Outils pour utilisateurs

Outils du site


issue141:python

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
issue141:python [2019/01/29 08:45] d52frissue141:python [2019/02/08 16:06] (Version actuelle) andre_domenech
Ligne 7: Ligne 7:
 Once you have that downloaded, create a folder to hold the code and the CSV file. This could all be done within the Python shell, but creating a file will make it easier to deal with until you get familiar with the commands and concepts that we will be using. We'll be building the code file step by step as we go along. I've put the source code up on PasteBin at  https://pastebin.com/uG1QSkmN to make it easy for you.** Once you have that downloaded, create a folder to hold the code and the CSV file. This could all be done within the Python shell, but creating a file will make it easier to deal with until you get familiar with the commands and concepts that we will be using. We'll be building the code file step by step as we go along. I've put the source code up on PasteBin at  https://pastebin.com/uG1QSkmN to make it easy for you.**
  
-Pandas = Tendres ... données ?+Pandas = câlins ... données ?
  
-Cette fois, nous nous concentrerons sur les Dataframes de Pandas, en traitant un scénario du monde semi-réel.+Cette fois, nous nous concentrerons sur les DataFrames de Pandas, en traitant un scénario du monde semi-réel.
  
 Nous aurons besoin de télécharger un fichier CSV depuis kaggle.com. Le lien est https://www.kaggle.com/sulmansarwar/transactions-from-a-bakery, et le fichier à récupérer est « BreadBasket_DMS.csv' ». Nous aurons besoin de télécharger un fichier CSV depuis kaggle.com. Le lien est https://www.kaggle.com/sulmansarwar/transactions-from-a-bakery, et le fichier à récupérer est « BreadBasket_DMS.csv' ».
  
-Une fois que vous l'avez téléchargé, créez un dossier qui contiendra le code et le fichier CSV. Ceci pourrait se faire complètement dans le shell Python, mais la création d'un fichier rendra tout ça plus facile jusqu'à ce que vous soyez à l'aise avec les commandes et les concepts que nous utiliserons. Nous construirons le fichier de code pas à pas en avançant. J'ai mis le code source sur Pastebin à : https://pastebin.com/uG1QSkmN pour que ce soit facile pour vous.+Une fois que vous l'aurez téléchargé, créez un dossier qui contiendra le code et le fichier CSV. Ceci pourrait se faire complètement dans le shell Python, mais la création d'un fichier rendra tout ça plus facile à gérer jusqu'à ce que vous soyez à l'aise avec les commandes et les concepts que nous utiliserons. Nous construirons le fichier de code en avançant pas à pas. J'ai mis le code source sur Pastebin à : https://pastebin.com/uG1QSkmN pour que ce soit facile pour vous.
  
 **The data that the CSV file holds is really rather simple. There are just four columns... **The data that the CSV file holds is really rather simple. There are just four columns...
Ligne 40: Ligne 40:
 • Transaction (un nombre) • Transaction (un nombre)
 • Item (l'article) • Item (l'article)
-et 21,293 lignes.+et 21 293 lignes.
  
-Pour commencer, nous créerons une Dataframe en important les données du fichier CSV. Vous pouvez aussi créer des Dataframes à partir de table de bases de données, mais, ce sera un article pour une autre fois. Voici un échantillon de ce à quoi ressemble le fichier CSV...+Pour commencer, nous créerons une DataFrame en important les données du fichier CSV. Vous pouvez aussi créer des DataFrames à partir d'une table de bases de données, mais, ce sera un article pour une autre fois. Voici un échantillon de ce à quoi ressemble le fichier CSV...
  
 Date,Time,Transaction,Item Date,Time,Transaction,Item
Ligne 72: Ligne 72:
 Now, to do any kind of work with the data, you will need to know the names of the columns. Many times, when we are working, we either don't have time or don't take the time to make notes carefully. This is especially true when we deal with really large data files with more than 50 columns. That can take more time than we have. Thankfully, Pandas has a simple command that we can use to get all of our column headers. The command is 'df.columns.values.tolist()'. We can use it like this...** Now, to do any kind of work with the data, you will need to know the names of the columns. Many times, when we are working, we either don't have time or don't take the time to make notes carefully. This is especially true when we deal with really large data files with more than 50 columns. That can take more time than we have. Thankfully, Pandas has a simple command that we can use to get all of our column headers. The command is 'df.columns.values.tolist()'. We can use it like this...**
  
-Pour commencer, nous importerons Pandas (exactement comme nous l'avons fait le mois dernier), définirons le nom du fichier CSV et créerons la ataframe à partir du fichier CSV.+Pour commencer, nous importerons Pandas (exactement comme nous l'avons fait le mois dernier), définirons le nom du fichier CSV et créerons la DataFrame à partir du fichier CSV.
  
 import pandas as pd import pandas as pd
