LoginSignup
4
6

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-09

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

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

前提環境

  • Windows10
  • Jupyter Notebook
  • Python3

folium導入

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

ライブラリインポート

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

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 をダウンロードすることができます。

47都道府県の県庁所在地の緯度経度データ

以下のリンクから CSV をダウンロードすることができます。

データの読み込み

CSV

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.csvSymbol の部分はご自身の環境に応じて書き換えてください。
今回は、ダウンロード(Downloads) に保存されていいる想定ですが、デスクトップ(Desktop)に保存した場合は、コードの Downloads をDesktop に書き換えてください。

Excel

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.xlsxSymbol の部分はご自身の環境に応じて書き換えてください。
今回は、ダウンロード(Downloads) に保存されていいる想定ですが、デスクトップ(Desktop)に保存した場合は、コードの Downloads をDesktop に書き換えてください。

Web

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 でエンコードします。

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

DataFrameの加工

下処理

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', 値が全て0の列を列番号1(先頭から2列目)に追加します。

増加のデータの作成

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:]

データの正規化

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()

地図の設定

Python3
heat_map_data = [[[row['lat'],row['lon'], row[idx]] for index, row in scaled_data.iterrows()] for idx in time_columns]

描画

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

参考文献リンク集

folium

Quickstart-folium

厚生労働省のオープンデータ

参考文献

4
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6