Open Data API Portalの厚生労働省 新型コロナ関連オープンデータAPIを試してみる その3:日々の死亡者数を計算し、グラフ化してみる

目次

Open Data API Portal

前回、Open Data API Portalの新型コロナ関連オープンデータAPIで累積の死亡者数を取得し、グラフ化してみました。

今回はここから日々の死亡者数を計算し、グラフ化してみましょう。

まずは前回のおさらいからです。

<セル1>ではAPIキーを使って、新型コロナ関連オープンデータAPIにアクセスしています。

<セル1>

import requests
import json

apikey = 'YOUR_API_KEY'

url = f'https://api.opendata.go.jp/mhlw/death-cases?apikey={apikey}'

requestHeaders = {
    "Accept": "application/json"
}

request = requests.get(url, headers=requestHeaders)

if request.status_code == 200:
    data = json.loads(request.content.decode())
    print(data)
else:
    print(request.status_code)

<セル2>では取得したJSONファイルから日付と死亡者数をそれぞれリストに格納しています。

<セル2>

date = []; death = []

for oneday in data:
    date.append(oneday['日付'])
    death.append(int(oneday['死亡者数']))

<セル3>では横軸日付、縦軸死亡者数としてグラフ化しています。

<セル3>

import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

fig = plt.figure()
plt.clf()

plt.plot(date, death)

plt.xticks(np.arange(0, len(date)+1, 30),rotation=90)

plt.tight_layout()

それでは始めていきましょう。

日々の死亡者数を計算

まずは累積の死亡者数から日々の死亡者数を計算していきます。

そのためにはある日の累積死亡者数から前日の累積死亡者数から引くことで、特定の日の死亡者数を取得することができます。

最終的にはnumpyを使うことで、同じインデックスの要素同士を引き算することができるので、まずは1日ずらしたリストを作成します。

ということでこんな感じ。

import copy

prev_death = death.copy()

prev_death.insert(0,0)
del prev_death[-1]

sub_death = np.array(death) - np.array(prev_death)

print(sub_death)

死亡者数を1日ずらしたリストを作成するため、まずは「prev_death = death.copy()」で死亡者数のリストをコピーしています。

ここで新しく「copy」モジュールを使っているので、少し解説してみることにします。

copyモジュール

「copy」モジュールを使って、死亡者数のリストをコピーしている部分はここです。

import copy

prev_death = death.copy()

ここで重要なのは「.copy()」でコピーすることです。

例えばリスト「a」があった時に、リスト「a」と同じリスト「b」を作りたいとします。

そこで「b = a」としてしまうと、リスト「b」を変更した場合、リスト「a」まで変更されてしまいます。

試してみましょう。

a = [1, 2, 3, 4, 5]

b = a

b.append(6)

print(f'a:{a}')
print(f'b:{b}')

実行結果
a:[1, 2, 3, 4, 5, 6]
b:[1, 2, 3, 4, 5, 6]

a=[1, 2, 3, 4, 5]というリストを作って、「b = a」としてリストbにコピーしました。

そしてリストbに「6」を追加して、printでリストaとリストbを表示しています。

するとリストaもリストbも「1, 2, 3, 4, 5, 6」と6が追加されてしまっています。

これは「b = a」はコピーしたのではなく、「同じもの」と定義したことになることから起こります。

そこで必要なのがその状態をコピーする「.copy()」というわけです。

同じように試してみましょう。

import copy

a = [1, 2, 3, 4, 5]

b = a.copy()

b.append(6)

print(f'a:{a}')
print(f'b:{b}')

実行結果
a:[1, 2, 3, 4, 5]
b:[1, 2, 3, 4, 5, 6]

先ほどと同じようにa=[1, 2, 3, 4, 5]というリストを作り、今度は「.copy()」でコピーします。

そしてリストbに「6」を追加し、printで表示しています。

結果は見ての通り、リストaでは[1, 2, 3, 4, 5]なのに対し、リストbでは「6」が追加された[1, 2, 3, 4, 5, 6]になっています。

このように内容は同じだけども、同一ではないリストを作成したい場合は「.copy()」を使います。

リストへの追加・削除

次にコピーしたリスト「prev_death」の値を1日後ろにずらします。

つまりリストの最初に要素を一つ「0」を追加し、最後の要素を削除します。

prev_death.insert(0,0)
del prev_death[-1]

このようにリストの特定のインデックスに要素を追加する場合は「リスト名.insert(挿入するインデックス番号, 挿入する要素)」とします。

また要素を削除する場合は少し書き方が特殊で「del リスト名[インデックス番号]」とします。

これで1日ずれたリストが作成できました。

numpyを使った要素ごとの計算

次にnumpyを使って、要素ごとを引き算していきます。

先ほどのリストdeathとリストprev_deathは通常のリストですので、「np.array(リスト名)」とすることで、numpyのリストに変換します。

そして単純に引き算することで、同じインデックス番号の要素ごとを引き算したリストを作成することができます。

sub_death = np.array(death) - np.array(prev_death)

print関数で表示してみるとこんな感じです。

print(sub_death)

実行結果
[  1   0   0   0   0   0   0   0   0   0   0   0   0   2   1   1   0   1
   0   0   0   0   0   0   1   2   3   3   4   2   1   2   4   1   2   2
   2   1   5   1   1   2   1   3   3   2   2   1   3   3   6   1   3   7
   1   4   3   6   4   4   7  10  17  12   6   7  10  15  91  10  30  17
  14   3  25  13  26  17  26  34  18  11  22   8  49  13   8  22  25  19
  23  15  19   5  14   8   6  19  12  12  10  16  12   9   7  12   5   1
   2   6   3   4   7   2   0   0   3   1   2   2   1   0   2   4   4   0
  17   1   0   2   8   4   1   2   0   1   0   2   1   1   1   0   0   1
   2   1   1   0   0   0   0   2   1   0   0   0   0   3   1   1   2   1
   3   0   2   3   3   2   5   0   1   4   6   4   7   6   1   7   5   7
   4  10  12   3  11  16  13  16  11  14   7   5  15  13  17  12  17   9
  15  17  11  12  11  19   8   6  14  16  13   6  11  16   3   9  10  12
(以下略)

グラフ化

最後はグラフ化です。

fig = plt.figure()
plt.clf()

plt.plot(date, sub_death)

plt.xticks(np.arange(0, len(date)+1, 30),rotation=90)

plt.tight_layout()

実行結果

日々の死亡者数をグラフ化することができました。

本当はもっと色々とやりたかったのですが、どうもこのAPIは接続できない時間が多くて、作業時間が限られてしまうため、これ以上使っていくのに耐えれなくなってきました。

ということでOpen Data API Portalに関しては、一旦ここで終了とします。

せっかくいいポータルサイトなので、安定したらもっと使って試していきたいと思います。

ではでは今回はこんな感じで。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる