[PYTHON] Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil8

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]

41st

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

  1. Erstellen Sie eine Tabelle in Form von df_Y [Datum (einen Tag später), aggregiert]
  2. Führen Sie die Daten zusammen, um die Daten zu erstellen [Datum, Aggregat, Aggregat (vor 1 Tag)]
  3. Fügen Sie eine Spalte mit aggregierten Unterschieden hinzu

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

42 ..

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

43 ..

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

  1. Erstellen Sie eine Spalte "Alter"
  2. Geben Sie 2 Elemente mit ".groupby" an
  3. Machen Sie es in Form einer Kreuztabelle

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 (

44

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

Bis hierher für diese Zeit

Auf jeden Fall ist es sehr lehrreich, weil es immer mehr Möglichkeiten gibt, die sich von meinen unterscheiden.

Nutzen Sie diese Gelegenheit

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

Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil5
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil10
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil8
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil3
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil6
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil2
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil1
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil9
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil7
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil4
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil11
Implementieren von 100 Data Science-Schlägen für Anfänger in Data Science (für Windows 10 Home)
Fordern Sie 100 Data Science-Schläge heraus
Versuchen Sie "100 Schläge auf Data Science" ①
100 Pandas klopfen für Python-Anfänger
Erkennung von Zeitreihendatenanomalien für Anfänger
[Praktisch für Anfänger] Lesen Sie zaggles "Predicting Home Prices" Zeile für Zeile (Teil 1: Lesen von Daten)
[Linux-Befehl] Liste weniger Befehlsoptionen [Muss für Anfänger sein]
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 018 Erläuterung
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 023 Erläuterung
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 030 Erläuterung
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 022 Erläuterung
Verwendung von Datenanalysetools für Anfänger
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 017 Erläuterung
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 026 Erläuterung
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 016 Erläuterung
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 024 Erläuterung
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 027 Erläuterung
Pandas-Grundlagen für Anfänger ② Übersicht über die Daten
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 029 Erläuterung
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 015 Erläuterung
[Python] 100 Schläge auf Data Science (strukturierte Datenverarbeitung) 028 Erläuterung