[PYTHON] <Pandas> Comment gérer les données de séries chronologiques dans le tableau croisé dynamique

introduction

L'auteur participe actuellement à un programme de développement des ressources humaines en IA parrainé par le ministère de l'Économie, du Commerce et de l'Industrie appelé AI Quest, où le concours du premier trimestre s'est terminé à 8h00 aujourd'hui. Je ne suis pas content que le résultat soit la 18e place (295 participants), mais je pense que c'était un contenu très pratique car c'était une prévision de la demande supposant des données réelles, alors j'ai noté cette expérience. Je vais l'écrire.

Aperçu des données

Le contour de ce concours est que les données de ventes quotidiennes pour chaque magasin de produits d'une certaine entreprise pendant environ deux ans sont données, et sur cette base, les ventes pour le mois suivant sont prévues, et les données sont les suivantes. Il a été donné sous la forme de.

Date ID magasin ID produit Prix du produit Quantité vendue
0        2018-01-01     9  1000001   420   1.0
1        2018-01-01     6  1000001   420   1.0
2        2018-01-01    10  1000001   420   1.0
3        2018-01-01     0  1000017   250   1.0

Prétraitement

Définissez la date sur le type datetime avant de la manipuler avec pivot.


df = pd.read_csv("data/sales_history.csv", parse_dates=["Date"])

Lors de la lecture de cette manière, la colonne de date peut être lue avec datetime. Si vous l'affichez comme df.info (), vous pouvez voir qu'il est de type datetime comme indiqué ci-dessous.

RangeIndex: 1119570 entries, 0 to 1119569
Data columns (total 5 columns):
 #   Column  Non-Null Count    Dtype         
---  ------  --------------    -----         
0 date 1119570 non-null  datetime64[ns]
1 Identifiant du magasin 1119570 non-null  int64         
2 ID produit 1119570 non-null  int64         
3 Prix du produit 1119570 non-null  int64         
4 Nombre d'unités vendues 1119570 non-null  float64       
dtypes: datetime64[ns](1),float64(1),int64(3)
memory usage: 42.7 MB

Ensuite, je veux l'agréger par mois, donc je vais créer une colonne qui correspond à l'année et au mois.


df["Année mois"] = df["Date"].dt.strftime("%y%m")

Si vous essayez avec df [" year / month "] .head (), vous pouvez voir qu'il est créé comme suit. Au fait, si vous le définissez sur % Y, ce sera 4 chiffres dans l'AD, et si vous le définissez sur% y, ce seront les 2 derniers chiffres.

0    1801
1    1801
2    1801
3    1801
4    1801
Name:Année mois, dtype: object

Résumons-le par mois. Le nombre total d'unités vendues est correct, mais je veux utiliser le prix moyen au lieu du total (cette fois j'ai utilisé la valeur médiane qui n'est pas affectée par des valeurs anormales), donc je les décrirai ensemble dans agg.


df = df.groupby(["Année mois", "ID produit", "Identifiant du magasin"]).agg({"Nombre d'unités vendues":"sum", "Prix du produit":"median"}).reset_index()

