[PYTHON] Science des données 100 coups ~ Bataille pour moins que les débutants part8

C'est un record de lutte pour frapper 100 œufs sans connaître l'œuf du scientifique des données. C'est un mystère si je peux terminer la course. ~~ Même s'il disparaît en cours de route, pensez qu'il n'est pas donné à Qiita. ~~

100 articles frappants 100 Knock Guide

** Faites attention si vous essayez de le faire car cela inclut des spoilers **

J'ai peur parce que la façon d'écrire la réponse du modèle est trop différente

C'est difficile à voir! Cette façon d'écrire est dangereuse! Si vous avez des questions, n'hésitez pas à me le faire savoir. ~~ Je vais l'utiliser comme nourriture tout en souffrant de dommages à mon cœur.

Cette solution est fausse! Cette interprétation est différente! Veuillez commenter si vous en avez.

Cette fois de 41 à 44. [Dernière fois] 36-40 [Première fois avec la table des matières]

41e

P-041: Agréger le montant des ventes (montant) du bloc de données des détails de la réception (df_receipt) pour chaque date (sales_ymd) et calculer l'augmentation ou la diminution du montant des ventes du jour précédent. Il suffit d'afficher 10 résultats de calcul.

mine41.py


df_day=df_receipt.groupby('sales_ymd').agg({'amount':'sum'}).reset_index()
df_Yday=pd.concat([df_day['sales_ymd']+1,df_day['amount']],axis=1).rename(columns={'amount': 'Y_amount'})
df=pd.merge(df_day.head(10),df_Yday,on='sales_ymd',how='outer')
df['sa']=df['amount']-df['Y_amount']
df.head(10)

'''Le modèle de réponse'''
df_sales_amount_by_date = df_receipt[['sales_ymd', 'amount']].groupby('sales_ymd').sum().reset_index()
df_sales_amount_by_date = pd.concat([df_sales_amount_by_date, df_sales_amount_by_date.shift()], axis=1)
df_sales_amount_by_date.columns = ['sales_ymd','amount','lag_ymd','lag_amount']
df_sales_amount_by_date['diff_amount'] = df_sales_amount_by_date['amount'] - df_sales_amount_by_date['lag_amount']
df_sales_amount_by_date.head(10)

C'est un total d'un quart de jour Comme ma méthode

  1. Créez une table sous la forme «df_Y» [date (un jour plus tard), agréger]
  2. Fusionner les dates ensemble, et cela créera les données [Date, Agrégation, Agrégation (il y a 1 jour)]
  3. Ajoutez une colonne de différences agrégées

Je l'ai fait comme. Je ne pense pas que ce soit faux, mais j'ai pensé qu'il serait préférable de retirer de la date sur la table au lieu de "1 jour".

――Par exemple, s'il y a un magasin fermé les samedis et dimanches, la date volera.

Après avoir vu la réponse du modèle, Si vous découvrez comment utiliser .shift (), j'ai pensé que ce serait très facile, donc je vais l'utiliser à partir du problème suivant. Ce devait être

42e

P-042: Agréger le montant des ventes (montant) du cadre de données de détail de la réception (df_receipt) pour chaque date (sales_ymd), et combiner les données d'il y a 1 jour, 2 jours et 3 jours avec les données de chaque date. Seuls 10 résultats doivent être affichés.

mine42.py


df_day=df_receipt.groupby('sales_ymd').agg({'amount':'sum'})
df=df_day
for i in range(1,4):
    df=pd.merge( df,df_day.shift(i).reset_index(),how='outer',on='sales_ymd')

df.columns=['sales_ymd','amount_sum_0','amount_sum_1','amount_sum_2','amount_sum_3']
df.head(10)

'''Le modèle de réponse'''
#Exemple de code 2:Mallette de maintien horizontale
df_sales_amount_by_date = df_receipt[['sales_ymd', 'amount']].groupby('sales_ymd').sum().reset_index()
for i in range(1, 4):
    if i == 1:
        df_lag = pd.concat([df_sales_amount_by_date, df_sales_amount_by_date.shift(i)],axis=1)
    else:
        df_lag = pd.concat([df_lag, df_sales_amount_by_date.shift(i)],axis=1)
