2017-09-27 46 views
0

我試圖使用下面的代碼來繪製圖形以顯示每小時的速度。處理大量行時的空圖

import pandas as pd 
import datetime 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import style 
style.use('ggplot') 
import glob, os 

taxi_df = pd.read_csv('ChicagoTaxi.csv') 

taxi_df['trip_start_timestamp'] = pd.to_datetime(taxi_df['trip_start_timestamp'], format = '%Y-%m-%d %H:%M:%S', errors = 'raise') 
taxi_df['trip_end_timestamp'] = pd.to_datetime(taxi_df['trip_end_timestamp'], format = '%Y-%m-%d %H:%M:%S', errors = 'raise') 

#For filtering away any zero values when trip_Seconds or trip_miles = 0 
filterZero = taxi_df[(taxi_df.trip_seconds != 0) & (taxi_df.trip_miles != 0)] 
filterZero['trip_seconds'] = filterZero['trip_seconds']/60 
filterZero['trip_seconds'] = filterZero['trip_seconds'].apply(lambda x: round(x,0)) 
filterZero['speed'] = filterZero['trip_miles']/filterZero['trip_seconds'] 
filterZero['speed'] *= 60 

filterZero = filterZero.reset_index(drop=True) 

filterZero.groupby(filterZero['trip_start_timestamp'].dt.strftime('%w'))['speed'].mean().plot() 
plt.xlabel('Day') 
plt.ylabel('Speed(Miles per Minutes)') 
plt.title('Mean Miles per Hour By Days') 
plt.show() #Not working 

實施例的行

0  2016-01-13 06:15:00 8.000000 
1  2016-01-22 09:30:00 10.500000 

小數據集:[1250219行×2列]

大數據集:[15172212行×2列]

對於較小的數據集的代碼完美的作品,並顯示情節。然而,當我試圖使用一個包含1500萬行的數據集時,所顯示的圖是空的,因爲儘管運行mean(),值仍然是「inf」。我在這裏做錯了什麼?

0 inf 
1 inf 
... 
5 inf 
6 inf 

速度是白天「英里每小時」!我正在嘗試所有的時間格式,所以在圖片中有一個不匹配的抱歉。失敗繪圖(大數據集)的

圖片:

enter image description here

成功繪製(更小的數據集)的圖像:

enter image description here

+0

我有點懷疑,該地塊確實是空的。它可能更傾向於繪製的部分位於邊緣或軸線之外。 – ImportanceOfBeingErnest

+0

縮小地段 - 以防萬一 – doctorlove

+0

我用兩張圖顯示了較小和較大的數據集的繪圖更新了問題。 – WhiteSolstice

回答

0

我真的不能肯定,因爲你做沒有提供您的數據集的真實例子,但我很確定您的問題來自trip_seconds列。

看到這兩行:

filterZero['trip_seconds'] = filterZero['trip_seconds']/60 
filterZero['trip_seconds'] = filterZero['trip_seconds'].apply(lambda x: round(x,0)) 

如果一些列trip_seconds你的價值觀都≤30,則這條線將它們四捨五入爲0.0。

filterZero['speed'] = filterZero['trip_miles']/filterZero['trip_seconds'] 

因此,該線路將被填充有一些inf值(如任何/ 0.0 = INF)。以inf值取數組的mean()將不管返回inf

兩件事情要考慮:

  1. 如果您在列trip_seconds值實際上是在幾秒鐘內,然後通過60除以你的價值觀後,他們將在幾分鐘內,這將使你的速度在每英里分鐘,而不是每小時。

  2. 你應該嘗試沒有四捨五入時代

+0

顯然這是真正的問題。謝謝你指出。我從來沒有想過得到零的可能性,因爲熊貓的最小功能顯示爲60。 – WhiteSolstice