Python Pandas分组计算变化

5
我想按组计算值的变化。
这是我拥有的 Python Pandas 数据框 df:
Group |   Date      | Value
  A     01-02-2016     16 
  A     01-03-2016     15 
  A     01-04-2016     14 
  A     01-05-2016     17 
  A     01-06-2016     19 
  A     01-07-2016     20 
  B     01-02-2016     16 
  B     01-03-2016     13 
  B     01-04-2016     13 
  C     01-02-2016     16 
  C     01-03-2016     16 

我想计算出A组的值正在上升,B组的值正在下降,而C组的值没有变化。
我不确定如何处理,因为在A组中,值最初会下降,然后再上升。所以我应该看平均变化还是最近的变化?
我应该使用pct_change吗?http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.pct_change.html 我不确定如何指定时间范围。
df.groupby.pct_change

如果我也能将其可视化,那就太好了。非常感谢您的任何建议或提示!谢谢。
1个回答

10

groupby 中使用 pct_change

d1 = df.set_index(['Date', 'Group']).Value
d2 = d1.groupby(level='Group').pct_change()
print(d2)

Date        Group
2016-01-02  A             NaN
2016-01-03  A       -0.062500
2016-01-04  A       -0.066667
2016-01-05  A        0.214286
2016-01-06  A        0.117647
2016-01-07  A        0.052632
2016-01-02  B             NaN
2016-01-03  B       -0.187500
2016-01-04  B        0.000000
2016-01-02  C             NaN
2016-01-03  C        0.000000
Name: Value, dtype: float64

有很多比较和可视化的方法,其中之一是看它们的增长方式。在这种情况下,我会

  • fillna(0)
  • add(1)
  • cumprod()

d2.fillna(0).add(1).cumprod().unstack().plot()

enter image description here


设置

from io import StringIO
import pandas as pd

txt = """Group   Date       Value
  A     01-02-2016     16 
  A     01-03-2016     15 
  A     01-04-2016     14 
  A     01-05-2016     17 
  A     01-06-2016     19 
  A     01-07-2016     20 
  B     01-02-2016     16 
  B     01-03-2016     13 
  B     01-04-2016     13 
  C     01-02-2016     16 
  C     01-03-2016     16 """

df = pd.read_clipboard(parse_dates=[1])

非常感谢,有没有一种方法可以创建一个新的数据框,其中一列是组,第二列是平均变化? - jeangelj
@jeangelj 你是指标准差吗? - piRSquared
不,我可以使用.describe()得到标准差。我正在寻找平均变化,所以代码应该是这样的:df_group = df.groupby('Group') df_new = df_group['Value'].pct_change().mean() - jeangelj
可以做到。虽然不完全按照您的写法,但是可以实现。df_group.Value.apply(lambda df: df.pct_change().mean()) 但是 pct_mean() 的结果会在零附近振荡,可能会减弱您对变化程度的观察。使用 df_group.Value.apply(lambda df: df.pct_change().abs().mean()) 可能更好。 - piRSquared
谢谢;当我使用第二个选项时,我不会得到负数,只有正数和“inf”。 - jeangelj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接