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]
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
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
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
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
.groupby
3.Faites-le sous forme de tabulation croiséeJ'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 (
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
En tout cas, il y a de plus en plus de façons différentes des miennes, donc c'est très éducatif.
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