大熊猫改变了价值计算

时间:2017-07-29 07:58:08

标签: python pandas

我想创建一个新列,其中包含根据其他列中的移位值计算的值。

正如您看到下面的代码,首先我创建了一个时间序列数据。

'价格'是随机生成的时间序列数据,动量是近12个周期的平均动量值。

我想添加一个新列,其中包含平均值为&n 39的数据。动量值,其中' n'对应于df [' shift']的值,而不是动量函数中固定的12值,而是“' shift'中的值。柱。

我该怎么做?

(在下面的例子中,动量是用固定的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 个答案:

答案 0 :(得分: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
相关问题