# Pandas und Numpy importieren
import pandas as pd
import numpy as np
# Visualisierungen
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
plt.style.use('Solarize_Light2')
# Karten
import folium
# Interface zum System
import os
os.chdir('D:\Data\Projects\Regression\Taxi Fare Prediction_Linear Regression')
# Datum und Zeit
import datetime as dt
from datetime import datetime
data = pd.read_csv('train_dt_clean.csv')
data.tail()
data.dtypes
# pickup_datetime in Format datetime umwandeln
data['pickup_datetime']= pd.to_datetime(data.pickup_datetime)
data.dtypes
data.describe()
# Verteilung des Targets mit Matplotlib Histogramm
plt.hist(data.fare_amount, color = 'blue', edgecolor = 'black', bins = 100);
# Fares log
#data['log10_fare'] = np.log10(data['fare_amount'])
# Graph der Fares auf Log Skala
#plt.hist(data.log10_fare, color = 'blue', edgecolor = 'black', bins = 50);
# ohne neue Spalte
logs = np.log10(data['fare_amount'])
plt.figure(figsize = (10, 8))
plt.hist(logs, color = 'red', edgecolor = 'white', bins = 50);
# Die ersten 1000 Pickup und Dropoff Orte auf Karte visualisieren mit Folium
df= data[:1000]
m = folium.Map(location = [40.75,-74], tiles='CartoDB dark_matter', zoom_start=11)
for i, row in df.iterrows():
folium.Circle(location = [row['pickup_latitude'], row['pickup_longitude']], radius=[row['fare_amount']]).add_to(m)
for i, row in df.iterrows():
folium.Circle(location = [row['dropoff_latitude'], row['dropoff_longitude']], radius=[row['fare_amount']], color='red').add_to(m)
m
# Ist der Preis abhängig von der Anzahl der Fahrtgäste?
sns.lmplot(x='passenger_count', y= 'fare_amount', data= df);
Um Trends in einem Time Series sichtbar zu machen, kann es sinnvoll sein, aus einer Zeit und Datum- Spalte Informationen zu extrahieren.
# Features aus datetime
data['year'] = data.pickup_datetime.dt.year
data['month'] = data.pickup_datetime.dt.month
data['day'] = data.pickup_datetime.dt.day
data['hour'] = data.pickup_datetime.dt.hour
data['minute'] = data.pickup_datetime.dt.minute
data.year.value_counts()
# Neues Feature: Streckenlänge mit haversine (nur relativ, da es keine genaue Distanz ist)
import haversine
data["dist"] = data.apply(lambda row : haversine.haversine((row["pickup_latitude"], row["pickup_longitude"]),
(row["dropoff_latitude"], row["dropoff_longitude"])), axis=1)
data.corr()['fare_amount']
corrs = data.corr()['fare_amount']
corrs = abs(corrs)
corrs = corrs.sort_values(ascending=False)[1:]
plt.figure(figsize = (10, 8))
sns.barplot(y=corrs.index, x=corrs.values, palette="Greens_d", orient='h');
plt.title('Korrelation der Variablen mit dem Fahrpreis');
corrs = data.corr()
plt.rcParams['font.size'] = 12
plt.figure(figsize = (12, 12))
sns.heatmap(corrs, annot = True, vmin = -1, vmax = 1, fmt = '.3f');
# neues Feature: Uhrzeiten zu denen die meisten Pickups sind, könnten Stauzeiten sein, längere Fahrt teurer?
df = data.loc[data.year == 2015]
df.groupby('hour').size().plot.bar(color = 'b');
# die meisten Pickups gibt es um 19h
hour_fare= df.groupby('hour')['fare_amount'].mean()
hour_dist= df.groupby('hour')['dist'].mean()
hour_fare.plot.bar(color = 'b');
hour_dist.plot.bar(color = 'b');
# Nachts werden für längere stecken Taxis genommen, daher ist es teurer. die Uhrzeit macht weniger aus.
#data.to_csv('train_clean_features.csv', sep=',', encoding='utf-8', index=False)