foliumというというPythonライブラリを使い、新型コロナウイルスのデータをビジュアライゼーションします。
folium は JavaScript の leaflet.js という地図ライブラリを Pythonライブラリにしたもので、データを地図上に可視化することができます。
前提環境
- Windows10
- Jupyter Notebook
- Python3
folium導入
pip install folium
conda install -c conda-forge folium
# Anacondaを利用したインストール方法
ライブラリインポート
一括でインポートさせていただきます。
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 をダウンロードすることができます。
47都道府県の県庁所在地の緯度経度データ
以下のリンクから CSV をダウンロードすることができます。
データの読み込み
CSV
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
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
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 でエンコードします。
Webから直接読み込む方法が、何かと便利だと思います。パス(ファイルが保存されているアドレス)の設定は Windows と Unix 系(Macなど)では異なるので面倒です。
DataFrameの加工
下処理
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', 値が全て0の列を列番号1(先頭から2列目)に追加します。
増加のデータの作成
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:]
データの正規化
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()
地図の設定
heat_map_data = [[[row['lat'],row['lon'], row[idx]] for index, row in scaled_data.iterrows()] for idx in time_columns]
描画
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
完成図
参考文献リンク集
folium
Quickstart-folium
厚生労働省のオープンデータ
参考文献