Pandas 数据帧上的数据滞后
Lags data on Pandas dataframes
我正在使用 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
所以不要使用滞后 n 数据创建多个列。
仅在需要时才动态计算滞后数据。例如,甚至可以将所有滞后计算框定为乘以某个矩阵核。在我们看到您的代码之前我们不知道。
如果您想要更具体的答案,请向我们展示您尝试计算的具体代码或公式。
编辑:对于反对者来说,这实际上是更正确的答案。如果你用各种中间和临时列堵塞你的数据框,你会浪费内存。在你可以根据需要动态计算的东西上。那是错误的方法。与 Spark 中的惰性求值的一般原则相同。
如果你最终得到一个大矩阵,我不会在这里使用 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])
我正在使用 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
所以不要使用滞后 n 数据创建多个列。
仅在需要时才动态计算滞后数据。例如,甚至可以将所有滞后计算框定为乘以某个矩阵核。在我们看到您的代码之前我们不知道。 如果您想要更具体的答案,请向我们展示您尝试计算的具体代码或公式。
编辑:对于反对者来说,这实际上是更正确的答案。如果你用各种中间和临时列堵塞你的数据框,你会浪费内存。在你可以根据需要动态计算的东西上。那是错误的方法。与 Spark 中的惰性求值的一般原则相同。
如果你最终得到一个大矩阵,我不会在这里使用 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])