python数据挖掘—绘制热力图,相关系数分析,基于GM11和ARIMA的财政收入预测

01绘制热力图

import numpy as np
import pandas as pd

inputfile = 'D://CourseAssignment//AI//DataPredict//data.csv'
data = pd.read_csv(inputfile)


#describe statistical analysis
description = [data.min(), data.max(), data.mean(), data.std()]
#calculate the min, max, mean, std
description = pd.DataFrame(description, index = ['Min', 'Max', 'Mean', 'STD']).T
#keep two decimals
print('describe the result of statisticl analysis : \n', np.round(description, 2))


#correlation analysis
corr = data.corr(method = 'pearson')
print('correlation coefficient martix: \n', np.round(corr, 2))


#draw thermodynamic diagram
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.subplots(figsize=(10, 10)) # set the size of canvas 
sns.heatmap(corr, annot=True, vmax=1, square=True, cmap="Reds")
plt.title('correlation thermodynamic diagram')
plt.show()
plt.close

 

 

 

 

 

 

02相关系数

 1 from sklearn.linear_model import Lasso
 2 lasso = Lasso(1000)   #use function Lasso, set 1000
 3 lasso.fit(data.iloc[:,0:13], data['y'])
 4 
 5 print('相关系数为: ', np.round(lasso.coef_, 5)) #output result
 6 print('相关系数非0个数为:',np.sum(lasso.coef_ != 0))
 7 
 8 mask = lasso.coef_ != 0;
 9 print('相关系数是否为0:', mask)
10 mask = np.append(mask, True)
11 print('相关系数是否为0:', mask)
12 
13 outputFile = r'D:\CourseAssignment\AI\new_reg_data3.csv'  #输出数据文件
14 new_reg_data = data.iloc[:, mask]                       #返回相关系数非零的??
15 new_reg_data.to_csv(outputFile)                         #存储数据
16 print('输出数据的维度为:', new_reg_data.shape)                 #查看数据

 

 

 

 

03基于GM11的财政预测

 1 #-*- coding: utf-8 -*-
 2 
 3 import sys
 4 sys.path.append('D://CourseAssignment//AI//DataPredict//code')  # 设置路径
 5 import numpy as np
 6 import pandas as pd
 7 from GM11 import GM11  # 引入自编的灰色预测函数
 8 
 9 inputfile1 = r'D://CourseAssignment//AI//DataPredict//new_reg_data.csv'  # 输入的数据文件