Il est résumé par mois comme suit. Ici, si vous utilisez .reset_index (), les colonnes utilisées pour le regroupement deviendront MultiIndex (l'index a une hiérarchie à plusieurs niveaux) et ce sera difficile à gérer, alors résolvez-le. Je le fais.

Année / mois ID produit ID magasin Nombre d'unités vendues Prix produit
0       1801  1000001     0   6.0   420
1       1801  1000001     1   2.0   325
2       1801  1000001     2   1.0   420

tableau croisé dynamique

C'est finalement le sujet principal. Ce que nous devrions faire cette fois-ci, c'est que le mois sans ventes n'est pas 0 et il n'y a pas de données lui-même, et si nous faisons une prédiction telle quelle, l'information selon laquelle les ventes étaient de 0 sera perdue, donc le mois sans données est 0 Je veux le remplir. De plus, je voudrais ajouter le montant de la fonction de décalage (ventes du mois dernier ou du mois précédent). Le tableau croisé dynamique facilite ces opérations.


df_pivot = df.pivot_table(index=["ID produit", "Identifiant du magasin"], columns="Année mois", values="Nombre d'unités vendues")

Si vous spécifiez l'index et la colonne et la valeur à agréger de cette manière, cela fera une belle impression.

Année 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810\
ID de produit ID de magasin
1000001 0      6.0   3.0   1.0   2.0   NaN   4.0   3.0   2.0   1.0   NaN   
        1      2.0   1.0   NaN   2.0   NaN   2.0   1.0   NaN   NaN   1.0   
        2      1.0   NaN   1.0   NaN   1.0   2.0   3.0   4.0   2.0   1.0 

Comme vous pouvez le voir, lorsqu'il n'y a pas de données, cela peut être exprimé comme une valeur manquante, donc si vous remplissez cela avec 0, vous pouvez exprimer des ventes de 0.


df_pivot = df_pivot.fillna(0)

Ensuite, regardons le montant de la fonction de décalage. La méthode d'écriture est la même que le décalage d'une colonne dans les données de séries chronologiques.


sold_lag_1 = df_pivot.shift(1, axis=1)

Si vous faites cela, il en déplacera un vers la droite, comme indiqué ci-dessous.

Année 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810\
ID de produit ID de magasin
1000001 0      NaN   6.0   3.0   1.0   2.0   0.0   4.0   3.0   2.0   1.0   
        1      NaN   2.0   1.0   0.0   2.0   0.0   2.0   1.0   0.0   0.0   
        2      NaN   1.0   0.0   1.0   0.0   1.0   2.0   3.0   4.0   2.0    

De la même manière, nous avons pu ajouter le décalage il y a quelques mois en tant que fonctionnalité.


sold_lag_2 = df_pivot.shift(2, axis=1)
sold_lag_3 = df_pivot.shift(3, axis=1)

Enfin, vous devez les ajouter au bloc de données d'origine. Par exemple, les données du nombre d'unités vendues le mois correspondant remplies de 0 sont traitées comme suit.


sold_lag_0 = df_pivot.stack().reset_index().rename(columns={0:"Rempli avec 0 unités vendues"})

Tout d'abord, vous pouvez éliminer ce qui a été pivoté par .stack () et l'exprimer avec un multi-index vertical.

ID produit ID magasin Année / mois
1000001  0     1801    6.0
               1802    3.0
               1803    1.0
               1804    2.0
               1806    4.0

Ce faisant, j'ai pu éliminer le multi-index et l'organiser de manière à ce qu'il puisse être combiné en modifiant les noms des colonnes selon les besoins. Tout ce que vous avez à faire est de faire correspondre les noms de colonnes et de les fusionner.


df_merge = pd.merge(df, sold_lag_0, how="right", on=['Année mois', 'Identifiant du magasin', 'ID produit'])

À ce stade, si vous définissez how =" right ", vous pouvez joindre la jointure externe droite (jointure basée sur la table sur le côté droit) et elle est terminée avec succès.

Année / mois ID produit ID magasin Nombre d'unités vendues Prix du produit Nombre d'unités vendues 0
0       1801  1000001     0   6.0   420    6.0
1       1801  1000001     1   2.0   325    2.0
2       1801  1000001     2   1.0   420    1.0

Après cela, les caractéristiques de décalage peuvent être combinées de la même manière, et le prix peut être complété linéairement par df_pivot.interpolate (" le plus proche ", limit_direction = 'both', axis = 1). Je peux le faire. En d'autres termes, plus d'informations peuvent être extraites en appliquant quatre règles de quantités de caractéristiques de décalage.

Sur la base de ce que j'ai appris cette fois, je voudrais me consacrer à l'obtention de meilleurs résultats lors du prochain concours.

Recommended Posts

<Pandas> Comment gérer les données de séries chronologiques dans le tableau croisé dynamique
Comment gérer les données de séries chronologiques (mise en œuvre)
Comment lire les données de séries chronologiques dans PyTorch
Ingéniosité pour gérer les données avec Pandas de manière à économiser la mémoire
Comment formater un tableau à l'aide de Pandas Appliquer, pivoter et permuter le niveau
Comment afficher DataFrame sous forme de tableau dans Markdown
Comment gérer les trames de données
[Pandas] Comment vérifier les doublons dans un tableau et supprimer les doublons (équivalent à supprimer les doublons dans Excel)
Graphique des données de séries chronologiques en Python à l'aide de pandas et matplotlib
[Python] Comment générer une table pandas dans un fichier Excel
Comment obtenir un aperçu de vos données dans Pandas
Compagnon de science des données en python, comment spécifier des éléments dans les pandas
Comment gérer une session dans SQLAlchemy
Comment écrire sobrement avec des pandas
[Python] Comment utiliser la série Pandas
Comment gérer le japonais avec Python
Comment calculer la somme ou la moyenne des données csv de séries chronologiques en un instant
Comment extraire des fonctionnalités de données de séries chronologiques avec les bases de PySpark
[Python] Comment ajouter des lignes et des colonnes à une table (pandas DataFrame)
Comment créer une grande quantité de données de test dans MySQL? ??
Exemple d'agrégation d'une grande quantité de données de séries temporelles à l'aide de Python dans un petit environnement de mémoire à une vitesse raisonnable
Comment comparer des données de séries chronologiques - Dérivée DTW, DTW-
Comment obtenir stacktrace en python
Comment afficher la table quatre-vingt-dix-neuf en python
Comment réattribuer un index dans pandas dataframe
Comment gérer des valeurs consécutives dans MySQL
Comment lire des fichiers CSV avec Pandas
Ajouter une série à la colonne dans les pandas python
Comment changer plusieurs colonnes de csv dans Pandas (Unixtime-> Japan Time)
Comment envoyer une image visualisée des données créées en Python à Typetalk
Comment arrêter le programme jusqu'à une date et une heure spécifiques en python
Agrégation pratique de séries chronologiques avec TimeGrouper de pandas
Obtenez des données de séries chronologiques de k-db.com avec Python
Comment effacer un taple dans une liste (Python)
Comment utiliser la bibliothèque d'images Python dans la série python3
Résumé de la méthode Kaggle's Kernel [Table time series data]
Comment créer un fichier JSON en Python
Une manière intelligente de chronométrer le traitement avec Python
Comment implémenter un sélecteur de dégradé dans Houdini
[Introduction à Python] Comment gérer les données au format JSON
Comment créer des données à mettre dans CNN (Chainer)
Comment notifier les canaux Discord en Python
[Python] Comment dessiner un histogramme avec Matplotlib
Comment créer une API Rest dans Django
Nettoyage des données Comment gérer les valeurs manquantes et aberrantes
Comment écrire un document tuple nommé en 2020
Comment compter les nombres dans une plage spécifique
Comment gérer le type datetime dans sqlite3 de python
Comment lire des fichiers dans différents répertoires
Comment se moquer d'une fonction publique dans Pytest
Extraire les périodes qui correspondent à un modèle spécifique des données qualitatives de séries chronologiques de pandas
La première étape de l'analyse du journal (comment formater et mettre les données du journal dans Pandas)
Comment spécifier un schéma dans les paramètres de la base de données Django
Comment convertir / restaurer une chaîne avec [] en python
Comment appliquer des marqueurs uniquement à des données spécifiques avec matplotlib
Je veux donner un group_id à une trame de données pandas
Comment mesurer le temps de traitement avec Python ou Java
Comment récupérer des données de courses de chevaux à l'aide de pandas read_html
Comment convertir des données détenues horizontalement en données détenues verticalement avec des pandas