2016-06-30 2 views
2

将来、在庫がある日からどの日に変更されるかを調べようとしています。唯一の問題は、これを1000行のデータで実行するのに約1分かかり、何百万行もあることです。私は「遅れ」がラインによって引き起こされると思う:パンダのデータフレームの列の値を変更する方法を最適化する方法

stocks[0][i][string][line[index]] = adjPctChange(line[adjClose],line[num])

私は500銘柄の全体の3Dデータフレームは、この行がヒットか何かするたびにコピーされているかもしれないと考えていますが、ちょうどI確かなことを知らない、あるいはそれをより速くする方法を知っている。また、この警告を投げています:

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

は、ここに私のコードです:

daysForeward = 2 
for days in range(1,daysForeward+1): 
    string = 'closeShift'+str(days) 
    stocks[0][i][string] = stocks[0][i]['adjClose'].shift(days-(days*2)) 

for line in stocks[0][i].itertuples(): 
    num = 6 #first closeShift columnb 
    for days in range(1,daysForeward+1): 
     string = 'closeShift'+str(days) 
     stocks[0][i][string][line[index]] = adjPctChange(line[adjClose],line[num]) 
     num+=1 

ここでのデータは、前との変化率を適用した後です:

 date  open close adjClose closeShift1 closeShift2 
0 19980102 20.3835 20.4417  NaN   NaN  0.984507 
1 19980105 20.5097 20.5679  NaN  0.984507  1.034904 
2 19980106 20.1408 20.0826 0.984507  1.034904  0.994047 
3 19980107 20.1408 20.9950 1.034904  0.994047  0.982926 
4 19980108 21.1115 20.0244 0.994047  0.982926  0.989441 

     date  open close adjClose closeShift1 closeShift2 
0 19980102 20.3835 20.4417  NaN   NaN   NaN 
1 19980105 20.5097 20.5679  NaN   NaN   NaN 
2 19980106 20.1408 20.0826 0.984507  4.869735  0.959720 
3 19980107 20.1408 20.9950 1.034904 -3.947904 -5.022423 
4 19980108 21.1115 20.0244 0.994047 -1.118683 -0.463311 

いくつかの説明は:

[0]stocks[0][i]は、3dデータフレームの適切なレベルに到達するだけです。[i]は、より高いforループで繰り返されている株の株価です。

adjCloseの列は、closeの代わりにcloseの変更版です。

adjPctChange()は、100~50が50~100と同じ結果になるように等式を切り替えるカスタムパーセント変更関数です。結果は平均化され、上方向にスキューしません。

def adjPctChange(startPoint, currentPoint): 
    if startPoint < currentPoint: 
     x = abs(((float(startPoint)-currentPoint)/float(currentPoint))*100.0) 
    else: 
     x = ((float(currentPoint)-startPoint)/float(startPoint))*100.0  
    return x 

お手伝いいただける方に感謝します。

答えて

2

DataFrameをループしないでください。配列関数ですべてを行います。

前:

In [30]: df 
Out[30]: 
     date  open close adjClose closeShift1 closeShift2 
0 19980102 20.3835 20.4417  NaN   NaN  0.984507 
1 19980105 20.5097 20.5679  NaN  0.984507  1.034904 
2 19980106 20.1408 20.0826 0.984507  1.034904  0.994047 
3 19980107 20.1408 20.9950 1.034904  0.994047  0.982926 
4 19980108 21.1115 20.0244 0.994047  0.982926  0.989441 

配列表記:

daysForeward = 2 
for day in range(1, daysForeward+1): 
    column = 'closeShift' + str(day) 
    df[column] = (df[column] - df.adjClose)/np.maximum(df[column], df.adjClose) * 100.0 

後:

In [33]: df 
Out[33]: 
     date  open close adjClose closeShift1 closeShift2 
0 19980102 20.3835 20.4417  NaN   NaN   NaN 
1 19980105 20.5097 20.5679  NaN   NaN   NaN 
2 19980106 20.1408 20.0826 0.984507  4.869727  0.959713 
3 19980107 20.1408 20.9950 1.034904 -3.947902 -5.022495 
4 19980108 21.1115 20.0244 0.994047 -1.118760 -0.463358 
0

IIUC:

def get_lags(s, n): 
    return pd.concat([s.shift(i) for i in range(n + 1)], 
        axis=1, keys=range(n + 1)) 

def get_comps(lags): 
    comps = [] 
    for i, cni in enumerate(lags.columns): 
     if i > 0: 
      max_ = lags.iloc[:, [0, i]].max(1) 
      min_ = lags.iloc[:, [0, i]].min(1) 
      comps.append((max_/min_ - 1) * 100) 
    return pd.concat(comps, axis=1) 

その後、私は遅れを取得し、それらを比較:

print get_comps(get_lags(df.adjclose, 2)) 



      0   1 
0 0.000000 0.000000 
1 5.119009 0.000000 
2 4.110168 0.969013 
3 1.131418 5.288089 
4 0.662817 0.465515 
print df 

     date  open close adjclose 
0 19980102 20.3835 20.4417 0.984507 
1 19980105 20.5097 20.5679 1.034904 
2 19980106 20.1408 20.0826 0.994047 
3 19980107 20.1408 20.9950 0.982926 
4 19980108 21.1115 20.0244 0.989441 

は、その後、私はこれらの関数を作成しました:私はこのデータフレームで始まった

フィナlly、dfと連結する

print pd.concat([df, get_comps(get_lags(df.adjclose, 2))], axis=1) 

     date  open close adjclose   0   1 
0 19980102 20.3835 20.4417 0.984507 0.000000 0.000000 
1 19980105 20.5097 20.5679 1.034904 5.119009 0.000000 
2 19980106 20.1408 20.0826 0.994047 4.110168 0.969013 
3 19980107 20.1408 20.9950 0.982926 1.131418 5.288089 
4 19980108 21.1115 20.0244 0.989441 0.662817 0.465515 

必要に応じて変更してください。

関連する問題