Extrahieren Sie nur Python für die Vorverarbeitung

Ich habe jedes Mal im Github-Code des Autors herumgewandert, also werde ich ihn zur sofortigen Verwendung zusammenstellen.

Frühere Geschichte

[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.

Daten gelesen

#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')

Typbestätigung / Konvertierung

#Bestätigung
reserve_tb.dtypes
print(type(reserve_tb))

#Umwandlung
reserve_tb['people_num'] = reserve_tb['people_num'].astype('float64')

Säulenextraktion

#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']]

Spalte löschen

#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)

Extraktion von Zeilen durch Angabe von Bedingungen

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)]

Probenahme

# reserve_tb bis 50%Probenahme
reserve_tb.sample(frac=0.5)

Anhäufung

 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

Anwenden von Aggregatfunktionen [max / min / mean / median / perzentile]

#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']

Dispersion, Standardabweichung

# 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)

Berechnung des häufigsten Wertes (Modusfunktion)

#Berechnen Sie nach dem Runden mit der Rundungsfunktion den häufigsten Wert mit der Modusfunktion
reserve_tb['total_price'].round(-3).mode()

Rangfunktion

#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')

Zusammenführen: Zusammenführen

#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')

So schreiben Sie einen Wert neu, der dem Zustand einer bestimmten Spalte in Pandas DataFrame entspricht

  1. Verwenden Sie die loc-Funktion. df.loc [df ['A'] <0, 'A'] = -100
  2. Verwenden Sie die Where-Funktion. Beachten Sie, dass es sich von der Where-Funktion von Numpy unterscheidet! Wenn es nicht übereinstimmt, wird es ersetzt.
  3. Verwenden Sie die Replae-Funktion. Wenn eine Bedingung ausreicht (kontinuierlicher Wertebereich kann nicht angegeben werden)

Zeitreihenverschiebung verbinden: Verschiebung

#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))

Hinweis: Python ist nicht für die Fensterfunktion geeignet

Datenpartition zur Modellüberprüfung in Zeitreihendaten

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

Numerische Umrechnung

#Funktion anwenden
reserve_tb['total_price_log'] = \
  reserve_tb['total_price'].apply(lambda x: np.log(x / 1000 + 1)) 

Entfernung von Ausreißern

#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()

Datumstyp (unvermeidlich in der Zeitreihenanalyse)

#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

Umrechnung in Jahr / Monat / Tag / Stunde / Minute / Sekunde / Tag

# 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')

Holen Sie sich Datums- und Zeitunterschied

# 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

Zunahme / Abnahme des Datumstyps

#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)

Umrechnung in die Saison: Definieren Sie eine Umrechnungsfunktion und wenden Sie diese an.

# 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']
)

Referenz

https://pandas.pydata.org/docs/user_guide/timedeltas.html

Recommended Posts

Extrahieren Sie nur Python für die Vorverarbeitung
2016-10-30 sonst für Python3> für:
Python [für mich]
Dart-Grammatik für diejenigen, die nur Python kennen
Über Python für Schleife
Python-Grundlagen ② für Anweisung
Feature-Vorverarbeitung für die Modellierung
Über Python für ~ (Bereich)
Python Lehrbuch für Anfänger
Refactoring-Tools, die mit Python verwendet werden können
Toolchain für Python für Android
OpenCV für Python-Anfänger
Installieren Sie Python (für Windows)
[Python] für Anweisungsfehler
Wartung der Python-Umgebung für Projekte
Zusammenfassung der Vorverarbeitungsmethoden für Python-Anfänger (Pandas-Datenrahmen)
[Python] Extrahieren Sie nur Zahlen aus Listen und Zeichenfolgen
Extrahieren Sie nur Elemente, die bestimmte Bedingungen in Python erfüllen
Python-Memo (für mich): Array
Fabric unterstützt Python 3
Python für die Datenanalyse Kapitel 4
Lernablauf für Python-Anfänger
Installationsverfahren für Python 3.6 [für Windows]
BigQuery-Integration für Python-Benutzer
Pipeline-Vorlage für DataLiner vorverarbeiten
Python-Lernplan für KI-Lernen
Für Mac einrichten (Python)
Python Tkinter Memo (für mich)
Persönliches Python-Code-Memo
Aufbau einer Python-Umgebung für Mac
Techniken zum Sortieren in Python
Python3-Umgebungskonstruktion (für Anfänger)
Roadmap zum Veröffentlichen von Python-Paketen
Installation der Python 3-Serie für Mac
Python #Funktion 2 für Super-Anfänger
Python-Vorlage für Codeforces-manuelle Test-
Grundlegende Python-Grammatik für Anfänger
Notizen für 3 Monate, seit ich Python gestartet habe
Qt für Python App Selbstaktualisierung
Python für die Datenanalyse Kapitel 2
100 Pandas klopfen für Python-Anfänger
Checkios Empfehlung zum Erlernen von Python
Schlüsselwortargumente für Python-Funktionen
[Zum Organisieren] Python-Entwicklungsumgebung
[Python] Beispielcode für die Python-Grammatik
[Python / PyQ] 4. Liste zur Anweisung
Einfacher HTTP-Server für Python
[Python + Selen] Tipps zum Scraping
Python #Liste für Super-Anfänger
~ Tipps für Python-Anfänger mit Liebe von Pythonista ③ ~
Einrückungsformatierung von Python-Skripten
Einführung in Python For, While
Über "für _ in range ():" von Python
tesseract-OCR für Python [japanische Version]
[Python] Iterative Verarbeitung (für, während)
Python für die Datenanalyse Kapitel 3
Installieren Sie dlib für Python (Windows)