前年同期比を比較し、条件を満たす商品だけ取り出したい
解決したいこと
商品の前年売上同期比を計算し、前年比で全てプラスになっている商品名を抜き取りたい。
まず、現在利用しているソフトからデータを出力すると、下表のようなデータが得られる。
実際には商品が100種以上は出てくるが、長いので割愛。
ここで、売上は通期の売上であり、2Qの売上は1Qを含み、3Qの売上は1Qと2Qを含む形になっている。
例:商品名Aの2019年2Qの売上は2500となっているが、これは1Qの2000+2Qの売上、となるので、実質の2Qの売上は2500-2000=500である。
ここから、最新の前年同期比が通年でプラスになっている商品だけを抜き取るという作業をしたい。
図 全体仕様
自分で試したこと
まず、元データのサンプルはこちら
元データ
import pandas as pd
import numpy as np
from pandas import Timestamp
data= {'商品コード': {0: 1001, 1: 1001, 2: 1001, 3: 1001, 4: 1001, 5: 1001, 6: 1001, 7: 1001, 8: 1001, 9: 1001, 10: 1001, 11: 1001, 12: 1002, 13: 1002, 14: 1002, 15: 1002, 16: 1002, 17: 1002, 18: 1002, 19: 1002, 20: 1003, 21: 1003, 22: 1003, 23: 1003}, '商品名': {0: 'A', 1: 'A', 2: 'A', 3: 'A', 4: 'A', 5: 'A', 6: 'A', 7: 'A', 8: 'A', 9: 'A', 10: 'A', 11: 'A', 12: 'B', 13: 'B', 14: 'B', 15: 'B', 16: 'B', 17: 'B', 18: 'B', 19: 'B', 20: 'C', 21: 'C', 22: 'C', 23: 'C'},
'年度': {0: Timestamp('2019-04-01 00:00:00'), 1: Timestamp('2019-04-01 00:00:00'), 2: Timestamp('2019-04-01 00:00:00'), 3: Timestamp('2019-04-01 00:00:00'), 4: Timestamp('2020-04-01 00:00:00'), 5: Timestamp('2020-04-01 00:00:00'), 6: Timestamp('2020-04-01 00:00:00'), 7: Timestamp('2020-04-01 00:00:00'), 8: Timestamp('2021-04-01 00:00:00'), 9: Timestamp('2021-04-01 00:00:00'), 10: Timestamp('2021-04-01 00:00:00'), 11: Timestamp('2021-04-01 00:00:00'),12: Timestamp('2020-04-01 00:00:00'), 13: Timestamp('2020-04-01 00:00:00'), 14: Timestamp('2020-04-01 00:00:00'), 15: Timestamp('2020-04-01 00:00:00'), 16: Timestamp('2021-04-01 00:00:00'), 17: Timestamp('2021-04-01 00:00:00'), 18: Timestamp('2021-04-01 00:00:00'), 19: Timestamp('2021-04-01 00:00:00'), 20: Timestamp('2021-04-01 00:00:00'), 21: Timestamp('2021-04-01 00:00:00'), 22: Timestamp('2021-04-01 00:00:00'), 23: Timestamp('2021-04-01 00:00:00')},
'期': {0: '1Q', 1: '2Q', 2: '3Q', 3: '4Q', 4: '1Q', 5: '2Q', 6: '3Q', 7: '4Q', 8: '1Q', 9: '2Q', 10: '3Q', 11: '4Q', 12: '1Q', 13: '2Q', 14: '3Q', 15: '4Q', 16: '1Q', 17: '2Q', 18: '3Q', 19: '4Q', 20: '1Q', 21: '2Q', 22: '3Q', 23: '4Q'},
'売上': {0: 2000, 1: 2500, 2: 4500, 3: 5700, 4: 3000, 5: 3500, 6: 6800, 7: 7700, 8: 4000, 9: 4600, 10: 8000, 11: 9000, 12: 500, 13: 5000, 14: 6200, 15: 9400, 16: 2000, 17: 6000, 18: 6500, 19: 8500, 20: 200, 21: 300, 22: 400, 23: 600}}
df_raw = pd.DataFrame(data)
これを整理するのはpivotで問題なく可能
データの整理
df = df_raw.pivot(index=["商品コード","商品名","年度"],columns=["期"],values=["売上"])
df.columns =df.columns.droplevel(0)
df=df.rename_axis(None, axis=1)
>>>print(df)
1Q 2Q 3Q 4Q
商品コード 商品名 年度
1001 A 2019-04-01 2000 2500 4500 5700
2020-04-01 3000 3500 6800 7700
2021-04-01 4000 4600 8000 9000
1002 B 2020-04-01 500 5000 6200 9400
2021-04-01 2000 6000 6500 8500
1003 C 2021-04-01 200 300 400 600
また、通期売上を期別売上にするのもdiffを使えばできました
通期売上を期別売上に変更
df_diff = df.diff(axis=1)
df_diff["1Q"]=df["1Q"]
>>>print(df_diff)
1Q 2Q 3Q 4Q
商品コード 商品名 年度
1001 A 2019-04-01 2000 500.0 2000.0 1200.0
2020-04-01 3000 500.0 3300.0 900.0
2021-04-01 4000 600.0 3400.0 1000.0
1002 B 2020-04-01 500 4500.0 1200.0 3200.0
2021-04-01 2000 4000.0 500.0 2000.0
1003 C 2021-04-01 200 100.0 100.0 200.0
問題はここからで、「商品ごとに前年同期比を追加する(diffを使うと、全行に対して差分を取ってしまう)」作業が上手く行きませんでした。
なにか上手い手があれば、どうぞご教授いただきたく。
0