pandasのメソッドを活用してワンライナーでタイムシフト系列とか時刻のダミー変数DataFrameとかを作る

これすげー，と思ったので．
[Python/pandasのデータ処理で再帰代入撲滅委員会 \- Qiita](https://qiita.com/piroyoung/items/dd209801ca60a0b00c11)

# 要約

- まず，``.rename``がmapperを受け取ってcolumnsやindexに適用してくれることを知らなかった．
- それから``.set_index``がカラム名だけでなくセットしたいindexをそのまま受け取ってくれることも知らなかった．

pythonistにこういうことしたい，って聞くと
「pythonドキュメント嫁ｗｗｗ」
とか言われるから聞けなくて困っていたのだった．
上のこと知ってる人には当たり前の処理だと思うので読む必要なし．

# 題材

1. 10分毎に集計されている，ある時系列の回帰モデルを構築する時に，説明変数として時刻のダミー変数と用いたい．
1. 前日の同時刻のデータを説明変数としたい．

# 準備

まず元となる時系列を作る．

```python
import pandas
import numpy as np
from datetime import datetime,timedelta

ser = pandas.Series( [0,100]
                   , index=[datetime(2018,1,1),datetime(2018,2,1)]
                   , name='linear'
                   ).resample('10min').interpolate('linear')
```

生成された系列はこんな感じ．(ちょっと長いので手で短くした)
ちなみに，この作り方だと時系列の末尾が``2018-02-01 00:00:00``になってしまうので，注意．

```
>>> ser
2018-01-01 00:00:00      0.000000
2018-01-01 00:10:00      0.022401
2018-01-01 00:20:00      0.044803
2018-01-01 00:30:00      0.067204
2018-01-01 00:40:00      0.089606
2018-01-01 00:50:00      0.112007
2018-01-01 01:00:00      0.134409
2018-01-01 01:10:00      0.156810
2018-01-01 01:20:00      0.179211
2018-01-01 01:30:00      0.201613
2018-01-01 01:40:00      0.224014
                          ...
2018-01-31 22:20:00     99.775986
2018-01-31 22:30:00     99.798387
2018-01-31 22:40:00     99.820789
2018-01-31 22:50:00     99.843190
2018-01-31 23:00:00     99.865591
2018-01-31 23:10:00     99.887993
2018-01-31 23:20:00     99.910394
2018-01-31 23:30:00     99.932796
2018-01-31 23:40:00     99.955197
2018-01-31 23:50:00     99.977599
2018-02-01 00:00:00    100.000000
Freq: 10T, Name: linear, Length: 4465, dtype: float64
```

# 1. 時刻のダミー変数をDataFrameにおさめる

```python
jikoku = pandas.get_dummies(ser.index.time, drop_first=True).rename(columns=str).set_index(ser.index)
```

そして，できたものがこちら．(やっぱし長いので手で編集が…)
ちなみに``.rename(columns=str)``は，カラム名を後で処理する時に``datetime.time``オブジェクトだと困ることがあるので，ラベル化するために挟んでいる．

```
>>> jikoku
                     00:10:00  00:20:00  00:30:00  00:40:00  00:50:00  \
2018-01-01 00:00:00         0         0         0         0         0
2018-01-01 00:10:00         1         0         0         0         0
2018-01-01 00:20:00         0         1         0         0         0
2018-01-01 00:30:00         0         0         1         0         0
2018-01-01 00:40:00         0         0         0         1         0
2018-01-01 00:50:00         0         0         0         0         1
2018-01-01 01:00:00         0         0         0         0         0
2018-01-01 01:10:00         0         0         0         0         0
2018-01-01 01:20:00         0         0         0         0         0
2018-01-01 01:30:00         0         0         0         0         0
2018-01-01 01:40:00         0         0         0         0         0
...                       ...       ...       ...       ...       ...
2018-01-31 22:20:00         0         0         0         0         0
2018-01-31 22:30:00         0         0         0         0         0
2018-01-31 22:40:00         0         0         0         0         0
2018-01-31 22:50:00         0         0         0         0         0
2018-01-31 23:00:00         0         0         0         0         0
2018-01-31 23:10:00         0         0         0         0         0
2018-01-31 23:20:00         0         0         0         0         0
2018-01-31 23:30:00         0         0         0         0         0
2018-01-31 23:40:00         0         0         0         0         0
2018-01-31 23:50:00         0         0         0         0         0
2018-02-01 00:00:00         0         0         0         0         0

                       ...     23:20:00  23:30:00  23:40:00  23:50:00
2018-01-01 00:00:00    ...            0         0         0         0
2018-01-01 00:10:00    ...            0         0         0         0
2018-01-01 00:20:00    ...            0         0         0         0
2018-01-01 00:30:00    ...            0         0         0         0
2018-01-01 00:40:00    ...            0         0         0         0
2018-01-01 00:50:00    ...            0         0         0         0
2018-01-01 01:00:00    ...            0         0         0         0
2018-01-01 01:10:00    ...            0         0         0         0
2018-01-01 01:20:00    ...            0         0         0         0
2018-01-01 01:30:00    ...            0         0         0         0
2018-01-01 01:40:00    ...            0         0         0         0
...                    ...          ...       ...       ...       ...
2018-01-31 22:20:00    ...            0         0         0         0
2018-01-31 22:30:00    ...            0         0         0         0
2018-01-31 22:40:00    ...            0         0         0         0
2018-01-31 22:50:00    ...            0         0         0         0
2018-01-31 23:00:00    ...            0         0         0         0
2018-01-31 23:10:00    ...            0         0         0         0
2018-01-31 23:20:00    ...            1         0         0         0
2018-01-31 23:30:00    ...            0         1         0         0
2018-01-31 23:40:00    ...            0         0         1         0
2018-01-31 23:50:00    ...            0         0         0         1
2018-02-01 00:00:00    ...            0         0         0         0

[4465 rows x 143 columns]
```

# 2. タイムシフト系列を作る

```python
d7=ser.rename( index   = lambda x: x + timedelta(days=7)
             , columns = lambda x: 'd7_' + x
             )
```

できたものがこちら．

```
>>>d7
>>> y
2018-01-08 00:00:00      0.000000
2018-01-08 00:10:00      0.022401
2018-01-08 00:20:00      0.044803
2018-01-08 00:30:00      0.067204
2018-01-08 00:40:00      0.089606
2018-01-08 00:50:00      0.112007
2018-01-08 01:00:00      0.134409
2018-01-08 01:10:00      0.156810
2018-01-08 01:20:00      0.179211
2018-01-08 01:30:00      0.201613
2018-01-08 01:40:00      0.224014
                          ...
2018-02-07 22:20:00     99.775986
2018-02-07 22:30:00     99.798387
2018-02-07 22:40:00     99.820789
2018-02-07 22:50:00     99.843190
2018-02-07 23:00:00     99.865591
2018-02-07 23:10:00     99.887993
2018-02-07 23:20:00     99.910394
2018-02-07 23:30:00     99.932796
2018-02-07 23:40:00     99.955197
2018-02-07 23:50:00     99.977599
2018-02-08 00:00:00    100.000000
Name: linear, Length: 4465, dtype: float64
```