In [1]:
# Pandas und Numpy importieren
import pandas as pd
pd.set_option('display.float_format', lambda x: '%.3f' % x)

import numpy as np

# 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
In [2]:
df = pd.read_csv('train_dt.csv')
In [3]:
df.head()
Out[3]:
fare_amount pickup_datetime pickup_longitude pickup_latitude dropoff_longitude dropoff_latitude passenger_count
0 4.500 2009-06-15 17:26:21+00:00 -73.844 40.721 -73.842 40.712 1
1 16.900 2010-01-05 16:52:16+00:00 -74.016 40.711 -73.979 40.782 1
2 5.700 2011-08-18 00:35:00+00:00 -73.983 40.761 -73.991 40.751 2
3 7.700 2012-04-21 04:30:42+00:00 -73.987 40.733 -73.992 40.758 1
4 5.300 2010-03-09 07:51:00+00:00 -73.968 40.768 -73.957 40.784 1
In [4]:
df.dtypes.sort_values()
Out[4]:
passenger_count        int64
fare_amount          float64
pickup_longitude     float64
pickup_latitude      float64
dropoff_longitude    float64
dropoff_latitude     float64
pickup_datetime       object
dtype: object
In [5]:
# pickup_datetime in Format datetime umwandeln
df['pickup_datetime']= pd.to_datetime(df.pickup_datetime)
In [6]:
df.dtypes
Out[6]:
fare_amount                      float64
pickup_datetime      datetime64[ns, UTC]
pickup_longitude                 float64
pickup_latitude                  float64
dropoff_longitude                float64
dropoff_latitude                 float64
passenger_count                    int64
dtype: object
In [7]:
df.describe()
Out[7]:
fare_amount pickup_longitude pickup_latitude dropoff_longitude dropoff_latitude passenger_count
count 5000000.000 5000000.000 5000000.000 4999964.000 4999964.000 5000000.000
mean 11.341 -72.507 39.920 -72.507 39.917 1.685
std 9.820 12.810 8.964 12.848 9.487 1.332
min -100.000 -3426.609 -3488.080 -3412.653 -3488.080 0.000
25% 6.000 -73.992 40.735 -73.991 40.734 1.000
50% 8.500 -73.982 40.753 -73.980 40.753 1.000
75% 12.500 -73.967 40.767 -73.964 40.768 2.000
max 1273.310 3439.426 3310.364 3457.622 3345.917 208.000

Der miminale Preis für eine Fahrt ist negativ. Da der Mindestpreis bei 2,5 $ liegt und man sicher nie Geld vom Fahrer bekommt, werden alle fare_amount unter 2,5 entfernt.

In [8]:
# Nur fare_amount über 2,50 behalten, da dies der Mindesbetrg für eine Fahrt ist
df = df.loc[df.fare_amount > 2.5]

Auch bei den Längen- und Breitengraden gibt es fehlerhafte Ausreißer

In [9]:
# Nur Latitudes und Longitues in der Gegend behalten
df = df.loc[df['pickup_latitude'].between(40, 42)]
df = df.loc[df['pickup_longitude'].between(-75, -72)]
df = df.loc[df['dropoff_latitude'].between(40, 42)]
df = df.loc[df['dropoff_longitude'].between(-75, -72)]

Da es in fünf Millionen Fahrten nur drei mit der Anzahl der Passagiere über 10 gab, werden diese als Ausreißer entfernt.

In [10]:
df.loc[df.passenger_count > 10]
Out[10]:
fare_amount pickup_datetime pickup_longitude pickup_latitude dropoff_longitude dropoff_latitude passenger_count
3107489 2.700 2009-05-12 14:50:00+00:00 -73.938 40.758 -73.938 40.758 208
3323791 8.500 2011-08-27 01:24:00+00:00 -73.988 40.760 -74.001 40.752 129
4432483 11.100 2009-05-11 13:56:00+00:00 -73.938 40.758 -73.938 40.758 208
In [11]:
df = df.loc[df.passenger_count < 10]
In [13]:
# Fehlende Werte
missing = pd.DataFrame(df.isnull().sum()).rename(columns = {0: 'total'})
missing['percent'] = missing['total'] / len(df)*100
missing.sort_values('percent', ascending = False).head()
Out[13]:
total percent
fare_amount 0 0.000
pickup_datetime 0 0.000
pickup_longitude 0 0.000
pickup_latitude 0 0.000
dropoff_longitude 0 0.000
In [14]:
df.shape
Out[14]:
(4876393, 7)
In [15]:
# Bereinigten Datensatz speichern
#df.to_csv('train_dt_clean.csv', index= False)