visualize per generation positive share
陽性者の年代別シェアを可視化してみた
今回はやろうと思っていたけどやり方がわからず詰まっていたプログラムです
年代ごとの陽性者数のデータはあるけど日毎の偏りはわかりにくいので計算して画像かしてみたのがこちら
「若者の感染が増えてます」みたいな煽りを見た気がするけど2月から4月が比較的少なく、シェアで見ると全体的に20代、30代が占めている割合は多いように見える
毎回のように不安になるけど、、、計算あってるのか!?
迷ったところ
全ての行の指定した列に対して割合を計算する方法
cross_df.update(cross_df.loc[:, '10歳未満': '-'].div(cross_df["All"], axis=0))
10歳未満
から-
の各セルを行のAll列の値(小計)で割っている
一行ずつループで回したりしなくてよくて楽ちん(ましてExcelで同じことをすると思うと)
あとDataFrameのカラムの並び順の変え方がわからなかったけど
cross_df = cross_df.reindex(columns=['10歳未満', '10代', '20代', '30代', '40代', '50代', '60代', '70代','80代', '90代', '100歳以上', '-', 'All'])
のDataframe.reindex()でできた
リンク
- 東京都福祉保健局のオープンデータ東京都 新型コロナウイルス陽性患者発表詳細
notebook
In [9]:
from datetime import date
import pandas as pd
import matplotlib.pyplot as plt
# download csv from https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv
data = pd.read_csv('data/130001_tokyo_covid19_patients.csv', parse_dates = ['公表_年月日', '発症_年月日', '確定_年月日'], low_memory=False)
In [18]:
daily_data = data[(data['公表_年月日'] >= date(date.today().year - 1, date.today().month, date.today().day).strftime('%Y-%m-%d')) & (data['公表_年月日'] < date.today().strftime('%Y-%m-%d'))]
cross_df = pd.crosstab(daily_data['公表_年月日'], columns=daily_data['患者_年代'], margins=True)
cross_df = cross_df.reindex(columns=['10歳未満', '10代', '20代', '30代', '40代', '50代', '60代', '70代','80代', '90代', '100歳以上', '-', 'All'])
cross_df = cross_df.drop('All', axis=0)
cross_df.update(cross_df.loc[:, '10歳未満': '-'].div(cross_df["All"], axis=0))
cross_df
Out[18]:
患者_年代 | 10歳未満 | 10代 | 20代 | 30代 | 40代 | 50代 | 60代 | 70代 | 80代 | 90代 | 100歳以上 | - | All |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
公表_年月日 | |||||||||||||
2020-08-28 | 0.035398 | 0.035398 | 0.278761 | 0.203540 | 0.137168 | 0.154867 | 0.070796 | 0.022124 | 0.053097 | 0.008850 | 0.000000 | 0.0 | 226 |
2020-08-29 | 0.020243 | 0.060729 | 0.291498 | 0.170040 | 0.178138 | 0.105263 | 0.089069 | 0.040486 | 0.028340 | 0.012146 | 0.004049 | 0.0 | 247 |
2020-08-30 | 0.020270 | 0.040541 | 0.277027 | 0.250000 | 0.155405 | 0.108108 | 0.054054 | 0.027027 | 0.040541 | 0.027027 | 0.000000 | 0.0 | 148 |
2020-08-31 | 0.050000 | 0.010000 | 0.310000 | 0.190000 | 0.180000 | 0.120000 | 0.060000 | 0.050000 | 0.020000 | 0.010000 | 0.000000 | 0.0 | 100 |
2020-09-01 | 0.011765 | 0.058824 | 0.282353 | 0.223529 | 0.164706 | 0.100000 | 0.088235 | 0.035294 | 0.029412 | 0.005882 | 0.000000 | 0.0 | 170 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2021-08-23 | 0.055578 | 0.113200 | 0.304046 | 0.207601 | 0.156518 | 0.099714 | 0.037188 | 0.017164 | 0.006130 | 0.002043 | 0.000817 | 0.0 | 2447 |
2021-08-24 | 0.059716 | 0.102844 | 0.303791 | 0.208768 | 0.159716 | 0.100474 | 0.031043 | 0.020142 | 0.010427 | 0.002844 | 0.000237 | 0.0 | 4220 |
2021-08-25 | 0.072848 | 0.098628 | 0.278855 | 0.210501 | 0.156812 | 0.116131 | 0.027200 | 0.020341 | 0.014191 | 0.004494 | 0.000000 | 0.0 | 4228 |
2021-08-26 | 0.069728 | 0.102253 | 0.282738 | 0.190476 | 0.172406 | 0.108844 | 0.032951 | 0.022959 | 0.014031 | 0.003189 | 0.000425 | 0.0 | 4704 |
2021-08-27 | 0.078306 | 0.101017 | 0.285782 | 0.185711 | 0.163473 | 0.114029 | 0.036432 | 0.022711 | 0.010173 | 0.001893 | 0.000473 | 0.0 | 4227 |
365 rows × 13 columns
In [19]:
fig = plt.figure(figsize=(16, 8))
ax1 = fig.subplots()
ax2 = ax1.twinx()
ax1.stackplot(cross_df.index, cross_df.rolling(10).mean().drop('All', axis=1).T, labels=['10歳未満', '10代', '20代', '30代', '40代', '50代', '60代', '70代','80代', '90代', '100歳以上', '-'])
ax2.plot(cross_df['All'].rolling('10d').mean(), color='darkgray')
fig.legend()
Out[19]:
<matplotlib.legend.Legend at 0x130f9adf0>
In [ ]: