Le Centre européen de prévention et de contrôle des maladies fournit des données COVID-19 mondiales mises à jour quotidiennement et faciles à télécharger aux formats JSON, CSV ou XML. Dans ce didacticiel, nous utiliserons l'outil d'analyse de données pandas sur les données CSV (valeurs séparées par des virgules) pour apprendre certaines des commandes pandas de base et explorer le contenu de l'ensemble de données.
Configuration de notre environnement de développement
Assurez-vous que Python 3 est installé. À l'heure actuelle, Python 3.8.2 est le dernier.
Au cours de ce tutoriel, nous allons également utiliser des pandas.
Installez-le maintenant dans un nouvel environnement virtuel avec les commandes suivantes :
python -m venv covidpandas source covidpandas/bin/activate pip install pandas
Nous sommes maintenant prêts à obtenir les données COVID-19 et à commencer à les analyser avec des pandas.
Obtenir les données COVID-19
Accédez à la page Télécharger les données d'aujourd'hui sur la répartition géographique des cas de COVID-19 dans le monde dans votre navigateur Web. Cela devrait ressembler à la capture d'écran suivante.
Il devrait y avoir un lien pour télécharger les données au format CSV, mais l'organisation a changé la mise en page à plusieurs reprises au cours des dernières semaines, ce qui rend difficile la recherche de formats autres qu'Excel (XLSX). Si vous rencontrez des difficultés pour obtenir la version CSV, il vous suffit de télécharger celle-ci depuis GitHub, qui est rattachée à une copie téléchargée le 28 mars 2020.
Importer le CSV dans pandas
Nous avons les données dans un CSV maintenant nous devons les importer dans un pandasDataFrame.
Commencez par exécuter le REPL Python :
python >>>
Le REPL est prêt à fonctionner, nous devons maintenant importer des pandas afin que nous puissions lire les données que nous avons téléchargées.
from pandas import read_csv df = read_csv("covid-19-cases-march-28-2020.csv")
Ne vous inquiétez pas si vous obtenez une erreur comme UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7...
.Exécutez plutôt cette commande qui définit explicitement l'encodage du fichier afin que les pandas puissent lire correctement le CSV.
# make sure the file name of the csv matches your file's name! df = read_csv("covid-19-cases-march-28-2020.csv", encoding="ISO-8859-1")
Nous avons maintenant nos données chargées dans apandas DataFrame et pouvons commencer à exécuter du code pour poke et prod et ce qu'il y a à l'intérieur de l'ensemble de données.
Exécuter des commandes pandas
Voyons d'abord à quoi ressemble un échantillon de données. J'exécute généralement le head
et tail
fonctionne lorsque j'ouvre quelque chose pour savoir ce qui est contenu dans les cinq premières et les cinq dernières lignes.
df.head()
Vous devriez voir six lignes de sortie :une comme en-tête de colonne et les cinq premières lignes de données du CSV :
dateRep day month year cases deaths countriesAndTerritories geoId countryterritoryCode popData2018 0 28/03/2020 28 3 2020 16 1 Afghanistan AF AFG 37172386.0 1 27/03/2020 27 3 2020 0 0 Afghanistan AF AFG 37172386.0 2 26/03/2020 26 3 2020 33 0 Afghanistan AF AFG 37172386.0 3 25/03/2020 25 3 2020 2 0 Afghanistan AF AFG 37172386.0 4 24/03/2020 24 3 2020 6 1 Afghanistan AF AFG 37172386.0
Le tail
la fonction examine les cinq dernières lignes d'un DataFrame.
df.tail()
tail
la sortie ressemblera à ceci :
dateRep day month year cases deaths countriesAndTerritories geoId countryterritoryCode popData2018 7315 25/03/2020 25 3 2020 0 0 Zimbabwe ZW ZWE 14439018.0 7316 24/03/2020 24 3 2020 0 1 Zimbabwe ZW ZWE 14439018.0 7317 23/03/2020 23 3 2020 0 0 Zimbabwe ZW ZWE 14439018.0 7318 22/03/2020 22 3 2020 1 0 Zimbabwe ZW ZWE 14439018.0 7319 21/03/2020 21 3 2020 1 0 Zimbabwe ZW ZWE 14439018.0
Notez que vous pouvez également passer un entier dans head
ou tail
commedf.head(10)
pour obtenir le premier ou le dernier n nombre de lignes.
Il semble basé sur le tail
fonction, nous avons environ 7320 lignes de données (puisque la première ligne est indexée à 0). Nous pouvons confirmer la quantité de données dans chaque colonne avec le count
fonction.
df.count()
count
La sortie ressemblera à :
dateRep 7320 day 7320 month 7320 year 7320 cases 7320 deaths 7320 countriesAndTerritories 7320 geoId 7306 countryterritoryCode 7254 popData2018 7311 dtype: int64
Que se passe-t-il si nous voulons examiner l'une de ces colonnes et trouver, par exemple, la valeur la plus élevée de cas ?
df.cases.max()
Dans cet ensemble de données, nous obtenons 18695 en sortie. Et si vous examiniez des mesures statistiques standard dans toutes les colonnes ? C'est là que le describe
la fonction est pratique.
df.describe()
describe
présente des mesures statistiques standard telles que min, max, médiane et moyenne pour tout dans votre ensemble de données. Dans ce cas, nous recevons en sortie :
day month year cases deaths popData2018 count 7320.000000 7320.000000 7320.000000 7320.000000 7320.000000 7.311000e+03 mean 16.828142 2.249454 2019.990847 80.870355 3.687158 7.130483e+07 std 8.322981 1.256463 0.095239 608.270244 35.327689 2.140624e+08 min 1.000000 1.000000 2019.000000 -9.000000 0.000000 1.000000e+03 25% 10.000000 1.000000 2020.000000 0.000000 0.000000 4.137309e+06 50% 18.000000 2.000000 2020.000000 0.000000 0.000000 1.072767e+07 75% 24.000000 3.000000 2020.000000 5.000000 0.000000 5.139301e+07 max 31.000000 12.000000 2020.000000 18695.000000 971.000000 1.392730e+09
Que diriez-vous d'une vue rapide pour savoir si les données des colonnes sont corrélées ou non les unes avec les autres ? Le corr
la fonction est ce dont nous avons besoin.
df.corr()
Pour notre ensemble de données, corr
sorties :
day month year cases deaths popData2018 day 1.000000 0.203006 -0.163665 0.063629 0.060075 -0.040677 month 0.203006 1.000000 -0.745912 0.062494 0.052707 -0.039131 year -0.163665 -0.745912 1.000000 0.012715 0.010032 -0.006294 cases 0.063629 0.062494 0.012715 1.000000 0.716968 0.136580 deaths 0.060075 0.052707 0.010032 0.716968 1.000000 0.082229 popData2018 -0.040677 -0.039131 -0.006294 0.136580 0.082229 1.000000
Sans surprise, nous voyons une corrélation de 1,000000 entre une colonne et elle-même. Nous devrions nous inquiéter si nous ne voyions pas ce résultat ! Pour les autres colonnes, il n'est peut-être pas logique de regarder leur corrélation. C'est là que vous devez penser aux données. Il existe souvent une corrélation entre des colonnes totalement indépendantes simplement parce que les données sont structurées d'une certaine manière.
Si vous êtes un développeur comme moi sans expérience rigoureuse en statistiques (Stats 200 à l'université a été long il y a longtemps), vous devrez peut-être revoir vos connaissances en statistiques avant de pouvoir dire si quelque chose dans les données est important ou non.
Continuons à explorer les données. Nous pouvons sélectionner des colonnes et déterminer le nombre d'éléments uniques qu'elles contiennent. Par exemple, combien de pays et de territoires uniques sont répertoriés ?
df.countriesAndTerritories.nunique()
Dans ce cas, le résultat devrait être 196.
Poser des questions sur les données
Ces fonctions conviennent parfaitement aux requêtes de base pour savoir ce qu'il y a dans l'ensemble de données, mais comment poser de vraies questions en enchaînant certaines commandes ?
Nous savons maintenant qu'il y a 7320 lignes dans cet ensemble puisque nous avons utilisé le count
fonction ci-dessus. Chaque ligne représente un seul jour dans un pays. Maintenant, posez une question. Pendant combien de jours dans ces pays 10 cas ou plus ont-ils été signalés ?
Créons une nouvelle base de données nommée df2 avec les lignes qui n'ont que 10 cas ou plus signalés ce jour-là, puis comptons le nombre de lignes qu'elle contient.
df2 = df[df['cases']>=10] df2.count()
Cela devrait nous donner la valeur 1531. Il y a eu 1531 cas de 10 cas de COVID-19 ou plus signalés en une seule journée, dans les 196 pays ou territoires répertoriés. Mais le 1531 est difficile à expliquer aux gens. Nous devrions choisir un seul pays et montrer combien de fois 10 cas ou plus ont été signalés en une journée. Que diriez-vous d'un pays plus petit comme le Vietnam qui ne fait pas l'objet d'autant de reportages que la Chine, les États-Unis ou l'Italie ?
df2[df2['countriesAndTerritories']=='Vietnam']
Cela nous donnera la sortie complète des données par colonne :
dateRep day month year cases deaths countriesAndTerritories geoId countryterritoryCode popData2018 7217 28/03/2020 28 3 2020 16 0 Vietnam VN VNM 95540395.0 7219 26/03/2020 26 3 2020 14 0 Vietnam VN VNM 95540395.0 7220 25/03/2020 25 3 2020 11 0 Vietnam VN VNM 95540395.0 7222 23/03/2020 23 3 2020 24 0 Vietnam VN VNM 95540395.0 7226 19/03/2020 19 3 2020 15 0 Vietnam VN VNM 95540395.0
On peut aussi utiliser le count
fonction ici pour confirmer qu'il y a eu cinq jours au cours desquels 10 nouveaux cas ou plus ont été signalés au Vietnam jusqu'à présent :
df2[df2['countriesAndTerritories']=='Vietnam'].count()
Nous obtenons la sortie de 5 pour les colonnes. Malheureusement, lorsque vous regardez les données complètes, il apparaît que ces lignes sont toutes très récentes et que le virus commence tout juste à s'y propager plus largement. Espérons qu'avec tous les autres pays, ils pourront inverser la tendance, aplanir la courbe et empêcher davantage de personnes de tomber malades à mesure que nous poursuivons.
C'est un bon point de départ, mais nous avons couvert beaucoup de pandas dans ce didacticiel !
Quelle est la prochaine ?
Nous venons d'importer et d'examiner le contenu de l'ensemble de données COVID-19 du Centre européen de prévention et de contrôle des maladies à l'aide de pandas. C'était un tour rapide de quelques commandes pandas de base et je vous recommande fortement de parcourir la liste de documentation DataFrame pour en savoir plus sur toutes les autres fonctions pratiques que cet outil fournit aux développeurs.
Vous pouvez également avoir une idée de ce qu'il faut coder ensuite dans votre projet Python en lisant la page de table des matières Full Stack Python.
Des questions? Contactez-moi via Twitter@fullstackpythonor @mattmakai. Je suis également sur GitHub avec le nom d'utilisateur mattmakai.
Quelque chose ne va pas avec ce message ? La source de cette page sur GitHuband soumet une pull request.