背景
私は横浜在住のサラリーマンです。Pythonをやり始めて2年。
2019#3のG検定と、第一回AI実装士の試験は合格しましたが、
「何ができる」ということはありません。
COVID-19について、テレビの報道を見ていると、すごく恐怖を感じたり、でもあるときは
大丈夫かな?と思ったり、簡潔に言うとTVにもて遊ばれてるような感覚にもなったので、
自分で状況を把握できないのだろうか?と考えたのがきっかけです。
対象範囲を絞ったのは
- 横浜:住んでいる
- 東京:会社がある
- 大阪:実家
という理由です。
あとは、kaggleのCORD-19も見たのですが、、、英語が、、、、。
どうするか
Googleで[東京 オープンデータ コロナ]と調べると、ありました。
ここから、データを参照して、まずはグラフ化に挑戦。
1. オープンデータURLのリンクcsvを作成
elements | url |
---|---|
tokyo_consultation | https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_combined_telephone_advice_center.csv |
tokyo_call | https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_call_center.csv |
tokyo_confirm | https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv |
kanagawa_confirm | http://www.pref.kanagawa.jp/osirase/1369/data/csv/patient.csv |
kanagawa_consultation | http://www.pref.kanagawa.jp/osirase/1369/data/csv/contacts.csv |
kanagawa_returnee | http://www.pref.kanagawa.jp/osirase/1369/data/csv/querent.csv |
osaka_confirm | http://www.pref.osaka.lg.jp/attach/23711/00346644/youseisyajyouhou.xlsx |
2. Indexとdateデータから単純な累積数をグラフ化する
ライブラリのインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime as dt
# ↓いつも私は入れている
plt.close('all')
データのDataFrame化と処理
各都府県で、formatが異なるのでそれぞれ処理
'''
##########################################
0. 東京都 新型コロナ受診相談窓口相談件数〔新規〕
1. 東京都 新型コロナコールセンター相談件数〔新規〕
2. 東京都_新型コロナウイルス陽性患者発表詳細
3. 神奈川県_陽性患者数と属性
4. 神奈川県_専用ダイヤル相談件数
5. 神奈川県_帰国者・接触者電話相談センター相談件数
6. 大阪府_陽性患者発生状況
##########################################
'''
# このリストの中に表示させる番号を列挙
# 患者数に該当する2,3,6をリストに入れる
sel_list = [2, 3, 6]
for sel_num in sel_list:
#各URLが入ったcsvを読み込む
url_df = pd.read_csv('opendata.csv')
if sel_num < 3: #東京データ用
df = pd.read_csv(url_df.loc[sel_num,'url'], encoding='utf-8')
elif sel_num == 6: #大阪データ用
df = pd.read_excel(url_df.loc[sel_num,'url'], encoding='shift_jis',header=1)
else: #神奈川データ用
df = pd.read_csv(url_df.loc[sel_num, 'url'], encoding='shift-jis')
# 東京データ用
if sel_num == 2:
fig1 = plt.figure()
ax1 = fig1.add_subplot()
#日本語表示できないので、アルファベット表記に変更
df = df.rename(columns={'公表_年月日': 'date', 'No':'Tokyo'})
df['date'] = pd.to_datetime(df['date'],format='%Y-%m-%d')
df = df.set_index('date')
df['Tokyo'].plot(ax=ax1, legend=True)
# 神奈川データ用
elif sel_num == 3:
df = df.rename(columns={'発表日': 'date'})
df['date'] = pd.to_datetime(df['date'],format='%Y-%m-%d')
df = df.set_index('date')
#Index番号になるものがないのでいちおう作る
serial_num = pd.RangeIndex(start=1, stop=len(df.index) + 1, step=1)
#凡例名のために列名をKanagawaにする
df['Kanagawa'] = serial_num
df['Kanagawa'].plot(ax=ax1, legend=True)
# 大阪データ用
elif sel_num == 6:
df = df.rename(columns={'番号':'num', '報道提供日': 'date'})
#Excelの日付データを変換
excel_time = datetime.date(1899, 12, 30)
## iterationで各行処理
# DataFrameの入れ替えはリストを作って上書き
new_date = []
for index, row in df.iterrows():
new_date.append(excel_time + datetime.timedelta(row['date']))
df['date'] = new_date
df['Osaka'] = df['num']
df = df.set_index('date')
df['Osaka'].plot(ax=ax1, legend=True)
3. かなり悩んだところ -Excelの時間表記-
UNIX時間表記なのかと、さんざん悩んだのですが、Excel特有の日付数値を
読みだしていることがこちらのページを見つけてわかりました。
エクセル日付の「数値」を python の datetime に変換する
自分ではどうにもならなかったです。
4. 結果
5. 感想
累計グラフは出せました。
コードはスマートではないです。とりあえず、今日はここまで。
Pythonは自分がやりたいことを細かく丁寧に教えてくれるサイトが多数あるので、
困ったときに、何とかなるという安心感があります。しかし、Excelのdatetime表記は知りませんでした。
-- 追記 7/21 --
積算陽性者数。検査数が増えたそうですが、不安です。