# 機械学習と数理最適化の融合


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

``` python
from typing import List, Optional, Union, Tuple, Dict, Any
from pydantic import BaseModel, Field, ValidationError, validator, confloat, conint, constr, Json
from pydantic.tools import parse_obj_as
import pandas as pd
import numpy as np
import fastai.tabular.core as ft
```

## 文脈から問題例を生成する関数 instance_generation

引数：

- 文脈（Context；たとえば日付）を表すデータフレーム
- 他のTabularPandasの引数

返値： - 問題例を生成

これは， 表データから表データを生成する深層学習モデルなので， fastaiの
TabularPandas で代用できる． 複数ラベル回帰を用いる．
顧客数だけを予測してから，点の座標を予測する．
その後，予測した点の数だけサンプリングする．

https://docs.fast.ai/tabular.core.html#tabularpandas

他の方法としては，問題例をクラスタリングして分類ラベルを付与し，
与えられた文脈からラベルを当てる分類を適当な機械学習で行うことも考えられる．

``` python
#Context（日付）
df = pd.DataFrame({'date': pd.date_range(
    start='2021/1/1',
    freq='d',
    periods=30
)})
#ft.make_date(df, 'date')
ft.add_datepart(df, "date")
df.head()
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">Year</th>
<th data-quarto-table-cell-role="th">Month</th>
<th data-quarto-table-cell-role="th">Week</th>
<th data-quarto-table-cell-role="th">Day</th>
<th data-quarto-table-cell-role="th">Dayofweek</th>
<th data-quarto-table-cell-role="th">Dayofyear</th>
<th data-quarto-table-cell-role="th">Is_month_end</th>
<th data-quarto-table-cell-role="th">Is_month_start</th>
<th data-quarto-table-cell-role="th">Is_quarter_end</th>
<th data-quarto-table-cell-role="th">Is_quarter_start</th>
<th data-quarto-table-cell-role="th">Is_year_end</th>
<th data-quarto-table-cell-role="th">Is_year_start</th>
<th data-quarto-table-cell-role="th">Elapsed</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">0</td>
<td>2021</td>
<td>1</td>
<td>53</td>
<td>1</td>
<td>4</td>
<td>1</td>
<td>False</td>
<td>True</td>
<td>False</td>
<td>True</td>
<td>False</td>
<td>True</td>
<td>1.609459e+09</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">1</td>
<td>2021</td>
<td>1</td>
<td>53</td>
<td>2</td>
<td>5</td>
<td>2</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>1.609546e+09</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2</td>
<td>2021</td>
<td>1</td>
<td>53</td>
<td>3</td>
<td>6</td>
<td>3</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>1.609632e+09</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">3</td>
<td>2021</td>
<td>1</td>
<td>1</td>
<td>4</td>
<td>0</td>
<td>4</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>1.609718e+09</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">4</td>
<td>2021</td>
<td>1</td>
<td>1</td>
<td>5</td>
<td>1</td>
<td>5</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>1.609805e+09</td>
</tr>
</tbody>
</table>

</div>

## 問題例を入力とし，過去の学習データから解の情報を返す関数

問題例間の距離を定義する必要がある．

Instanceクラス

- たとえばTSPなら点数と座標の列や地点間の移動費用，時間の行列；
  　点の座標は（たとえば北東方向に）大きい順に並べておく．
- 他の問題例との距離計算（輸送問題を解く） 割当問題の解法
  https://scmopt.github.io/opt100/33ap.html#%E5%89%B2%E5%BD%93%E5%95%8F%E9%A1%8C
- 問題例をクラスタリングしたときのラベル
- 対応する文脈データフレーム

Solutionクラス

- 対応するInstance

``` python
class Instance():
        
    def __init__(self, context=None, data=None, feature=None):
        self.context = context
        self.data = data
        self.feature = self.extract_feature(data)
    
    def extract_feature(self, data=None):
        pass
    
    def distance(self, another):
        pass
        
    class Config:
        arbitrary_types_allowed = True
        
class Solution():
    pass