Ligne 84: Ligne 84:
 Ce que nous verrons ressemblera aux données montrées ci-dessus. Ce que nous verrons ressemblera aux données montrées ci-dessus.
  
-Toutes les données sont bien là, mais Pandas ne montre qu'une partie des information de la Dataframe.+Toutes les données sont bien là, mais Pandas ne montre qu'une partie des informations de la DataFrame.
  
-Maintenant, quelque soit le travail à faire sur les données, vous aurez besoin de connaître les noms des colonnes. Il arrive très souvent quand nous travaillons que nous n'avons pas le temps ou que nous ne prenions pas le temps de noter soigneusement. C'est particulièrement vrai quand nous traitons des fichiers de données vraiment très vastes avec plus de 50 colonnes. Ça peut prendre plus de temps que nous n'en avons. Heureusement, Pandas possède une simple commande que nous pouvons utiliser pour obtenir toutes nos entêtes de colonnes. la commande est « df.columns.values.tolist() ». Nous pouvons l'utiliser comme ceci...+Maintenant, quel que soit le travail à faire sur les données, vous aurez besoin de connaître le nom des colonnes. Il arrive très souventquand nous travaillonsque nous n'ayons pas le temps ou que nous ne prenions pas le temps de prendre des notes avec soin. C'est particulièrement vrai quand nous traitons des fichiers de données vraiment très vastes avec plus de 50 colonnes. Ça peut prendre plus de temps que nous n'en avons. Heureusement, Pandas possède une simple commande que nous pouvons utiliser pour obtenir toutes nos entêtes de colonnes. La commande est « df.columns.values.tolist() ». Nous pouvons l'utiliser comme ceci :
  
 **# get and display a list of the column names (headers) **# get and display a list of the column names (headers)
Ligne 118: Ligne 118:
 ['Date', 'Time', 'Transaction', 'Item'] ['Date', 'Time', 'Transaction', 'Item']
  
-nous pouvons n'appeler que « df.count() » et quelque chose comme ceci nous sera présenté...+nous pouvons également tout simplement appeler « df.count() » et quelque chose comme ceci nous sera présenté :
  
 print(df.count()) print(df.count())
Ligne 141: Ligne 141:
 Keep the datelist variable in mind for later on.** Keep the datelist variable in mind for later on.**
  
-Donc, jusqu'ici, nous avons créé et chargé notre Dataframe et nous connaissons les entêtes de colonnes et le nombre de ligne qu'elle contient. Maintenant, voyons combien de dates uniques nous traitons. Pour ce faire, nous pouvons créer une liste (presque comme nous fîmes pour obtenir la liste des entêtes) en utilisant la commande suivante...+Jusqu'ici, nous avons créé et chargé notre DataFrame et nous connaissons les entêtes des colonnes et le nombre de lignes qu'il y a. Maintenant, voyons combien de dates uniques nous traitons. Pour ce faire, nous pouvons créer une liste (presque comme nous le fîmes pour obtenir la liste des entêtes) en utilisant la commande suivante :
  
 datelist = df['Date'].unique().tolist() datelist = df['Date'].unique().tolist()
  
-Ensuite, nous pouvons imprimer la longueur de la liste pour savoir combien elle possède de dates uniques. Nous pouvons aussi inclure les dates la plus proche et la plus lointaine pour lesquelles nous avons des données.+Ensuite, nous pouvons imprimer la longueur de la liste pour savoir combien elle possède de dates uniques. Nous pouvons aussi inclure les dates la plus proche et la plus lointaine pour lesquelles nous avons des données :
  
 print(len(datelist),min(datelist),max(datelist)) print(len(datelist),min(datelist),max(datelist))
  
-dont les résultats sont+dont les résultats sont :
  
 159 2016-10-30 2017-04-09 159 2016-10-30 2017-04-09
Ligne 170: Ligne 170:
 Ok, so now we know that we have a DataFrame that has 4 data columns, the data has 159 unique dates between 2016-10-30 and 2017-04-09, and 95 unique items in the DataFrame, and all in less than 20 lines of code and about 5 minutes of actual work.** Ok, so now we know that we have a DataFrame that has 4 data columns, the data has 159 unique dates between 2016-10-30 and 2017-04-09, and 95 unique items in the DataFrame, and all in less than 20 lines of code and about 5 minutes of actual work.**
  
-Nous savons aussi qu'existe la colonne « Item ». Nous pouvons faire la même chose pour voir combien d'articles différents nous avons.+Nous savons aussi que la colonne « Item » existe. Nous pouvons faire la même chose pour voir combien d'articles différents nous avons.
  
 itemlist = df['Item'].unique().tolist() itemlist = df['Item'].unique().tolist()
Ligne 180: Ligne 180:
 Je n'imprimerai pas toute le liste ici, mais il y a 95 articles uniques. Je n'imprimerai pas toute le liste ici, mais il y a 95 articles uniques.
  
-['Bread', 'Scandinavian', 'Hot chocolate', 'Jam', 'Cookies', 'Muffin', 'Coffee', …, 'Mortimer', 'Raw bars', 'Tacos/Fajita']. Maintenant nous savons que nous avons une Dataframe qui possède 4 colonnes, que les données ont 159 dates uniques entre le 30-10-2016 et le 09-04-2017, et qu'il y a 95 articles uniques dans la Dataframe ; et tout cela, avec moins de 20 lignes de code et trois minutes de travail réel.+['Bread', 'Scandinavian', 'Hot chocolate', 'Jam', 'Cookies', 'Muffin', 'Coffee', …, 'Mortimer', 'Raw bars', 'Tacos/Fajita'].  
 + 
 +Bon. Maintenant nous savons que nous avons une DataFrame qui possède 4 colonnes, que les données ont 159 dates uniques entre le 30-10-2016 et le 09-04-2017, et qu'il y a 95 articles uniques dans la DataFrame ; et tout cela, avec moins de 20 lignes de code et environ cinq minutes de travail réel.
  
 **Now, before we go any further, it would be a good idea to think about some of the questions that would be asked about our data… probably by the boss. Some of them might be... **Now, before we go any further, it would be a good idea to think about some of the questions that would be asked about our data… probably by the boss. Some of them might be...
Ligne 193: Ligne 195:
 We know that our data is broken down by date, time of each sale (transaction) and each item sold. In addition, each sale has a unique transaction number that is duplicated if there were multiple items in that sale. For example, let's look at two sales (shown above).** We know that our data is broken down by date, time of each sale (transaction) and each item sold. In addition, each sale has a unique transaction number that is duplicated if there were multiple items in that sale. For example, let's look at two sales (shown above).**
  
-Avant d'aller plus loin, ce serait maintenant une bonne idée de réfléchir aux questions qui pourraient être posées à propos des données... probablement par notre patron. Certaines pourraient être...+Avant d'aller plus loin, ce serait maintenant une bonne idée de réfléchir aux questions qui pourraient être posées à propos des données... probablement par notre patron. Certaines pourraient être :
 • Par jour, combien d'articles uniques ont été vendus ? • Par jour, combien d'articles uniques ont été vendus ?
 • Par article, quels ont été les plus vendus ? Quels sont les 10 moins bien vendus ? • Par article, quels ont été les plus vendus ? Quels sont les 10 moins bien vendus ?
-• Par jour, quels sont ceux les plus actifs ?+• Par jour, quels sont les périodes les plus actives ?
  
-Avant de pouvoir répondre à ces questions, nous devons monter un plan pour chacune. Aussi, commençons avec la question n°1...+Avant de pouvoir répondre à ces questions, nous devons monter un plan pour chacune. Aussi, commençons avec la question n°1.
  
 Par jour, combien d'articles uniques ont été vendus ? Par jour, combien d'articles uniques ont été vendus ?
Ligne 215: Ligne 217:
            | Coffee    | 2            | Coffee    | 2
            | Alfajores | 1**            | Alfajores | 1**
 +           
 +La vente n°1 (transaction 1954) a été terminée le 24-11-2016 à 10:18:24, et comprenait trois articles, deux articles boulangers et un café.
 +
 +La vente n°2 (transaction 1955) s'est terminée le même jour à 10:23:10, pour deux articles.
 +
 +Aussi, comment pourrions-nous structurer notre recherche pour accomplir cette tâche ? Si je ne regardais qu'un seul jour, je prendrais tous les enregistrements du jour dit et trierais les enregistrements par articles vendus. Ensuite, je compterais chaque article unique qui a été vendu ce jour-là. En utilisant les cinq enregistrements ci-dessus, ça ressemblerait à quelque chose comme ceci :
 +
 +Date         Item       Count
 +-----------|-----------|-----
 +2016-11-24 | Bread     | 2
 +           | Coffee    | 2
 +           | Alfajores | 1
  
 **Or to put it another way, I'd group the records by Date, then by Item and count (and record) each occurance of the unique item. **Or to put it another way, I'd group the records by Date, then by Item and count (and record) each occurance of the unique item.
Ligne 229: Ligne 243:
  
 #2 - By item, what were the top 10 sellers? What were the bottom 10?** #2 - By item, what were the top 10 sellers? What were the bottom 10?**
 +
 +Ou, pour le présenter différemment, je regrouperais les enregistrements par Date, puis par Items (articles) et compterais (et enregistrerais) chaque occurrence d'un article unique.
 +
 +Aussi, comment, à partir de la sortie d'un jeu simple d'enregistrements, arriverons-nous à un jeu de commandes qui nous donnera ce que nous voulons sur l'ensemble des données ? La clé est dans les mots « regrouper » et « compter ». Dans Pandas, il existe des fonctions auxiliaires qui accomplissent chacune des deux phases de la tâche. La première est « groupby » et nous avons déjà utilisé la seconde, « count ».
 +
 +N° 1 - Par Date, montrer combien il a été vendu de chaque article...
 +
 +Ce n° 1 produit un objet de données Series.
 +
 +byDate = df.groupby(['Date','Item'])['Date'].count()
 +
 +Ainsi, nous savons maintenant comment obtenir les informations pour le patron pour la question n°1. Et pour la question n° 2 :
 +
 +N° 2 - Par Item, quels sont ceux les plus vendus ? Et les 10 moins bien vendus ?
  
 **Again, we want to find the top 10 sellers as well as the bottom 10. Here we want to groupby Item, counting each Transaction number within each group. Then we want to make sure the items are sorted from hi to low. The .head() and .tail helper routines will give us the answers we need. **Again, we want to find the top 10 sellers as well as the bottom 10. Here we want to groupby Item, counting each Transaction number within each group. Then we want to make sure the items are sorted from hi to low. The .head() and .tail helper routines will give us the answers we need.
Ligne 243: Ligne 271:
  
 #3 - By day, what were the busiest times?** #3 - By day, what were the busiest times?**
 +
 +À nouveau, nous voulons trouver les 10 articles les mieux vendus tout comme les 10 moins bien vendus. Ici, nous voulons regrouper les articles, en comptant le nombre de transactions pour chaque regroupement. Ensuite, nous voulons nous assurer que les articles sont classés du haut vers le bas. Les routines auxiliaires .head() et .tail() nous donneront les réponses dont nous avons besoin.
 +
 +# By item, what were the top 10 sellers? What were the bottom 10?
 +
 +sorteditemcount2 = df.groupby('Item')[['Transaction']].count().sort_values('Transaction',ascending=False)
 +
 +print(sorteditemcount2)
 +
 +print(sorteditemcount2.head(10))
 +
 +print(sorteditemcount2.tail(10))
 +
 +N° 3 - Par jour, quelles ont été les périodes les plus actives ?
  
 **Once again, we can group by data and time, then count the number of transaction items. **Once again, we can group by data and time, then count the number of transaction items.
Ligne 266: Ligne 308:
  
 [9531 rows x 1 columns]** [9531 rows x 1 columns]**
 +
 +Une fois encore, nous pouvons regrouper par date et heure, puis compter le nombre de transactions.
 +
 +df.groupby(['Date','Time'])[['Transaction']].count()
 +
 +Date       Time            Transaction     
 +2016-10-30 09:58:11        1
 +           10:05:34        2
 +           10:07:57        3
 +           10:08:41        1 
 +           10:13:03        3
 +           10:16:55        3
 +           10:19:12        4
 +...                          ...
 +2017-04-09 10:08:23        2
 +           10:36:11        1
 +           10:39:07        2
 +           10:52:02        3
 +           11:14:28        1
 +           11:17:43        2
 +           11:22:01        1
 +
 +[9531 rows x 1 columns] (9531 lignes x 1 colonne)
  
 **So now we have answers for the boss and still all of the work could have been done within the Python Shell. I have created a simple program that contains all of the things that we did in one easy-to-see file. You can find it on pastebin at https://pastebin.com/uG1QSkmN . **So now we have answers for the boss and still all of the work could have been done within the Python Shell. I have created a simple program that contains all of the things that we did in one easy-to-see file. You can find it on pastebin at https://pastebin.com/uG1QSkmN .
  
 Next month, we’ll continue dealing with Pandas and Python, this time looking at a different dataset. Until then, have fun!** Next month, we’ll continue dealing with Pandas and Python, this time looking at a different dataset. Until then, have fun!**
 +
 +Nous avons maintenant les réponses pour notre patron ; et encore une fois, tout ce travail aurait pu être fait dans un shell Python. J'ai créé un programme simple qui contient toutes les choses que nous avons faites dans un fichier facile à visualiser. Vous pouvez le trouver sur pastebin à https://pastebin.com/uG1QSkmN.
 +
 +Le mois prochain, nous continuerons à traiter de Pandas et Python, en regardant ce coup-là un jeu de données différent. Jusque là, amusez-vous bien !
  
issue141/python.1548747949.txt.gz · Dernière modification : 2019/01/29 08:45 de d52fr