【问题标题】:Predicting the future with pandas and statsmodels使用 pandas 和 statsmodels 预测未来
【发布时间】:2017-12-08 22:11:29
【问题描述】:

我需要做的是用这些“要求”绘制未来温度:“假设温度大致是二氧化碳排放的线性函数, 从最近的数据点估计线性函数的系数(使用 过去的 2 很好,如果你想更彻底,可以使用过去的 10 左右)。 此外,假设 CO2 排放量的增长率为 与今天相同(即,如果 2016 年的二氧化碳排放量比 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()

【问题讨论】:

  • 您收到RRstudio 的消息了吗?处理数据的好程序!
  • 我没有,但我会检查一下:D
  • 这是作业吗?如果是这样,请参阅此处:meta.stackoverflow.com/questions/334822/…
  • @itzy 嘿,它的考试练习,我们有一些任务我们应该在考试前尝试做以获得更好的理解。不确定这是否算作家庭作业?

标签: python pandas statsmodels


【解决方案1】:

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()

【讨论】:

  • 谢谢!我很确定这正是我所需要的。只需要稍微修改一下:D 只是一个问题,我如何让它超越已知数据?因为在您的图片中,它会在最后一个已知数据处停止(如预测未来数据)
  • @cryseth predict 方法中的外生数据可以引用任何数据,包括未来数据。
  • 谢谢,但我还是不太明白。你可以举一个简单的例子吗?非常感谢你到目前为止的帮助,让我更进一步。
  • @cryseth 我刚刚进行了编辑。我添加了后缀_train_pred 来区分训练集和预测集。顺便说一句,你可能会发现sklearn.linear_model.LinearRegression的API更方便。
  • 非常感谢,这对您有很大帮助。
猜你喜欢
  • 2015-07-22
  • 1970-01-01
  • 2018-01-17
  • 2016-12-08
  • 2020-08-29
  • 2020-03-11
  • 2018-12-21
  • 1970-01-01
  • 2016-02-13
相关资源
最近更新 更多