Outils pour utilisateurs

Outils du site


issue157:python

We are all experiencing a new world due to COVID-19. Stay at home orders, Work from home orders, businesses closed, lost jobs, long lines at the grocery stores, shortages when you get into the stores and social distancing. This is the new normal, at least for a while. Many “experts” are suggesting that we may never return to the “old” normal and even more are suggesting that this will last for a year or longer. We are presented with the number of confirmed cases, number of deaths and number of hospitalizations due to COVID-19 on every TV news show, radio show and on the Internet. Where are these numbers coming from and how do we make sense of them? Luckily, those of us who know Python with just a little work can do some of the data analysis for ourselves and with logic can see what the trends are really doing. The goal here is not to provide any answers, but to give you the ability to look at the data and see the trends for yourself. As the saying goes, “knowledge is power”.

Nous faisons tous l'expérience d'un nouveau monde avec le COVID-19. L'ordre de rester chez soi, l'ordre de travailler depuis la maison, les entreprises fermées, les emplois perdus, de longues files d'attente devant les épiceries, des ruptures de stock quand vous y entrez et la distanciation sociale. Toute cette nouveauté est normale, au moins pour un temps. Beaucoup d'« experts » laissent penser que nous ne retournerons pas à l'« ancien » temps normal et même suggèrent que ça durera pendant un an ou plus.

À chaque journal télévisé, à chaque point de presse à la radio et sur Internet, il nous est montré un certain nombre de cas confirmés, de décès, et beaucoup d'hospitalisations dues au COVID-19. D'où viennent ces chiffres et comment les comprendre ? Par chance, ceux d'entre nous qui connaissent Python peuvent, avec juste un peu de travail, faire un peu d'analyse des données et, avec un peu de logique, peuvent appréhender les tendances réelles. Ici, l'objectif n'est pas de fournir des réponses, mais de vous donner la capacité de regarder les données et de voir vous-même les tendances. Comme il est souvent dit, « savoir, c'est pouvoir ».

Way back in December 2018 (FCM#140), I talked about Pandas and Python. This month, we will use Pandas and Python to look at some of these numbers and make the graphs for ourselves. If you don’t have Pandas installed, please re-visit Full Circle Magazine # 140 to see the installation steps. To get started, we need some data. I’m going to use a Comma Separated Variable data set available from https://data.humdata.org/dataset/novel-coronavirus-2019-ncov-cases . This data is compiled by the Johns Hopkins University Center for Systems Science and Engineering (JHU CCSE) and comes from many “trusted” sources. This site also has data for deaths and recovered as well. When you get to the page, scroll down below the chart and find the first download “button” that says “time_series_covid19_confirmed_global.csv” to the left of it. This will download the CSV file to your machine. Now use LibreOffice Calc (or some other spreadsheet viewer) to open the file. In theory, you should be able to simply double click on the downloaded file. Accept the import settings box.

En décembre 2018 (le FCM n° 140), j'ai parlé de Pandas et Python. Ce mois-ci, nous utiliserons Pandas et Python pour regarder certains de ces chiffres et en faire des graphiques. Si Pandas n'est pas installé sur votre machine, retournez dans le FCM n° 140 pour les étapes de l'installation.

Pour commencer, nous avons besoin de quelques données. Je vais utiliser un jeu de données CVS (Comma Separated Variables - Variables séparées par une virgule) disponible sur https://data.humdata.org/dataset/novel-coronavirus-2019-ncov-cases. Ces données sont compilées par le Johns Hopkins University Center for Systems Science and Engineering (JHU CCSE) et viennent de nombreuses sources « de confiance ». Ce site donne aussi des données sur les décès et les guérisons.

Quand vous arrivez sur la page, descendez sous le tableau et trouvez le premier bouton « download » qui indique « time_series_covid19_confirmed_global.csv » à sa gauche. Cela téléchargera le fichier .csv sur votre machine.

Maintenant, utilisez LibreOffice Calc (ou un autre tableur) pour ouvrir le fichier. En théorie, vous ne devriez avoir qu'à double-cliquer sur le fichier téléchargé. Acceptez la fenêtre des paramètres d'importation.

PLEASE NOTE: I am using data that I downloaded on 5 May, 2020. Yours will be a little bit different, mainly in the fact that it will have more data, column wise as well as possibly more rows (since more regions can be added as new cases spread to more countries). The important thing to do here is to verify that the Country or Region that you are interested in is somewhere in Column B. It might be partially in Column B and partially in Column A. For example, if you are interested in Scotland, you would use the row marked “United Kingdom”, but if you want Greenland, you need to find “Denmark” in Column B then “Greenland” in Column A. For the purposes of this article, we’ll use “US” which is around row 227 (at least for now).

MERCI DE NOTER : J'utilise les données que j'ai téléchargées le 5 mai 2020. Les vôtres seront un peu différentes, principalement parce qu'il y aura plus de données, colonnes comme lignes (car d'autres régions peuvent être ajoutées avec de nouveaux cas s'étendant à d'autres pays).

