Dies ist ein Kampfbericht über das Klopfen von 100 Eiern, ohne das Ei des Datenwissenschaftlers zu kennen. Es ist ein Rätsel, ob ich das Rennen beenden kann. ~~ Auch wenn es unterwegs verschwindet, denken Sie bitte, dass es Qiita nicht gegeben wird. ~~
100 Klopfartikel 100 Knock Guide
** Sei vorsichtig, wenn du es versuchst, da es Spoiler enthält **
Ich habe Angst, weil die Art und Weise, die Modellantwort zu schreiben, zu unterschiedlich ist
Das ist schwer zu sehen! Diese Schreibweise ist gefährlich! Wenn Sie Fragen haben, lassen Sie es mich bitte wissen. ~~ Ich werde es als Nahrung verwenden, während mein Herz geschädigt wird.
Diese Lösung ist falsch! Diese Interpretation ist anders! Bitte kommentieren Sie, wenn Sie welche haben.
Diesmal von 41 bis 44. [Letztes Mal] 36-40 [Zum ersten Mal mit Inhaltsverzeichnis]
P-041: Aggregieren Sie den Verkaufsbetrag (Betrag) des Datenrahmens für Belegdetails (df_receipt) für jedes Datum (sales_ymd) und berechnen Sie die Zunahme oder Abnahme des Verkaufsbetrags gegenüber dem Vortag. Es reicht aus, 10 Berechnungsergebnisse anzuzeigen.
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)
'''Musterantwort'''
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)
Es ist insgesamt eine Tagesschicht Als meine Methode
df_Y
[Datum (einen Tag später), aggregiert]Ich habe es als gemacht. Ich denke nicht, dass dies falsch ist, aber ich dachte, es wäre besser, vom Datum auf dem Tisch zu ziehen, anstatt "1 Tag".
――Wenn beispielsweise ein Geschäft samstags und sonntags geschlossen ist, fliegt das Datum.
Nachdem Sie die Antwort des Modells gesehen haben, Wenn Sie herausfinden, wie Sie .shift ()
verwenden Es sollte sein
P-042: Aggregieren Sie den Verkaufsbetrag (Betrag) des Belegdetail-Datenrahmens (df_receipt) für jedes Datum (sales_ymd) und kombinieren Sie die Daten von vor 1 Tag, 2 Tagen und 3 Tagen mit den Daten jedes Datums. Es sollten nur 10 Ergebnisse angezeigt werden.
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)
'''Musterantwort'''
#Codebeispiel 2:Horizontaler Haltekoffer
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)
Zuerst habe ich versucht, vier Tabellen gleichzeitig zu verbinden, ohne eine for-Anweisung zu verwenden, aber anscheinend kann pd.merge ()
nur zwei verbinden
Referenz
Also machte ich eine Quelle und drehte sie mit einem for-Satz um.
Persönlich war es heutzutage die unterhaltsamste Datenmanipulation
Übrigens scheinen sich die Daten mit .shift (0)
nicht zu ändern.
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')
Ich wollte so schreiben
P-043: Verkaufsübersichtsdatenrahmen (df_sales_summary), der den Belegdetaildatenrahmen (df_receipt) und den Kundendatenrahmen (df_customer) kombiniert und den Verkaufsbetrag (Betrag) für jedes Geschlecht (Geschlecht) und Alter (berechnet aus dem Alter) summiert. ). Das Geschlecht ist 0 für Männer, 1 für Frauen und 9 für Unbekannte. Die Artikelzusammensetzung sollte jedoch vier Artikel umfassen: Alter, Verkaufsbetrag für Frauen, Verkaufsbetrag für Männer und Verkaufsbetrag für unbekanntes Geschlecht (Kreuztabelle von Alter vertikal und Geschlecht horizontal). Außerdem sollte die Altersgruppe alle 10 Jahre alt sein.
Das nächste Problem ist
Ich habe die Bühne betreten
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
'''Musterantwort'''
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
Wenn Sie die Modellantwort denken und sehen, teilen Sie sie nicht in Behälter auf
.apply(lambda x: math.floor(x / 10) * 10)
Wird es durch 10 geteilt (in einen ganzzahligen Typ konvertiert) und mit 10 multipliziert?
Ich weiß nicht, wie man Lambda benutzt.
Und es ist ein Pivot-Tisch ... ich verstehe. Ist es möglich, es so zu benutzen ...
Ich werde die Pivot-Tabelle studieren (
P-044: Der in der vorherigen Frage erstellte Datenrahmen für die Verkaufszusammenfassung (df_sales_summary) war ein Side-by-Side-Verkauf des Geschlechts. Lassen Sie uns das Geschlecht vertikal aus diesem Datenrahmen heraushalten und es in drei Elemente konvertieren: Alter, Geschlechtscode und Verkaufsbetrag. Der Geschlechtscode lautet jedoch "00" für Männer, "01" für Frauen und "99" für Unbekannte.
Da dies ein kontinuierliches Problem ist, wird das zuletzt zusammengefasste df unverändert verwendet. Da es bedeutet, es in vertikales Halten zu ändern, habe ich den df in drei Teile geteilt und vertikal angeordnet. Oder besser gesagt, ich habe beim letzten Mal die vertikale in die horizontale geändert, sodass das Gegenteil einfach war ...
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
'''Musterantwort'''
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'})
Die Musterantwort wird mit einem sehr langen Satz beendet.
Haben Sie setindex () verwendet, um die chronologische Spalte im Index zu speichern und alle Spalten zu vereinheitlichen?
Ich finde es erstaunlich, dass Sie den Namen sofort mit .replace ()
ändern können. Ich möchte es definitiv meistern
Auf jeden Fall ist es sehr lehrreich, weil es immer mehr Möglichkeiten gibt, die sich von meinen unterscheiden.
Vielen Dank an diejenigen, die immer stecken bleiben. Wenn es Personen gibt, die ihren Fortschritt sehen können, anstatt einzelne Artikel zu registrieren, senden wir Ihnen jedes Mal eine Aktualisierungsbenachrichtigung, wenn Sie die Tabelle von Teil1 aktualisieren. Wenn Sie also Teil1 auf Lager haben, ohne alle Artikel auf Lager zu haben, können Sie Ihren Fortschritt sehen, sodass ich denke, dass Sie sich nicht darum kümmern müssen. (Ich glaube nur)
Ich möchte allen danken, die es immer gesehen haben, diesmal zum ersten Mal, und allen. Vielen Dank für das Surfen.
Recommended Posts