df_lag.columns = ['sales_ymd', 'amount', 'lag_ymd_1', 'lag_amount_1', 'lag_ymd_2', 'lag_amount_2', 'lag_ymd_3', 'lag_amount_3']
df_lag.dropna().sort_values(['sales_ymd']).head(10)

Au début, j'ai essayé de joindre quatre tables à la fois sans tourner avec une instruction for, mais apparemment pd.merge () ne peut en joindre que deux Référence

J'ai donc créé une source et l'ai tournée avec une phrase pour.

Personnellement, c'était la manipulation de données la plus amusante de nos jours Au fait, il semble que les données ne changent pas avec .shift (0).

df=pd.merge( df_day.shift(0).reset_index() , df_day.shift(1).reset_index() , df_day.shift(2).reset_index() , df_day.shift(3).reset_index() ,how='outer',on='sales_ymd') Je voulais écrire comme ça

43e

P-043: Cadre de données récapitulatif des ventes (df_sales_summary) qui combine le bloc de données de détail des reçus (df_receipt) et le bloc de données client (df_customer) et totalise le montant des ventes (montant) pour chaque sexe (sexe) et âge (calculé à partir de l'âge). ). Le sexe est 0 pour l'homme, 1 pour la femme et 9 pour l'inconnu. Cependant, la composition de l'article doit être de quatre éléments: l'âge, le montant des ventes pour les femmes, le montant des ventes pour les hommes et le montant des ventes pour le sexe inconnu (tabulation croisée de l'âge verticalement et du sexe horizontalement). En outre, le groupe d'âge devrait être tous les 10 ans.

Le problème suivant est

  1. Créez une colonne "âge"
  2. Spécifiez 2 éléments avec .groupby 3.Faites-le sous forme de tabulation croisée

J'ai pris la scène

mine43.py


df=pd.merge(df_receipt,df_customer,how='inner',on='customer_id')
df_bins=pd.cut(df.age,range(0,100,10))
df=pd.concat([df[['gender_cd','amount']],df_bins],axis=1)
df=df.groupby(['age','gender_cd']).agg({'amount':'sum'}).reset_index()

df_cross=pd.merge( df.query("gender_cd=='0'")[['age','amount']]
                  ,df.query("gender_cd=='1'")[['age','amount']]
                  ,how='outer',on='age')
df_cross=pd.merge( df_cross
                  ,df.query("gender_cd=='9'")[['age','amount']]
                  ,how='outer',on='age')
df_cross.columns=['age','male','female','unkown']
df_cross

'''Le modèle de réponse'''
df_tmp = pd.merge(df_receipt, df_customer, how ='inner', on="customer_id")
df_tmp['era'] = df_tmp['age'].apply(lambda x: math.floor(x / 10) * 10)
df_sales_summary = pd.pivot_table(df_tmp, index='era', columns='gender_cd', values='amount', aggfunc='sum').reset_index()
df_sales_summary.columns = ['era', 'male', 'female', 'unknown']
df_sales_summary

Si vous réfléchissez et voyez la réponse du modèle, ne la divisez pas en bacs .apply(lambda x: math.floor(x / 10) * 10) Est-il divisé par 10 (converti en type entier) et multiplié par 10? Je ne sais pas comment utiliser lambda. Et c'est un tableau croisé dynamique ... Je vois. Est-il possible de l'utiliser comme ça ...

J'étudierai le tableau croisé dynamique (

44ème

P-044: La base de données de synthèse des ventes (df_sales_summary) créée à la question précédente était une vente côte à côte de sexe. Tenons le sexe verticalement à partir de cette base de données et convertissons-le en 3 éléments: âge, code de sexe et montant des ventes. Cependant, le code de genre est «00» pour les hommes, «01» pour les femmes et «99» pour les inconnues.

Puisqu'il s'agit d'un problème continu, le df résumé la dernière fois est utilisé tel quel. Comme cela signifie le changer en maintien vertical, j'ai divisé le df en trois et les ai disposés verticalement. Ou plutôt, j'ai changé la verticale en horizontale la dernière fois, donc l'inverse était facile ...

mine44.py


df_cross_M=df_cross[['age','male']].rename(columns={'male':'sum'})
df_cross_M['gender']='00'
df_cross_F=df_cross[['age','female']].rename(columns={'female':'sum'})
df_cross_F['gender']='01'
df_cross_U=df_cross[['age','unkown']].rename(columns={'unkown':'sum'})
df_cross_U['gender']='99'

df=pd.concat([df_cross_M,df_cross_F,df_cross_U])
df
'''Le modèle de réponse'''
df_sales_summary = df_sales_summary.set_index('era'). \
        stack().reset_index().replace({'female':'01',
                                        'male':'00',
                                        'unknown':'99'}).rename(columns={'level_1':'gender_cd', 0: 'amount'})

La réponse modèle se termine par une très longue phrase. Avez-vous utilisé setindex () pour enregistrer la colonne chronologique dans l'index et unifier toutes les colonnes? Je pense que c'est incroyable que vous puissiez changer le nom à la fois avec .replace (). Je veux vraiment le maîtriser

Jusqu'à ici pour cette fois

En tout cas, il y a de plus en plus de façons différentes des miennes, donc c'est très éducatif.

Saisissez cette opportunité

Merci à ceux qui restent toujours coincés. S'il y a des personnes qui peuvent voir leur progression au lieu d'enregistrer des articles individuels, nous vous enverrons une notification de mise à jour chaque fois que vous mettez à jour le tableau de part1. Par conséquent, si vous stockez part1 sans stocker tous les articles, vous pouvez voir votre progression, donc je pense que vous n'aurez pas à vous soucier. (Je pense simplement)

Je tiens à remercier tous ceux qui l'ont toujours vu, cette fois pour la première fois, et tout le monde. Merci pour la navigation.

Recommended Posts

Data Science 100 Knock ~ Bataille pour moins que les débutants part5
Data Science 100 Knock ~ Battle pour moins que les débutants part10
Science des données 100 coups ~ Bataille pour moins que les débutants part8
Data Science 100 Knock ~ Bataille pour moins que les débutants part3
Data Science 100 Knock ~ Bataille pour moins que les débutants part6
Data Science 100 Knock ~ Bataille pour moins que les débutants part2
Data Science 100 Knock ~ Bataille pour moins que les débutants part1
Data Science 100 Knock ~ Battle pour moins que les débutants part9
Science des données 100 coups ~ Bataille pour moins que les débutants part7
Data Science 100 Knock ~ Bataille pour moins que les débutants part4
Data Science 100 Knock ~ Bataille pour moins que les débutants part11
Comment mettre en œuvre 100 coups de science des données pour les débutants en science des données (pour Windows 10 Home)
Défiez 100 coups de science des données
Essayez «100 coups sur la science des données» ①
Pandas 100 coups pour les débutants en Python
Détection d'anomalies de données chronologiques pour les débutants
[Pratique pour les débutants] Lire ligne par ligne "Prédire les prix des maisons" de kaggle (Partie 1: Lire les données)
[Commande Linux] Liste d'options de commande moins [À voir pour les débutants]
[Python] 100 coups sur la science des données (traitement de données structurées) 018 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 023 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 030 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 022 Explication
Comment utiliser les outils d'analyse de données pour les débutants
[Python] 100 coups sur la science des données (traitement de données structurées) 017 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 026 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 016 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 024 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 027 Explication
Principes de base de Pandas pour les débutants ② Présentation des données de saisie
[Python] 100 coups sur la science des données (traitement de données structurées) 029 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 015 Explication
[Python] 100 coups sur la science des données (traitement de données structurées) 028 Explication