La chose importante à faire ici est de vérifier que le pays ou la région qui vous intéresse est quelque part dans la colonne B. Elle peut être en partie dans la colonne B et en partie dans la colonne A. Par exemple, si vous vous intéressez à l'Écosse, vous utiliserez la ligne marquée « United Kingdom » (Royaume-Uni), mais si vous voulez le Groenland, vous aurez besoin de trouver « Denmark » dans la colonne B puis « Greenland » dans la colonne A. Pour les besoins de cet article, nous utiliserons « US » qui est aux environs de la ligne 227 (au moins à ce moment précis).

Create a convenient folder somewhere, copy the CSV file into the folder and open a terminal window in that folder. ( I use “Open in Terminal” from the GUI File manager.) Now it’s time to do some coding. We’ll use the Python Interpreter for this example. See box above. Look at the last line of the pandas head/tail dump. It says that there are 266 rows and 108 columns. We’ll get some of that information in a few moments. For right now, we’ll just grab the row that contains data for the US. If you wanted to find “Greenland”, use ‘Province/State” instead of ‘Country/Region’ in the line above.

Créez un dossier quelque part à votre guise, copiez-y le fichier CSV et ouvrez une fenêtre de terminal dans ce dossier. (J'utilise « Ouvrir dans un terminal » à partir du Gestionnaire graphique de fichiers).

Il est temps maintenant de faire un peu de codage. Nous utiliserons l’interpréteur Python pour cet exemple. Voyez l'encadré ci-dessus.

Regardez le dernière ligne de l'extraction complète par Pandas. Il dit que le tableau fait 266 lignes et 108 colonnes. Nous récupérerons quelques-unes de ces informations dans un petit moment. Pour l'instant, nous allons retrouver la ligne qui contient les données pour les USA. Si vous voulez chercher « Greenland », utilisez « Province/State » à la place de « Country/Region » dans la ligne au-dessus.

Again, here we want to verify a few things. First, that the last data column is for the proper date (which is marked as “5/4/20”), the proper country and that there are (still) 108 columns. Secondly, the actual row data is shown here as 225. In the spreadsheet, however, it shows up as 227. That’s because there is a header row and (remember) Python is ZERO BASED. Now we have some data that we can play with. BUT, we need to get a bit more information to make our programming easier. »> sh = data.shape »> print(sh) (266, 108) »> lastcol = sh[1] »> print(lastcol) 108 »>

À nouveau, nous voulons vérifier quelques points. D'abord, que la dernière colonne est pour la bonne date (qui est marquée « 5/4/20 »), le bon pays, et qu'il y a (encore) 108 colonnes. En second, la vraie ligne des données est située en 225. Dans le tableur, cependant, elle est en 227. C'est parce qu'il y a la ligne d'entête et que Python commence sa numérotation à ZÉRO.

Maintenant, nous avons des données avec lesquelles jouer. Mais nous avons besoin d'un peu plus d'informations pour faciliter notre programmation.

sh = data.shape
print(sh)

(266, 108)

lastcol = sh[1]
print(lastcol)

108

Here we use data.shape() to get the number of rows and the number of columns in the dataframe. This comes back as a tuple, so we can assign a variable “lastcol” to the 108 (sh[1]) of the variable sh. Now (top right) we will grab just the columns that contain the confirmed number of cases (Column E or 4 (again zero based)) through lastcol (108) for Row 255. We’ll use the .iloc method to grab the row, start column and last column from the dataframe and assign it to variable s1a. So we now have data that we can use, but the data was extracted, it came back as a data series, not a data frame. So, we’ll convert it to a dataframe. See bottom right. See bottom right.

Ici, nous utilisons data.shape() pour obtenir le nombre de lignes et le nombre de colonnes du jeu de données. Cela est retourné comme un tuple ; aussi, nous pouvons assigner une variable « lastcol » aux 108 (sh[1]) de la variable sh.

Maintenant (en haut à droite), nous ne récupérerons que les colonnes qui contiennent le nombre de cas confirmés (Colonne E ou 4 - attention, début à zéro) via lastcol (108) pour la ligne 225. Nous utiliserons la méthode .iloc pour récupérer la ligne, la première et la dernière colonnes du jeu de données et les assigner à la variable sla.

Ainsi, nous avons maintenant des données que nous pouvons utiliser ; mais les données ont été extraites, sous la forme d'une série de données, pas d'un jeu de données. Aussi, nous devons les convertir en jeu de données. Voir en bas à droite.

So now we’ve got data that we can almost play with. But first, let’s assign the column headings to some proper, meaningful information. We’ll change the “index” column header to “dtstring” and the 255 (numeric not text) column header to ‘Cases’. See top right. It’s a very busy plot (bottom right), but you can definitely see the same kind of data you do from the news. For the next part of our data examination, we need to calculate the number of new cases each day from the day before. This is SUPER easy with the .shift() method available in Pandas (below). Now let’s see the daily differences on a graph… »> df.plot(kind='line',x='dtstring',y='diff',color='red') <matplotlib.axes._subplots.AxesSubplot object at 0x7f16e3ff3b90> »> plt.show()

Ainsi, nous avons maintenant des données avec lesquelles jouer, ou presque. Mais d'abord, commençons par donner des noms clairs et compréhensibles aux entêtes de colonnes. Nous changerons « index » en « dtstring » et l'entête 225 de la deuxième colonne (un nombre, pas du texte) par « Cases » (Cas). Voir en haut à droite.

C'est un tracé très chargé (en bas à droite), mais vous pouvez vraiment voir le même genre de données que celles qui paraissent dans les journaux.

Pour la partie suivante de notre examen des données, nous devons calculer le nombre de nouveaux cas d'un jour sur l'autre. C'est SUPER facile avec la méthode .shift() disponible dans Pandas (ci-dessous).

Maintenant, faisons apparaître les écarts quotidiens sur un graphique :

df.plot(kind='line',x='dtstring',y='diff',color='red')

<matplotlib.axes._subplots.AxesSubplot object at 0x7f16e3ff3b90>

plt.show()

Now that you have the basics of dealing with the basic data, you can go back to the beginning, where we pulled the data for the US and change it to the country or region of your choice. For example, change the line… s1 = data.loc[data['Country/Region']=='US'] To… s1 = data.loc[data['Country/Region']=='Norway'] When you print the s1 data, you will see that the row for Norway is 175. So in the line that we got just the data columns for that row (from column 4 to last column)… s1a = data.iloc[225,4:lastcol] You would change it to… s1a = data.iloc[175,4:lastcol]

Maintenant que nous avons les bases pour traiter les données simples, vous pouvez retourner au début, là où nous avons extrait les données pour les USA et changer pour le pays ou la région de votre choix. Par exemple, modifiez la ligne :

s1 = data.loc[data['Country/Region']=='US']

en…

s1 = data.loc[data['Country/Region']=='Norway']

Si vous imprimez les données de s1, vous verrez que la ligne de la Norvège est la 175. Aussi, avec la ligne suivante, nous n'obtenons que les colonnes de données pour cette ligne (de la colonne 4 à la dernière) :

s1a = data.iloc[225,4:lastcol]

vous pouvez la modifier en :

s1a = data.iloc[175,4:lastcol]

At this point, you would repeat all of the other steps again to create and modify the dataframe so you can plot it. What exactly should we take away from this data? That’s a very good question. The accuracy of this, is currently in somewhat of a (series) question. There are speculations that suggest that the number of confirmed cases are low due to the lack and quality of testing of the population of many of the areas. You can never be sure of the data, unless you gather it yourself. In cases like this, you have no choice but to believe, with a grain of salt, that the data was taken with the best level of care.

À ce stade, vous pourriez répéter toutes les étapes précédentes pour créer et modifier les jeux de données de façon à les tracer.

Que devons-nous tirer vraiment de ces données ? C'est une très bonne question. La précision de celles-ci est actuellement une question (de séries) en elle-même. Il y a des spéculations qui suggèrent que le nombre de cas confirmés est bas dans beaucoup de régions du fait du manque de tests sur la population. Vous ne pouvez jamais être sûr des données, sauf si vous les regroupez vous-même. Dans des cas comme celui-ci, votre seul choix est de croire, avec un petit grain de sel, que les données ont été relevées avec le plus grand soin.

WIth a little bit of creative web searches, you can find a lot more information on Pandas, various datasets and types of plots and options that you can use to show your data. Until next month; stay safe, healthy, positive and creative!

Avec un peu de créativité dans vos recherches sur le Web, vous pouvez trouver beaucoup plus d'informations sur Pandas, des jeux de données variés et des types de tracés et d'options que vous pouvez utiliser pour présenter vos données.

Jusqu'au mois prochain, restez à l'abri, en bonne santé, positif et créatif !

Lignes noires de l'encadré de la page 22

Now, we need to import two libraries, pandas and matplotlib.pyplot. Make sure that you alias them as shown…

Maintenant, nous devons importer deux bibliothèques, pandas and matplotlib.pyplot. Assurez-vous que vous leur créez un alias comme indiqué : Now, let’s set the filename of the .csv file into a variable…

Maintenant, mettons le nom du fichier .csv dans une variable :

Next, have Pandas read the spreadsheet into a dataframe…

Puis, faisons en sorte que Pandas lise le tableur vers le jeu de données :

Lignes noires de l'encadré de la page 24

Now we can plot the data. Remember, there are 104 data points, so the date information on the X axis will be pretty squished together.

Maintenant, nous pouvons tracer les données. Souvenez-vous qu'il y a 104 points ; aussi, les informations des dates sur l'axe des X seront bien tassées.

issue157/python.txt · Dernière modification : 2020/06/06 13:52 de andre_domenech