LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-01

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0