问:如果想实现2018年以前的数据分成测试集和训练集,然后出来的方程单独用2019的数据验证,怎么做呢
答:我的代码就是根据你的要求做的,你需要理解我的代码
wangxishi
2020-11-24
为什么我那样设定 一些系数会变成0呢,如果想实现2018年以前的数据分成测试集和训练集,然后出来的方程单独用2019的数据验证,怎么做呢
wangxishi
2020-11-24
你以前用train_test_split随机拆分成训练集和测试集,肯定是不对的,因为你的数据是时间序列数据,也就是每个时间点或者每个时间段一个数据值。用这种数据建模,不能随机拆分训练集和测试集
wangxishi
2020-11-24
"""
Created on Mon Nov 23 11:01:18 2020
@author: Administrator
"""
#导入库
import pandas as pd
import numpy as np
#导入数据
data=pd.read_excel("D:\\360安全浏览器下载\\线性回归1119.xlsx")
#让时间显示为正确格式
#excel中以1900年1月1日为基准线记录时间
#python中以1970年1月1日为基准线记录时间
#进行时间转化的时候需要将从excel中导来的数值减去25539,再用pd.timestamp将其转换
data["时间"]=data["时间"].map(lambda x:x-25569)
data["时间"]=data["时间"].map(lambda x:pd.Timestamp(x,unit="D"))
data["年份"]=data["时间"].dt.year
#准备训练集(2018年及以前的数据)和测试集数据(2019年数据)
xnamelist=["沪深300",
"stock5","stock12",
"中国货币供应量M2(亿元)",
"M2_12",
"居民消费价格指数(上月=100)",
"居住类居民消费价格指数(上月=100)",
"新建商品住宅销售价格指数(上月=100)",
"二手住宅销售价格指数(上月=100)",
"银行间同业拆借加权平均利率_当期%",
"rate",
"美元兑人民币平均汇率_当期(人民币/美元)"
]
YX_2018=data[data["年份"]<=2018].loc[:,["Y"]+xnamelist]
#查看2018年及以前有多少行数据,可以看到有96行数据,你的变量x个数为12个
YX_2018.shape
#sklearn这个库建模和一般的统计学软件建模相比,sklearn这个库有不少缺点。
#其中一个缺点就是在做线性回归估计的时候要求传入的x和y不能有缺失值,
#因为系统不会自动筛选非缺失值进行建模和系数估计
#而是直接硬生生的给你抛出一个错误提示
#这就需要我们在进行建模前,人为进行缺失值处理。
#这里我们将含有缺失值的行直接从训练数据中删除。
YX_2018.notnull().sum(axis=0)
YX_2018.drop(labels = YX_2018.index[YX_2018.notnull().sum(axis=1)<13],axis=0,inplace=True)
#删除有缺失值的行之后,只剩下84行数据
YX_2019=data[data["年份"]==2019].loc[:,["Y"]+xnamelist]
#查看2019年有多少行数据,可以看到有12行数据,但是变量y有两个月的数据缺失
YX_2019.notnull().sum(axis=0)
#我们只对未缺失的行进行测试
YX_2019.drop(labels = YX_2019.index[YX_2019.notnull().sum(axis=1)<13],axis=0,inplace=True)
#导入线性回归类
from sklearn.linear_model import LinearRegression
#开始建模估计回归系数
#实例化一个回归模型
regmodel = LinearRegression()
#给模型传入测试集数据x和y
regmodel.fit(YX_2018.iloc[:,1:],YX_2018.iloc[:,0])#线性回归训练
#如果你想用sklearn库查看回归系数,可以用下面的命令
regmodel.intercept_ #常数项
regmodel.coef_ #斜率系数
#接下来我们只能直接进行预测,
Y_pred2019 = regmodel.predict(YX_2019.iloc[:,1:])#对测试集数据,用predict函数预测
#将预测值和实际值放在一起进行画图比较
import matplotlib.pyplot as plt
fig,ax=plt.subplots(1,1,figsize=(10,5))
#设定横轴刻度线标签值
xticklabels=data["时间"].loc[list(YX_2019.iloc[:,0].index)]
ax.plot(xticklabels,YX_2019.iloc[:,0],'red', linewidth=2.5,label="real data")
ax.plot(xticklabels,Y_pred2019,'green',label="predict data")
ax.legend(loc = 'upper right') #添加图例
wangxishi
2020-11-24
X_train,X_test,Y_train,Y_test = train_test_split(examDf[['房均价','x6','中国货币供应量M2(亿元)','美元兑人民币平均汇率_当期(人民币/美元)','沪深300']],examDf.Y,train_size=0.8)
model = LinearRegression()
model.fit(X_train,Y_train)#线性回归训练
#显示线性方程,并限制参数的小数位为两位
print("最佳拟合线: Y = ",round(a,2),"+",round(b[0],2),"* X1 + ",round(b[1],2),"* X2",round(b[2],2),"* X3",round(b[3],2),"* X4",round(b[4],2),"* X5")
以上我之前的代码也是用的sklearn 为什么可以出来回归系数呢
wangxishi
2020-11-24
# -*- coding: utf-8 -*-
"""
Created on Mon Nov 23 11:01:18 2020
@author: Administrator
"""
#导入库
import pandas as pd
import numpy as np
#导入数据
data=pd.read_excel("D:\\360安全浏览器下载\\线性回归1119.xlsx")
#让时间显示为正确格式
#excel中以1900年1月1日为基准线记录时间
#python中以1970年1月1日为基准线记录时间
#进行时间转化的时候需要将从excel中导来的数值减去25539,再用pd.timestamp将其转换
data["时间"]=data["时间"].map(lambda x:x-25569)
data["时间"]=data["时间"].map(lambda x:pd.Timestamp(x,unit="D"))
data["年份"]=data["时间"].dt.year
#准备训练集(2018年及以前的数据)和测试集数据(2019年数据)
xnamelist=["沪深300",
"stock5","stock12",
"中国货币供应量M2(亿元)",
"M2_12",
"居民消费价格指数(上月=100)",
"居住类居民消费价格指数(上月=100)",
"新建商品住宅销售价格指数(上月=100)",
"二手住宅销售价格指数(上月=100)",
"银行间同业拆借加权平均利率_当期%",
"rate",
"美元兑人民币平均汇率_当期(人民币/美元)"
]
YX_2018=data[data["年份"]<=2018].loc[:,["Y"]+xnamelist]
#查看2018年及以前有多少行数据,可以看到有96行数据,你的变量x个数为12个
YX_2018.shape
#sklearn这个库建模和一般的统计学软件建模相比,sklearn这个库有不少缺点。
#其中一个缺点就是在做线性回归估计的时候要求传入的x和y不能有缺失值,
#因为系统不会自动筛选非缺失值进行建模和系数估计
#而是直接硬生生的给你抛出一个错误提示
#这就需要我们在进行建模前,人为进行缺失值处理。
#这里我们将含有缺失值的行直接从训练数据中删除。
YX_2018.notnull().sum(axis=0)
YX_2018.drop(labels = YX_2018.index[YX_2018.notnull().sum(axis=1)<13],axis=0,inplace=True)
#删除有缺失值的行之后,只剩下84行数据
YX_2019=data[data["年份"]==2019].loc[:,["Y"]+xnamelist]
#查看2019年有多少行数据,可以看到有12行数据,但是变量y有两个月的数据缺失
YX_2019.notnull().sum(axis=0)
#我们只对未缺失的行进行测试
YX_2019.drop(labels = YX_2019.index[YX_2019.notnull().sum(axis=1)<13],axis=0,inplace=True)
#导入线性回归类
from sklearn.linear_model import LinearRegression
#开始建模估计回归系数
#实例化一个回归模型
regmodel = LinearRegression()
#给模型传入测试集数据x和y
regmodel.fit(YX_2018.iloc[:,1:],YX_2018.iloc[:,0])#线性回归训练
#如果你想用sklearn库查看回归系数,对不起sklearn不支持,这是因为sklearn不在乎系数和显著性
#只在乎预测,如果你非要看回归系数只能用其他库了。
#因此接下来我们只能直接进行预测,
Y_pred2019 = regmodel.predict(YX_2019.iloc[:,1:])#对测试集数据,用predict函数预测
#将预测值和实际值放在一起进行画图比较
import matplotlib.pyplot as plt
fig,ax=plt.subplots(1,1,figsize=(10,5))
#设定横轴刻度线标签值
xticklabels=data["时间"].loc[list(YX_2019.iloc[:,0].index)]
ax.plot(xticklabels,YX_2019.iloc[:,0],'red', linewidth=2.5,label="real data")
ax.plot(xticklabels,Y_pred2019,'green',label="predict data")
ax.legend(loc = 'upper right') #添加图例

