Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

指定した月からの累積和

解決したいこと

pythonでのデータ分析で思うようにいかず困っています。

例)
下記のようなデータフレームがあるとします。
商品が3つ(a,b,c)で、発売開始日がそれぞれ2021/8/1, 2021/9/1, 2021/10/1。
sale列は売上個数です。

image.png
month product start sale
2021/8/1 a 2021/8/1 32
2021/9/1 a 2021/8/1 56
2021/10/1 b 2021/9/1 454
2021/11/1 c 2021/10/1 45
2021/12/1 a 2021/8/1 84
2022/1/1 a 2021/8/1 54
2022/2/1 c 2021/10/1 5465
2022/3/1 c 2021/10/1 545
2022/4/1 b 2021/9/1 548
2022/5/1 a 2021/8/1 78
2022/6/1 c 2021/10/1 78
2021/8/1 a 2021/8/1 8
2021/9/1 a 2021/8/1 45
2021/10/1 b 2021/9/1 56
2021/11/1 c 2021/10/1 55
2021/12/1 a 2021/8/1 554
2022/1/1 a 2021/8/1 84
2022/2/1 c 2021/10/1 71
2022/3/1 c 2021/10/1 11
2022/4/1 b 2021/9/1 548
2022/5/1 a 2021/8/1 0
2022/6/1 c 2021/10/1 7

自分で試したこと

もともとはエクセルの時系列横持データだったものを縦持ちにしたものです。

ここで、a,b,cの商品発売6か月間の売上総数をそれぞれ算出して新たなデータフレームを作るにはどうしたらいいでしょうか。
a,b,cの開始月が同じならまとめてできるのですが、商品ごとに開始月が違うので総和を求めるのに苦労しています。
pandasのresample, cumsumなどを使うのでしょうか。

0

2Answer

ご返事遅くなり申し訳ありません。

ご回答ありがとうございます。pd.DataOffsetのメソッドは知らなかったので勉強になりました。

サンプルではうまくいくようですが、実務データだと

df_new = df[df['month'] < df['start'] + pd.DateOffset(months=6)]

の命令で関係のない月(その年の1月から)のデータまで抽出してしまい、どうもうまくいきません。
時間を作って再度質問させていただきます。
取り急ぎお礼まで。

1Like

カラムmonthstartから、商品が発売されてから6か月以内のレコードを抽出するのはどうでしょうか。

data.csv
month,product,start,sale
2021/8/1,a,2021/8/1,32
2021/9/1,a,2021/8/1,56
2021/10/1,b,2021/9/1,454
2021/11/1,c,2021/10/1,45
2021/12/1,a,2021/8/1,84
2022/1/1,a,2021/8/1,54
2022/2/1,c,2021/10/1,5465
2022/3/1,c,2021/10/1,545
2022/4/1,b,2021/9/1,548
2022/5/1,a,2021/8/1,78
2022/6/1,c,2021/10/1,78
2021/8/1,a,2021/8/1,8
2021/9/1,a,2021/8/1,45
2021/10/1,b,2021/9/1,56
2021/11/1,c,2021/10/1,55
2021/12/1,a,2021/8/1,554
2022/1/1,a,2021/8/1,84
2022/2/1,c,2021/10/1,71
2022/3/1,c,2021/10/1,11
2022/4/1,b,2021/9/1,548
2022/5/1,a,2021/8/1,0
2022/6/1,c,2021/10/1,7
>>> import pandas as pd
>>> df = pd.read_csv('data.csv', parse_dates=['month','start'])  # monthとstart列は日付形式としてパースする
>>> df_new = df[df['month'] < df['start'] + pd.DateOffset(months=6)]
>>> df_new
        month product      start  sale
0  2021-08-01       a 2021-08-01    32
1  2021-09-01       a 2021-08-01    56
2  2021-10-01       b 2021-09-01   454
3  2021-11-01       c 2021-10-01    45
4  2021-12-01       a 2021-08-01    84
5  2022-01-01       a 2021-08-01    54
6  2022-02-01       c 2021-10-01  5465
7  2022-03-01       c 2021-10-01   545
11 2021-08-01       a 2021-08-01     8
12 2021-09-01       a 2021-08-01    45
13 2021-10-01       b 2021-09-01    56
14 2021-11-01       c 2021-10-01    55
15 2021-12-01       a 2021-08-01   554
16 2022-01-01       a 2021-08-01    84
17 2022-02-01       c 2021-10-01    71
18 2022-03-01       c 2021-10-01    11
>>> df_new.groupby('product').sum()
         sale
product
a         917
b         510
c        6192
0Like

Your answer might help someone💌