【问题标题】:How to exactly compute percentage change with NaN in DataFrame for each day?如何准确计算 DataFrame 中 NaN 每天的百分比变化?
【发布时间】:2018-02-06 17:31:23
【问题描述】:

我想计算这个 DataFrame (frame_) 的每日百分比变化:

import pandas as pd
import numpy as np
data_ = {
    'A':[1,np.NaN,2,1,1,2],
    'B':[1,2,3,1,np.NaN,1],
    'C':[1,2,np.NaN,1,1,2],
       }
dates_ = [
    '06/01/2018','05/01/2018','04/01/2018','03/01/2018','02/01/2018', '01/01/2018'
    ]

frame_ = pd.DataFrame(data_, index=dates_, columns=['A','B','C'])

问题是我用这个方法得到了一个 DataFrame:

returns_ = frame_.pct_change(periods=1, fill_method='pad')

dates,A,B,C
06/01/2018,,,
05/01/2018,,1.0,1.0
04/01/2018,1.0,0.5,
03/01/2018,-0.5,-0.6666666666666667,-0.5
02/01/2018,0.0,,0.0
01/01/2018,1.0,0.0,1.0

这不是我想要的。而且 dropna() 方法也没有给我我想要的结果。我想为没有价值或 NaN 的那一天计算一个价值和 NaN 的每一天的价值。例如,在 A 列:我希望看到的百分比变化

dates,A
06/01/2018,1
05/01/2018,
04/01/2018,1.0
03/01/2018,-0.5
02/01/2018,0.0
01/01/2018,1.0

在此先感谢

【问题讨论】:

  • 为什么df.pct_change(1, fill_method='pad') 不是您想要的?因为第一个值?
  • 是的,我需要使用 06/01/2018 和 04/01/2018 的值来计算每日百分比变化。因此这种方法是不正确的。
  • 如果我没有遗漏任何东西,df.pct_change(1, fill_method='pad').fillna(df) 应该可以工作吗?
  • 这行得通,谢谢你,ayhan

标签: python pandas dataframe


【解决方案1】:

这是一种方法,有点蛮力。

import pandas as pd
import numpy as np
data_ = {
    'A':[1,np.NaN,2,1,1,2],
    'B':[1,2,3,1,np.NaN,1],
    'C':[1,2,np.NaN,1,1,2],
       }
dates_ = [
    '06/01/2018','05/01/2018','04/01/2018','03/01/2018','02/01/2018', '01/01/2018'
    ]

frame_ = pd.DataFrame(data_, index=dates_, columns=['A','B','C'])
frame_ = pd.concat([frame_, pd.DataFrame(columns=['dA', 'dB', 'dC'])])

for col in ['A', 'B', 'C']:
    frame_['d'+col] = frame_[col].pct_change()
    frame_.loc[pd.notnull(frame_[col]) & pd.isnull(frame_['d'+col]), 'd'+col] = frame_[col]

#               A    B    C   dA        dB   dC
# 06/01/2018  1.0  1.0  1.0  1.0  1.000000  1.0
# 05/01/2018  NaN  2.0  2.0  NaN  1.000000  1.0
# 04/01/2018  2.0  3.0  NaN  1.0  0.500000  NaN
# 03/01/2018  1.0  1.0  1.0 -0.5 -0.666667 -0.5
# 02/01/2018  1.0  NaN  1.0  0.0       NaN  0.0
# 01/01/2018  2.0  1.0  2.0  1.0  0.000000  1.0

【讨论】:

  • 蛮力(我的风格也是:))但对于我正在寻找的东西非常有效和正确,谢谢 jp_data_analysis
猜你喜欢
  • 1970-01-01
  • 2021-10-15
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多