wangxishi
2020-11-24
# -*- coding: utf-8 -*-
"""
Created on Mon Nov 23 11:01:18 2020
@author: Administrator
"""
#导入库
import pandas as pd
import numpy as np
#导入数据
data=pd.read_excel("D:\\360安全浏览器下载\\线性回归1119.xlsx")
#让时间显示为正确格式
#excel中以1900年1月1日为基准线记录时间
#python中以1970年1月1日为基准线记录时间
#进行时间转化的时候需要将从excel中导来的数值减去25539,再用pd.timestamp将其转换
data["时间"]=data["时间"].map(lambda x:x-25569)
data["时间"]=data["时间"].map(lambda x:pd.Timestamp(x,unit="D"))
data["年份"]=data["时间"].dt.year
#准备训练集(2018年数据)和测试集数据(2019年数据)
xnamelist=["沪深300",
"stock5","stock12",
"中国货币供应量M2(亿元)",
"M2_12",
"居民消费价格指数(上月=100)",
"居住类居民消费价格指数(上月=100)",
"品住宅销售价格指数(上月=100)",
"二手住宅销售价格指数(上月=100)",
"银行间同业拆借加权平均利率_当期%",
"rate",
"美元兑人民币平均汇率_当期(人民币/美元)"
]
X_2018=data[data["年份"]==2018].loc[:,xnamelist]
#查看2018年有多少行数据,可以看到2018年只有12行数据,你的变量x个数却那么多,这样估计出来的回归系数是不可信的。
X_2018.shape
wangxishi
2020-11-24
offset 的语法是:
reference:参考位置
row:行方向上的偏移量
cols:列方向上的偏移量
hight:引用区域的高
width:引用区域的宽
offset(A1,7,1,1,3)的意思是:从AI单元格向下移动7个(A8)再向右移动1个(B8) 然后索引B8:D8 三个单元格的值。
这时候应该是数组运算了,需要在公式上执行Ctrl+Shift + enter 做数组运算。
CDA-188****6009
2020-11-23
用文件中标绿色的变量进行线性回归预测,取13年到18年的历史数据做模型,得到线性回归方程后用19年的变量验证下
wangxishi
2020-11-23
我用历史数据做线性回归模型用的是sklearn,得出的问题中的
最佳拟合线: Y = -0.08 + -0.0 * X1 + 1.03 * X2 0.0 * X3 -0.05 * X4 0.0 * X5
代码如下,是否可以?
#拆分训练集和测试集
X_train,X_test,Y_train,Y_test = train_test_split(examDf[[x1,x2,x3,x4,x5]],examDf.Y,train_size=0.8)
#new_examDf.ix[:,:2]取了数据中的前两列为自变量,此处与单变量的不同
#调用线性规划包
model = LinearRegression()
model.fit(X_train,Y_train)#线性回归训练
a = model.intercept_#截距
b = model.coef_#回归系数
print("拟合参数:截距",a,",回归系数:",b)
#显示线性方程,并限制参数的小数位为两位
print("最佳拟合线: Y = ",round(a,2),"+",round(b[0],2),"* X1 + ",round(b[1],2),"* X2",round(b[2],2),"* X3",round(b[3],2),"* X4",round(b[4],2),"* X5")
Y_pred = model.predict(X_test)#对测试集数据,用predict函数预测
plt.plot(range(len(Y_pred)),Y_pred,'red', linewidth=2.5,label="predict data")
plt.plot(range(len(Y_test)),Y_test,'green',label="test data")
plt.legend(loc='1')
plt.show()#显示预测值与测试值曲线
wangxishi
2020-11-23
你可以用sklearn库进行最小二乘回归系数估计和预测,这样会更方便一些。
给你推荐一个链接如下:
https://www.pinggu.com/post/details/5f3e456a49796226c2294017
wangxishi
2020-11-23

1插入3列数据,这三列数据的第一个单元格的内容为你要查找的关键字。这三列分别是哲学,概论,618.
2.在b2单元格里面写入公式:=IF(ISERROR(SEARCH(B$1,$A2)),"0","1")
search函数的第一个参数,是要查找的关键字,第二个参数是查找范围。如果关键字被查找,则返回一个位置,如果没有被查到,则返回一个错误。我们这里要查找的内容是哲学,我们用b$1,锁定行,不锁定列,方便后面我们拖拽,因为关键字固定在第一行。
iferror函数的意思是,传入的参数只一个错误值则返回为True,非错误值则返回为False
if函数的意思是如果没有查找到关键字,则返回0,查找到则返回1.
3.将b2单元格的公式向右拖动到最后一列
4.将上面的公式向下拖动到最后一行
5.然后我们借助excel筛选功能可以将哲学列取值为1的数据筛选出来用作他用,其他都是以此类推。
星!
2020-11-23