2017-07-29 87 views
1

我想創建一個新列,其中包含從其他列中的移位值計算出的值。大熊貓移位值計算

正如你看到下面的代碼,首先我創建了一個時間序列數據。

'價格'是隨機產生的時間序列數據,動量是最近12個週期的平均動量值。

我想添加一個新列,其中包含具有平均'n'動量值的數據,其中'n'對應於df ['shift']的值,而不是動量函數中的固定12值,但是在'shift'列中具有值。

我該怎麼做?

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

(在下面的例子中,動量與固定12計算)這是我的做法

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