10 inputfile2 = r'D://CourseAssignment//AI//DataPredict//data.csv'  # 输入的数据文件
11 new_reg_data = pd.read_csv(inputfile1, index_col = 0,header =0)  # 读取经过特征选择后的数据
12 data = pd.read_csv(inputfile2, header=0)  # 读取总的数据
13 new_reg_data.index = range(1994, 2014)
14 new_reg_data.loc[2014] = None
15 new_reg_data.loc[2015] = None
16 new_reg_data.loc[2016] = None
17 l = ['x1', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x13']
18 for i in l:
19   f = GM11(new_reg_data.loc[range(1994, 2014),i].values)[0]
20   new_reg_data.loc[2014,i] = f(len(new_reg_data)-1)  # 2014年预测结果
21   new_reg_data.loc[2015,i] = f(len(new_reg_data))  # 2015年预测结果
22   new_reg_data.loc[2016, i] = f(len(new_reg_data)+1)  # 2016年预测结果
23   new_reg_data[i] = new_reg_data[i].round(2)  # 保留两位小数
24 
25 
26 y = list(data['y'].values)  # 提取财政收入列,合并至新数据框中
27 y.extend([np.nan,np.nan,np.nan])
28 new_reg_data['y'] = y
29 outputfile = 'D://CourseAssignment//AI//DataPredict//new_reg_data_GM11.xls'  # 灰色预测后保存的路径
30 new_reg_data.to_excel(outputfile)  # 结果输出
31 print('预测结果为:\n',new_reg_data.loc[2014:2016,])  # 预测结果展示
32 
33 
34 import matplotlib.pyplot as plt
35 from sklearn.svm import LinearSVR
36 
37 inputfile = 'D://CourseAssignment//AI//DataPredict//new_reg_data_GM11.xls'  # 灰色预测后保存的路径
38 data = pd.read_excel(inputfile, index_col=0, header=0)  # 读取数据
39 feature = ['x1', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x13']  # 属性所在列
40 print('***************分隔*****************')
41 #data.index = range(1994, 2014)
42 data_train = data.loc[range(1994,2014)].copy()  # 取2014年前的数据建模
43 data_mean = data_train.mean()
44 data_std = data_train.std()
45 data_train = (data_train - data_mean)/data_std  # 数据标准化
46 x_train = data_train[feature].values  # 属性数据
47 y_train = data_train['y'].values  # 标签数据
48 linearsvr = LinearSVR()  # 调用LinearSVR()函数
49 linearsvr.fit(x_train,y_train)
50 x = ((data[feature] - data_mean[feature])/data_std[feature]).values  # 预测,并还原结果。
51 data['y_pred'] = linearsvr.predict(x) * data_std['y'] + data_mean['y']
52 outputfile = 'D://CourseAssignment//AI//DataPredict//new_reg_data_GM11_revenue.xls'  # SVR预测后保存的结果
53 data.to_excel(outputfile)
54 
55 print('真实值与预测值分别为:\n',data[['y','y_pred']])
56 
57 fig = data[['y','y_pred']].plot(subplots = True, style=['b-o','r-*'])  # 画出预测结果图
58 plt.title('3009----predict')
59 plt.show()

 

 

 

 

 

 

04基于ARIMA的财政预测

  1 import pandas as pd
  2 # 参数初始化
  3 import statsmodels.tsa.arima_model
  4 
  5 discfile = r'D://CourseAssignment//AI//DataPredict//data.csv'
  6 forecastnum = 3
  7 
  8 # 读取数据,指定日期列为指标,pandas自动将“日期”列识别为Datetime格式
  9 data = pd.read_csv(discfile)
 10 x = 'y'
 11 data = data[[x]]
 12 
 13 """"
 14 # 时序图
 15 import matplotlib.pyplot as plt
 16 plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
 17 plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
 18 x = [
 19   '1994','1995','1996','1997','1998','1999','2000'
 20   ,'2001','2002','2003','2004','2005','2006','2007','2008','2009',
 21   '2010','2011','2012','2013']
 22 y = data['y']
 23 plt.figure(figsize=(14,9))
 24 plt.plot(x,y,color='green')
 25 plt.show()
 26 """
 27 
 28 # 自相关图
 29 from statsmodels.graphics.tsaplots import plot_acf
 30 plot_acf(data).show()
 31 
 32 # 平稳性检测
 33 from statsmodels.tsa.stattools import adfuller as ADF
 34 print('原始序列的ADF检验结果为:', ADF(data['y']))
 35 # 返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore
 36 
 37 # 差分后的结果
 38 D_data = data.diff().dropna()
 39 D_data.columns = ['收入差分']
 40 D_data.plot()  # 时序图
 41 import matplotlib.pyplot as plt
 42 plt.show()
 43 plot_acf(D_data).show()  # 自相关图
 44 from statsmodels.graphics.tsaplots import plot_pacf
 45 plot_pacf(D_data, lags=8).show()  # 偏自相关图
 46 print('差分序列的ADF检验结果为:', ADF(D_data['收入差分']))  # 平稳性检测
 47 
 48 # 白噪声检验
 49 from statsmodels.stats.diagnostic import acorr_ljungbox
 50 print('差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1))  # 返回统计量和p值
 51 
 52 from statsmodels.tsa.arima.model import ARIMA
 53 
 54 # 定阶
 55 data['y'] = data['y'].astype('float64')
 56 pmax = int(len(D_data)/10)  # 一般阶数不超过length/10
 57 qmax = int(len(D_data)/10)  # 一般阶数不超过length/10
 58 bic_matrix = []  # BIC矩阵
 59 for p in range(pmax+1):
 60   tmp = []
 61   for q in range(qmax+1):
 62     try:  # 存在部分报错,所以用try来跳过报错。
 63       tmp.append(ARIMA(data,order= (p,1,q)).fit().bic)
 64     except:
 65       tmp.append(None)
 66   bic_matrix.append(tmp)
 67 bic_matrix = pd.DataFrame(bic_matrix)  # 从中可以找出最小值
 68 p,q = bic_matrix.stack().idxmin()  # 先用stack展平,然后用idxmin找出最小值位置。
 69 print('BIC最小的p值和q值为:%s、%s' %(p,q))
 70 model = ARIMA(data, order=(p,1,q)).fit()  # 建立ARIMA(0, 1, 1)模型
 71 print('模型报告为:\n', model.summary())
 72 print('预测未来3年,其预测结果、标准误差、置信区间如下:\n', model.forecast(3))
 73 
 74 #原数据cxcel文件列名规范
 75 data.to_excel('D://CourseAssignment//AI//DataPredict//ARIMA_data//new_reg_data_ARIMA_origin.xls')
 76 columns = ['year', 'y']
 77 originfile = 'D://CourseAssignment//AI//DataPredict//ARIMA_data//new_reg_data_ARIMA_origin.xls'
 78 origindata = pd.read_excel(originfile, header = None, names = columns)
 79 origindata = origindata.drop(labels=0)
 80 origindata.to_excel('D://CourseAssignment//AI//DataPredict//ARIMA_data//new_reg_data_ARIMA_origin.xls')
 81 
 82 
 83 #提取预测后的数值到excel
 84 model.forecast(3).to_excel('D://CourseAssignment//AI//DataPredict//ARIMA_data//new_reg_data_ARIMA_temp.xls')
 85 tempfile = r'D://CourseAssignment//AI//DataPredict//ARIMA_data//new_reg_data_ARIMA_temp.xls'
 86 tempdata = pd.read_excel(tempfile)
 87 tempdata.rename(columns={'predicted_mean':'y'}, inplace=True)
 88 tempdata.to_excel('D://CourseAssignment//AI//DataPredict//ARIMA_data//new_reg_data_ARIMA_temp.xls')
 89 tempdata.rename(columns={'Unnamed: 0':'year'}, inplace=True)
 90 tempdata.to_excel('D://CourseAssignment//AI//DataPredict//ARIMA_data//new_reg_data_ARIMA_temp.xls')
 91 
 92 
 93 #合并excel
 94 df1 = pd.read_excel('D://CourseAssignment//AI//DataPredict//ARIMA_data//new_reg_data_ARIMA_origin.xls')
 95 df2 = pd.read_excel('D://CourseAssignment//AI//DataPredict//ARIMA_data//new_reg_data_ARIMA_temp.xls')
 96 result = pd.concat([df1, df2])
 97 print(result)
 98 result.to_excel('D://CourseAssignment//AI//DataPredict//new_reg_data_ARIMA_result.xls')
 99 
100 # 时序图
101 plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
102 plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
103 plt.figure(figsize=(10,4))
104 x = [
105   '1994','1995','1996','1997','1998','1999','2000'
106   ,'2001','2002','2003','2004','2005','2006','2007','2008','2009',
107   '2010','2011','2012','2013','2014','2015','2016']
108 y = result['y']
109 x_pred = ['2014','2015','2016']
110 y_pred = tempdata['y']
111 plt.plot(x, y, color = 'green', label = '现有数据', marker='o')
112 plt.plot(x_pred, y_pred, color = 'red', label = '预测数据', marker='s')
113 plt.legend()
114 plt.title('3009---ARIMA预测')
115 plt.show()

 

posted @ 2023-03-05 00:47  孤影化双皮奶  阅读(518)  评论(0)    收藏  举报