计算数据帧的每日回报/增量

时间:2016-04-12 12:14:53

标签: python pandas dataframe

所以我有一些时间序列数据,我想计算每日回报/增量,其中每日增量= value_at_time(T)/ value_at_time(T-1)

import pandas as pd
df=pd.DataFrame([1,2,3,7]) #Sample data frame
df[1:]
out:
 0
 1  2
 2  3
 3  7
df[:-1]
out: 
    0
 0  1
 1  2
 2  3
######### Method 1
df[1:]/df[:-1]
out:
    0
0 NaN
1   1
2   1
3 NaN

######### Method 2
df[1:]/df[:-1].values
out:
          0
1  2.000000
2  1.500000
3  2.333333

######### Method 3
df[1:].values/df[:-1]
out:
   0
0  2
1  1
2  2

我的问题是那个

  1. 如果df [: - 1]和df [1:]只有三个值(行的切片) dataframe)那么为什么Method_1不起作用?
  2. 为什么方法2& 3几乎相似,给出不同的结果?
  3. 为什么在Method_2中使用.values使其正常工作

1 个答案:

答案 0 :(得分:2)

让我们看看每个

方法1,如果您查看切片返回的内容,您可以看到索引不对齐:

In [87]:
print(df[1:])
print(df[:-1])

   0
1  2
2  3
3  7
   0
0  1
1  2
2  3

那么分裂时只有2列相交:

In [88]:
df[1:]/df[:-1]

Out[88]:
     0
0  NaN
1  1.0
2  1.0
3  NaN

方法2产生一个np数组,它没有索引,所以除法将按照预期的顺序按顺序执行:

In [89]:
df[:-1].values

Out[89]:
array([[1],
       [2],
       [3]], dtype=int64)

,并提供:

In [90]:
df[1:]/df[:-1].values

Out[90]:
          0
1  2.000000
2  1.500000
3  2.333333

方法3与方法2的原因相同

所以问题是如何在纯熊猫中做到这一点?我们使用shift允许您根据需要对齐索引:

In [92]:
df.shift(-1)/df

Out[92]:
          0
0  2.000000
1  1.500000
2  2.333333
3       NaN