2017-12-05 7 views
1

私はsklearnを使用して予測を行っています。通常、予測に遅れたデータを作成しますが、この機能が1列のみの場合は簡単です。例えばパンダのデータフレームにデータが遅れます

:だから私のデータフレームになる

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 

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

通常私のような機能を使用して遅れたデータを作成するために、温度値をシフトして別の列を作成します。

私が予測したいとき、私は次のようなコードを使ってフィットすることができます:

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 
+1

を使用してデータをフィット。 – unknowncoder

+0

@cᴏʟᴅsᴘᴇᴇᴅ:解決策は、ラグnのデータを持つ複数の列を作成するのではなく、計算時間に中間値を動的に作成することです。 – smci

+1

scikitとの組み合わせではありません。 model.fit()を呼び出すときにデータを準備する必要があります(あなたが言ったように大きなデータフレーム) –

答えて

2

大きな行列になった場合、ここではパンダを使用しません。 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]) 
+1

しかし、最終的にすべての中間フィールドを格納する必要がない場合、関連する式のために動的に生成するほうがよく聞こえます。 – smci

+0

@smciでmodel.fit(..)を使用するには、すべての機能とターゲットを一緒に渡す必要があります。 – mm441

+0

したがって、モデルの前に余分なコードをラップします。fit()コールを使用して、中間遅れ系列を動的に計算します。すべての計算を何らかの行列カーネルによって乗算として遅らせることで、計算をフレーム化することさえ可能かもしれません。我々はOPのコードを見るまでわからない。 – smci

-1

だからラグ-n個のデータを複数の列を作成しないでください。

遅れたデータは、必要なときにのみ動的に計算します。たとえば、すべての行列をいくつかの行列カーネルによって乗算するより遅らせることで、計算をフレーム化することさえ可能かもしれません。私たちがあなたのコードを見るまでわからない。 より具体的な回答が必要な場合は、計算しようとしている特定のコードや数式を表示してください。

編集:downvotersに、これは実際にはより正確な答えです。あらゆる種類の中間カラムと一時カラムでデータフレームを詰まらせると、メモリが浪費されます。あなたは必要に応じて動的に計算することができます。それは間違った方法です。 Sparkの遅延評価と同じ一般原則。

+0

さて、私はコードを追加するために私の質問を更新しました、ありがとう! :) –

関連する問題