```

``` python
an_instance = Instance()
```

``` python
#Dayによって顧客数や分布が異なるように設定
n_max, n_min = 100, 50 #平日と休日の平均顧客数
sd = 10 #standard deviation 
data = []
for row in df.itertuples():
    if row.Dayofweek<=4:
        loc = np.random.normal( loc= 0, scale = sd, size= (n_max,2) )
        instance = Instance(numpyArray=loc)
    else:
        loc = np.random.normal( loc= 0, scale = sd, size= (n_min,2) )
        instance = Instance(numpyArray=loc)
    
    new_loc = np.concatenate( ((loc[:,0] + loc[:,1]).reshape( (-1,1) ), loc ), axis=1 )
    new_loc.sort(axis=0)
    sorted_loc = new_loc[:,1:]
    
    data.append( sorted_loc.flatten() )
```

``` python
new_loc = np.concatenate( ((loc[:,0] + loc[:,1]).reshape( (-1,1) ), loc ), axis=1 )
```

``` python
new_loc.sort(axis=0)
sorted_loc = new_loc[:,1:]
sorted_loc
```

    array([[-20.19666462, -24.74534989],
           [-13.69222509, -17.30384304],
           [-12.33393609, -15.45093693],
           [-10.53916806, -15.32671206],
           [ -9.35126821, -15.22409121],
           [ -8.822563  , -14.52154506],
           [ -8.73932943, -12.28191137],
           [ -8.36073931, -12.13593063],
           [ -8.02864509, -11.33781158],
           [ -7.74814991, -11.22964621],
           [ -7.7033224 , -10.10622249],
           [ -7.42682121,  -8.17208738],
           [ -6.55308268,  -7.914439  ],
           [ -5.66587855,  -6.38066481],
           [ -5.282336  ,  -6.34512238],
           [ -4.90897862,  -4.69273309],
           [ -3.94285144,  -4.53736864],
           [ -3.23423259,  -4.38628677],
           [ -3.16378394,  -4.35164651],
           [ -2.82444794,  -3.8416044 ],
           [ -2.72227564,  -3.29531517],
           [ -2.62622257,  -2.25543761],
           [ -2.40086914,  -2.03813249],
           [ -1.5312655 ,  -1.94330015],
           [ -1.5306093 ,  -1.57389452],
           [ -1.24658262,  -0.88679573],
           [ -1.03659721,  -0.83513033],
           [ -0.64599481,  -0.72145542],
           [  1.16255704,   1.08847602],
           [  2.35537998,   1.26442765],
           [  2.54497356,   2.33036034],
           [  4.16398703,   3.35935826],
           [  4.19791133,   3.81257709],
           [  4.6522782 ,   3.85829137],
           [  4.83735901,   3.99427655],
           [  4.96292333,   4.71795374],
           [  5.65189015,   5.10307142],
           [  5.75416739,   6.04482509],
           [  6.40985136,   6.39549295],
           [  7.24370719,   6.71061287],
           [  7.25471248,   7.65835066],
           [  8.06849262,   7.83926117],
           [  8.6756994 ,   8.892523  ],
           [ 11.8957031 ,   9.88954257],
           [ 12.03415855,  10.10811007],
           [ 12.91862634,  10.68724123],
           [ 14.15213083,  12.69164302],
           [ 15.66748155,  12.73932924],
           [ 23.25826818,  13.61147835],
           [ 29.68281631,  22.75131276]])

``` python
sorted_loc.flatten()
```

    array([-20.19666462, -24.74534989, -13.69222509, -17.30384304,
           -12.33393609, -15.45093693, -10.53916806, -15.32671206,
            -9.35126821, -15.22409121,  -8.822563  , -14.52154506,
            -8.73932943, -12.28191137,  -8.36073931, -12.13593063,
            -8.02864509, -11.33781158,  -7.74814991, -11.22964621,
            -7.7033224 , -10.10622249,  -7.42682121,  -8.17208738,
            -6.55308268,  -7.914439  ,  -5.66587855,  -6.38066481,
            -5.282336  ,  -6.34512238,  -4.90897862,  -4.69273309,
            -3.94285144,  -4.53736864,  -3.23423259,  -4.38628677,
            -3.16378394,  -4.35164651,  -2.82444794,  -3.8416044 ,
            -2.72227564,  -3.29531517,  -2.62622257,  -2.25543761,
            -2.40086914,  -2.03813249,  -1.5312655 ,  -1.94330015,
            -1.5306093 ,  -1.57389452,  -1.24658262,  -0.88679573,
            -1.03659721,  -0.83513033,  -0.64599481,  -0.72145542,
             1.16255704,   1.08847602,   2.35537998,   1.26442765,
             2.54497356,   2.33036034,   4.16398703,   3.35935826,
             4.19791133,   3.81257709,   4.6522782 ,   3.85829137,
             4.83735901,   3.99427655,   4.96292333,   4.71795374,
             5.65189015,   5.10307142,   5.75416739,   6.04482509,
             6.40985136,   6.39549295,   7.24370719,   6.71061287,
             7.25471248,   7.65835066,   8.06849262,   7.83926117,
             8.6756994 ,   8.892523  ,  11.8957031 ,   9.88954257,
            12.03415855,  10.10811007,  12.91862634,  10.68724123,
            14.15213083,  12.69164302,  15.66748155,  12.73932924,
            23.25826818,  13.61147835,  29.68281631,  22.75131276])

``` python
#dfに追加（顧客数も追加）
loc_df = pd.DataFrame(data)
```

``` python
pd.concat( [df, loc_df], axis=1 )
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
&#10;    .dataframe tbody tr th {
        vertical-align: top;
    }
