【问题标题】:Lags data on Pandas dataframesPandas 数据帧上的滞后数据
【发布时间】:2018-05-18 16:04:42
【问题描述】:

我正在使用 sklearn 进行预测。通常我会为预测创建滞后数据,如果特征只包含 1 列,这很容易。

例如:

index  temperature
1      100
2      80
3      50
4      90
5      110

通常我会创建另一列,使用以下函数移动温度值以创建滞后数据:

dataframe.temperature.shift()

所以我的数据框变成:

index  temperature temperature2 temperature3
1      100         NaN          NaN
2      80          100          NaN
3      50          80           100
4      90          50           80
5      110         90           50

然后当我想预测时,我可以使用如下代码进行拟合:

x = dataframe.loc[:,('temperature3','temperature2')]
y = dataframe.temperature
model.fit([x],y)

问题是当我有很多列要创建滞后数据,并且每列需要更多滞后数据时,我的数据框会太大。

有什么简单的方法可以使用吗?谢谢!

作为参考,这是我的数据框:

import pandas as pd
import talib

df = pd.read_csv('..\\data\\uj5.CSV', names=['date','time','open','high','low','close','volume'])
df.index = pd.to_datetime(df.date + df.time,format='%Y.%m.%d%H:%M')


# assuming this is the 'X', let say i need 100 lags of these column to predict the 'Y'
df['CDLBELTHOLD'] = talib.CDLBELTHOLD(df.open.values, df.high.values, df.low.values, df.close.values)
df['CDLCLOSINGMARUBOZU'] = talib.CDLCLOSINGMARUBOZU(df.open.values, df.high.values, df.low.values, df.close.values)
df['CDLDOJI'] = talib.CDLDOJI(df.open.values, df.high.values, df.low.values, df.close.values)
df['CDLHIKKAKE'] = talib.CDLHIKKAKE(df.open.values, df.high.values, df.low.values, df.close.values)
df['CDLLONGLEGGEDDOJI'] = talib.CDLLONGLEGGEDDOJI(df.open.values, df.high.values, df.low.values, df.close.values)
df['CDLLONGLINE'] = talib.  CDLLONGLINE(df.open.values, df.high.values, df.low.values, df.close.values)
df['CDLSHORTLINE'] = talib.CDLSHORTLINE(df.open.values, df.high.values, df.low.values, df.close.values)
df['CDLSPINNINGTOP'] = talib.CDLSPINNINGTOP(df.open.values, df.high.values, df.low.values, df.close.values)
df['atr'] = talib.ATR(df.high.values, df.low.values, df.close.values,timeperiod=14)


#assuming this is the Y
df['target'] = #some int value

【问题讨论】:

  • 也许创建一个列名列表然后遍历它。
  • @cᴏʟᴅsᴘᴇᴇᴅ:解决方案不是使用滞后 n 数据创建多列,而是在计算时动态创建中间值。
  • 不与 scikit 结合使用。调用 model.fit() 时,您需要准备好数据(如您所说的大数据框)
  • FSuyuti:请给我们展示一下计算,已经!您可以使用计算的矩阵乘法公式来获取所有滞后 k 项。除非您尽快提出问题,否则此问题已经获得 4 票关闭,并且很可能被关闭。很遗憾,因为我怀疑您的计算很有趣,而且矩阵乘法公式会很简洁并且可以节省大量内存。

标签: python pandas scikit-learn forecasting sklearn-pandas


【解决方案1】:

如果你最终得到一个大矩阵,我不会在这里使用 pandas。 Numpy 在这里更合适:

import numpy as np

x = you_data_frame.values
max_lag = 10 # number of lags you want to have 

m = np.array([])
for i in np.arange(len(x) - max_lag):
    new_row = x[i:i+max_lag][None, :]
    if len(m) == 0:
        m = new_row
    else:
        m = np.vstack([m, new_row])

然后你用猫拟合你的数据

model.fit(m[:, 1:], m[:, 0])

【讨论】:

  • 但最终如果他们不需要存储所有中间字段,为相关表达式动态生成它们听起来更好。
  • @smci 使用 model.fit(..) 您需要将所有功能和目标一起传递
  • 所以你在 model.fit() 调用之前包装了额外的代码,以动态计算中间滞后序列。甚至可以将计算的所有滞后构建为乘以某个矩阵内核。直到我们看到 OP 的代码我们才知道。
  • 我怎样才能让这段代码在多个线程或进程中运行?它在一年的数据上运行了这么长时间(大约 75000 行)。
  • @F.Suyuti 75k 行听起来不像你需要多线程处理的东西。但是您可以使用multiprocessing.Pool 并将过程拆分到矩阵 m 的几个部分。如果您将向量 x 保留在内存中,您将不会在进程之间产生任何依赖关系。
【解决方案2】:

所以不要使用滞后 n 数据创建多个列。

仅在需要时动态计算滞后数据。例如,甚至可以将计算的所有滞后构建为乘以某个矩阵内核。我们不知道,直到我们看到你的代码。 如果您想要更具体的答案,请向我们展示您尝试计算的具体代码或公式。

编辑:对于反对者来说,这实际上是更正确的答案。如果您用各种中间列和临时列阻塞数据框,您将浪费内存。在你可以根据需要动态计算的东西上。那是错误的方法。与 Spark 中的惰性求值相同的一般原则。

【讨论】:

  • 好的,我更新了我的问题以添加代码,谢谢! :)
猜你喜欢
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2016-01-31
  • 2011-04-03
  • 1970-01-01
相关资源
最近更新 更多