【问题标题】:How to calculate percent change compared to the beginning value using pandas?如何使用熊猫计算与起始值相比的百分比变化?
【发布时间】:2016-05-07 12:59:08
【问题描述】:

我有一个DataFrame,需要计算公司与年初相比的百分比变化。有没有办法使用pct_change() 或其他方法来执行此任务?谢谢!

df 看起来像

security    date        price
IBM         1/1/2016    100
IBM         1/2/2016    102
IBM         1/3/2016    108
AAPL        1/1/2016    1000
AAPL        1/2/2016    980
AAPL        1/3/2016    1050
AAPL        1/4/2016    1070

我想要的结果

security    date        price   change
IBM         1/1/2016    100     NA
IBM         1/2/2016    102     2%
IBM         1/3/2016    108     8%
AAPL        1/1/2016    1000    NA
AAPL        1/2/2016    980     -2%
AAPL        1/3/2016    1050    5%
AAPL        1/4/2016    1070    7%

【问题讨论】:

  • 首先拆分您的数据框,然后使用 pct_change() 计算每个日期的百分比变化。
  • 如果我执行 df.groupby('security')['price'].pct_change(),这将给我与前几天相比的百分比变化。但是,我需要的是与 100 和 1000 相比的百分比变化。有什么想法吗?

标签: python pandas dataframe percentage


【解决方案1】:

听起来您正在寻找expanding_window 版本的pct_change()。这不存在开箱即用的 AFAIK,但您可以自己推出:

df.groupby('security')['price'].apply(lambda x: x.div(x.iloc[0]).subtract(1).mul(100))

【讨论】:

  • 我喜欢你的一个班轮!我认为这个“与开始相比”对于pct_change() 来说可能是一个不错的功能
  • 要么添加一个expanding_pct_change() 到文档中提到的扩展窗口函数。还有expanding_apply,顺便看Cookbook:pandas.pydata.org/pandas-docs/stable/cookbook.html
【解决方案2】:

这可行,假设您已经在每个可能的分组中按日期排序。

def pct_change(df):
    df['pct'] = 100 * (1 - df.iloc[0].price / df.price)
    return df

df.groupby('security').apply(pct_change)

【讨论】:

    【解决方案3】:

    我也遇到了同样的问题,但是用他的方法解决了:

    (唯一的区别是列是您的公司,而不是行。)

    对于我所做的数据框的每一列:

    df[column] = df[column].pct_change().cumsum()

    pct_change() 计算现在和最后一个值之间的变化,cumcum() 将它们加在一起。

    【讨论】:

    • x.pct_change().cumsum() 对于 1000、500、300 的系列将等于 [-0.5, -0.9],这显然是不正确的。 cumum 将再次添加以前价格​​的百分比,而不是第一个价格
    • 但要继续这个想法,在某些情况下 x.pct_change().cumprod().cumsum() 可能会起作用(您必须将初始值设置为零并加一才能累积改变
    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 2021-01-05
    • 2020-04-17
    • 2023-01-02
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多