&#10;    .dataframe thead th {
        text-align: right;
    }
</style>

<table class="dataframe" data-quarto-postprocess="true" data-border="1">
<thead>
<tr style="text-align: right;">
<th data-quarto-table-cell-role="th"></th>
<th data-quarto-table-cell-role="th">Year</th>
<th data-quarto-table-cell-role="th">Month</th>
<th data-quarto-table-cell-role="th">Week</th>
<th data-quarto-table-cell-role="th">Day</th>
<th data-quarto-table-cell-role="th">Dayofweek</th>
<th data-quarto-table-cell-role="th">Dayofyear</th>
<th data-quarto-table-cell-role="th">Is_month_end</th>
<th data-quarto-table-cell-role="th">Is_month_start</th>
<th data-quarto-table-cell-role="th">Is_quarter_end</th>
<th data-quarto-table-cell-role="th">Is_quarter_start</th>
<th data-quarto-table-cell-role="th">...</th>
<th data-quarto-table-cell-role="th">190</th>
<th data-quarto-table-cell-role="th">191</th>
<th data-quarto-table-cell-role="th">192</th>
<th data-quarto-table-cell-role="th">193</th>
<th data-quarto-table-cell-role="th">194</th>
<th data-quarto-table-cell-role="th">195</th>
<th data-quarto-table-cell-role="th">196</th>
<th data-quarto-table-cell-role="th">197</th>
<th data-quarto-table-cell-role="th">198</th>
<th data-quarto-table-cell-role="th">199</th>
</tr>
</thead>
<tbody>
<tr>
<td data-quarto-table-cell-role="th">0</td>
<td>2021</td>
<td>1</td>
<td>53</td>
<td>1</td>
<td>4</td>
<td>1</td>
<td>False</td>
<td>True</td>
<td>False</td>
<td>True</td>
<td>...</td>
<td>14.470132</td>
<td>20.842812</td>
<td>14.809092</td>
<td>22.660701</td>
<td>15.209006</td>
<td>22.725063</td>
<td>18.868986</td>
<td>23.626687</td>
<td>29.370445</td>
<td>28.334336</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">1</td>
<td>2021</td>
<td>1</td>
<td>53</td>
<td>2</td>
<td>5</td>
<td>2</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">2</td>
<td>2021</td>
<td>1</td>
<td>53</td>
<td>3</td>
<td>6</td>
<td>3</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">3</td>
<td>2021</td>
<td>1</td>
<td>1</td>
<td>4</td>
<td>0</td>
<td>4</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>14.920890</td>
<td>16.903697</td>
<td>15.339421</td>
<td>18.232201</td>
<td>15.420866</td>
<td>18.901594</td>
<td>16.108396</td>
<td>24.803074</td>
<td>17.458791</td>
<td>26.837565</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">4</td>
<td>2021</td>
<td>1</td>
<td>1</td>
<td>5</td>
<td>1</td>
<td>5</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>16.620776</td>
<td>13.192277</td>
<td>17.113658</td>
<td>13.442796</td>
<td>17.145945</td>
<td>13.689042</td>
<td>18.394004</td>
<td>20.106800</td>
<td>23.705008</td>
<td>25.717087</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">5</td>
<td>2021</td>
<td>1</td>
<td>1</td>
<td>6</td>
<td>2</td>
<td>6</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>19.174283</td>
<td>15.499169</td>
<td>19.307015</td>
<td>16.227055</td>
<td>21.029683</td>
<td>17.517485</td>
<td>22.046130</td>
<td>17.754123</td>
<td>26.434196</td>
<td>20.584023</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">6</td>
<td>2021</td>
<td>1</td>
<td>1</td>
<td>7</td>
<td>3</td>
<td>7</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>19.204572</td>
<td>17.585625</td>
<td>21.110851</td>
<td>17.667264</td>
<td>21.812600</td>
<td>19.550941</td>
<td>24.309018</td>
<td>22.560459</td>
<td>25.161768</td>
<td>23.408903</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">7</td>
<td>2021</td>
<td>1</td>
<td>1</td>
<td>8</td>
<td>4</td>
<td>8</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>15.978173</td>
<td>15.930315</td>
<td>16.300432</td>
<td>17.716276</td>
<td>18.003666</td>
<td>20.133823</td>
<td>20.179454</td>
<td>22.199705</td>
<td>20.717632</td>
<td>24.163873</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">8</td>
<td>2021</td>
<td>1</td>
<td>1</td>
<td>9</td>
<td>5</td>
<td>9</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">9</td>
<td>2021</td>
<td>1</td>
<td>1</td>
<td>10</td>
<td>6</td>
<td>10</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">10</td>
<td>2021</td>
<td>1</td>
<td>2</td>
<td>11</td>
<td>0</td>
<td>11</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>18.734432</td>
<td>15.311818</td>
<td>19.974946</td>
<td>16.032423</td>
<td>20.910366</td>
<td>20.280738</td>
<td>23.157091</td>
<td>20.382886</td>
<td>26.204243</td>
<td>21.547111</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">11</td>
<td>2021</td>
<td>1</td>
<td>2</td>
<td>12</td>
<td>1</td>
<td>12</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>14.473795</td>
<td>17.296738</td>
<td>18.006466</td>
<td>19.308644</td>
<td>18.114859</td>
<td>19.789006</td>
<td>19.152658</td>
<td>20.259421</td>
<td>23.773261</td>
<td>24.067777</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">12</td>
<td>2021</td>
<td>1</td>
<td>2</td>
<td>13</td>
<td>2</td>
<td>13</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>16.047620</td>
<td>11.983234</td>
<td>16.662413</td>
<td>14.059299</td>
<td>18.522118</td>
<td>15.099365</td>
<td>19.265778</td>
<td>15.182389</td>
<td>19.778607</td>
<td>18.048300</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">13</td>
<td>2021</td>
<td>1</td>
<td>2</td>
<td>14</td>
<td>3</td>
<td>14</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>20.008937</td>
<td>16.221666</td>
<td>20.111617</td>
<td>16.348063</td>
<td>21.458096</td>
<td>16.614298</td>
<td>29.560323</td>
<td>18.886797</td>
<td>33.268425</td>
<td>24.639888</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">14</td>
<td>2021</td>
<td>1</td>
<td>2</td>
<td>15</td>
<td>4</td>
<td>15</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>15.167943</td>
<td>17.820723</td>
<td>16.650802</td>
<td>19.963430</td>
<td>17.963204</td>
<td>22.391149</td>
<td>18.381884</td>
<td>23.846735</td>
<td>22.882777</td>
<td>24.703841</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">15</td>
<td>2021</td>
<td>1</td>
<td>2</td>
<td>16</td>
<td>5</td>
<td>16</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">16</td>
<td>2021</td>
<td>1</td>
<td>2</td>
<td>17</td>
<td>6</td>
<td>17</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">17</td>
<td>2021</td>
<td>1</td>
<td>3</td>
<td>18</td>
<td>0</td>
<td>18</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>17.136287</td>
<td>17.469488</td>
<td>17.142804</td>
<td>17.516448</td>
<td>18.589927</td>
<td>17.575417</td>
<td>21.233247</td>
<td>19.700874</td>
<td>26.086480</td>
<td>22.692306</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">18</td>
<td>2021</td>
<td>1</td>
<td>3</td>
<td>19</td>
<td>1</td>
<td>19</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>15.395525</td>
<td>14.435958</td>
<td>17.677362</td>
<td>15.293260</td>
<td>20.340947</td>
<td>16.074834</td>
<td>25.272895</td>
<td>18.181873</td>
<td>27.679798</td>
<td>24.392501</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">19</td>
<td>2021</td>
<td>1</td>
<td>3</td>
<td>20</td>
<td>2</td>
<td>20</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>18.327361</td>
<td>20.267441</td>
<td>18.634094</td>
<td>20.791375</td>
<td>20.257293</td>
<td>20.978126</td>
<td>21.129962</td>
<td>22.456371</td>
<td>26.234376</td>
<td>23.942431</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">20</td>
<td>2021</td>
<td>1</td>
<td>3</td>
<td>21</td>
<td>3</td>
<td>21</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>16.626384</td>
<td>16.446960</td>
<td>18.830958</td>
<td>17.035065</td>
<td>20.053474</td>
<td>18.842837</td>
<td>20.223198</td>
<td>24.516268</td>
<td>20.841600</td>
<td>25.171439</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">21</td>
<td>2021</td>
<td>1</td>
<td>3</td>
<td>22</td>
<td>4</td>
<td>22</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>22.943273</td>
<td>16.232633</td>
<td>23.352425</td>
<td>16.451594</td>
<td>23.798254</td>
<td>16.814654</td>
<td>27.866677</td>
<td>18.287373</td>
<td>28.669873</td>
<td>18.924273</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">22</td>
<td>2021</td>
<td>1</td>
<td>3</td>
<td>23</td>
<td>5</td>
<td>23</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">23</td>
<td>2021</td>
<td>1</td>
<td>3</td>
<td>24</td>
<td>6</td>
<td>24</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">24</td>
<td>2021</td>
<td>1</td>
<td>4</td>
<td>25</td>
<td>0</td>
<td>25</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>13.051126</td>
<td>16.176910</td>
<td>14.691632</td>
<td>21.956990</td>
<td>14.696065</td>
<td>22.078566</td>
<td>15.721047</td>
<td>22.890334</td>
<td>24.247104</td>
<td>27.744182</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">25</td>
<td>2021</td>
<td>1</td>
<td>4</td>
<td>26</td>
<td>1</td>
<td>26</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>17.066672</td>
<td>18.071581</td>
<td>19.149347</td>
<td>18.227819</td>
<td>19.395548</td>
<td>18.514316</td>
<td>22.566636</td>
<td>19.413032</td>
<td>23.693322</td>
<td>25.134841</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">26</td>
<td>2021</td>
<td>1</td>
<td>4</td>
<td>27</td>
<td>2</td>
<td>27</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>14.615501</td>
<td>18.174073</td>
<td>14.895239</td>
<td>19.835223</td>
<td>16.661473</td>
<td>20.114736</td>
<td>22.003240</td>
<td>23.647944</td>
<td>23.992727</td>
<td>29.237498</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">27</td>
<td>2021</td>
<td>1</td>
<td>4</td>
<td>28</td>
<td>3</td>
<td>28</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>16.130062</td>
<td>16.489784</td>
<td>16.364160</td>
<td>17.313268</td>
<td>17.327189</td>
<td>17.666102</td>
<td>18.210826</td>
<td>20.392974</td>
<td>20.443050</td>
<td>22.736248</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">28</td>
<td>2021</td>
<td>1</td>
<td>4</td>
<td>29</td>
<td>4</td>
<td>29</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>19.313625</td>
<td>17.858271</td>
<td>20.281820</td>
<td>17.864886</td>
<td>21.246656</td>
<td>20.640586</td>
<td>30.321315</td>
<td>23.640204</td>
<td>30.574485</td>
<td>31.760287</td>
</tr>
<tr>
<td data-quarto-table-cell-role="th">29</td>
<td>2021</td>
<td>1</td>
<td>4</td>
<td>30</td>
<td>5</td>
<td>30</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>False</td>
<td>...</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
</tr>
</tbody>
</table>

<p>30 rows × 213 columns</p>
</div>
