2021-04-11

系列文章目录

财政收入预测分析(灰色预测)


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文对财政收入进行预测分析,采用灰色预测


提示:以下是本篇文章正文内容,下面案例可供参考

一、步骤

1.数据探索和预处理

1.1数据探索

#导入所有需要的库
import numpy as np
import pandas as pd
from sklearn.linear_model import Lasso
from sklearn.svm import LinearSVR
#查看数据
data=pd.read_csv('D:/jupter notebook tmp/data.csv')
data.head()

1.2数据预处理

#计算相关系数
per=data.corr()
lasso=Lasso(1000)# 构建正则回归降维模型,参数可以从较大的开始尝试
lasso.fit(data.iloc[:,:13],data['y'])#对前13列进行正则降维
lasso.coef_#查看系数·
#筛选特征的对应的索引(系数不为0)
mask=lasso.coef_!=0
new_reg_data=data.iloc[:,:13].loc[:,mask]

2.自定义灰色预测模型

#自定义灰色预测模型
def GM21(x0):
    #print('x0',x0)
    x1=x0.cumsum()#对x0进行进行一次累加所得
    #print('x1',x1)
    z1=(x1[:len(x1)-1]+x1[1:])/2.0#z1为x1的紧邻均值生成的序列
    z1=z1.reshape(len(z1),1)#将z1转换为矩阵
    #print('z1',z1)
    B=np.append(-z1,np.ones_like(z1),axis=1)#合并z1和形状相同的1矩阵
    #print('B',B)
    Yn=x0[1:].reshape(len(x0)-1,1)
    #print('Yn',Yn)
    [[a],[b]]=np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Yn)
    #np.dot矩阵点积,np.dot([1,2,3][4,,5,6])=1*4+2*5+3*6
    #np.linalg.inv 矩阵求逆
    f=lambda k:(x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2))
    return f,a,b,x0[0]

3.创建2014和2015年数据并对其x值进行预测实验

new_reg_data.index=range(1994,2014)
new_reg_data.loc[2014]=None#创建2014年数据
new_reg_data.loc[2015]=None#创建2015年数据
#实验
f=GM21(new_reg_data.loc[range(1994,2014),'x1'].as_matrix())[0]
#as_matrix()转换为矩阵,因为我们定义的灰色预测函数需要输入矩阵类型
f(len(new_reg_data)-1)#预测2014年x1的值

4.预测2014年和2015年数据x值

col=['x1', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x13']
for i in col:
    f=GM21(new_reg_data.loc[range(1994,2014),i].as_matrix())[0]
    new_reg_data.loc[2014,i]=f(len(new_reg_data)-1)#预测2014
    new_reg_data.loc[2015,i]=f(len(new_reg_data))#预测2015
    new_reg_data[i] = new_reg_data[i].round(2)  # 保留两位小数
new_reg_data
#添加2014年和2015年y值
y = list(data['y'].values)
y.extend([np.nan,np.nan])
new_reg_data['y']=y

5.构建回归预测模型并预测y值

data_tr=new_reg_data.loc[range(1994,2014)]#提取1994年到2013年数据作为训练集进行训练
data_mean=data_tr.mean()
data_std=data_tr.std()
data_tr=(data_tr-data_mean)/data_std#数据标准化
X_tr=data_tr[col]
y_tr=data_tr['y']
svr = LinearSVR()#模型构建
svr.fit(X_tr,y_tr)#模型训练
# 标准化处理
x = (new_reg_data[col]-data_mean[col])/data_std[col]
# 预测值还原
y_pre = svr.predict(x) * data_std['y'] + data_mean['y']
new_reg_data["y_pre"] = y_pre

6.结果可视化

import matplotlib.pyplot as plt
plt.figure(figsize=(20,8),dpi=80)
plt.plot(new_reg_data["y"],"b-o")
plt.plot(new_reg_data["y_pre"],"r-*")
plt.legend(["y","y_pre"])
plt.show()

总结

本文仅作者的观点,若有异议,欢迎评论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值