Ich habe jedes Mal im Github-Code des Autors herumgewandert, also werde ich ihn zur sofortigen Verwendung zusammenstellen.
[Vollständige Vorverarbeitung [SQL / R / Python-Übungstechnik für die Datenanalyse]](https://www.amazon.co.jp/%E5%89%8D%E5%87%A6%E7%90%86] % E5% A4% A7% E5% 85% A8% EF% BC% BB% E3% 83% 87% E3% 83% BC% E3% 82% BF% E5% 88% 86% E6% 9E% 90% E3 % 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AESQL-R-Python% E5% AE% 9F% E8% B7% B5% E3% 83% 86% E3% 82% AF % E3% 83% 8B% E3% 83% 83% E3% 82% AF% EF% BC% BD-% E6% 9C% AC% E6% A9% 8B-% E6% 99% BA% E5% 85% 89 -ebook / dp / B07C3JFK3V)
https://github.com/ghmagazine/awesomebook
Extrahieren Sie den Python-Teil aus dem Github unten. Ausführliche Erklärungen finden Sie im Buch.
Darüber hinaus sind diese Quellcodes lizenziert gemäß den BSD 3-Bedingungen.
BSD 3-Clause License
Copyright (c) 2018, Tomomitsu Motohashi All rights reserved.
#Aus der Bibliothek lesen
from preprocess.load_data.data_loader import load_hotel_reserve
customer_tb, hotel_tb, reserve_tb = load_hotel_reserve()
#Lesen Sie aus CSV
reserve_tb = pd.read_csv('./data/reserve.csv', encoding='UTF-8')
#Bestätigung
reserve_tb.dtypes
print(type(reserve_tb))
#Umwandlung
reserve_tb['people_num'] = reserve_tb['people_num'].astype('float64')
#Zeile nach iloc-Funktion/Vermeiden Sie es, in der Spalte "Nummer" anzugeben, da dies eine Brutstätte für Fehler sein wird.
#KFold verwendet jedoch iloc.
reserve_tb[['reserve_id','hotel_id','customer_id','reserve_datetime','checkin_date','checkin_time','checkout_date']]
reserve_tb.loc[:, ['reserve_id','hotel_id','customer_id','reserve_datetime','checkin_date','checkin_time','checkout_date']]
#Geben Sie das Löschen der Spalte an, indem Sie die Achse auf 1 setzen
#Reservieren Sie, indem Sie inplace als True angeben_Geben Sie tb rewrite an
reserve_tb.drop(['people_num', 'total_price'], axis=1, inplace=True)
reserve_tb.query('"2016-10-13" <= checkout_date <= "2016-10-14"')
#Beim Verbinden von Bedingungen mit und&
#Beim Verbinden von Bedingungen mit oder|
# @var_Wie Name@Sie können die Variablen in Pythons Speicher verwenden, indem Sie den Variablennamen schreiben, auf den Sie später verweisen möchten.
#Die Abfragefunktion wird in nicht unterstützt.
#Abtasten der Kunden-ID und Extrahieren der Transaktion (Reservierung) entsprechend der extrahierten Kunden-ID
# reserve_tb['customer_id'].unique()Ist ein Kunde, der Doppelarbeit beseitigt_Gibt die ID zurück
#Pandas zur Verwendung der Beispielfunktion.Series(Listenobjekt von Pandas)Umstellung auf
#Musterkunden-ID mit Musterfunktion
target = pd.Series(reserve_tb['customer_id'].unique()).sample(frac=0.5)
#Durch die isin-Funktion, Kunde_Extrahieren Sie Zeilen, deren ID mit einer der abgetasteten Kunden-IDs übereinstimmt
reserve_tb[reserve_tb['customer_id'].isin(target)]
# reserve_tb bis 50%Probenahme
reserve_tb.sample(frac=0.5)
hotel_Wenn Sie die Aggregationsverarbeitung für jede ID durchführen möchten. Kunde_Wenn Sie für jede ID eine eindeutige Zählverarbeitung durchführen möchten
#Verwenden Sie die Funktion agg, um die Gesamtverarbeitung gemeinsam festzulegen
# reserve_Zählfunktion für ID anwenden
# customer_Wenden Sie die Nunique-Funktion für id an
result = reserve_tb \
.groupby('hotel_id') \
.agg({'reserve_id': 'count', 'customer_id': 'nunique'})
# reset_Ersetzen Sie die Spaltennummer durch die Indexfunktion=Richtig, also Ergebnis direkt aktualisieren)
result.reset_index(inplace=True)
result.columns = ['hotel_id', 'rsv_cnt', 'cus_cnt']
#Referenz
#Was ich tun möchte: reservieren_ID und Kunde_Die Anzahl der Datensätze, in denen beide IDs dupliziert werden['dup']In einer Spalte speichern.
#Wenn Sie die Anzahl der doppelten Zeilen am Ende eines Datenrahmens hinzufügen möchten. verwandeln('count')Verwenden
reserve_tb['dup'] = reserve_tb.groupby(['reserve_id','customer_id']).transform('count')
#Wenn es nur einen Aggregationsprozess gibt, ist das Schreiben ohne Verwendung der Agg-Funktion einfacher.
#Hotel mit Gesamteinheit_ID und Leute_Geben Sie eine Kombination aus num
#Summe aus den aggregierten Daten_Berechnen Sie den Gesamtumsatz, indem Sie den Preis herausnehmen und auf die Summenfunktion anwenden
result = reserve_tb \
.groupby(['hotel_id', 'people_num'])['total_price'] \
.sum().reset_index()
#Der Spaltenname des Gesamtumsatzes ist total_Da es Preis ist, Preis_Wechseln Sie zu Summe
result.rename(columns={'total_price': 'price_sum'}, inplace=True)
groupby-> agg combo
#Geben Sie in der Funktion agg den Aggregationsprozess des prozentualen Kachelwerts in der Zeichenfolge an(q=20 Dinge)Da dies nicht möglich ist, wird es mit dem Lambda-Ausdruck angegeben.
# total_max für den Preis/min/mean/Medianfunktion anwenden
#Geben Sie den Python-Lambda-Ausdruck für die Aggregationsverarbeitung der Agg-Funktion an
#Numpy für Lambda-Ausdruck.Geben Sie das Perzentil an und berechnen Sie den prozentualen Kachelwert (Prozent ist 20).
result = reserve_tb \
.groupby('hotel_id') \
.agg({'total_price': ['max', 'min', 'mean', 'median',
lambda x: np.percentile(x, q=20)]}) \
.reset_index()
result.columns = ['hotel_id', 'price_max', 'price_min', 'price_mean',
'price_median', 'price_20per']
# total_Wenden Sie die Var-Funktion und die Standardfunktion auf den Preis an, um den Dispersionswert und den Standardabweichungswert zu berechnen
result = reserve_tb \
.groupby('hotel_id') \
.agg({'total_price': ['var', 'std']}).reset_index()
result.columns = ['hotel_id', 'price_var', 'price_std']
#Wenn die Anzahl der Daten 1 ist, sind der Dispersionswert und der Standardabweichungswert na. Ersetzen Sie sie daher durch 0.
#Der zu ersetzende Bereich sind alle NAs im DataFrame. Achten Sie daher darauf, keine irrelevanten Werte zu ersetzen.
result.fillna(0, inplace=True)
#Berechnen Sie nach dem Runden mit der Rundungsfunktion den häufigsten Wert mit der Modusfunktion
reserve_tb['total_price'].round(-3).mode()
#Konvertieren Sie den Datentyp von einer Zeichenfolge in einen Zeitstempeltyp, um nach Rangfunktion zu sortieren
#(Erläuterung in "Kapitel 10 Datums- und Uhrzeittyp")
reserve_tb['reserve_datetime'] = pd.to_datetime(
reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S'
)
# log_Fügen Sie no als neue Spalte hinzu
#Geben Sie an, dass die Aggregationseinheit eine Gruppe ist_Verwendung durch
#Vom Kunden organisierte Reserve_Generieren Sie datetime und generieren Sie eine Rang-für-Rang-Funktion
#Stellen Sie in aufsteigender Reihenfolge ein, indem Sie aufsteigend auf True setzen(Wenn False, in absteigender Reihenfolge einstellen)
reserve_tb['log_no'] = reserve_tb \
.groupby('customer_id')['reserve_datetime'] \
.rank(ascending=True, method='first')
#Machen Sie die Daten vor dem Join-Prozess so klein wie möglich
pd.merge(reserve_tb.query('people_num == 1'),
hotel_tb.query('is_business'),
on='hotel_id', how='inner')
#Wenn Sie n Zeilen verschieben und kombinieren möchten (fügen Sie vergangene Daten zur Feature-Menge hinzu usw.)
#Schaltfunktion:Eine Funktion, die Daten in n Zeilen nach oben und unten verschieben kann
#Reservieren Sie für jeden Kunden_Nach Datum / Uhrzeit sortieren
#Sortieren Sie nach Gruppe, indem Sie die Apply-Funktion nach der Groupby-Funktion anwenden
# sort_Sortieren Sie die Daten mit der Wertefunktion, sortieren Sie die Zeilen, wenn die Achse 0 ist, und die Spalten, wenn die Achse 1 ist
result = reserve_tb \
.groupby('customer_id') \
.apply(lambda group:
group.sort_values(by='reserve_datetime', axis=0, inplace=False))
#Ergebnis ist bereits Kunde_Gruppiert nach ID
#Zwei vorherige Summe für jeden Kunden_Preis vor_Als Preis sparen
#Die Verschiebungsfunktion ist eine Funktion, die die Datenzeile um die Anzahl der Argumente von Perioden nach unten verschiebt.
result['before_price'] = \
pd.Series(result['total_price'].shift(periods=2))
from preprocess.load_data.data_loader import load_monthly_index
monthly_index_tb = load_monthly_index()
#Dieses Buch beginnt in der folgenden Zeile
# train_window_Geben Sie die Startzeilennummer der ersten Trainingsdaten beim Start an
train_window_start = 1
# train_window_Geben Sie die Endzeilennummer der ersten Trainingsdaten am Ende an
train_window_end = 24
#Geben Sie die Anzahl der Überprüfungsdaten im Horizont an
horizon = 12
#Legen Sie die Anzahl der zu überspringenden Daten fest
skip = 12
#Sortieren Sie die Daten nach Jahr / Monat
monthly_index_tb.sort_values(by='year_month')
while True:
#Berechnen Sie die Endzeilennummer der Verifizierungsdaten
test_window_end = train_window_end + horizon
#Holen Sie sich Trainingsdaten aus den Originaldaten, indem Sie die Zeilennummer angeben
# train_window_Wenn Sie den Startteil auf 1 festlegen, können Sie zur Überprüfung wechseln, die die Trainingsdaten erhöht
train = monthly_index_tb[train_window_start:train_window_end]
#Erhalten Sie Validierungsdaten aus den Originaldaten, indem Sie die Zeilennummer angeben
test = monthly_index_tb[(train_window_end + 1):test_window_end]
#Stellen Sie fest, ob die Endzeilennummer der Überprüfungsdaten größer oder gleich der Anzahl der Zeilen in den Originaldaten ist
if test_window_end >= len(monthly_index_tb.index):
#Beenden Sie, wenn alle Daten als Ziel ausgewählt wurden
break
#Schieben Sie die Daten
train_window_start += skip
train_window_end += skip
#Fassen Sie die Ergebnisse des Kreuztests zusammen
#Funktion anwenden
reserve_tb['total_price_log'] = \
reserve_tb['total_price'].apply(lambda x: np.log(x / 1000 + 1))
#Es gibt kein Paket, das die wichtigsten Methoden zusammenfasst. Sie müssen es selbst implementieren
reserve_tb = reserve_tb[
(abs(reserve_tb['total_price'] - np.mean(reserve_tb['total_price'])) /
np.std(reserve_tb['total_price']) <= 3)
].reset_index()
#Datetime64 als Datumstyp[D]Sie können auch den Typ angeben, jedoch datetime64[ns]Ab datetime64[D]Weil es viele Unannehmlichkeiten gibt, wie zum Beispiel, dass man nicht konvertieren kann
# datetime64[ns]Es ist bequemer, das Datums- und Uhrzeitelement nach der Konvertierung in einen Typ zu extrahieren.
# to_Mit der datetime-Funktion datetime64[ns]In Typ konvertieren
pd.to_datetime(reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S')
pd.to_datetime(reserve_tb['checkin_date'] + reserve_tb['checkin_time'],
format='%Y-%m-%d%H:%M:%S')
# datetime64[ns]Datumsinformationen vom Typ abrufen
pd.to_datetime(reserve_tb['reserve_datetime'],
format='%Y-%m-%d %H:%M:%S').dt.date
pd.to_datetime(reserve_tb['checkin_date'], format='%Y-%m-%d').dt.date
# reserve_datetime bis datetime64[ns]In Typ konvertieren
reserve_tb['reserve_datetime'] = \
pd.to_datetime(reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S')
#Holen Sie sich das Jahr
reserve_tb['reserve_datetime'].dt.year
#Holen Sie sich den Monat
reserve_tb['reserve_datetime'].dt.month
#Holen Sie sich den Tag
reserve_tb['reserve_datetime'].dt.day
#Tag (0)=Zahlenwert erhalten am Sonntag, 1 = Montag)
reserve_tb['reserve_datetime'].dt.dayofweek
#Holen Sie sich die Zeit der Zeit
reserve_tb['reserve_datetime'].dt.hour
#Holen Sie sich die Minuten der Stunde
reserve_tb['reserve_datetime'].dt.minute
#Holen Sie sich die Sekunden der Zeit
reserve_tb['reserve_datetime'].dt.second
#In eine Zeichenfolge im angegebenen Format konvertieren
reserve_tb['reserve_datetime'].dt.strftime('%Y-%m-%d %H:%M:%S')
# datetime64[ns]Subtraktion zwischen Typen
# reserve_datetime bis datetime64[ns]In Typ konvertieren
reserve_tb['reserve_datetime'] = \
pd.to_datetime(reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S')
# checkin_datetime bis datetime64[ns]In Typ konvertieren
reserve_tb['checkin_datetime'] = \
pd.to_datetime(reserve_tb['checkin_date'] + reserve_tb['checkin_time'],
format='%Y-%m-%d%H:%M:%S')
#Jahresdifferenz berechnen (Datums- und Zeitelemente unter dem Monat nicht berücksichtigen)
reserve_tb['reserve_datetime'].dt.year - \
reserve_tb['checkin_datetime'].dt.year
#Monatsdifferenz abrufen (Datums- und Zeitelemente nicht kleiner als Tag berücksichtigen)
(reserve_tb['reserve_datetime'].dt.year * 12 +
reserve_tb['reserve_datetime'].dt.month) \
- (reserve_tb['checkin_datetime'].dt.year * 12 +
reserve_tb['checkin_datetime'].dt.month)
#Berechnen Sie die Differenz täglich
(reserve_tb['reserve_datetime'] - reserve_tb['checkin_datetime']) \
.astype('timedelta64[D]')
#Berechnen Sie die Differenz stündlich
(reserve_tb['reserve_datetime'] - reserve_tb['checkin_datetime']) \
.astype('timedelta64[h]')
#Berechnen Sie die Differenz in Minuten
(reserve_tb['reserve_datetime'] - reserve_tb['checkin_datetime']) \
.astype('timedelta64[m]')
#Berechnen Sie die Differenz in Sekunden
(reserve_tb['reserve_datetime'] - reserve_tb['checkin_datetime']) \
.astype('timedelta64[s]')
#Memo
# timedelta64[D/h/m/s]Tagesunterschied nach Typ/Zeit/Protokoll/Bei der Konvertierung in Sekunden wird das Ergebnis nach dem Dezimalpunkt "aufgerundet" (im Gegensatz zu SQL und R).
#Wenn die Differenz beispielsweise 2 Tage und 3 Stunden beträgt und Sie auf täglich umrechnen, 3(Tag)Ist zurück gekommen
# ???
#Selbst wenn Sie sich die Pandas-Site ansehen, sieht es so aus, als wäre sie abgeschnitten worden.
# https://pandas.pydata.org/docs/user_guide/timedeltas.html
#Laden Sie die datetime-Bibliothek für timedelta
import datetime
# reserve_datetime bis datetime64[ns]In Typ konvertieren
reserve_tb['reserve_datetime'] = \
pd.to_datetime(reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S')
# reserve_Datum aus Datum / Uhrzeit extrahieren
reserve_tb['reserve_date'] = reserve_tb['reserve_datetime'].dt.date
# reserve_Fügen Sie der Datumszeit 1 Tag hinzu
reserve_tb['reserve_datetime'] + datetime.timedelta(days=1)
# reserve_Fügen Sie bisher 1 Tag hinzu
reserve_tb['reserve_date'] + datetime.timedelta(days=1)
# reserve_Fügen Sie der Datumszeit 1 Stunde hinzu
reserve_tb['reserve_datetime'] + datetime.timedelta(hours=1)
# reserve_Fügen Sie der Datumszeit 1 Minute hinzu
reserve_tb['reserve_datetime'] + datetime.timedelta(minutes=1)
# reserve_Fügen Sie der Datumszeit 1 Sekunde hinzu
reserve_tb['reserve_datetime'] + datetime.timedelta(seconds=1)
# reserve_datetime bis datetime64[ns]In Typ konvertieren
reserve_tb['reserve_datetime'] = pd.to_datetime(
reserve_tb['reserve_datetime'], format='%Y-%m-%d %H:%M:%S'
)
#Funktion zum Konvertieren von Monatszahlen in Jahreszeiten
def to_season(month_num):
season = 'winter'
if 3 <= month_num <= 5:
season = 'spring'
elif 6 <= month_num <= 8:
season = 'summer'
elif 9 <= month_num <= 11:
season = 'autumn'
return season
#In Saison umwandeln
reserve_tb['reserve_season'] = pd.Categorical(
reserve_tb['reserve_datetime'].dt.month.apply(to_season),
categories=['spring', 'summer', 'autumn', 'winter']
)
https://pandas.pydata.org/docs/user_guide/timedeltas.html
Recommended Posts