階差列を目的変数&時系列クロスバリデーションのサンプル共有

Baselineの共有(Public LB:21.73689)

要約

  1. LightGBM利用(NaNを含むため)
  2. 原系列ではなく階差列を予測
  3. クロスバリデーションは時系列特有の方法で実装
  4. 位置情報、天気情報は含めず(なかなかうまくいかないので発見求む)
import pandas as pd
pd.options.display.max_columns = 100
pd.options.display.max_rows = 999
import numpy as np
import math
import warnings
warnings.filterwarnings('ignore')

import lightgbm as lgb
from sklearn.metrics import mean_squared_error

%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import seaborn as sns

import datetime
import time

import gc
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
path = "/content/drive/MyDrive/tmp/7_probspace/3_taxi/"

train = pd.read_csv(path+'data/train_data.csv', parse_dates=["tpep_pickup_datetime"]).rename(columns={'tpep_pickup_datetime':'ds'})

前処理

  1. 異常値?の補間:https://comp.probspace.com/competitions/taxi_demand/discussions/mini_forest-Post1a9434c0c2c1552abca3
  2. 予測期間の時刻を追加
  3. 縦持ち
# 前処理

# 異常値の補間
## 補間せずに、データから除外した方がいいのかもしれないというメモ
train.loc[((train["ds"]>="2017-03-12 02:00:00")&(train["ds"]<="2017-03-12 02:30:00")),list(map(str, range(79)))] = float('nan')
train.loc[((train["ds"]>="2018-03-11 02:00:00")&(train["ds"]<="2018-03-11 02:30:00")),list(map(str, range(79)))] = float('nan')
train.loc[((train["ds"]>="2019-03-10 02:00:00")&(train["ds"]<="2019-03-10 02:30:00")),list(map(str, range(79)))] = float('nan')

train = train.set_index("ds")
train = train.interpolate(method='linear', axis=0)
train = train.round().astype(int)
train = train.reset_index()

# trainに予測期間の時刻を追加
data = pd.concat([
    train,
    pd.DataFrame({
      "ds":pd.date_range(start='2019-12-01 00:00:00', end='2019-12-07 23:30:00', freq='30T')
    })
], axis=0).reset_index(drop=True)

# 縦持ち
data_df = data.copy()
data_df = pd.melt(
    data_df, id_vars=["ds"], value_vars=list(map(str, range(79))),
    var_name="id", value_name="y"
)
data_df.loc[:,"id"] = data_df["id"].astype("int64")

data_df
ds id y
0 2017-01-01 00:00:00 0 53.0
1 2017-01-01 00:30:00 0 83.0
2 2017-01-01 01:00:00 0 69.0
3 2017-01-01 01:30:00 0 76.0
4 2017-01-01 02:00:00 0 101.0
... ... ... ...
4061227 2019-12-07 21:30:00 78 NaN
4061228 2019-12-07 22:00:00 78 NaN
4061229 2019-12-07 22:30:00 78 NaN
4061230 2019-12-07 23:00:00 78 NaN
4061231 2019-12-07 23:30:00 78 NaN

4061232 rows × 3 columns

目的変数、特徴量追加

  1. 目的変数は一週間前からの階差
  2. 特徴量は、時間関連、過去の情報
## 移動平均などの特徴量の追加するための関数

### 単純なlag
def create_lags(df, group_col, val_col, lags):
    lag_df = pd.DataFrame()
    for lag in lags:
        lag_df[f'lag_{lag}_{val_col}'] = df[group_col+[val_col]].copy().groupby(
            group_col
        )[val_col].transform(lambda x: x.shift(lag))
    return lag_df

# 以下の関数は現在未使用
### 移動平均
def create_rolls_ma(df, group_col, val_col, lags, rolls):
    roll_df = pd.DataFrame()
    for lag in lags:
        for roll in rolls:
            roll_df[f'ma_{lag}_{roll}_{val_col}'] = df[group_col+[val_col]].copy().groupby(
                group_col
            )[val_col].transform(lambda x: x.shift(lag).rolling(roll).mean())
    return roll_df

### 標準偏差
def create_rolls_std(df, group_col, val_col, lags, rolls):
    roll_df = pd.DataFrame()
    for lag in lags:
        for roll in rolls:
            roll_df[f'std_{lag}_{roll}_{val_col}'] = df[group_col+[val_col]].copy().groupby(
                group_col
            )[val_col].transform(lambda x: x.shift(lag).rolling(roll).std())
    return roll_df

### 移動最大
def create_rolls_max(df, group_col, val_col, lags, rolls):
    roll_df = pd.DataFrame()
    for lag in lags:
        for roll in rolls:
            roll_df[f'ma_{lag}_{roll}_{val_col}'] = df[group_col+[val_col]].copy().groupby(
                group_col
            )[val_col].transform(lambda x: x.shift(lag).rolling(roll).max())
    return roll_df

### 移動最小
def create_rolls_min(df, group_col, val_col, lags, rolls):
    roll_df = pd.DataFrame()
    for lag in lags:
        for roll in rolls:
            roll_df[f'ma_{lag}_{roll}_{val_col}'] = df[group_col+[val_col]].copy().groupby(
                group_col
            )[val_col].transform(lambda x: x.shift(lag).rolling(roll).min())
    return roll_df
# 目的変数の設定
## 一週間前(7*48行前)の同時刻との差分
data_df.loc[:,"y_diff"] =  data_df["y"] - data_df[["id", "y"]].groupby("id")["y"].transform(lambda x: x.shift(periods=48*7))

# 特徴量追加

## 時間関連
data_df.loc[:,"hour_minute"] = data_df["ds"].dt.strftime('%H%M')
data_df.loc[:,"ds_h"] = pd.to_datetime(data_df["ds"].dt.strftime('%Y-%m-%d %H')+":00:00")
data_df.loc[:,"ds_ymd"] = pd.to_datetime(data_df["ds"].dt.strftime('%Y-%m-%d ')+"00:00:00")
data_df.loc[:,"year"] = data_df["ds"].dt.year
data_df.loc[:,"month"] = data_df["ds"].dt.month
data_df.loc[:,"day"] = data_df["ds"].dt.day
data_df.loc[:,"hour"] = data_df["ds"].dt.hour
data_df.loc[:,"ampm"] = [ 1 if ampm == "AM" else 0 for ampm in data_df["ds"].dt.strftime('%p') ]
data_df.loc[:,"peak"] = 1 # 深夜4〜5時はとても少ないので、そこをフラグ化
data_df.loc[(4 <= data_df["hour"])&(data_df["hour"] < 6),"peak"] = 0

