2017-07-29 21 views
1

他の列のシフト値から計算された値を含む新しい列を作成したいと思います。パンダシフト計算の計算

以下のコードを見ると、最初に時系列データを作成しました。

「価格」はランダムに生成された時系列データであり、運動量は最近の12期間の平均運動量値です。

平均 'n'拍動値のデータを含む新しい列を追加したいと思います。ここでnはdf ['shift']の値に対応し、拍動関数の固定値12ではありません「シフト」列の値を使用します。

どうすればいいですか?

(以下の例では、運動量は一定の12で計算した)

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.random.uniform(low=0.8, high=1.3, size=100).cumprod(),columns = ['price']) 
df['shift'] = np.random.randint(5, size=100)+3 
df 

def momentum(x): 
    init = 0 
    for i in range(1, 13): 
     init = x.price/x.price.shift(i) + init 
    return init/12 

df['momentum'] = momentum(df) 

     price shift momentum 
0 1.069857  3  NaN 
1 0.986563  7  NaN 
2 0.809052  5  NaN 
3 0.991204  3  NaN 
4 0.846159  6  NaN 
5 0.717344  4  NaN 
6 0.599436  3  NaN 
7 0.596711  7  NaN 
8 0.543450  4  NaN 
9 0.511640  3  NaN 
10 0.496865  3  NaN 
11 0.460142  4  NaN 
12 0.435862  4 0.657192 
13 0.410519  4 0.665493 
14 0.368428  5 0.640927 
15 0.335583  7 0.625128 
16 0.313470  7 0.635423 
17 0.321265  4 0.704990 
18 0.319503  7 0.746885 
19 0.365991  4 0.900135 
20 0.300793  4 0.766266 
21 0.274449  6 0.733104 

答えて

1

これは

def momentum(shift,price,array,index): 
    if shift > index: 
     return 0 
    else: 
     init = 0 
     for i in range(1,int(shift)+1): 
      init += price/array[int(index)-i] 
     return init 



df = pd.DataFrame(np.random.uniform(low=0.8, high=1.3, size=100).cumprod(),columns = ['price']) 
df['shift'] = np.random.randint(5, size=100)+3 
df['Index'] = df.index 
series = df['price'].tolist() 


df['momentum'] = df.apply(lambda row: momentum(row['shift'],row['price'],series,row['Index']),axis=1) 
print df 
+0

私のアプローチである、これはあなたの問題を解決していますか? – DJK