【问题标题】:Use Scikit Learn to do linear regression on a time series pandas data frame使用 Scikit Learn 对时间序列 pandas 数据框进行线性回归
【发布时间】:2015-06-27 05:27:45
【问题描述】:

我正在尝试使用 scikit 学习线性回归器对熊猫数据框进行简单的线性回归。我的数据是时间序列,pandas数据框有日期时间索引:

                value
2007-01-01    0.771305
2007-02-01    0.256628
2008-01-01    0.670920
2008-02-01    0.098047

做一些简单的事情

from sklearn import linear_model

lr = linear_model.LinearRegression()

lr(data.index, data['value'])

没用:

float() argument must be a string or a number

所以我尝试创建一个带有日期的新列来尝试对其进行转换:

data['date'] = data.index
data['date'] = pd.to_datetime(data['date'])
lr(data['date'], data['value'])

但现在我明白了:

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

所以回归器无法处理日期时间。例如,我看到了很多将整数数据转换为日期时间的方法,但找不到将日期时间转换为整数的方法。

这样做的正确方法是什么?

PS:我对使用 scikit 很感兴趣,因为我打算以后用它做更多的事情,所以现在没有 statsmodels。

【问题讨论】:

  • 将您的日期转换为自纪元以来的时间:stackoverflow.com/questions/15203623/…
  • 谢谢。下面的解决方案更“流行”。
  • 这里有同样的愿望。我很遗憾 sklearn 无法处理日期时间索引...我希望科学堆栈可以更好地协同工作。

标签: python pandas


【解决方案1】:

您可能希望将自开始以来的天数作为您的预测指标。假设一切都已排序:

In [36]: X = (df.index -  df.index[0]).days.reshape(-1, 1)

In [37]: y = df['value'].values

In [38]: linear_model.LinearRegression().fit(X, y)
Out[38]: LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

您用于预测器的确切单位并不重要,可能是天或月。系数和解释会发生变化,因此一切都会产生相同的结果。另外,请注意,我们需要 reshape(-1, 1) 以便 X 采用预期的格式。

【讨论】:

  • 还有另一种方法,即与数据的频率无关:df.index.factorize()[0].reshape(-1,1)
  • index.reshape 现在不可用。任何建议
  • @MichaelLi 使用df['value'].values.reshape(..)
  • @Ivan 的建议对我在 Xarray 中计算线性回归非常有用,谢谢 Ivan :)
猜你喜欢
  • 2018-07-31
  • 2017-12-31
  • 2016-05-16
  • 2013-10-23
  • 2016-07-24
  • 2015-07-07
  • 2019-05-14
  • 2017-12-25
  • 2015-08-01
相关资源
最近更新 更多