data_df.loc[:,"minute"] = data_df["ds"].dt.minute
data_df.loc[:,"quarter"] = data_df["ds"].dt.quarter
data_df.loc[:,"yobi"] = data_df["ds"].dt.weekday
data_df.loc[:,"week_number_year"] = data_df["ds"].dt.strftime('%U').astype(int) # 年における第何週か
data_df.loc[:,"week_number_month"] = [ (day - 1) // 7 + 1 for day in data_df["day"] ] # 月における第何週か

## 過去の情報を特徴量に追加

### 1,2,3,4…週間前の階差
data_df.loc[:,[
    "lag_7_y_diff","lag_8_y_diff","lag_14_y_diff","lag_15_y_diff","lag_21_y_diff","lag_28_y_diff","lag_35_y_diff","lag_42_y_diff","lag_49_y_diff","lag_364_y_diff","lag_182_y_diff",
]] = create_lags(data_df, ["id","hour_minute"], "y_diff", [7,8,14,15,21,28,35,42,49,7*52,7*26,])

### 1,2,3,4…週間前の原系列
data_df.loc[:,[
    "lag_7_y","lag_8_y","lag_14_y","lag_15_y","lag_21_y","lag_28_y","lag_35_y","lag_42_y","lag_49_y","lag_364_y","lag_182_y",
]] = create_lags(data_df, ["id","hour_minute"], "y", [7,8,14,15,21,28,35,42,49,7*52,7*26,])

### ratio
data_df.loc[:,"lag_7_y_ratio"] = data_df.loc[:,"lag_7_y_diff"] / data_df.loc[:,"lag_7_y"]
data_df.loc[:,"lag_8_y_ratio"] = data_df.loc[:,"lag_8_y_diff"] / data_df.loc[:,"lag_8_y"]
data_df.loc[:,"lag_14_y_ratio"] = data_df.loc[:,"lag_14_y_diff"] / data_df.loc[:,"lag_14_y"]
data_df.loc[:,"lag_15_y_ratio"] = data_df.loc[:,"lag_15_y_diff"] / data_df.loc[:,"lag_15_y"]
data_df.loc[:,"lag_21_y_ratio"] = data_df.loc[:,"lag_21_y_diff"] / data_df.loc[:,"lag_21_y"]
data_df.loc[:,"lag_28_y_ratio"] = data_df.loc[:,"lag_28_y_diff"] / data_df.loc[:,"lag_28_y"]
data_df.loc[:,"lag_35_y_ratio"] = data_df.loc[:,"lag_35_y_diff"] / data_df.loc[:,"lag_35_y"]
data_df.loc[:,"lag_42_y_ratio"] = data_df.loc[:,"lag_35_y_diff"] / data_df.loc[:,"lag_35_y"]
data_df.loc[:,"lag_49_y_ratio"] = data_df.loc[:,"lag_35_y_diff"] / data_df.loc[:,"lag_35_y"]
data_df.loc[:,"lag_364_y_ratio"] = data_df.loc[:,"lag_364_y_diff"] / data_df.loc[:,"lag_364_y"]
data_df.loc[:,"lag_182_y_ratio"] = data_df.loc[:,"lag_182_y_diff"] / data_df.loc[:,"lag_182_y"]

### 階差列のcumsum
data_df.loc[:,"lag_7_14_diff_sum"] = data_df["lag_7_y_diff"] + data_df["lag_14_y_diff"]
data_df.loc[:,"lag_7_14_21_diff_sum"] = data_df["lag_7_14_diff_sum"] + data_df["lag_21_y_diff"]
data_df.loc[:,"lag_7_14_21_28_diff_sum"] = data_df["lag_7_14_21_diff_sum"] + data_df["lag_28_y_diff"]
data_df.loc[:,"lag_7_14_21_28_35_diff_sum"] = data_df["lag_7_14_21_28_diff_sum"] + data_df["lag_35_y_diff"]
data_df.loc[:,"lag_7_14_21_28_35_42_diff_sum"] = data_df["lag_7_14_21_28_35_diff_sum"] + data_df["lag_42_y_diff"]
data_df.loc[:,"lag_7_14_21_28_35_42_49_diff_sum"] = data_df["lag_7_14_21_28_35_42_diff_sum"] + data_df["lag_49_y_diff"]

### 原系列系列のcumsum
data_df.loc[:,"lag_7_14_sum"] = data_df["lag_7_y"] + data_df["lag_14_y"]
data_df.loc[:,"lag_7_14_21_sum"] = data_df["lag_7_14_sum"] + data_df["lag_21_y"]
data_df.loc[:,"lag_7_14_21_28_sum"] = data_df["lag_7_14_21_sum"]  + data_df["lag_28_y"]
data_df.loc[:,"lag_7_14_21_28_35_sum"] = data_df["lag_7_14_21_28_sum"] + data_df["lag_35_y"]
data_df.loc[:,"lag_7_14_21_28_35_42_sum"] = data_df["lag_7_14_21_28_35_sum"] + data_df["lag_42_y"]
data_df.loc[:,"lag_7_14_21_28_35_42_49_sum"] = data_df["lag_7_14_21_28_35_42_sum"] + data_df["lag_49_y"]


# 確認のため、id==0の00:00、00:30だけ表示
data_df[((data_df["id"]==0)&((data_df["hour_minute"]=="0000")|(data_df["hour_minute"]=="0030")))].head(100)
ds id y y_diff hour_minute ds_h ds_ymd year month day hour ampm peak minute quarter yobi week_number_year week_number_month lag_7_y_diff lag_8_y_diff lag_14_y_diff lag_15_y_diff lag_21_y_diff lag_28_y_diff lag_35_y_diff lag_42_y_diff lag_49_y_diff lag_364_y_diff lag_182_y_diff lag_7_y lag_8_y lag_14_y lag_15_y lag_21_y lag_28_y lag_35_y lag_42_y lag_49_y lag_364_y lag_182_y lag_7_y_ratio lag_8_y_ratio lag_14_y_ratio lag_15_y_ratio lag_21_y_ratio lag_28_y_ratio lag_35_y_ratio lag_42_y_ratio lag_49_y_ratio lag_364_y_ratio lag_182_y_ratio lag_7_14_diff_sum lag_7_14_21_diff_sum lag_7_14_21_28_diff_sum lag_7_14_21_28_35_diff_sum lag_7_14_21_28_35_42_diff_sum lag_7_14_21_28_35_42_49_diff_sum lag_7_14_sum lag_7_14_21_sum lag_7_14_21_28_sum lag_7_14_21_28_35_sum lag_7_14_21_28_35_42_sum lag_7_14_21_28_35_42_49_sum
0 2017-01-01 00:00:00 0 53.0 NaN 0000 2017-01-01 2017-01-01 2017 1 1 0 1 1 0 1 6 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 2017-01-01 00:30:00 0 83.0 NaN 0030 2017-01-01 2017-01-01 2017 1 1 0 1 1 30 1 6 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
48 2017-01-02 00:00:00 0 16.0 NaN 0000 2017-01-02 2017-01-02 2017 1 2 0 1 1 0 1 0 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
49 2017-01-02 00:30:00 0 7.0 NaN 0030 2017-01-02 2017-01-02 2017 1 2 0 1 1 30 1 0 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
96 2017-01-03 00:00:00 0 8.0 NaN 0000 2017-01-03 2017-01-03 2017 1 3 0 1 1 0 1 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
97 2017-01-03 00:30:00 0 11.0 NaN 0030 2017-01-03 2017-01-03 2017 1 3 0 1 1 30 1 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
144 2017-01-04 00:00:00 0 7.0 NaN 0000 2017-01-04 2017-01-04 2017 1 4 0 1 1 0 1 2 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
145 2017-01-04 00:30:00 0 4.0 NaN 0030 2017-01-04 2017-01-04 2017 1 4 0 1 1 30 1 2 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
192 2017-01-05 00:00:00 0 12.0 NaN 0000 2017-01-05 2017-01-05 2017 1 5 0 1 1 0 1 3 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
193 2017-01-05 00:30:00 0 9.0 NaN 0030 2017-01-05 2017-01-05 2017 1 5 0 1 1 30 1 3 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
240 2017-01-06 00:00:00 0 19.0 NaN 0000 2017-01-06 2017-01-06 2017 1 6 0 1 1 0 1 4 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
241 2017-01-06 00:30:00 0 21.0 NaN 0030 2017-01-06 2017-01-06 2017 1 6 0 1 1 30 1 4 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
288 2017-01-07 00:00:00 0 61.0 NaN 0000 2017-01-07 2017-01-07 2017 1 7 0 1 1 0 1 5 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
289 2017-01-07 00:30:00 0 74.0 NaN 0030 2017-01-07 2017-01-07 2017 1 7 0 1 1 30 1 5 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
336 2017-01-08 00:00:00 0 42.0 -11.0 0000 2017-01-08 2017-01-08 2017 1 8 0 1 1 0 1 6 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 53.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
337 2017-01-08 00:30:00 0 67.0 -16.0 0030 2017-01-08 2017-01-08 2017 1 8 0 1 1 30 1 6 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 83.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
384 2017-01-09 00:00:00 0 14.0 -2.0 0000 2017-01-09 2017-01-09 2017 1 9 0 1 1 0 1 0 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 16.0 53.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
385 2017-01-09 00:30:00 0 5.0 -2.0 0030 2017-01-09 2017-01-09 2017 1 9 0 1 1 30 1 0 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.0 83.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
432 2017-01-10 00:00:00 0 7.0 -1.0 0000 2017-01-10 2017-01-10 2017 1 10 0 1 1 0 1 1 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.0 16.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
433 2017-01-10 00:30:00 0 9.0 -2.0 0030 2017-01-10 2017-01-10 2017 1 10 0 1 1 30 1 1 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 11.0 7.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
480 2017-01-11 00:00:00 0 15.0 8.0 0000 2017-01-11 2017-01-11 2017 1 11 0 1 1 0 1 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.0 8.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
481 2017-01-11 00:30:00 0 13.0 9.0 0030 2017-01-11 2017-01-11 2017 1 11 0 1 1 30 1 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.0 11.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
528 2017-01-12 00:00:00 0 17.0 5.0 0000 2017-01-12 2017-01-12 2017 1 12 0 1 1 0 1 3 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 12.0 7.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
529 2017-01-12 00:30:00 0 10.0 1.0 0030 2017-01-12 2017-01-12 2017 1 12 0 1 1 30 1 3 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.0 4.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
576 2017-01-13 00:00:00 0 30.0 11.0 0000 2017-01-13 2017-01-13 2017 1 13 0 1 1 0 1 4 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 19.0 12.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
577 2017-01-13 00:30:00 0 21.0 0.0 0030 2017-01-13 2017-01-13 2017 1 13 0 1 1 30 1 4 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 21.0 9.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
624 2017-01-14 00:00:00 0 69.0 8.0 0000 2017-01-14 2017-01-14 2017 1 14 0 1 1 0 1 5 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 61.0 19.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
625 2017-01-14 00:30:00 0 66.0 -8.0 0030 2017-01-14 2017-01-14 2017 1 14 0 1 1 30 1 5 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 74.0 21.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
672 2017-01-15 00:00:00 0 61.0 19.0 0000 2017-01-15 2017-01-15 2017 1 15 0 1 1 0 1 6 3 3 -11.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 42.0 61.0 53.0 NaN NaN NaN NaN NaN NaN NaN NaN -0.261905 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 95.0 NaN NaN NaN NaN NaN
673 2017-01-15 00:30:00 0 82.0 15.0 0030 2017-01-15 2017-01-15 2017 1 15 0 1 1 30 1 6 3 3 -16.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 67.0 74.0 83.0 NaN NaN NaN NaN NaN NaN NaN NaN -0.238806 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 150.0 NaN NaN NaN NaN NaN
720 2017-01-16 00:00:00 0 17.0 3.0 0000 2017-01-16 2017-01-16 2017 1 16 0 1 1 0 1 0 3 3 -2.0 -11.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 14.0 42.0 16.0 53.0 NaN NaN NaN NaN NaN NaN NaN -0.142857 -0.261905 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 30.0 NaN NaN NaN NaN NaN
721 2017-01-16 00:30:00 0 29.0 24.0 0030 2017-01-16 2017-01-16 2017 1 16 0 1 1 30 1 0 3 3 -2.0 -16.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.0 67.0 7.0 83.0 NaN NaN NaN NaN NaN NaN NaN -0.400000 -0.238806 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 12.0 NaN NaN NaN NaN NaN
768 2017-01-17 00:00:00 0 6.0 -1.0 0000 2017-01-17 2017-01-17 2017 1 17 0 1 1 0 1 1 3 3 -1.0 -2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.0 14.0 8.0 16.0 NaN NaN NaN NaN NaN NaN NaN -0.142857 -0.142857 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 15.0 NaN NaN NaN NaN NaN
769 2017-01-17 00:30:00 0 8.0 -1.0 0030 2017-01-17 2017-01-17 2017 1 17 0 1 1 30 1 1 3 3 -2.0 -2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.0 5.0 11.0 7.0 NaN NaN NaN NaN NaN NaN NaN -0.222222 -0.400000 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 20.0 NaN NaN NaN NaN NaN
816 2017-01-18 00:00:00 0 9.0 -6.0 0000 2017-01-18 2017-01-18 2017 1 18 0 1 1 0 1 2 3 3 8.0 -1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 15.0 7.0 7.0 8.0 NaN NaN NaN NaN NaN NaN NaN 0.533333 -0.142857 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 22.0 NaN NaN NaN NaN NaN
817 2017-01-18 00:30:00 0 6.0 -7.0 0030 2017-01-18 2017-01-18 2017 1 18 0 1 1 30 1 2 3 3 9.0 -2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 13.0 9.0 4.0 11.0 NaN NaN NaN NaN NaN NaN NaN 0.692308 -0.222222 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 17.0 NaN NaN NaN NaN NaN
864 2017-01-19 00:00:00 0 18.0 1.0 0000 2017-01-19 2017-01-19 2017 1 19 0 1 1 0 1 3 3 3 5.0 8.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 17.0 15.0 12.0 7.0 NaN NaN NaN NaN NaN NaN NaN 0.294118 0.533333 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 29.0 NaN NaN NaN NaN NaN
865 2017-01-19 00:30:00 0 13.0 3.0 0030 2017-01-19 2017-01-19 2017 1 19 0 1 1 30 1 3 3 3 1.0 9.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0 13.0 9.0 4.0 NaN NaN NaN NaN NaN NaN NaN 0.100000 0.692308 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 19.0 NaN NaN NaN NaN NaN
912 2017-01-20 00:00:00 0 24.0 -6.0 0000 2017-01-20 2017-01-20 2017 1 20 0 1 1 0 1 4 3 3 11.0 5.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 30.0 17.0 19.0 12.0 NaN NaN NaN NaN NaN NaN NaN 0.366667 0.294118 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 49.0 NaN NaN NaN NaN NaN
913 2017-01-20 00:30:00 0 15.0 -6.0 0030 2017-01-20 2017-01-20 2017 1 20 0 1 1 30 1 4 3 3 0.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 21.0 10.0 21.0 9.0 NaN NaN NaN NaN NaN NaN NaN 0.000000 0.100000 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 42.0 NaN NaN NaN NaN NaN
960 2017-01-21 00:00:00 0 62.0 -7.0 0000 2017-01-21 2017-01-21 2017 1 21 0 1 1 0 1 5 3 3 8.0 11.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 69.0 30.0 61.0 19.0 NaN NaN NaN NaN NaN NaN NaN 0.115942 0.366667 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 130.0 NaN NaN NaN NaN NaN
961 2017-01-21 00:30:00 0 58.0 -8.0 0030 2017-01-21 2017-01-21 2017 1 21 0 1 1 30 1 5 3 3 -8.0 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 66.0 21.0 74.0 21.0 NaN NaN NaN NaN NaN NaN NaN -0.121212 0.000000 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 140.0 NaN NaN NaN NaN NaN
1008 2017-01-22 00:00:00 0 62.0 1.0 0000 2017-01-22 2017-01-22 2017 1 22 0 1 1 0 1 6 4 4 19.0 8.0 -11.0 NaN NaN NaN NaN NaN NaN NaN NaN 61.0 69.0 42.0 61.0 53.0 NaN NaN NaN NaN NaN NaN 0.311475 0.115942 -0.261905 NaN NaN NaN NaN NaN NaN NaN NaN 8.0 NaN NaN NaN NaN NaN 103.0 156.0 NaN NaN NaN NaN
1009 2017-01-22 00:30:00 0 79.0 -3.0 0030 2017-01-22 2017-01-22 2017 1 22 0 1 1 30 1 6 4 4 15.0 -8.0 -16.0 NaN NaN NaN NaN NaN NaN NaN NaN 82.0 66.0 67.0 74.0 83.0 NaN NaN NaN NaN NaN NaN 0.182927 -0.121212 -0.238806 NaN NaN NaN NaN NaN NaN NaN NaN -1.0 NaN NaN NaN NaN NaN 149.0 232.0 NaN NaN NaN NaN
1056 2017-01-23 00:00:00 0 6.0 -11.0 0000 2017-01-23 2017-01-23 2017 1 23 0 1 1 0 1 0 4 4 3.0 19.0 -2.0 -11.0 NaN NaN NaN NaN NaN NaN NaN 17.0 61.0 14.0 42.0 16.0 NaN NaN NaN NaN NaN NaN 0.176471 0.311475 -0.142857 -0.261905 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN 31.0 47.0 NaN NaN NaN NaN
1057 2017-01-23 00:30:00 0 10.0 -19.0 0030 2017-01-23 2017-01-23 2017 1 23 0 1 1 30 1 0 4 4 24.0 15.0 -2.0 -16.0 NaN NaN NaN NaN NaN NaN NaN 29.0 82.0 5.0 67.0 7.0 NaN NaN NaN NaN NaN NaN 0.827586 0.182927 -0.400000 -0.238806 NaN NaN NaN NaN NaN NaN NaN 22.0 NaN NaN NaN NaN NaN 34.0 41.0 NaN NaN NaN NaN
1104 2017-01-24 00:00:00 0 9.0 3.0 0000 2017-01-24 2017-01-24 2017 1 24 0 1 1 0 1 1 4 4 -1.0 3.0 -1.0 -2.0 NaN NaN NaN NaN NaN NaN NaN 6.0 17.0 7.0 14.0 8.0 NaN NaN NaN NaN NaN NaN -0.166667 0.176471 -0.142857 -0.142857 NaN NaN NaN NaN NaN NaN NaN -2.0 NaN NaN NaN NaN NaN 13.0 21.0 NaN NaN NaN NaN
1105 2017-01-24 00:30:00 0 0.0 -8.0 0030 2017-01-24 2017-01-24 2017 1 24 0 1 1 30 1 1 4 4 -1.0 24.0 -2.0 -2.0 NaN NaN NaN NaN NaN NaN NaN 8.0 29.0 9.0 5.0 11.0 NaN NaN NaN NaN NaN NaN -0.125000 0.827586 -0.222222 -0.400000 NaN NaN NaN NaN NaN NaN NaN -3.0 NaN NaN NaN NaN NaN 17.0 28.0 NaN NaN NaN NaN
1152 2017-01-25 00:00:00 0 11.0 2.0 0000 2017-01-25 2017-01-25 2017 1 25 0 1 1 0 1 2 4 4 -6.0 -1.0 8.0 -1.0 NaN NaN NaN NaN NaN NaN NaN 9.0 6.0 15.0 7.0 7.0 NaN NaN NaN NaN NaN NaN -0.666667 -0.166667 0.533333 -0.142857 NaN NaN NaN NaN NaN NaN NaN 2.0 NaN NaN NaN NaN NaN 24.0 31.0 NaN NaN NaN NaN
1153 2017-01-25 00:30:00 0 8.0 2.0 0030 2017-01-25 2017-01-25 2017 1 25 0 1 1 30 1 2 4 4 -7.0 -1.0 9.0 -2.0 NaN NaN NaN NaN NaN NaN NaN 6.0 8.0 13.0 9.0 4.0 NaN NaN NaN NaN NaN NaN -1.166667 -0.125000 0.692308 -0.222222 NaN NaN NaN NaN NaN NaN NaN 2.0 NaN NaN NaN NaN NaN 19.0 23.0 NaN NaN NaN NaN
1200 2017-01-26 00:00:00 0 18.0 0.0 0000 2017-01-26 2017-01-26 2017 1 26 0 1 1 0 1 3 4 4 1.0 -6.0 5.0 8.0 NaN NaN NaN NaN NaN NaN NaN 18.0 9.0 17.0 15.0 12.0 NaN NaN NaN NaN NaN NaN 0.055556 -0.666667 0.294118 0.533333 NaN NaN NaN NaN NaN NaN NaN 6.0 NaN NaN NaN NaN NaN 35.0 47.0 NaN NaN NaN NaN
1201 2017-01-26 00:30:00 0 11.0 -2.0 0030 2017-01-26 2017-01-26 2017 1 26 0 1 1 30 1 3 4 4 3.0 -7.0 1.0 9.0 NaN NaN NaN NaN NaN NaN NaN 13.0 6.0 10.0 13.0 9.0 NaN NaN NaN NaN NaN NaN 0.230769 -1.166667 0.100000 0.692308 NaN NaN NaN NaN NaN NaN NaN 4.0 NaN NaN NaN NaN NaN 23.0 32.0 NaN NaN NaN NaN
1248 2017-01-27 00:00:00 0 24.0 0.0 0000 2017-01-27 2017-01-27 2017 1 27 0 1 1 0 1 4 4 4 -6.0 1.0 11.0 5.0 NaN NaN NaN NaN NaN NaN NaN 24.0 18.0 30.0 17.0 19.0 NaN NaN NaN NaN NaN NaN -0.250000 0.055556 0.366667 0.294118 NaN NaN NaN NaN NaN NaN NaN 5.0 NaN NaN NaN NaN NaN 54.0 73.0 NaN NaN NaN NaN
1249 2017-01-27 00:30:00 0 21.0 6.0 0030 2017-01-27 2017-01-27 2017 1 27 0 1 1 30 1 4 4 4 -6.0 3.0 0.0 1.0 NaN NaN NaN NaN NaN NaN NaN 15.0 13.0 21.0 10.0 21.0 NaN NaN NaN NaN NaN NaN -0.400000 0.230769 0.000000 0.100000 NaN NaN NaN NaN NaN NaN NaN -6.0 NaN NaN NaN NaN NaN 36.0 57.0 NaN NaN NaN NaN
1296 2017-01-28 00:00:00 0 73.0 11.0 0000 2017-01-28 2017-01-28 2017 1 28 0 1 1 0 1 5 4 4 -7.0 -6.0 8.0 11.0 NaN NaN NaN NaN NaN NaN NaN 62.0 24.0 69.0 30.0 61.0 NaN NaN NaN NaN NaN NaN -0.112903 -0.250000 0.115942 0.366667 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN 131.0 192.0 NaN NaN NaN NaN
1297 2017-01-28 00:30:00 0 65.0 7.0 0030 2017-01-28 2017-01-28 2017 1 28 0 1 1 30 1 5 4 4 -8.0 -6.0 -8.0 0.0 NaN NaN NaN NaN NaN NaN NaN 58.0 15.0 66.0 21.0 74.0 NaN NaN NaN NaN NaN NaN -0.137931 -0.400000 -0.121212 0.000000 NaN NaN NaN NaN NaN NaN NaN -16.0 NaN NaN NaN NaN NaN 124.0 198.0 NaN NaN NaN NaN
1344 2017-01-29 00:00:00 0 84.0 22.0 0000 2017-01-29 2017-01-29 2017 1 29 0 1 1 0 1 6 5 5 1.0 -7.0 19.0 8.0 -11.0 NaN NaN NaN NaN NaN NaN 62.0 62.0 61.0 69.0 42.0 53.0 NaN NaN NaN NaN NaN 0.016129 -0.112903 0.311475 0.115942 -0.261905 NaN NaN NaN NaN NaN NaN 20.0 9.0 NaN NaN NaN NaN 123.0 165.0 218.0 NaN NaN NaN
1345 2017-01-29 00:30:00 0 78.0 -1.0 0030 2017-01-29 2017-01-29 2017 1 29 0 1 1 30 1 6 5 5 -3.0 -8.0 15.0 -8.0 -16.0 NaN NaN NaN NaN NaN NaN 79.0 58.0 82.0 66.0 67.0 83.0 NaN NaN NaN NaN NaN -0.037975 -0.137931 0.182927 -0.121212 -0.238806 NaN NaN NaN NaN NaN NaN 12.0 -4.0 NaN NaN NaN NaN 161.0 228.0 311.0 NaN NaN NaN
1392 2017-01-30 00:00:00 0 10.0 4.0 0000 2017-01-30 2017-01-30 2017 1 30 0 1 1 0 1 0 5 5 -11.0 1.0 3.0 19.0 -2.0 NaN NaN NaN NaN NaN NaN 6.0 62.0 17.0 61.0 14.0 16.0 NaN NaN NaN NaN NaN -1.833333 0.016129 0.176471 0.311475 -0.142857 NaN NaN NaN NaN NaN NaN -8.0 -10.0 NaN NaN NaN NaN 23.0 37.0 53.0 NaN NaN NaN
1393 2017-01-30 00:30:00 0 8.0 -2.0 0030 2017-01-30 2017-01-30 2017 1 30 0 1 1 30 1 0 5 5 -19.0 -3.0 24.0 15.0 -2.0 NaN NaN NaN NaN NaN NaN 10.0 79.0 29.0 82.0 5.0 7.0 NaN NaN NaN NaN NaN -1.900000 -0.037975 0.827586 0.182927 -0.400000 NaN NaN NaN NaN NaN NaN 5.0 3.0 NaN NaN NaN NaN 39.0 44.0 51.0 NaN NaN NaN
1440 2017-01-31 00:00:00 0 8.0 -1.0 0000 2017-01-31 2017-01-31 2017 1 31 0 1 1 0 1 1 5 5 3.0 -11.0 -1.0 3.0 -1.0 NaN NaN NaN NaN NaN NaN 9.0 6.0 6.0 17.0 7.0 8.0 NaN NaN NaN NaN NaN 0.333333 -1.833333 -0.166667 0.176471 -0.142857 NaN NaN NaN NaN NaN NaN 2.0 1.0 NaN NaN NaN NaN 15.0 22.0 30.0 NaN NaN NaN
1441 2017-01-31 00:30:00 0 4.0 4.0 0030 2017-01-31 2017-01-31 2017 1 31 0 1 1 30 1 1 5 5 -8.0 -19.0 -1.0 24.0 -2.0 NaN NaN NaN NaN NaN NaN 0.0 10.0 8.0 29.0 9.0 11.0 NaN NaN NaN NaN NaN -inf -1.900000 -0.125000 0.827586 -0.222222 NaN NaN NaN NaN NaN NaN -9.0 -11.0 NaN NaN NaN NaN 8.0 17.0 28.0 NaN NaN NaN
1488 2017-02-01 00:00:00 0 12.0 1.0 0000 2017-02-01 2017-02-01 2017 2 1 0 1 1 0 1 2 5 1 2.0 3.0 -6.0 -1.0 8.0 NaN NaN NaN NaN NaN NaN 11.0 9.0 9.0 6.0 15.0 7.0 NaN NaN NaN NaN NaN 0.181818 0.333333 -0.666667 -0.166667 0.533333 NaN NaN NaN NaN NaN NaN -4.0 4.0 NaN NaN NaN NaN 20.0 35.0 42.0 NaN NaN NaN
1489 2017-02-01 00:30:00 0 4.0 -4.0 0030 2017-02-01 2017-02-01 2017 2 1 0 1 1 30 1 2 5 1 2.0 -8.0 -7.0 -1.0 9.0 NaN NaN NaN NaN NaN NaN 8.0 0.0 6.0 8.0 13.0 4.0 NaN NaN NaN NaN NaN 0.250000 -inf -1.166667 -0.125000 0.692308 NaN NaN NaN NaN NaN NaN -5.0 4.0 NaN NaN NaN NaN 14.0 27.0 31.0 NaN NaN NaN
1536 2017-02-02 00:00:00 0 9.0 -9.0 0000 2017-02-02 2017-02-02 2017 2 2 0 1 1 0 1 3 5 1 0.0 2.0 1.0 -6.0 5.0 NaN NaN NaN NaN NaN NaN 18.0 11.0 18.0 9.0 17.0 12.0 NaN NaN NaN NaN NaN 0.000000 0.181818 0.055556 -0.666667 0.294118 NaN NaN NaN NaN NaN NaN 1.0 6.0 NaN NaN NaN NaN 36.0 53.0 65.0 NaN NaN NaN
1537 2017-02-02 00:30:00 0 14.0 3.0 0030 2017-02-02 2017-02-02 2017 2 2 0 1 1 30 1 3 5 1 -2.0 2.0 3.0 -7.0 1.0 NaN NaN NaN NaN NaN NaN 11.0 8.0 13.0 6.0 10.0 9.0 NaN NaN NaN NaN NaN -0.181818 0.250000 0.230769 -1.166667 0.100000 NaN NaN NaN NaN NaN NaN 1.0 2.0 NaN NaN NaN NaN 24.0 34.0 43.0 NaN NaN NaN
1584 2017-02-03 00:00:00 0 29.0 5.0 0000 2017-02-03 2017-02-03 2017 2 3 0 1 1 0 1 4 5 1 0.0 0.0 -6.0 1.0 11.0 NaN NaN NaN NaN NaN NaN 24.0 18.0 24.0 18.0 30.0 19.0 NaN NaN NaN NaN NaN 0.000000 0.000000 -0.250000 0.055556 0.366667 NaN NaN NaN NaN NaN NaN -6.0 5.0 NaN NaN NaN NaN 48.0 78.0 97.0 NaN NaN NaN
1585 2017-02-03 00:30:00 0 31.0 10.0 0030 2017-02-03 2017-02-03 2017 2 3 0 1 1 30 1 4 5 1 6.0 -2.0 -6.0 3.0 0.0 NaN NaN NaN NaN NaN NaN 21.0 11.0 15.0 13.0 21.0 21.0 NaN NaN NaN NaN NaN 0.285714 -0.181818 -0.400000 0.230769 0.000000 NaN NaN NaN NaN NaN NaN 0.0 0.0 NaN NaN NaN NaN 36.0 57.0 78.0 NaN NaN NaN
1632 2017-02-04 00:00:00 0 66.0 -7.0 0000 2017-02-04 2017-02-04 2017 2 4 0 1 1 0 1 5 5 1 11.0 0.0 -7.0 -6.0 8.0 NaN NaN NaN NaN NaN NaN 73.0 24.0 62.0 24.0 69.0 61.0 NaN NaN NaN NaN NaN 0.150685 0.000000 -0.112903 -0.250000 0.115942 NaN NaN NaN NaN NaN NaN 4.0 12.0 NaN NaN NaN NaN 135.0 204.0 265.0 NaN NaN NaN
1633 2017-02-04 00:30:00 0 67.0 2.0 0030 2017-02-04 2017-02-04 2017 2 4 0 1 1 30 1 5 5 1 7.0 6.0 -8.0 -6.0 -8.0 NaN NaN NaN NaN NaN NaN 65.0 21.0 58.0 15.0 66.0 74.0 NaN NaN NaN NaN NaN 0.107692 0.285714 -0.137931 -0.400000 -0.121212 NaN NaN NaN NaN NaN NaN -1.0 -9.0 NaN NaN NaN NaN 123.0 189.0 263.0 NaN NaN NaN
1680 2017-02-05 00:00:00 0 68.0 -16.0 0000 2017-02-05 2017-02-05 2017 2 5 0 1 1 0 1 6 6 1 22.0 11.0 1.0 -7.0 19.0 -11.0 NaN NaN NaN NaN NaN 84.0 73.0 62.0 62.0 61.0 42.0 53.0 NaN NaN NaN NaN 0.261905 0.150685 0.016129 -0.112903 0.311475 -0.261905 NaN NaN NaN NaN NaN 23.0 42.0 31.0 NaN NaN NaN 146.0 207.0 249.0 302.0 NaN NaN
1681 2017-02-05 00:30:00 0 83.0 5.0 0030 2017-02-05 2017-02-05 2017 2 5 0 1 1 30 1 6 6 1 -1.0 7.0 -3.0 -8.0 15.0 -16.0 NaN NaN NaN NaN NaN 78.0 65.0 79.0 58.0 82.0 67.0 83.0 NaN NaN NaN NaN -0.012821 0.107692 -0.037975 -0.137931 0.182927 -0.238806 NaN NaN NaN NaN NaN -4.0 11.0 -5.0 NaN NaN NaN 157.0 239.0 306.0 389.0 NaN NaN
1728 2017-02-06 00:00:00 0 8.0 -2.0 0000 2017-02-06 2017-02-06 2017 2 6 0 1 1 0 1 0 6 1 4.0 22.0 -11.0 1.0 3.0 -2.0 NaN NaN NaN NaN NaN 10.0 84.0 6.0 62.0 17.0 14.0 16.0 NaN NaN NaN NaN 0.400000 0.261905 -1.833333 0.016129 0.176471 -0.142857 NaN NaN NaN NaN NaN -7.0 -4.0 -6.0 NaN NaN NaN 16.0 33.0 47.0 63.0 NaN NaN
1729 2017-02-06 00:30:00 0 10.0 2.0 0030 2017-02-06 2017-02-06 2017 2 6 0 1 1 30 1 0 6 1 -2.0 -1.0 -19.0 -3.0 24.0 -2.0 NaN NaN NaN NaN NaN 8.0 78.0 10.0 79.0 29.0 5.0 7.0 NaN NaN NaN NaN -0.250000 -0.012821 -1.900000 -0.037975 0.827586 -0.400000 NaN NaN NaN NaN NaN -21.0 3.0 1.0 NaN NaN NaN 18.0 47.0 52.0 59.0 NaN NaN
1776 2017-02-07 00:00:00 0 8.0 0.0 0000 2017-02-07 2017-02-07 2017 2 7 0 1 1 0 1 1 6 1 -1.0 4.0 3.0 -11.0 -1.0 -1.0 NaN NaN NaN NaN NaN 8.0 10.0 9.0 6.0 6.0 7.0 8.0 NaN NaN NaN NaN -0.125000 0.400000 0.333333 -1.833333 -0.166667 -0.142857 NaN NaN NaN NaN NaN 2.0 1.0 0.0 NaN NaN NaN 17.0 23.0 30.0 38.0 NaN NaN
1777 2017-02-07 00:30:00 0 4.0 0.0 0030 2017-02-07 2017-02-07 2017 2 7 0 1 1 30 1 1 6 1 4.0 -2.0 -8.0 -19.0 -1.0 -2.0 NaN NaN NaN NaN NaN 4.0 8.0 0.0 10.0 8.0 9.0 11.0 NaN NaN NaN NaN 1.000000 -0.250000 -inf -1.900000 -0.125000 -0.222222 NaN NaN NaN NaN NaN -4.0 -5.0 -7.0 NaN NaN NaN 4.0 12.0 21.0 32.0 NaN NaN
1824 2017-02-08 00:00:00 0 6.0 -6.0 0000 2017-02-08 2017-02-08 2017 2 8 0 1 1 0 1 2 6 2 1.0 -1.0 2.0 3.0 -6.0 8.0 NaN NaN NaN NaN NaN 12.0 8.0 11.0 9.0 9.0 15.0 7.0 NaN NaN NaN NaN 0.083333 -0.125000 0.181818 0.333333 -0.666667 0.533333 NaN NaN NaN NaN NaN 3.0 -3.0 5.0 NaN NaN NaN 23.0 32.0 47.0 54.0 NaN NaN
1825 2017-02-08 00:30:00 0 11.0 7.0 0030 2017-02-08 2017-02-08 2017 2 8 0 1 1 30 1 2 6 2 -4.0 4.0 2.0 -8.0 -7.0 9.0 NaN NaN NaN NaN NaN 4.0 4.0 8.0 0.0 6.0 13.0 4.0 NaN NaN NaN NaN -1.000000 1.000000 0.250000 -inf -1.166667 0.692308 NaN NaN NaN NaN NaN -2.0 -9.0 0.0 NaN NaN NaN 12.0 18.0 31.0 35.0 NaN NaN
1872 2017-02-09 00:00:00 0 22.0 13.0 0000 2017-02-09 2017-02-09 2017 2 9 0 1 1 0 1 3 6 2 -9.0 1.0 0.0 2.0 1.0 5.0 NaN NaN NaN NaN NaN 9.0 12.0 18.0 11.0 18.0 17.0 12.0 NaN NaN NaN NaN -1.000000 0.083333 0.000000 0.181818 0.055556 0.294118 NaN NaN NaN NaN NaN -9.0 -8.0 -3.0 NaN NaN NaN 27.0 45.0 62.0 74.0 NaN NaN
1873 2017-02-09 00:30:00 0 15.0 1.0 0030 2017-02-09 2017-02-09 2017 2 9 0 1 1 30 1 3 6 2 3.0 -4.0 -2.0 2.0 3.0 1.0 NaN NaN NaN NaN NaN 14.0 4.0 11.0 8.0 13.0 10.0 9.0 NaN NaN NaN NaN 0.214286 -1.000000 -0.181818 0.250000 0.230769 0.100000 NaN NaN NaN NaN NaN 1.0 4.0 5.0 NaN NaN NaN 25.0 38.0 48.0 57.0 NaN NaN
1920 2017-02-10 00:00:00 0 15.0 -14.0 0000 2017-02-10 2017-02-10 2017 2 10 0 1 1 0 1 4 6 2 5.0 -9.0 0.0 0.0 -6.0 11.0 NaN NaN NaN NaN NaN 29.0 9.0 24.0 18.0 24.0 30.0 19.0 NaN NaN NaN NaN 0.172414 -1.000000 0.000000 0.000000 -0.250000 0.366667 NaN NaN NaN NaN NaN 5.0 -1.0 10.0 NaN NaN NaN 53.0 77.0 107.0 126.0 NaN NaN
1921 2017-02-10 00:30:00 0 10.0 -21.0 0030 2017-02-10 2017-02-10 2017 2 10 0 1 1 30 1 4 6 2 10.0 3.0 6.0 -2.0 -6.0 0.0 NaN NaN NaN NaN NaN 31.0 14.0 21.0 11.0 15.0 21.0 21.0 NaN NaN NaN NaN 0.322581 0.214286 0.285714 -0.181818 -0.400000 0.000000 NaN NaN NaN NaN NaN 16.0 10.0 10.0 NaN NaN NaN 52.0 67.0 88.0 109.0 NaN NaN
1968 2017-02-11 00:00:00 0 47.0 -19.0 0000 2017-02-11 2017-02-11 2017 2 11 0 1 1 0 1 5 6 2 -7.0 5.0 11.0 0.0 -7.0 8.0 NaN NaN NaN NaN NaN 66.0 29.0 73.0 24.0 62.0 69.0 61.0 NaN NaN NaN NaN -0.106061 0.172414 0.150685 0.000000 -0.112903 0.115942 NaN NaN NaN NaN NaN 4.0 -3.0 5.0 NaN NaN NaN 139.0 201.0 270.0 331.0 NaN NaN
1969 2017-02-11 00:30:00 0 56.0 -11.0 0030 2017-02-11 2017-02-11 2017 2 11 0 1 1 30 1 5 6 2 2.0 10.0 7.0 6.0 -8.0 -8.0 NaN NaN NaN NaN NaN 67.0 31.0 65.0 21.0 58.0 66.0 74.0 NaN NaN NaN NaN 0.029851 0.322581 0.107692 0.285714 -0.137931 -0.121212 NaN NaN NaN NaN NaN 9.0 1.0 -7.0 NaN NaN NaN 132.0 190.0 256.0 330.0 NaN NaN
2016 2017-02-12 00:00:00 0 90.0 22.0 0000 2017-02-12 2017-02-12 2017 2 12 0 1 1 0 1 6 7 2 -16.0 -7.0 22.0 11.0 1.0 19.0 -11.0 NaN NaN NaN NaN 68.0 66.0 84.0 73.0 62.0 61.0 42.0 53.0 NaN NaN NaN -0.235294 -0.106061 0.261905 0.150685 0.016129 0.311475 -0.261905 -0.261905 -0.261905 NaN NaN 6.0 7.0 26.0 15.0 NaN NaN 152.0 214.0 275.0 317.0 370.0 NaN
2017 2017-02-12 00:30:00 0 105.0 22.0 0030 2017-02-12 2017-02-12 2017 2 12 0 1 1 30 1 6 7 2 5.0 2.0 -1.0 7.0 -3.0 15.0 -16.0 NaN NaN NaN NaN 83.0 67.0 78.0 65.0 79.0 82.0 67.0 83.0 NaN NaN NaN 0.060241 0.029851 -0.012821 0.107692 -0.037975 0.182927 -0.238806 -0.238806 -0.238806 NaN NaN 4.0 1.0 16.0 0.0 NaN NaN 161.0 240.0 322.0 389.0 472.0 NaN
2064 2017-02-13 00:00:00 0 4.0 -4.0 0000 2017-02-13 2017-02-13 2017 2 13 0 1 1 0 1 0 7 2 -2.0 -16.0 4.0 22.0 -11.0 3.0 -2.0 NaN NaN NaN NaN 8.0 68.0 10.0 84.0 6.0 17.0 14.0 16.0 NaN NaN NaN -0.250000 -0.235294 0.400000 0.261905 -1.833333 0.176471 -0.142857 -0.142857 -0.142857 NaN NaN 2.0 -9.0 -6.0 -8.0 NaN NaN 18.0 24.0 41.0 55.0 71.0 NaN
2065 2017-02-13 00:30:00 0 4.0 -6.0 0030 2017-02-13 2017-02-13 2017 2 13 0 1 1 30 1 0 7 2 2.0 5.0 -2.0 -1.0 -19.0 24.0 -2.0 NaN NaN NaN NaN 10.0 83.0 8.0 78.0 10.0 29.0 5.0 7.0 NaN NaN NaN 0.200000 0.060241 -0.250000 -0.012821 -1.900000 0.827586 -0.400000 -0.400000 -0.400000 NaN NaN 0.0 -19.0 5.0 3.0 NaN NaN 18.0 28.0 57.0 62.0 69.0 NaN
2112 2017-02-14 00:00:00 0 13.0 5.0 0000 2017-02-14 2017-02-14 2017 2 14 0 1 1 0 1 1 7 2 0.0 -2.0 -1.0 4.0 3.0 -1.0 -1.0 NaN NaN NaN NaN 8.0 8.0 8.0 10.0 9.0 6.0 7.0 8.0 NaN NaN NaN 0.000000 -0.250000 -0.125000 0.400000 0.333333 -0.166667 -0.142857 -0.142857 -0.142857 NaN NaN -1.0 2.0 1.0 0.0 NaN NaN 16.0 25.0 31.0 38.0 46.0 NaN
2113 2017-02-14 00:30:00 0 13.0 9.0 0030 2017-02-14 2017-02-14 2017 2 14 0 1 1 30 1 1 7 2 0.0 2.0 4.0 -2.0 -8.0 -1.0 -2.0 NaN NaN NaN NaN 4.0 10.0 4.0 8.0 0.0 8.0 9.0 11.0 NaN NaN NaN 0.000000 0.200000 1.000000 -0.250000 -inf -0.125000 -0.222222 -0.222222 -0.222222 NaN NaN 4.0 -4.0 -5.0 -7.0 NaN NaN 8.0 8.0 16.0 25.0 36.0 NaN
2160 2017-02-15 00:00:00 0 28.0 22.0 0000 2017-02-15 2017-02-15 2017 2 15 0 1 1 0 1 2 7 3 -6.0 0.0 1.0 -1.0 2.0 -6.0 8.0 NaN NaN NaN NaN 6.0 8.0 12.0 8.0 11.0 9.0 15.0 7.0 NaN NaN NaN -1.000000 0.000000 0.083333 -0.125000 0.181818 -0.666667 0.533333 0.533333 0.533333 NaN NaN -5.0 -3.0 -9.0 -1.0 NaN NaN 18.0 29.0 38.0 53.0 60.0 NaN
2161 2017-02-15 00:30:00 0 28.0 17.0 0030 2017-02-15 2017-02-15 2017 2 15 0 1 1 30 1 2 7 3 7.0 0.0 -4.0 4.0 2.0 -7.0 9.0 NaN NaN NaN NaN 11.0 4.0 4.0 4.0 8.0 6.0 13.0 4.0 NaN NaN NaN 0.636364 0.000000 -1.000000 1.000000 0.250000 -1.166667 0.692308 0.692308 0.692308 NaN NaN 3.0 5.0 -2.0 7.0 NaN NaN 15.0 23.0 29.0 42.0 46.0 NaN
2208 2017-02-16 00:00:00 0 12.0 -10.0 0000 2017-02-16 2017-02-16 2017 2 16 0 1 1 0 1 3 7 3 13.0 -6.0 -9.0 1.0 0.0 1.0 5.0 NaN NaN NaN NaN 22.0 6.0 9.0 12.0 18.0 18.0 17.0 12.0 NaN NaN NaN 0.590909 -1.000000 -1.000000 0.083333 0.000000 0.055556 0.294118 0.294118 0.294118 NaN NaN 4.0 4.0 5.0 10.0 NaN NaN 31.0 49.0 67.0 84.0 96.0 NaN
2209 2017-02-16 00:30:00 0 20.0 5.0 0030 2017-02-16 2017-02-16 2017 2 16 0 1 1 30 1 3 7 3 1.0 7.0 3.0 -4.0 -2.0 3.0 1.0 NaN NaN NaN NaN 15.0 11.0 14.0 4.0 11.0 13.0 10.0 9.0 NaN NaN NaN 0.066667 0.636364 0.214286 -1.000000 -0.181818 0.230769 0.100000 0.100000 0.100000 NaN NaN 4.0 2.0 5.0 6.0 NaN NaN 29.0 40.0 53.0 63.0 72.0 NaN
2256 2017-02-17 00:00:00 0 26.0 11.0 0000 2017-02-17 2017-02-17 2017 2 17 0 1 1 0 1 4 7 3 -14.0 13.0 5.0 -9.0 0.0 -6.0 11.0 NaN NaN NaN NaN 15.0 22.0 29.0 9.0 24.0 24.0 30.0 19.0 NaN NaN NaN -0.933333 0.590909 0.172414 -1.000000 0.000000 -0.250000 0.366667 0.366667 0.366667 NaN NaN -9.0 -9.0 -15.0 -4.0 NaN NaN 44.0 68.0 92.0 122.0 141.0 NaN
2257 2017-02-17 00:30:00 0 24.0 14.0 0030 2017-02-17 2017-02-17 2017 2 17 0 1 1 30 1 4 7 3 -21.0 1.0 10.0 3.0 6.0 -6.0 0.0 NaN NaN NaN NaN 10.0 15.0 31.0 14.0 21.0 15.0 21.0 21.0 NaN NaN NaN -2.100000 0.066667 0.322581 0.214286 0.285714 -0.400000 0.000000 0.000000 0.000000 NaN NaN -11.0 -5.0 -11.0 -11.0 NaN NaN 41.0 62.0 77.0 98.0 119.0 NaN
2304 2017-02-18 00:00:00 0 56.0 9.0 0000 2017-02-18 2017-02-18 2017 2 18 0 1 1 0 1 5 7 3 -19.0 -14.0 -7.0 5.0 11.0 -7.0 8.0 NaN NaN NaN NaN 47.0 15.0 66.0 29.0 73.0 62.0 69.0 61.0 NaN NaN NaN -0.404255 -0.933333 -0.106061 0.172414 0.150685 -0.112903 0.115942 0.115942 0.115942 NaN NaN -26.0 -15.0 -22.0 -14.0 NaN NaN 113.0 186.0 248.0 317.0 378.0 NaN
2305 2017-02-18 00:30:00 0 71.0 15.0 0030 2017-02-18 2017-02-18 2017 2 18 0 1 1 30 1 5 7 3 -11.0 -21.0 2.0 10.0 7.0 -8.0 -8.0 NaN NaN NaN NaN 56.0 10.0 67.0 31.0 65.0 58.0 66.0 74.0 NaN NaN NaN -0.196429 -2.100000 0.029851 0.322581 0.107692 -0.137931 -0.121212 -0.121212 -0.121212 NaN NaN -9.0 -2.0 -10.0 -18.0 NaN NaN 123.0 188.0 246.0 312.0 386.0 NaN
2352 2017-02-19 00:00:00 0 87.0 -3.0 0000 2017-02-19 2017-02-19 2017 2 19 0 1 1 0 1 6 8 3 22.0 -19.0 -16.0 -7.0 22.0 1.0 19.0 -11.0 NaN NaN NaN 90.0 47.0 68.0 66.0 84.0 62.0 61.0 42.0 53.0 NaN NaN 0.244444 -0.404255 -0.235294 -0.106061 0.261905 0.016129 0.311475 0.311475 0.311475 NaN NaN 6.0 28.0 29.0 48.0 37.0 NaN 158.0 242.0 304.0 365.0 407.0 460.0
2353 2017-02-19 00:30:00 0 81.0 -24.0 0030 2017-02-19 2017-02-19 2017 2 19 0 1 1 30 1 6 8 3 22.0 -11.0 5.0 2.0 -1.0 -3.0 15.0 -16.0 NaN NaN NaN 105.0 56.0 83.0 67.0 78.0 79.0 82.0 67.0 83.0 NaN NaN 0.209524 -0.196429 0.060241 0.029851 -0.012821 -0.037975 0.182927 0.182927 0.182927 NaN NaN 27.0 26.0 23.0 38.0 22.0 NaN 188.0 266.0 345.0 427.0 494.0 577.0

クロスバリデーション

  1. trainを約2年、validを1週間
  2. ずらしながら、20期間分作成
  3. 最初の半年を学習に使用していないのはColabでメモリエラーとなったため

cv_jikeiretu.jpg

# 手動でクロスバリデーション期間の設定
## valid期間は一週間で、それをずらしていく
t_start = datetime.datetime(2017, 7, 1)
t_end =   datetime.datetime(2019, 12, 1)

num_valid = 20

list_term = []
for i in range(num_valid):
  list_term += [
      [
          t_start + datetime.timedelta(days=7*i), # trainの最初の日
          t_end + datetime.timedelta(days=-7*(num_valid-i)),   # trainの最後の次の日 = validの最初の日
          t_end + datetime.timedelta(days=-7*(num_valid-i-1)), # validの最後の次の日
      ]
]

# testデータ作成
target = "y_diff"

feature_c = [
    "id","month","day","hour","yobi","week_number_year","peak","ampm","minute","quarter","week_number_month",
]
feature_r = [
    ## diff
    "lag_7_y_diff","lag_8_y_diff","lag_14_y_diff","lag_15_y_diff","lag_21_y_diff","lag_28_y_diff","lag_35_y_diff","lag_42_y_diff","lag_49_y_diff","lag_364_y_diff","lag_182_y_diff",
    ## y
    "lag_7_y","lag_8_y","lag_14_y","lag_15_y","lag_21_y","lag_28_y","lag_35_y","lag_42_y","lag_49_y","lag_364_y","lag_182_y",
    ## ratio
    "lag_7_y_ratio","lag_8_y_ratio","lag_14_y_ratio","lag_15_y_ratio","lag_21_y_ratio","lag_28_y_ratio","lag_35_y_ratio","lag_42_y_ratio","lag_49_y_ratio","lag_364_y_ratio","lag_182_y_ratio",
    ## sum
    "lag_7_14_diff_sum","lag_7_14_21_diff_sum","lag_7_14_21_28_diff_sum","lag_7_14_21_28_35_diff_sum","lag_7_14_21_28_35_42_diff_sum","lag_7_14_21_28_35_42_49_diff_sum",
    "lag_7_14_sum","lag_7_14_21_sum","lag_7_14_21_28_sum","lag_7_14_21_28_35_sum","lag_7_14_21_28_35_42_sum","lag_7_14_21_28_35_42_49_sum",
]
feature = feature_r + feature_c

test_X = data_df[data_df["ds"] >= t_end][["ds"]+feature].copy().reset_index(drop=True)
test_X.head()
ds lag_7_y_diff lag_8_y_diff lag_14_y_diff lag_15_y_diff lag_21_y_diff lag_28_y_diff lag_35_y_diff lag_42_y_diff lag_49_y_diff lag_364_y_diff lag_182_y_diff lag_7_y lag_8_y lag_14_y lag_15_y lag_21_y lag_28_y lag_35_y lag_42_y lag_49_y lag_364_y lag_182_y lag_7_y_ratio lag_8_y_ratio lag_14_y_ratio lag_15_y_ratio lag_21_y_ratio lag_28_y_ratio lag_35_y_ratio lag_42_y_ratio lag_49_y_ratio lag_364_y_ratio lag_182_y_ratio lag_7_14_diff_sum lag_7_14_21_diff_sum lag_7_14_21_28_diff_sum lag_7_14_21_28_35_diff_sum lag_7_14_21_28_35_42_diff_sum lag_7_14_21_28_35_42_49_diff_sum lag_7_14_sum lag_7_14_21_sum lag_7_14_21_28_sum lag_7_14_21_28_35_sum lag_7_14_21_28_35_42_sum lag_7_14_21_28_35_42_49_sum id month day hour yobi week_number_year peak ampm minute quarter week_number_month
0 2019-12-01 00:00:00 -9.0 9.0 25.0 2.0 -6.0 -17.0 22.0 4.0 -7.0 24.0 16.0 49.0 41.0 58.0 32.0 33.0 39.0 56.0 34.0 30.0 41.0 30.0 -0.183673 0.219512 0.431034 0.062500 -0.181818 -0.435897 0.392857 0.392857 0.392857 0.585366 0.533333 16.0 10.0 -7.0 15.0 19.0 12.0 107.0 140.0 179.0 235.0 269.0 299.0 0 12 1 0 6 48 1 1 0 4 1
1 2019-12-01 00:30:00 4.0 4.0 16.0 5.0 -8.0 1.0 11.0 -5.0 10.0 42.0 14.0 64.0 50.0 60.0 46.0 44.0 52.0 51.0 40.0 45.0 63.0 37.0 0.062500 0.080000 0.266667 0.108696 -0.181818 0.019231 0.215686 0.215686 0.215686 0.666667 0.378378 20.0 12.0 13.0 24.0 19.0 29.0 124.0 168.0 220.0 271.0 311.0 356.0 0 12 1 0 6 48 1 1 30 4 1
2 2019-12-01 01:00:00 11.0 24.0 12.0 8.0 -36.0 50.0 -7.0 -3.0 4.0 41.0 29.0 85.0 64.0 74.0 40.0 62.0 98.0 48.0 55.0 58.0 69.0 47.0 0.129412 0.375000 0.162162 0.200000 -0.580645 0.510204 -0.145833 -0.145833 -0.145833 0.594203 0.617021 23.0 -13.0 37.0 30.0 27.0 31.0 159.0 221.0 319.0 367.0 422.0 480.0 0 12 1 1 6 48 1 1 0 4 1
3 2019-12-01 01:30:00 -10.0 1.0 -2.0 1.0 -37.0 42.0 11.0 4.0 2.0 33.0 20.0 58.0 51.0 68.0 50.0 70.0 107.0 65.0 54.0 50.0 59.0 33.0 -0.172414 0.019608 -0.029412 0.020000 -0.528571 0.392523 0.169231 0.169231 0.169231 0.559322 0.606061 -12.0 -49.0 -7.0 4.0 8.0 10.0 126.0 196.0 303.0 368.0 422.0 472.0 0 12 1 1 6 48 1 1 30 4 1
4 2019-12-01 02:00:00 -8.0 9.0 14.0 -12.0 14.0 -24.0 29.0 -1.0 -3.0 45.0 21.0 62.0 42.0 70.0 33.0 56.0 42.0 66.0 37.0 38.0 70.0 42.0 -0.129032 0.214286 0.200000 -0.363636 0.250000 -0.571429 0.439394 0.439394 0.439394 0.642857 0.500000 6.0 20.0 -4.0 25.0 24.0 21.0 132.0 188.0 230.0 296.0 333.0 371.0 0 12 1 2 6 48 1 1 0 4 1

モデリング

start = time.time()
print(datetime.datetime.now())

params = {
    "objective" : "regression_l2",
    "metric" : "rmse",
    'verbosity': -1,
    'boosting_type': 'gbdt',
    "max_depth": 10,
    "seed" : 810, # 鳩
}

valid_scores = []
models = []
preds = []
for i,term in enumerate(list_term):
    print(i)
    print(datetime.datetime.now())
    X_train = data_df[(term[0] <= data_df["ds"])&(data_df["ds"] < term[1])][["ds"]+feature].copy().reset_index(drop=True)
    X_valid = data_df[(term[1] <= data_df["ds"])&(data_df["ds"] < term[2])][["ds"]+feature].copy().reset_index(drop=True)
    y_train = data_df[(term[0] <= data_df["ds"])&(data_df["ds"] < term[1])][[target]].copy().reset_index(drop=True)
    y_valid = data_df[(term[1] <= data_df["ds"])&(data_df["ds"] < term[2])][[target]].copy().reset_index(drop=True)

    train_set = lgb.Dataset(X_train.drop(columns=["ds"]), y_train, categorical_feature=feature_c)
    valid_set = lgb.Dataset(X_valid.drop(columns=["ds"]), y_valid, categorical_feature=feature_c)

    # optunaやろうかやるまいか。。あとでやる
    best_booster = lgb.train(
        params=params,
        num_boost_round=100,
        train_set=train_set,
        valid_sets=[valid_set],
        callbacks=[
            lgb.early_stopping(stopping_rounds=10,verbose=True),
            lgb.log_evaluation(0)
        ],
    )
    y_valid_pred = best_booster.predict(X_valid.drop(columns=["ds"]))
    score = np.sqrt(mean_squared_error(y_valid, y_valid_pred))
    print(score)

    valid_scores.append(score)
    models.append(best_booster)

    X_valid.loc[:,target] = y_valid
    X_valid.loc[:,target+"_pred"] = y_valid_pred
    preds += [X_valid[["ds","id",target,target+"_pred"]]]

df_pred = pd.concat(preds, axis=0)
print(datetime.datetime.now())
print(time.time() - start)
2023-10-18 02:55:32.494141
0
2023-10-18 02:55:32.497922
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[49]	valid_0's rmse: 16.5224
16.52237810292792
1
2023-10-18 02:56:32.054683
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[78]	valid_0's rmse: 15.702
15.701957711633412
2
2023-10-18 02:57:52.047473
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[66]	valid_0's rmse: 12.8013
12.801286112953457
3
2023-10-18 02:58:58.224308
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[38]	valid_0's rmse: 13.9681
13.968099840822498
4
2023-10-18 02:59:50.335213
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[75]	valid_0's rmse: 12.1229
12.122861402636937
5
2023-10-18 03:01:09.962083
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[71]	valid_0's rmse: 14.1581
14.158075557274952
6
2023-10-18 03:02:24.338493
Training until validation scores don't improve for 10 rounds
Did not meet early stopping. Best iteration is:
[92]	valid_0's rmse: 13.9122
13.91217434196716
7
2023-10-18 03:03:46.196818
Training until validation scores don't improve for 10 rounds
Did not meet early stopping. Best iteration is:
[100]	valid_0's rmse: 17.09
17.09002184506239
8
2023-10-18 03:05:13.650979
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[86]	valid_0's rmse: 15.829
15.829000725192014
9
2023-10-18 03:06:33.812730
Training until validation scores don't improve for 10 rounds
Did not meet early stopping. Best iteration is:
[100]	valid_0's rmse: 14.0112
14.011171739690957
10
2023-10-18 03:07:55.894757
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[87]	valid_0's rmse: 19.1044
19.10442255745607
11
2023-10-18 03:09:20.164350
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[45]	valid_0's rmse: 16.5177
16.51769254240633
12
2023-10-18 03:10:18.986233
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[72]	valid_0's rmse: 18.1565
18.156510100431635
13
2023-10-18 03:11:33.026930
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[53]	valid_0's rmse: 17.4281
17.428071987919047
14
2023-10-18 03:12:40.956040
Training until validation scores don't improve for 10 rounds
Did not meet early stopping. Best iteration is:
[100]	valid_0's rmse: 14.4566
14.456644067454894
15
2023-10-18 03:14:02.067742
Training until validation scores don't improve for 10 rounds
Did not meet early stopping. Best iteration is:
[100]	valid_0's rmse: 17.7746
17.774621285910698
16
2023-10-18 03:15:23.509473
Training until validation scores don't improve for 10 rounds
Did not meet early stopping. Best iteration is:
[100]	valid_0's rmse: 16.6244
16.62441312120392
17
2023-10-18 03:16:50.346785
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[57]	valid_0's rmse: 17.0008
17.000768402177975
18
2023-10-18 03:17:53.399734
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[7]	valid_0's rmse: 19.0798
19.079818231499463
19
2023-10-18 03:18:25.933257
Training until validation scores don't improve for 10 rounds
Early stopping, best iteration is:
[10]	valid_0's rmse: 35.6021
35.60208220972919
2023-10-18 03:19:00.035495
1407.5421886444092
print(valid_scores)
print(f'cv: {np.mean(valid_scores):.4f} ± {np.std(valid_scores):.4f}')

[16.52237810292792, 15.701957711633412, 12.801286112953457, 13.968099840822498, 12.122861402636937, 14.158075557274952, 13.91217434196716, 17.09002184506239, 15.829000725192014, 14.011171739690957, 19.10442255745607, 16.51769254240633, 18.156510100431635, 17.428071987919047, 14.456644067454894, 17.774621285910698, 16.62441312120392, 17.000768402177975, 19.079818231499463, 35.60208220972919]
cv: 16.8931 ± 4.7115

model評価

  1. importanceの確認
importance = pd.DataFrame({
    "feature":feature# + feature_p,
})
for i in range(num_valid):
  importance.loc[:,"imp_"+str(i)] = models[i].feature_importance(importance_type='gain')

importance.loc[:,"imp"] = importance[["imp_"+str(i) for i in range(num_valid)]].mean(axis=1)
importance = importance.sort_values( ["imp"], ascending=False ).reset_index(drop=True)

# 可視化用に縦持ち
importance_p = pd.melt(
    importance, id_vars=["feature"], value_vars=["imp_"+str(i) for i in range(num_valid-2)],
    var_name="cv", value_name="imp"
)
fig, ax = plt.subplots(1, 1, figsize=(20,5))
sns.boxplot(x='feature', y='imp', data=importance_p, showfliers=True, ax=ax)
sns.stripplot(x='feature', y='imp', data=importance_p, jitter=True, color='black', ax=ax)
plt.xticks(rotation=90)
plt.show()
plt.close()
plt.clf()
<Figure size 640x480 with 0 Axes>

予測期間の予測

  1. 上で作成した20個のモデルから予測値を算出し、平均化

df_p_test = pd.DataFrame({
    "ds":test_X["ds"],
    "id":test_X["id"],
})
for i in range(num_valid):
  df_p_test.loc[:,"p_"+str(i)] = models[i].predict(test_X.drop(columns=["ds"]))
df_p_test.loc[:,target] = df_p_test[["p_"+str(i) for i in range(num_valid)]].mean(axis=1)

df_p_test
ds id p_0 p_1 p_2 p_3 p_4 p_5 p_6 p_7 p_8 p_9 p_10 p_11 p_12 p_13 p_14 p_15 p_16 p_17 p_18 p_19 y_diff
0 2019-12-01 00:00:00 0 -5.987569 -4.049480 -2.067799 -5.172304 -2.043512 -4.290158 -3.436173 -2.300683 -3.268234 -5.334087 -3.667078 -3.098998 -3.690946 -2.037640 7.927288 -3.125983 -4.903559 -4.355229 -4.000627 -0.384659 -2.964372
1 2019-12-01 00:30:00 0 -11.811568 2.289212 -8.894862 -9.626971 -9.649868 -10.609826 -9.155092 -9.203097 1.780453 -10.915441 -10.262607 -10.062258 -12.674401 -11.621274 0.224474 -13.590294 -11.299707 -11.125552 -4.876711 -7.273418 -8.417940
2 2019-12-01 01:00:00 0 -15.055681 -4.068192 -13.777418 -10.537198 -15.521889 -15.886448 -16.819746 -14.041582 -3.321415 -15.650388 -11.715205 -16.937093 -13.987021 -17.516257 -7.281736 -17.691119 -16.420388 -17.124032 -9.128959 -11.269493 -13.187563
3 2019-12-01 01:30:00 0 10.219280 11.808957 12.172895 8.108707 11.806605 11.592320 12.158343 11.963290 10.056736 9.432975 12.889696 12.664564 13.199889 10.386991 14.643005 14.091954 9.485976 10.987640 2.984438 8.054777 10.935452
4 2019-12-01 02:00:00 0 -4.954675 -1.958903 -1.397884 -6.001234 -3.377880 -5.113123 -1.969360 -3.524124 -4.601961 -5.495884 -3.774563 -3.776555 -4.275754 -1.856756 -1.133228 -2.355394 -3.318899 -1.562502 -4.388309 -4.611658 -3.472432
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
26539 2019-12-07 21:30:00 78 39.406997 45.442531 43.116963 36.853059 43.610210 41.367584 43.153560 43.057959 39.556898 39.216493 40.554808 35.595738 40.114734 40.594344 43.752460 48.734825 42.478621 40.953912 14.758771 19.186908 39.075369
26540 2019-12-07 22:00:00 78 39.060970 38.470825 39.197638 34.032954 40.335457 41.823266 44.737772 39.697671 39.069606 39.638004 40.001643 36.770446 42.713502 40.306960 40.676187 43.018999 44.148941 40.036759 15.372432 18.601487 37.885576
26541 2019-12-07 22:30:00 78 35.992159 40.059395 41.784433 31.284896 37.995332 37.971215 40.875624 39.934740 40.460008 40.015087 42.138984 34.654532 40.106285 35.164505 41.538022 40.197062 40.256109 38.643334 12.533972 17.573552 36.458962
26542 2019-12-07 23:00:00 78 20.466418 20.919298 21.413820 18.004469 25.704675 24.753557 21.830074 25.101810 20.625811 21.970171 21.333877 14.610272 24.434872 19.812786 21.725774 21.097146 23.520261 20.426885 4.935743 8.447192 20.056746
26543 2019-12-07 23:30:00 78 36.981026 38.614770 35.195329 31.876444 36.788047 40.001321 41.397470 41.504350 39.366595 37.042793 44.023278 36.916089 42.292673 32.699400 40.859369 38.772997 43.523346 38.131795 15.048237 23.368167 36.720175

26544 rows × 23 columns

後処理

  1. 階差列を原系列に戻す関数
# 原系列に戻す関数
## 超絶汚い希ガス・・・
def reverse_diff2org(data_df, d, colname):
  d = d[["ds","id",colname]].copy()

  # cumsumするための初期値
  init_s = d["ds"].min() + datetime.timedelta(days=-7)
  init_e = d["ds"].min()
  d_init = data_df.loc[((init_s<=data_df["ds"])&(data_df["ds"]<init_e)), ["ds","id","y"]].rename(columns={'y':colname})
  # 原系列に戻す
  d_org = pd.concat([d_init, d], axis=0).reset_index(drop=True)
  d_org.loc[:,"hour_minute"] = d_org["ds"].dt.strftime('%H%M')
  d_org.loc[:,"yobi"] = d_org["ds"].dt.weekday

  d_org.loc[:,"y_pred"] = d_org[["id","yobi","hour_minute",colname]].groupby(["id","yobi","hour_minute"]).cumsum().agg(np.ceil) # 切り上げ
  d_org.loc[d_org["y_pred"]<0,"y_pred"] = 0
  d_org.loc[:,"y_pred"] = d_org["y_pred"].astype(int)
  # 初期値を削除
  d_org = d_org[d_org["ds"]>=init_e]
  # 正解の値をマージ(validの評価用)
  d_org = pd.merge(d_org, data_df[["ds", "id", "y"]], how="left", on=["ds", "id"])

  return d_org
df_p_test_org = reverse_diff2org(data_df, d=df_p_test[["ds","id","y_diff"]], colname="y_diff")
df_p_test_org
ds id y_diff hour_minute yobi y_pred y
0 2019-12-01 00:00:00 0 -2.964372 0000 6 47 NaN
1 2019-12-01 00:30:00 0 -8.417940 0030 6 56 NaN
2 2019-12-01 01:00:00 0 -13.187563 0100 6 72 NaN
3 2019-12-01 01:30:00 0 10.935452 0130 6 69 NaN
4 2019-12-01 02:00:00 0 -3.472432 0200 6 59 NaN
... ... ... ... ... ... ... ...
26539 2019-12-07 21:30:00 78 39.075369 2130 5 115 NaN
26540 2019-12-07 22:00:00 78 37.885576 2200 5 123 NaN
26541 2019-12-07 22:30:00 78 36.458962 2230 5 109 NaN
26542 2019-12-07 23:00:00 78 20.056746 2300 5 109 NaN
26543 2019-12-07 23:30:00 78 36.720175 2330 5 115 NaN

26544 rows × 7 columns

# 予測結果の確認
plot_d_y = data_df[data_df["ds"]>="2019-11-01"]
plot_d_p = df_p_test_org

fig, ax = plt.subplots(79, 1, figsize=(20, 79*4))

for i in range(79):
    ax[i].plot(plot_d_y[plot_d_y["id"]==i]['ds'], plot_d_y[plot_d_y["id"]==i]["y"])
    ax[i].plot(plot_d_p[plot_d_p["id"]==i]['ds'], plot_d_p[plot_d_p["id"]==i]["y_pred"])
    ax[i].set_title(str(i))

plt.show()
plt.close()
plt.clf()

# 画像は添付をご確認ください
Output hidden; open in https://colab.research.google.com to view.
# sub用データ作成(たて→よこ)
df_sub = df_p_test_org.copy()
df_sub.loc[:,"id"] = df_sub["id"].astype(str)
df_sub = df_sub.pivot(
    index="ds",
    columns="id",
    values="y_pred" # , y_pred, y_maze
).reset_index()[["ds"]+list(map(str, range(79)))]
df_sub.columns = [["tpep_pickup_datetime"]+list(map(str, range(79)))]
df_sub.head()
tpep_pickup_datetime 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
0 2019-12-01 00:00:00 47 9 23 13 13 9 5 21 10 42 18 296 64 4 8 5 197 18 29 479 53 32 144 12 101 209 134 226 7 48 3 111 90 11 50 111 190 34 125 8 7 309 21 6 136 164 106 140 179 22 153 2 16 161 3 21 94 3 13 7 94 252 137 32 57 239 74 143 58 121 8 97 316 31 20 2 21 22 110
1 2019-12-01 00:30:00 56 11 12 9 10 4 4 21 7 34 17 249 76 2 6 4 198 17 17 522 43 26 147 9 91 206 109 244 4 53 4 70 85 0 46 92 127 21 133 11 8 366 20 7 161 119 90 118 184 16 134 4 10 132 5 21 87 4 12 5 90 220 124 33 49 198 59 99 49 88 6 78 317 35 21 2 24 21 116
2 2019-12-01 01:00:00 72 15 10 10 11 6 3 16 8 20 26 266 79 2 7 3 217 20 18 643 35 23 156 11 90 196 103 285 7 52 7 54 85 5 38 97 89 17 159 8 8 455 18 5 183 121 76 103 192 16 116 5 12 135 3 23 87 3 11 7 81 192 113 32 44 192 39 75 31 68 6 99 323 25 24 4 15 15 100
3 2019-12-01 01:30:00 69 14 6 7 7 3 2 15 10 12 17 196 59 1 7 2 202 15 13 621 29 25 140 12 75 159 80 293 8 53 6 32 74 3 29 88 58 12 155 7 8 500 13 4 196 78 50 88 168 14 113 3 10 86 3 17 86 4 6 9 62 159 101 32 29 160 33 50 25 48 5 97 301 30 22 6 12 13 89
4 2019-12-01 02:00:00 59 11 5 5 4 4 2 15 7 9 15 170 48 1 5 2 175 11 11 559 23 20 114 6 55 134 66 254 5 53 6 11 50 2 15 68 29 8 147 7 7 482 10 3 178 45 39 70 139 9 81 4 5 79 2 16 67 3 7 7 43 125 77 27 24 123 20 31 19 31 4 100 249 23 18 4 10 7 74
df_sub.to_csv(path+'submit/'+'chk.csv',index=False, header=True)

添付データ

  • lightgbm_chk.png?X-Amz-Expires=10800&X-Amz-Date=20241123T040743Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIP7GCBGMWPMZ42PQ
  • Aws4 request&x amz signedheaders=host&x amz signature=575dc4bcaa4f8485776c78f701ac74e76fdece7a5d9ccf3317cdbda4a928c91a
    mini_forest

    model評価 importanceの確認にて、謎のrange(num_valid-2)がありますが、色々試行錯誤していた時の直し忘れでした、、、
    -2の結果、importanceがCV直近2期間を除外した図になっておりますのでご了承ください(最終的なサブミットでは全期間採用)

    Favicon
    new user
    コメントするには 新規登録 もしくは ログイン が必要です。