bugの内容
概要
pandasのpct_change関数をgroup byと共に使用する際に、group毎にpct_changeを区切って実行してくれないという事象が発生していた。(pandas 0.24.0で修正済み。)
何をしたかったのか
以下に参考用のテーブルを用意した。
このデータのValueのpct_changeをして、昨対比(MoM)を見たいという場面を想定。
Company | Group | Date | Value |
---|---|---|---|
A | X | 2015-01 | 1 |
A | X | 2015-02 | 2 |
A | X | 2015-03 | 1.5 |
A | XX | 2015-01 | 1 |
A | XX | 2015-02 | 1.5 |
A | XX | 2015-03 | 0.75 |
A | XX | 2015-04 | 1 |
B | Y | 2015-01 | 1 |
B | Y | 2015-02 | 1.5 |
B | Y | 2015-03 | 2 |
B | Y | 2015-04 | 3 |
B | YY | 2015-01 | 2 |
B | YY | 2015-02 | 2.5 |
B | YY | 2015-03 | 3 |
Company, Group, Dateでgroup byをして、Valueのpct_changeを実施する。
df['Pct_change'] = df.sort_values('Date').groupby(['Company', 'Group']).Value.pct_change()
欲しかった結果
Company | Group | Date | Value | Pct_change |
---|---|---|---|---|
A | X | 2015-01 | 1 | NaN |
A | X | 2015-02 | 2 | 1 |
A | X | 2015-03 | 1.5 | -0.25 |
A | XX | 2015-01 | 1 | NaN |
A | XX | 2015-02 | 1.5 | 0.5 |
A | XX | 2015-03 | 0.75 | -0.5 |
A | XX | 2015-04 | 1 | 0.33 |
B | Y | 2015-01 | 1 | NaN |
B | Y | 2015-02 | 1.5 | 0.5 |
B | Y | 2015-03 | 2 | 0.33 |
B | Y | 2015-04 | 3 | 0.5 |
B | YY | 2015-01 | 2 | NaN |
B | YY | 2015-02 | 2.5 | 0.25 |
B | YY | 2015-03 | 3 | 0.2 |
実際に吐き出された結果
Company | Group | Date | Value | Pct_change |
---|---|---|---|---|
A | X | 2015-01 | 1 | NaN |
A | X | 2015-02 | 2 | 1 |
A | X | 2015-03 | 1.5 | -0.25 |
A | XX | 2015-01 | 1 | -0.33 |
A | XX | 2015-02 | 1.5 | 0.5 |
A | XX | 2015-03 | 0.75 | -0.5 |
A | XX | 2015-04 | 1 | 0.33 |
B | Y | 2015-01 | 1 | 0 |
B | Y | 2015-02 | 1.5 | 0.5 |
B | Y | 2015-03 | 2 | 0.33 |
B | Y | 2015-04 | 3 | 0.5 |
B | YY | 2015-01 | 2 | -0.33 |
B | YY | 2015-02 | 2.5 | 0.25 |
B | YY | 2015-03 | 3 | 0.2 |
要は、group_byの最初のrow(ex.4行目)のPct_changeカラムに-0.33と入ってしまう。
ここはgroupが違うので、NaNであるべきなのに。
解決方法
概要
pandasのversionを0.24.0にupしましょう。
sample
anaconda userはterminalを立ち上げて、以下のコマンドを打ちましょう。
conda install pandas=0.24.0
参考
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pct_change.html
https://stackoverflow.com/questions/40273251/pandas-groupby-with-pct-change
https://github.com/pandas-dev/pandas/issues/21200