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.
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
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
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