【问题标题】:computing daily return/increment on dataframe计算数据框的每日回报/增量
【发布时间】:2016-04-12 20:21:57
【问题描述】:

因此,我想计算一些时间序列数据以计算每日回报/增量,其中每日增量 = 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 会使其工作

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    让我们看看每个

    方法 1,如果您查看切片返回的内容,您会发现索引不对齐:

    In [87]:
    print(df[1:])
    print(df[:-1])
    
       0
    1  2
    2  3
    3  7
       0
    0  1
    1  2
    2  3
    

    那么什么时候除法只有两列相交:

    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
    

    【讨论】:

    • 感谢 EdChum,但另一个问题是 Method_3 虽然与 Method_2 完全相同,但没有给出相同的输出。虽然 Method_2 提供浮点输出,但 Method_3 将它们四舍五入,为什么会这样?订单反转发生了什么。
    • 我得到浮动,但我的 np 版本是 '1.10.4',pandas 版本是 '0.18.0' 和 python 3.4
    • pd.__version__ 0.17.1,numpy.__version__ '1.10.1'。我猜可能是 pandas 17.1 的错误
    • 可以,可以升级
    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多