python pandas groupby вычислить изменение

Я хочу рассчитать изменение значения по группе.

Это кадр данных 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 они не меняются.

Я не знаю, как к этому подойти, так как в группе А значения сначала уменьшаются, а затем увеличиваются. Так я должен смотреть на среднее изменение или самое последнее изменение?

Должен ли я использовать pct_change? http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.pct_change.html Я не был уверен, как указать временные рамки для этого.

df.groupby.pct_change

Было бы здорово, если бы я тоже мог это визуализировать. Любые советы или подсказки очень ценятся! Спасибо


person jeangelj    schedule 03.01.2017    source источник


Ответы (1)


использовать pct_change в groupby

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()

введите здесь описание изображения


настройка

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])
person piRSquared    schedule 03.01.2017
comment
большое спасибо, есть ли способ создать новый фрейм данных, в котором один столбец будет группой, а второй столбец будет средним изменением? - person jeangelj; 04.01.2017
comment
@jeangelj ты имеешь в виду стандартное отклонение? - person piRSquared; 04.01.2017
comment
нет - я могу получить SD с помощью .describe(); Я ищу среднее изменение, поэтому что-то вроде этого df_group = df.groupby('Group') df_new = df_group['Value'].pct_change().mean() - person jeangelj; 04.01.2017
comment
Да, это можно сделать. Не совсем так, как вы написали, но можно. df_group.Value.apply(lambda df: df.pct_change().mean()) Но результаты pct_mean() колеблются около нуля и могут приглушить ваши наблюдения относительно того, насколько он меняется. df_group.Value.apply(lambda df: df.pct_change().abs().mean()) может быть лучше. - person piRSquared; 04.01.2017
comment
благодарю вас; когда я использую второй вариант, я получаю не отрицательные значения, а только положительные и инф. - person jeangelj; 04.01.2017