pivot_table droplevel groupby mergeの例 として、当日の勝敗と前X日の勝敗の集計をまとめたデータを作る。
元データ
日付 | 銘柄 | 勝敗 |
---|---|---|
2021-01-01 00:00:00 | M100 | 大勝 |
2021-01-02 00:00:00 | M100 | 小勝 |
2021-01-03 00:00:00 | M100 | 負 |
2021-01-04 00:00:00 | M100 | 取引なし |
2021-01-05 00:00:00 | M100 | 大勝 |
2021-01-06 00:00:00 | M100 | 小勝 |
2021-01-08 00:00:00 | M100 | 取引なし |
2021-01-01 00:00:00 | M200 | 大勝 |
2021-01-02 00:00:00 | M200 | 小勝 |
2021-01-03 00:00:00 | M200 | 負 |
2021-01-04 00:00:00 | M200 | 取引なし |
2021-01-08 00:00:00 | M200 | 取引なし |
最終的なイメージのデータ
上記元データに 前2日の勝敗の集計を追加したデータを作成する。
勝敗 | 前日まで_取引なし | 前日まで_大勝 | 前日まで_小勝 | 前日まで_負 | |
---|---|---|---|---|---|
('M100', Timestamp('2021-01-01 00:00:00')) | 大勝 | nan | nan | nan | nan |
('M100', Timestamp('2021-01-02 00:00:00')) | 小勝 | 0 | 1 | 0 | 0 |
('M100', Timestamp('2021-01-03 00:00:00')) | 負 | 0 | 1 | 1 | 0 |
('M100', Timestamp('2021-01-04 00:00:00')) | 取引なし | 0 | 0 | 1 | 1 |
('M100', Timestamp('2021-01-05 00:00:00')) | 大勝 | 1 | 0 | 0 | 1 |
('M100', Timestamp('2021-01-06 00:00:00')) | 小勝 | 1 | 1 | 0 | 0 |
('M100', Timestamp('2021-01-08 00:00:00')) | 取引なし | 0 | 1 | 1 | 0 |
('M200', Timestamp('2021-01-01 00:00:00')) | 大勝 | nan | nan | nan | nan |
('M200', Timestamp('2021-01-02 00:00:00')) | 小勝 | 0 | 1 | 0 | 0 |
('M200', Timestamp('2021-01-03 00:00:00')) | 負 | 0 | 1 | 1 | 0 |
('M200', Timestamp('2021-01-04 00:00:00')) | 取引なし | 0 | 0 | 1 | 1 |
('M200', Timestamp('2021-01-08 00:00:00')) | 取引なし | 1 | 0 | 0 | 1 |
手順
サンプルデータ作成
import pandas as pd
# 基本となるデータ
col=["日付" , "銘柄" , "勝敗"]
dt=[
["2021/1/1" , "M100" , "大勝" ] ,
["2021/1/2" , "M100" , "小勝" ] ,
["2021/1/3" , "M100" , "負" ] ,
["2021/1/4" , "M100" , "取引なし" ] ,
["2021/1/5" , "M100" , "大勝" ] ,
["2021/1/6" , "M100" , "小勝" ] ,
["2021/1/8" , "M100" , "取引なし" ] ,
["2021/1/1" , "M200" , "大勝" ] ,
["2021/1/2" , "M200" , "小勝" ] ,
["2021/1/3" , "M200" , "負" ] ,
["2021/1/4" , "M200" , "取引なし" ] ,
["2021/1/8" , "M200" , "取引なし" ] ,
]
df0=pd.DataFrame(dt,columns=col)
df0["日付"]=pd.to_datetime(df0["日付"])
df0.sort_values(["銘柄" , "日付"] ,inplace=True)
df0.set_index("日付",inplace=True)
print(df0.to_markdown())
日付 | 銘柄 | 勝敗 |
---|---|---|
2021-01-01 00:00:00 | M100 | 大勝 |
2021-01-02 00:00:00 | M100 | 小勝 |
2021-01-03 00:00:00 | M100 | 負 |
2021-01-04 00:00:00 | M100 | 取引なし |
2021-01-05 00:00:00 | M100 | 大勝 |
2021-01-06 00:00:00 | M100 | 小勝 |
2021-01-08 00:00:00 | M100 | 取引なし |
2021-01-01 00:00:00 | M200 | 大勝 |
2021-01-02 00:00:00 | M200 | 小勝 |
2021-01-03 00:00:00 | M200 | 負 |
2021-01-04 00:00:00 | M200 | 取引なし |
2021-01-08 00:00:00 | M200 | 取引なし |
前日までの勝敗の集計を作る。
#日、銘柄ごとに'勝敗'を横展開する
df1=df0.copy()
df1["cnt"]=1
df1=df1.pivot_table(index=['銘柄',"日付" ], columns='勝敗' , aggfunc="count" , fill_value=0).copy()
df1=df1.droplevel(None, axis=1)
df1.reset_index( inplace=True)
df1.set_index("日付" , inplace=True)
print(df1.to_markdown())
日付 | 銘柄 | 取引なし | 大勝 | 小勝 | 負 |
---|---|---|---|---|---|
2021-01-01 00:00:00 | M100 | 0 | 1 | 0 | 0 |
2021-01-02 00:00:00 | M100 | 0 | 0 | 1 | 0 |
2021-01-03 00:00:00 | M100 | 0 | 0 | 0 | 1 |
2021-01-04 00:00:00 | M100 | 1 | 0 | 0 | 0 |
2021-01-05 00:00:00 | M100 | 0 | 1 | 0 | 0 |
2021-01-06 00:00:00 | M100 | 0 | 0 | 1 | 0 |
2021-01-08 00:00:00 | M100 | 1 | 0 | 0 | 0 |
2021-01-01 00:00:00 | M200 | 0 | 1 | 0 | 0 |
2021-01-02 00:00:00 | M200 | 0 | 0 | 1 | 0 |
2021-01-03 00:00:00 | M200 | 0 | 0 | 0 | 1 |
2021-01-04 00:00:00 | M200 | 1 | 0 | 0 | 0 |
2021-01-08 00:00:00 | M200 | 1 | 0 | 0 | 0 |
#日、銘柄ごとに2日分の集計をする
df_r=df1.groupby(["銘柄"]).rolling("2d").sum().copy()
print(df_r.to_markdown())
取引なし | 大勝 | 小勝 | 負 | |
---|---|---|---|---|
('M100', Timestamp('2021-01-01 00:00:00')) | 0 | 1 | 0 | 0 |
('M100', Timestamp('2021-01-02 00:00:00')) | 0 | 1 | 1 | 0 |
('M100', Timestamp('2021-01-03 00:00:00')) | 0 | 0 | 1 | 1 |
('M100', Timestamp('2021-01-04 00:00:00')) | 1 | 0 | 0 | 1 |
('M100', Timestamp('2021-01-05 00:00:00')) | 1 | 1 | 0 | 0 |
('M100', Timestamp('2021-01-06 00:00:00')) | 0 | 1 | 1 | 0 |
('M100', Timestamp('2021-01-08 00:00:00')) | 1 | 0 | 0 | 0 |
('M200', Timestamp('2021-01-01 00:00:00')) | 0 | 1 | 0 | 0 |
('M200', Timestamp('2021-01-02 00:00:00')) | 0 | 1 | 1 | 0 |
('M200', Timestamp('2021-01-03 00:00:00')) | 0 | 0 | 1 | 1 |
('M200', Timestamp('2021-01-04 00:00:00')) | 1 | 0 | 0 | 1 |
('M200', Timestamp('2021-01-08 00:00:00')) | 1 | 0 | 0 | 0 |
#前日までの集計結果を当日に割り当てる(SHIFT(1))
df_r2=df_r.groupby(["銘柄"]).shift(1).copy()
#カラム名を変更する
df_r2.rename(columns={
'取引なし': '前日まで_取引なし' ,
'大勝': '前日まで_大勝' ,
'小勝': '前日まで_小勝',
'負' : '前日まで_負',
},inplace=True)
print(df_r2.to_markdown())
前日まで_取引なし | 前日まで_大勝 | 前日まで_小勝 | 前日まで_負 | |
---|---|---|---|---|
('M100', Timestamp('2021-01-01 00:00:00')) | nan | nan | nan | nan |
('M100', Timestamp('2021-01-02 00:00:00')) | 0 | 1 | 0 | 0 |
('M100', Timestamp('2021-01-03 00:00:00')) | 0 | 1 | 1 | 0 |
('M100', Timestamp('2021-01-04 00:00:00')) | 0 | 0 | 1 | 1 |
('M100', Timestamp('2021-01-05 00:00:00')) | 1 | 0 | 0 | 1 |
('M100', Timestamp('2021-01-06 00:00:00')) | 1 | 1 | 0 | 0 |
('M100', Timestamp('2021-01-08 00:00:00')) | 0 | 1 | 1 | 0 |
('M200', Timestamp('2021-01-01 00:00:00')) | nan | nan | nan | nan |
('M200', Timestamp('2021-01-02 00:00:00')) | 0 | 1 | 0 | 0 |
('M200', Timestamp('2021-01-03 00:00:00')) | 0 | 1 | 1 | 0 |
('M200', Timestamp('2021-01-04 00:00:00')) | 0 | 0 | 1 | 1 |
('M200', Timestamp('2021-01-08 00:00:00')) | 1 | 0 | 0 | 1 |
最後に当日データとマージして完成
df4=pd.merge(df3,df_r2,left_index=True , right_index=True)
print(df4.to_markdown())
勝敗 | 前日まで_取引なし | 前日まで_大勝 | 前日まで_小勝 | 前日まで_負 | |
---|---|---|---|---|---|
('M100', Timestamp('2021-01-01 00:00:00')) | 大勝 | nan | nan | nan | nan |
('M100', Timestamp('2021-01-02 00:00:00')) | 小勝 | 0 | 1 | 0 | 0 |
('M100', Timestamp('2021-01-03 00:00:00')) | 負 | 0 | 1 | 1 | 0 |
('M100', Timestamp('2021-01-04 00:00:00')) | 取引なし | 0 | 0 | 1 | 1 |
('M100', Timestamp('2021-01-05 00:00:00')) | 大勝 | 1 | 0 | 0 | 1 |
('M100', Timestamp('2021-01-06 00:00:00')) | 小勝 | 1 | 1 | 0 | 0 |
('M100', Timestamp('2021-01-08 00:00:00')) | 取引なし | 0 | 1 | 1 | 0 |
('M200', Timestamp('2021-01-01 00:00:00')) | 大勝 | nan | nan | nan | nan |
('M200', Timestamp('2021-01-02 00:00:00')) | 小勝 | 0 | 1 | 0 | 0 |
('M200', Timestamp('2021-01-03 00:00:00')) | 負 | 0 | 1 | 1 | 0 |
('M200', Timestamp('2021-01-04 00:00:00')) | 取引なし | 0 | 0 | 1 | 1 |
('M200', Timestamp('2021-01-08 00:00:00')) | 取引なし | 1 | 0 | 0 | 1 |