Créez une carte chronologique animée de l'état de l'infection par le virus corona avec python + plotly

Carte de série chronologique animée de l'état de l'infection corona

ezgif.com-video-to-gif.gif

J'ai fait une simple carte de série chronologique hebdomadaire de l'infection à coronavirus avec complot. J'ai apporté les données une par une du pdf posté sur le site de l'OMS (c'était dur ...). Coronavirus disease (COVID-2019) situation reports

J'ai peur de l'augmentation du nombre de régions asiatiques. .. .. De plus, même s'il y a moins de 100 personnes en Europe, aux États-Unis et au Canada, je crains également qu'elles ne se manifestent.

[Notes sur les données]

――Au 21 février 2020, il y avait environ 140000 personnes infectées en Chine, mais si l'échelle est la même, les données d'autres pays ne seront pas visibles, alors divisez par 100 et réduisez à 1000 personnes. «Pourtant, certains pays à un ou deux chiffres sont encore trop petits pour être visualisés, nous multiplions donc par dix. ――Les données pour le Japon incluent les passagers du Princess Diamond, donc le nombre est d'environ 600. S'il n'est pas inclus, il y a 21 personnes au 21 février 2020.

Code une fois fait

Environnement: Google Colab Langage: python

module

Visualisez en utilisant plotly. Puisque plotly gère le code du nom du pays (JPN etc. pour le Japon) au lieu du nom du pays tel qu'il est, importez le country_converter pour le convertir en code du nom du pays. Le traitement des données se fait avec des «pandas».

#Si non
!pip install plotly
!pip install country_converter
!pip install pandas

import country_converter as coco
import plotly.express as px
import pandas as pd

Lecture des données

Tous ces éléments sont copiés et fabriqués à la main à partir du pdf du site de l'OMS, je suis donc désolé s'il y a une erreur. .. .. Je me demande s'il existe une meilleure base de données. .. ..

Stockez toutes ces données dans un DataFrame.

dict_01_22 = {"2020/01/22":
              {"China": 310,
               "Japan": 1,
               "Republic of Korea": 1,
               "Thailand": 2}}
dict_01_30 = {"2020/01/30":
              {"China": 7737,
               "Japan": 11,
               "Republic of Korea": 4,
               "Vietnam": 2,
               "Singapore": 10,
               "Australia": 7,
               "Malaysia": 7,
               "Cambodia": 1,
               "Philippines": 1,
               "Nepal": 1,
               "Sri Lanka": 1,
               "India": 1,
               "United States of America": 5,
               "Canada": 3,
               "France": 5,
               "Finland": 1,
               "Germany": 4,
               "United Arab Emirates": 4,
               "Thailand": 14}}
dict_02_07 = {"2020/02/07":
              {"China": 31211,
               "Japan": 91,
               "Republic of Korea": 24,
               "Vietnam": 12,
               "Singapore": 30,
               "Australia": 15,
               "Malaysia": 14,
               "Cambodia": 1,
               "Philippines": 3,
               "Nepal": 1,
               "Sri Lanka": 1,
               "India": 3,
               "United States of America": 12,
               "Canada": 7,
               "France": 6,
               "Belgium": 1,
               "Italy": 3,
               "Finland": 1,
               "Spain": 1,
               "Sweden": 1,
               "Germany": 13,
               "The United Kingdom": 3,
               "United Arab Emirates": 5,
               "Russia": 2,
               "Thailand": 25}}
dict_02_14 = {"2020/02/14":
              {"China": 142823,
               "Japan": 251,
               "Republic of Korea": 28,
               "Vietnam": 16,
               "Singapore": 58,
               "Australia": 15,
               "Malaysia": 14,
               "Cambodia": 1,
               "Philippines": 3,
               "Nepal": 1,
               "Sri Lanka": 1,
               "India": 3,
               "United States of America": 15,
               "Canada": 7,
               "France": 11,
               "Belgium": 1,
               "Italy": 3,
               "Finland": 1,
               "Spain": 2,
               "Sweden": 1,
               "Germany": 16,
               "The United Kingdom": 9,
               "United Arab Emirates": 8,
               "Russia": 2,
               "Thailand": 33}}
dict_02_21 = {"2020/02/21":
              {"China": 142823,
               "Japan": 727,
               "Republic of Korea": 204,
               "Vietnam": 16,
               "Singapore": 85,
               "Australia": 17,
               "Malaysia": 22,
               "Cambodia": 1,
               "Philippines": 3,
               "Nepal": 1,
               "Sri Lanka": 1,
               "India": 3,
               "United States of America": 15,
               "Canada": 8,
               "France": 12,
               "Belgium": 1,
               "Italy": 3,
               "Finland": 1,
               "Spain": 2,
               "Sweden": 1,
               "Germany": 16,
               "The United Kingdom": 9,
               "United Arab Emirates": 9,
               "Iran": 5,
               "Egypt": 1,
               "Russia": 2,
               "Thailand": 35}}
concated = pd.concat([
                      pd.DataFrame(dict_01_22),
                      pd.DataFrame(dict_01_30),
                      pd.DataFrame(dict_02_07),
                      pd.DataFrame(dict_02_14),
                      pd.DataFrame(dict_02_21)], axis=1, sort=True).fillna(0)

Les cinq premières lignes de concated ressemblent à ceci:

2020/01/22 2020/01/30 2020/02/07 2020/02/14 2020/02/21
Australia 0.0 7.0 15.0 15.0 17
Belgium 0.0 0.0 1.0 1.0 1
Cambodia 0.0 1.0 1.0 1.0 1
Canada 0.0 3.0 7.0 7.0 8
China 310.0 7737.0 31211.0 142823.0 142823

Traitement de l'information

La conversion d'un nom de pays en code de pays et de manière graphique utilisera des données ordonnées, utilisez donc pd.melt pour convertir.

time_periods = [column for column in concated.columns]
df = concated.reset_index().rename(columns={"index": "country"})
df["ISO"] = df["country"].apply(lambda x: coco.convert(x))
data = pd.melt(df, id_vars=["ISO"], value_vars=time_periods)

Voici à quoi cela ressemble pour les «données» converties en données ordonnées.

ISO variable value
0 AUS 2020/01/22 0.0
1 BEL 2020/01/22 0.0
2 KHM 2020/01/22 0.0
3 CAN 2020/01/22 0.0
4 CHN 2020/01/22 310.0

Enfin la visualisation des données

Je veux visualiser les données ici,

Il y a un problème, alors ajustez l'échelle là-bas.

Cela a facilité la visibilité sur la carte (je ne sais pas vraiment si c'est éthique ...)


data_for_map = data
for ind in data[(data["ISO"] != "CHN") & (data["ISO"] != "JPN") & (data["ISO"] != "KOR")].index:
  data_for_map.at[ind, "value"] = data_for_map.at[ind, "value"] * 10
for ind in data[data["ISO"] == "CHN"].index:
  data_for_map.at[ind, "value"] = data_for_map.at[ind, "value"] // 100
fig = px.scatter_geo(data_for_map, locations="ISO",size="value",
                     animation_frame="variable",
                     projection="natural earth")
fig.show()

Cela devrait vous donner une carte.

Lorsque le Japon, la Chine et la Corée du Sud sont exclus

=======================Pareil qu'avant=======================
time_periods = [column for column in concated.columns]
df = concated.reset_index().rename(columns={"index": "country"})
df["ISO"] = df["country"].apply(lambda x: coco.convert(x))
data = pd.melt(df, id_vars=["ISO"], value_vars=time_periods)
==========================================================

data_for_map = data[(data["ISO"] != "CHN") & (data["ISO"] != "JPN") & (data["ISO"] != "KOR")]

fig = px.scatter_geo(data_for_map, locations="ISO",size="value",
                     animation_frame="variable",
                     projection="natural earth")
fig.show()

Si tel est le cas, il est possible d'exclure le Japon, la Chine et la Corée du Sud, qui comptent de nombreuses personnes infectées, et de les visualiser. Dans ce cas, les données pour «2020/02/21» sont les suivantes.

ezgif.com-video-to-gif (1).gif

L'Asie du Sud-Est, l'Europe et l'Amérique du Nord sont particulièrement visibles.

J'espère qu'il convergera le plus tôt possible. .. ..

Recommended Posts

Créez une carte chronologique animée de l'état de l'infection par le virus corona avec python + plotly
Visualisons l'état de l'infection par le virus corona avec Plotly [pour les débutants]
Créer un serveur local GIF animé avec Python + Flask
[Série chronologique avec plotly] Visualisation dynamique avec plotly [python, cours boursier]
Créez rapidement un fichier Excel avec Python #python
[Python] Accélère le chargement du fichier CSV de séries chronologiques
Tracer CSV de données de séries temporelles avec une valeur unixtime en Python (matplotlib)
[Python] Créez rapidement une API avec Flask
Créez une application de mots anglais avec python
Créez une application qui devine les étudiants avec Python
Créer un environnement de 64 bits Windows + python 2.7 + MeCab 0.996
Créer une image avec des caractères avec python (japonais)
Voir les détails des données de séries chronologiques dans Remotte
Créez rapidement un serveur API avec Python + Falcon
Implémentation de la méthode de clustering k-shape pour les données de séries chronologiques [Apprentissage non supervisé avec python Chapitre 13]
Visualisez plus clairement les prédictions de séries chronologiques de Prophet avec Plotly
Python 3.4 Créer un environnement Windows7-64bit (pour l'analyse des séries chronologiques financières)
Obtenez l'état de fonctionnement de JR West avec Python
"Analyse des séries chronologiques de mesure des données économiques et financières" Résolution du problème de fin de chapitre avec Python
Python: analyse des séries chronologiques
Question sur la série chronologique Python
fonction map - grammaire Python de base apprise avec un exemple de programme intéressant
J'ai créé un package pour filtrer les séries chronologiques avec python
Créez des jeux LCD (16x2) avec Raspberry Pi et Python
Reformatez l'axe des temps du graphique de la série chronologique des pandas avec matplotlib
[Python Kivy] Comment créer un fichier exe avec pyinstaller
[Django] Mémo pour créer un environnement de Django + MySQL + Vue.js [Python]
Tourner un tableau de chaînes avec une instruction for (Python3)
[Python] Créer un écran pour le code d'état HTTP 403/404/500 avec Django