使用pandas和statsmodels预测未来

时间:2017-12-08 12:50:43

标签: python pandas statsmodels

我需要做的是根据这些“要求”绘制未来温度:“假设温度大致是二氧化碳排放的线性函数, 从最近的数据点估计线性函数的系数(使用 过去2是好的,如果你想要更彻底的话,使用过去的10个左右。 此外,假设二氧化碳排放量的增加率将是 与今天相同(即如果2016年的二氧化碳排放量超过X吨) 2015年,2017年的二氧化碳排放量将比2016年增加X吨)“。

我有2个数据集,一个是每年每个月的温度,另一个是每年的碳水平。

(发布合并并缩短了一个,因为它不是那么大,但如果它更有帮助看到它们未经修改然后我也可以发布它,你可以看到它是如何在我发布我的代码下面完成的)

Year    Carbon    June

2000    6727  20.386
2001    6886  20.445
2002    6946  20.662
2003    7367  20.343
2004    7735  20.242
2005    8025  20.720
2006    8307  20.994
2007    8488  20.661
2008    8738  20.657
2009    8641  20.548
2010    9137  21.027
2011    9508  20.915
2012    9671  21.172

到目前为止,我所做的是将两个数据集合并在一起,然后尝试预测未来几年的温度,我将其限制在2000年至2012年,只是为了简化并确保两个表都有与一个表相同的长度比另一个表长。我对python和整体编码很新,我不知道怎么做,下面你可以看到我试过的东西:

data1 = pd.read_csv("co2.csv", sep=',')
data2 = pd.read_csv("temperature.csv", sep=',')

data1 = data1.set_index('Year')
data2 = data2.set_index('Year')

data3 = data1.loc["2000":"2012"]

data4 = data2.loc["2000":"2012"]

data4 = data4.loc[:, "June":"June"]

data5 = pd.merge(data3,data4, how= 'left', left_index =True , right_index=True)

x = data5["Carbon"]

y = data5["June"]

model = sm.OLS(y,x).fit()

prediction = model.predict(x)

prediction.plot()


plt.show()

1 个答案:

答案 0 :(得分:3)

方法OLS.predict不是x作为参数而是模型参数(最终是外生数据)。此外,您必须向X添加常量,否则它会强制线性回归通过原点。这是一个例子:

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
from StringIO import StringIO

data = StringIO("""
Year Carbon June
2000 6727 20.386
2001 6886 20.445
2002 6946 20.662
2003 7367 20.343
2004 7735 20.242
2005 8025 20.720
2006 8307 20.994
2007 8488 20.661
2008 8738 20.657
2009 8641 20.548
2010 9137 21.027
2011 9508 20.915
2012 9671 21.172
""")

# Model training
df = pd.read_table(data, index_col=0, sep='\s+')
Y_train = df['June']
X_train = df['Carbon']
X_train = sm.add_constant(X_train) # add this to your code
model = sm.OLS(Y_train, X_train)
results = model.fit()

# Prediction of future values
future_carbon = range(9700, 10000, 50)
X_pred = pd.DataFrame(data=future_carbon, columns=['Carbon'])
X_pred = sm.add_constant(X_pred)
prediction = model.predict(results.params, X_pred)

# Plot
plt.figure()
plt.plot(X_train['Carbon'], model.predict(results.params), '-r', label='Linear model')
plt.plot(X_pred['Carbon'], prediction, '--r', label='Linear prediction')
plt.scatter(df['Carbon'], df['June'], label='data')
plt.xlabel('Carbon')
plt.ylabel('June temperature')
plt.legend()
plt.show()

enter image description here