foliumを使ってヒートマップを作ってみる


**folium**というというPythonライブラリを使い、新型コロナウイルスのデータを**ビジュアライゼーション**します。

:::note info
folium は JavaScript の leaflet.js という地図ライブラリを Pythonライブラリにしたもので、データを地図上に可視化することができます。
:::

# 前提環境
- Windows10
- Jupyter Notebook
- Python3



### folium導入
~~~ruby:Python3
pip install folium
~~~

~~~ruby:Anaconda　Prompt
conda install -c conda-forge folium
#　Anacondaを利用したインストール方法
~~~

## ライブラリインポート
一括でインポートさせていただきます。

~~~ruby:Python3
from datetime import datetime, timedelta
import pandas as pd
import numpy as np
import folium
from folium.plugins import HeatMap
import pandas as pd
import folium
from folium import plugins
~~~

## データ準備

##### 新規陽性者数の推移（日別）
以下のリンクから **CSV** をダウンロードすることができます。

https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_daily.csv

##### 47都道府県の県庁所在地の緯度経度データ
以下のリンクから **CSV** をダウンロードすることができます。

https://techtech-sorae.com/jp_city_latlon/

## データの読み込み
### CSV 

~~~ruby:Python3
df_newly = pd.read_csv('C:\\Users\\Symbol\\Downloads\\newly_confirmed_cases_daily.csv', index_col='Date')
df_pref_lat_lon = pd.read_csv('C:\\Users\\Symbol\\Downloads\\pref_lat_lon.csv', index_col='Date')
# index_col='Date' で、Date 列（カラム）をインデックスに設定します。
~~~

**ダウンロード（Downloads）** に保存されているものは以下のコードで読み込むことができます。
ただし、`C:\\Users\\Symbol\\Downloads\\newly_confirmed_cases_daily.csv` の **Symbol** の部分はご自身の環境に応じて書き換えてください。
今回は、**ダウンロード（Downloads）** に保存されていいる想定ですが、**デスクトップ（Desktop）**に保存した場合は、コードの **Downloads** を**Desktop** に書き換えてください。

### Excel

~~~ruby:Python3
df_newly = pd.read_excel('C:\\Users\\Symbol\\Downloads\\newly_confirmed_cases_daily.xlsx', index_col='Date')
df_pref_lat_lon = pd.read_csv('C:\\Users\\Symbol\\Downloads\\pref_lat_lon.xlsx', index_col='Date')
# index_col='Date' で、Date 列（カラム）をインデックスに設定します。
~~~

**ダウンロード（Downloads）** に保存されているものは以下のコードで読み込むことができます。
ただし、`C:\\Users\\Symbol\\Downloads\\newly_confirmed_cases_daily.xlsx` の **Symbol** の部分はご自身の環境に応じて書き換えてください。
今回は、**ダウンロード（Downloads）** に保存されていいる想定ですが、**デスクトップ（Desktop）**に保存した場合は、コードの **Downloads** を**Desktop** に書き換えてください。

### Web 

~~~ruby:Python3
df_newly = pd.read_csv("https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_daily.csv", encoding='utf-8', index_col='Date')
df_pref_lat_lon = pd.read_csv('https://techtech-sorae.com/wp-content/uploads/2021/07/pref_lat_lon.csv', encoding='utf-8')
# index_col='Date' で、Date 列（カラム）をインデックスに設定します。
# encoding='utf-8' で、utf-8 でエンコードします。
~~~

:::note info
Webから直接読み込む方法が、何かと便利だと思います。パス（ファイルが保存されているアドレス）の設定は Windows と Unix 系（Macなど）では異なるので面倒です。
:::

## DataFrameの加工

### 下処理
~~~ruby:Python3
df_newly.drop(columns='ALL', inplace=True) # ALL 列を削除します。
df_newly = df_newly.T # 行と列を入れ替えます。
df_newly = df_newly.reset_index() # 新しいインデックスを設定します。

df_data = pd.concat([df_newly, df_pref_lat_lon], axis=1) # df_newly と df_pref_lat_lon を結合します。
df_data.insert(1, '2020/1/15', '0')# name='2020/1/15', 値が全て０の列を列番号１（先頭から２列目）に追加します。
~~~

### 増加のデータの作成
~~~ruby:Python3
time_columns = df_data.columns[1:len(df_newly.columns)].values

df_data.loc[:, time_columns] = df_data.loc[:, time_columns].astype(float)
diff_data = df_data.copy()
diff_data.loc[:, time_columns]  = df_data.loc[:, time_columns].diff(axis=1)

# 2020/1/15のデータがなくなるので削除する
diff_data = diff_data.dropna(axis=1)
time_columns = time_columns[1:]
~~~

### データの正規化
~~~ruby:Python3
scaled_data = diff_data.copy()

scaled_data.loc[:, time_columns] = (diff_data.loc[:, time_columns] - diff_data.loc[:, time_columns] .min().min()) / (diff_data.loc[:, time_columns] .max().max() - diff_data.loc[:, time_columns] .min().min())
scaled_data.loc[:, time_columns] = scaled_data.loc[:, time_columns] + 1e-4
scaled_data.head()
~~~

### 地図の設定
~~~ruby:Python3
heat_map_data = [[[row['lat'],row['lon'], row[idx]] for index, row in scaled_data.iterrows()] for idx in time_columns]
~~~
### 描画
~~~ruby:Python3
COVID19_map = folium.Map(location=[35, 135], zoom_start=6)
hm = plugins.HeatMapWithTime(heat_map_data, index=list(time_columns),auto_play=True,radius=30,max_opacity=1,gradient={0.38: 'blue', 0.4: 'lime', 0.5:'yellow',0.75: 'orange', 0.9:'red'})
hm.add_to(COVID19_map)

COVID19_map
~~~

## 完成図
![Screenshot 2022-02-05 at 17-14-07 Desktop Untitle (2) - JupyterLab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2339630/76d10b07-bb8d-5ad3-941f-63bc891564a6.png)




# 参考文献リンク集

##### folium
https://github.com/python-visualization/folium
##### Quickstart-folium
https://python-visualization.github.io/folium/quickstart.html
##### 厚生労働省のオープンデータ
https://www.mhlw.go.jp/stf/covid-19/open-data.html



# 参考文献
https://note.com/narudesu/n/n3d882a711e24

https://qiita.com/hcpmiyuki/items/e16edc17805c94c03651