pivot_table droplevel shift groupby mergeの例 今日の成績を前日までの成績から予測するためのデータを作る。



#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   | 取引なし |

#最終的なイメージのデータ
上記元データに　前２日の勝敗の集計を追加したデータを作成する。

|                                            | 勝敗     |   前日まで_取引なし |   前日まで_大勝 |   前日まで_小勝 |   前日まで_負 |
|:-------------------------------------------|:---------|--------------------:|----------------:|----------------:|--------------:|
| ('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 |
​
#手順
##サンプルデータ作成
```PYTHON
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   | 取引なし |

##前日までの勝敗の集計を作る。
```PYTHON
#日、銘柄ごとに'勝敗'を横展開する
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 |

```PYTHON
#日、銘柄ごとに２日分の集計をする
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 |

```PYTHON
#前日までの集計結果を当日に割り当てる(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 |


#最後に当日データとマージして完成
```PYTHON
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 |