2017-07-29 90 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