【Python】New York City Taxi Trip Duration纽约出租车大数据探索(技术实现过程)

# New York City Taxi Trip Duration纽约出租车大数据探索

# 该项目来源于Kaggle,旨在建模来预测纽约出租车在行程中的总行驶时间。
# 在建模预测的过程中,我们可以顺便探索纽约市民打车出行习惯及其他有效信息。
# kaggle项目链接  https://www.kaggle.com/c/nyc-taxi-trip-duration/overview

# 本文内容结构说明:

# 一、先参考简书帖子《纽约出租车大数据探索》完成一部分探索,帖子没有源代码,所以我会根据帖子思路,自行写出代码。
# 帖子网址 https://www.jianshu.com/p/1da53849a314 

# 二、按照帖子文末提出的可以进一步拓展的探索方向,自行深入探索。

# 三、kaggle比赛目标之预测行程持续时间,另外再开帖子叙述。
# 一、先参照简书帖子

# 帖子的结构为五部分:
# 1、提出问题—2、理解数据——3、数据清理——4、数据分析—5、得出结论


# 1、提出问题(根据已有数据分析)

# (1)何时为打车需求高发期?
# (2)居民夜生活活跃情况?
# (3)城市一天的什么时候最为拥堵?
# (4)什么时间容易接到长途单?

# 2、理解数据(表单说明)

# id - 每次行程的唯一ID
# vendor_id - 行程提供者的ID
# pickup_datetime - 上车的日期和时间
# dropoff_datetime - 停表的日期和时间
# passenger_count - 车辆中的乘客数量(驾驶员输入值)
# pickup_longitude - 上车的经度
# pickup_latitude - 上车的纬度
# dropoff_longitude - 下车经度
# dropoff_latitude - 下车的纬度
# store_and_fwd_flag - 行程记录是否为存储转发(或是直接发送)-- Y =存储和转发 N =没有存储
# trip_duration - 行程持续时间(秒)

# 3、数据清理

# Basic packages
import numpy as np
import pandas as pd

# Viz
import matplotlib.pyplot as plt
import seaborn as sns

# settings
import warnings
warnings.filterwarnings("ignore")
# 导入数据
train=pd.read_csv(r"D:\2018_BigData\Python\Kaggle_learning\New York City Taxi Trip Duration\train.csv")
train.head()
idvendor_idpickup_datetimedropoff_datetimepassenger_countpickup_longitudepickup_latitudedropoff_longitudedropoff_latitudestore_and_fwd_flagtrip_duration
0id287542122016-03-14 17:24:552016-03-14 17:32:301-73.98215540.767937-73.96463040.765602N455
1id237739412016-06-12 00:43:352016-06-12 00:54:381-73.98041540.738564-73.99948140.731152N663
2id385852922016-01-19 11:35:242016-01-19 12:10:481-73.97902740.763939-74.00533340.710087N2124
3id350467322016-04-06 19:32:312016-04-06 19:39:401-74.01004040.719971-74.01226840.706718N429
4id218102822016-03-26 13:30:552016-03-26 13:38:101-73.97305340.793209-73.97292340.782520N435
train.info()

# 从下表看到,数据比较完整。看Kaggle官网也说了,因为是playground项目,所以已经把数据cleaned了。
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1458644 entries, 0 to 1458643
Data columns (total 11 columns):
id                    1458644 non-null object
vendor_id             1458644 non-null int64
pickup_datetime       1458644 non-null object
dropoff_datetime      1458644 non-null object
passenger_count       1458644 non-null int64
pickup_longitude      1458644 non-null float64
pickup_latitude       1458644 non-null float64
dropoff_longitude     1458644 non-null float64
dropoff_latitude      1458644 non-null float64
store_and_fwd_flag    1458644 non-null object
trip_duration         1458644 non-null int64
dtypes: float64(4), int64(3), object(4)
memory usage: 122.4+ MB
train.describe()

# 看下表,全部是科学计数法,影响观察。
vendor_idpassenger_countpickup_longitudepickup_latitudedropoff_longitudedropoff_latitudetrip_duration
count1.458644e+061.458644e+061.458644e+061.458644e+061.458644e+061.458644e+061.458644e+06
mean1.534950e+001.664530e+00-7.397349e+014.075092e+01-7.397342e+014.075180e+019.594923e+02
std4.987772e-011.314242e+007.090186e-023.288119e-027.064327e-023.589056e-025.237432e+03
min1.000000e+000.000000e+00-1.219333e+023.435970e+01-1.219333e+023.218114e+011.000000e+00
25%1.000000e+001.000000e+00-7.399187e+014.073735e+01-7.399133e+014.073588e+013.970000e+02
50%2.000000e+001.000000e+00-7.398174e+014.075410e+01-7.397975e+014.075452e+016.620000e+02
75%2.000000e+002.000000e+00-7.396733e+014.076836e+01-7.396301e+014.076981e+011.075000e+03
max2.000000e+009.000000e+00-6.133553e+015.188108e+01-6.133553e+014.392103e+013.526282e+06
# 尝试不以科学计数法显示。

# np.set_printoptions(suppress=True)
pd.set_option('display.max_columns', None)
train[["passenger_count","trip_duration"]].describe()

# 暂不成功。因为整体数据比较完整,接下来直接可视化分析。
passenger_counttrip_duration
count1.458644e+061.458644e+06
mean1.664530e+009.594923e+02
std1.314242e+005.237432e+03
min0.000000e+001.000000e+00
25%1.000000e+003.970000e+02
50%1.000000e+006.620000e+02
75%2.000000e+001.075000e+03
max9.000000e+003.526282e+06

# 4、 数据分析与可视化

# (1)何时为打车需求高发期?
# (2)居民夜生活活跃情况?
# (3)城市一天的什么时候最为拥堵?
# (4)什么时间容易接到长途单?
# 分析一:何时为打车需求高发期?

import datetime
from datetime import datetime

# dt = train["pickup_datetime"]
# dt = datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
# train["pickup_month"] = dt.month

train.pickup_datetime = train.pickup_datetime.apply(lambda x:datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))
train["pickup_yearmonth"] = train["pickup_datetime"].map(lambda x: 100*x.year + x.month)
train.head(1)

# 另外,年份月份提取也可以用astpye函数,例如[M]转换成月份:参考 df["month"]=df.DealTime.values.astype("datetime64[M]")
# 还可以提取星期几的周信息。
idvendor_idpickup_datetimedropoff_datetimepassenger_countpickup_longitudepickup_latitudedropoff_longitudedropoff_latitudestore_and_fwd_flagtrip_durationpickup_yearmonth
0id287542122016-03-14 17:24:552016-03-14 17:32:301-73.98215540.767937-73.9646340.765602N455201603
train["pickup_yearmonth"].value_counts()

# 只有六个月的时间数据。
201603    256189
201604    251645
201605    248487
201602    238300
201606    234316
201601    229707
Name: pickup_yearmonth, dtype: int64
# 新增月份
# train.drop(["pickup_yearmonth"],axis=1,inplace=True)
train["pickup_month"] = train["pickup_datetime"].map(lambda x: x.month)

# train.dropoff_datetime = train.dropoff_datetime.apply(lambda x:datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))
# train["dropoff_month"] = train["dropoff_datetime"].map(lambda x: x.month)

train.head(1)

# 其实dropoff_month和pickup_month基本一致,如果考虑到效率和内存,可以不用提取dropoff_month。
idvendor_idpickup_datetimedropoff_datetimepassenger_countpickup_longitudepickup_latitudedropoff_longitudedropoff_latitudestore_and_fwd_flagtrip_durationpickup_yearmonthpickup_month
0id287542122016-03-14 17:24:552016-03-14 17:32:301-73.98215540.767937-73.9646340.765602N4552016033
# 新增周标识

# train["week"]=train.pickup_datetime.weekday()
# AttributeError: 'Series' object has no attribute 'datetime'

train["pickup_week"]=train.pickup_datetime.apply(lambda x: x.weekday())
train.head(2)
idvendor_idpickup_datetimedropoff_datetimepassenger_countpickup_longitudepickup_latitudedropoff_longitudedropoff_latitudestore_and_fwd_flagtrip_durationpickup_yearmonthpickup_monthpickup_week
0id287542122016-03-14 17:24:552016-03-14 17:32:301-73.98215540.767937-73.96463040.765602N45520160330
1id237739412016-06-12 00:43:352016-06-12 00:54:381-73.98041540.738564-73.99948140.731152N66320160666
train["pickup_day"]=train.pickup_datetime.apply(lambda x: x.day)
train.head(2)
idvendor_idpickup_datetimedropoff_datetimepassenger_countpickup_longitudepickup_latitudedropoff_longitudedropoff_latitudestore_and_fwd_flagtrip_durationpickup_yearmonthpickup_monthpickup_weekpickup_day
0id287542122016-03-14 17:24:552016-03-14 17:32:301-73.98215540.767937-73.96463040.765602N4552016033014
1id237739412016-06-12 00:43:352016-06-12 00:54:381-73.98041540.738564-73.99948140.731152N6632016066612
# 新增日标识
train["pickup_date"]=train.pickup_datetime.values.astype("datetime64[D]")
train.head(2)
idvendor_idpickup_datetimedropoff_datetimepassenger_countpickup_longitudepickup_latitudedropoff_longitudedropoff_latitudestore_and_fwd_flagtrip_durationpickup_yearmonthpickup_monthpickup_weekpickup_daypickup_date
0id287542122016-03-14 17:24:552016-03-14 17:32:301-73.98215540.767937-73.96463040.765602N45520160330142016-03-14
1id237739412016-06-12 00:43:352016-06-12 00:54:381-73.98041540.738564-73.99948140.731152N66320160666122016-06-12
month_trip=train.groupby(['pickup_month'])["trip_duration"].agg(["sum","mean","count"])
month_trip=month_trip.reset_index() 
month_trip.head(2)
pickup_monthsummeancount
01211875608922.373319229707
12219433897920.830453238300
# 为了直观一些,改列名
month_trip.rename(columns={'sum':'month_sum_trip_dur','mean':'month_avg_trip_dur','count':"month_trip_times"}, inplace = True)
month_trip.head(2)
pickup_monthmonth_sum_trip_durmonth_avg_trip_durmonth_trip_times
01211875608922.373319229707
12219433897920.830453238300
date_trip=train.groupby(['pickup_date'])["trip_duration"].agg(["sum","mean","count"])
date_trip=date_trip.reset_index() 
date_trip.rename(columns={'sum':'date_sum_trip_duration','mean':'date_avg_trip_dur','count':"date_trip_times"}, inplace = True)
date_trip.head()
pickup_datedate_sum_trip_durationdate_avg_trip_durdate_trip_times
02016-01-016593910920.6799787162
12016-01-025470632840.0847676512
22016-01-035874410924.6670866353
32016-01-045723773851.1186626725
42016-01-05104843041455.3448087204
day_trip=train.groupby(['pickup_day'])["trip_duration"].agg(["sum","mean","count"])
day_trip=day_trip.reset_index() 
day_trip.rename(columns={'sum':'day_sum_trip_duration','mean':'day_avg_trip_dur','count':"day_trip_times"}, inplace = True)
day_trip.head()
pickup_dayday_sum_trip_durationday_avg_trip_durday_trip_times
0144656812958.05397846612
1244354937928.86029947752
2346806173976.24722147945
3447050568947.54945149655
45511932131020.27289950176
# plot
plt.figure(figsize=(16,18))

plt.subplot(321)
ax1= plt.plot(month_trip.pickup_month, month_trip.month_trip_times, color="green", alpha=0.8, label='trip times',marker='*')
plt.title("Monthly Trip Times")
plt.ylabel('# of trip times', fontsize=12)
plt.xlabel('Pickup_Month', fontsize=12)

plt.subplot(322)
ax2= plt.plot(month_trip.pickup_month, month_trip.month_avg_trip_dur, color="green",alpha=0.8,marker='o')
plt.title("Monthly Trip Duration")
plt.ylabel('Avg of trip druration', fontsize=12)
plt.xlabel('Pickup_Month', fontsize=12)

plt.subplot(312)
ax2= plt.plot(date_trip.pickup_date, date_trip.date_trip_times, color="red", alpha=0.8,marker='o')
plt.title("Date Trip Time")
plt.ylabel('Date trip time', fontsize=12)
plt.xlabel('Pickup_Date', fontsize=12)

plt.subplot(313)
ax2= plt.plot(day_trip.pickup_day, day_trip.day_trip_times, color="red", alpha=0.8,marker='*')
plt.title("Day Trip Time")
plt.ylabel('Day trip time', fontsize=12)
plt.xlabel('Pickup_Day', fontsize=12)

plt.show()

# 从趋势来说,2016年1~6月整体打车时长一直呈增长状态,可能用户逐渐习惯了更远距离也打车。

# 其中,3月-5月订单数量属于六个月中最高的三个月,但是整体下降趋势。

# 1月下旬和5月底有异常点,这两天打车人数特别少,可能是当天发生了什么重大事故,或者是重大节日不出行。

# 从日折线图来看,忽略23号和31号两个异常点,整体订单数量随日期变化呈现规律波动,看似周期为7天(一个星期),据此推测订单数量可能与星期几有关。

在这里插入图片描述

# 1、分析异常值

# 从图"Date Trip Time"可以定义异常值临界点为6000,将低于6000的异常值筛选出来。

date_trip[date_trip.date_trip_times<6000]

# 找出异常的日期是1月23日,1月24日,5月30日。
# 分析其原因。根据当日美国新闻:

# (1)美遭暴风雪袭击 纽约时报广场飞雪飘零_网易新闻
# 2016-1-24 · 当地时间2016年1月23日,美国纽约,美国遭遇暴雪天气,暴雪中的时报广场。

# (2)阵亡将士纪念日 (5月的最后一个星期一)
# 中新网5月30日电 据美媒报道,美国迎来“国殇日”长周末,标志着夏季的正式开始。
pickup_datedate_sum_trip_durationdate_avg_trip_durdate_trip_times
222016-01-2316917541026.5497571648
232016-01-243052107902.1894773383
1502016-05-304568228820.1486545570

# 2、分析订单数量可能和星期几有关

x = train.groupby(['pickup_day'])["passenger_count"].agg(["mean"])
x = x.reset_index() 
day_trip["avg_passenger_count"] = x["mean"]
day_trip.head()
pickup_dayday_sum_trip_durationday_avg_trip_durday_trip_timesavg_passenger_count
0144656812958.053978466121.682871
1244354937928.860299477521.666611
2346806173976.247221479451.655355
3447050568947.549451496551.643279
45511932131020.272899501761.670301
plt.figure(figsize=(12,12))

plt.subplot(211)
ax2= plt.plot(day_trip.pickup_day, day_trip.avg_passenger_count, color="grey", alpha=0.8,marker='o')
plt.title("Day Trip Passenger")
plt.ylabel('Day trip passenger', fontsize=12)
plt.xlabel('Pickup_Day', fontsize=12)

plt.subplot(212)
ax2= plt.plot(day_trip.pickup_day, day_trip.day_trip_times, color="grey", alpha=0.9,marker='*')
plt.title("Day Trip Time")
plt.ylabel('Day trip time', fontsize=12)
plt.xlabel('Pickup_Day', fontsize=12)

plt.show()

# 两张图展示了在2016年1月1日至2016年6月30日这半年内,六个月1~31日的每日订单总量、每日平均乘车人数随日期的波动。

# 两个图(每日订单数量/乘车次数与日平均乘车人数)的趋势惊人地一致。这说明在周期的某一阶段,不仅订单数量增多,而且人们偏向于结伴出行。

在这里插入图片描述

train["pickup_hour"]=train.pickup_datetime.apply(lambda x: x.hour)
train.head()
idvendor_idpickup_datetimedropoff_datetimepassenger_countpickup_longitudepickup_latitudedropoff_longitudedropoff_latitudestore_and_fwd_flagtrip_durationpickup_yearmonthpickup_monthpickup_weekpickup_daypickup_datepickup_hour
0id287542122016-03-14 17:24:552016-03-14 17:32:301-73.98215540.767937-73.96463040.765602N45520160330142016-03-1417
1id237739412016-06-12 00:43:352016-06-12 00:54:381-73.98041540.738564-73.99948140.731152N66320160666122016-06-120
2id385852922016-01-19 11:35:242016-01-19 12:10:481-73.97902740.763939-74.00533340.710087N212420160111192016-01-1911
3id350467322016-04-06 19:32:312016-04-06 19:39:401-74.01004040.719971-74.01226840.706718N4292016044262016-04-0619
4id218102822016-03-26 13:30:552016-03-26 13:38:101-73.97305340.793209-73.97292340.782520N43520160335262016-03-2613
# pc=train["passenger_count"]
# phour=train["pickup_hour"]
# pday=train["pickup_day"]
# pweek=train["pickup_week"]
# pmonth=train["pickup_month"]
# pdate=train["pickup_date"]
# tripdur=train["trip_duration"]

# sns.swarmplot(x="pweek", y="tripdur", hue="pmonth", data=train)

# 如上先赋值再代入函数,则swarmplot函数运行报错。下面尝试直接代入函数。

# sns.swarmplot(x=train["pickup_week"], y=train["trip_duration"], hue=train["pickup_month"], data=train)
# sns.swarmplot(x="pickup_week", y="trip_duration", hue="pickup_month", data=train)
# 这两句语句都运行过久,30分钟未有反应,暂时放弃该语句,再寻找其他较优语句。
week_trip = train.groupby(["pickup_month",'pickup_week','pickup_day','pickup_hour'])["trip_duration"].agg(["mean","count"])
week_trip = week_trip.reset_index() 
week_trip.head(2)
pickup_monthpickup_weekpickup_daypickup_hourmeancount
01040656.771186118
11041703.08695792
week_trip.rename(columns={'mean':'week_avg_trip_dur','count':"week_trip_times"}, inplace = True)
print(week_trip.shape)
week_trip.head(2)

# 4359行数据,数据量不大,这次可以用sns.swarmplot()函数了。
(4359, 6)
pickup_monthpickup_weekpickup_daypickup_hourweek_avg_trip_durweek_trip_times
01040656.771186118
11041703.08695792
# 在week_trip表中增加乘车人数

x1 = train.groupby(["pickup_month",'pickup_week','pickup_day','pickup_hour'])["passenger_count"].agg(["mean"])
x1 = x1.reset_index() 
week_trip["avg_passenger_count"] = x1["mean"]
week_trip.head()
pickup_monthpickup_weekpickup_daypickup_hourweek_avg_trip_durweek_trip_timesavg_passenger_count
01040656.7711861181.593220
11041703.086957921.673913
21042692.085106471.574468
31043738.500000321.250000
41044644.000000501.700000
# 周一至周日打车次数/订单数量

plt.figure(figsize=(10,8))
sns.swarmplot(x="pickup_week", y="week_trip_times", hue="pickup_month", data=week_trip)
plt.show()

# 明显周日周一打车次数最低,周五至周六打车次数最高。可能周四至周六市民出行意愿更高。
# 另外发现,周日打车次数/订单数量在100-300区间内明显比周一至周六多,这里可能蕴含一些信息,待挖掘。

在这里插入图片描述

# 周一至周日乘车人数

plt.figure(figsize=(10,5))
sns.boxplot(x="pickup_week", y="avg_passenger_count", hue="pickup_month", data=week_trip)
plt.show()

# 下图可见,周六周日拼车人数较多。

在这里插入图片描述

# 当日内0点至24点乘车次数/订单数量

plt.figure(figsize=(16,6))
sns.swarmplot(x="pickup_hour", y="week_trip_times", data=week_trip)
plt.show()

# 从图中可以看出:

# (1)全天候分析:
# 凌晨一点开始至凌晨五点,订单数量急剧下降,符合人群休息规律。从早6点开始,订单量由谷底回升,早7点至早9点有一个早高峰。
# 在早8点到下午5点之间有轻微波动不明显。而早10点和下午4点均有一个轻微的走低点。

# 原因推测:
# 1、市民上班的出行需求被公共交通、私家车等分担,不会偏好于出租车出行;
# 2、假设通勤时间1小时,则基本可确定八点至十点是上班时间小集中的时间段。(此结论与原贴不一致,甚至有轻微相反。)
# 3、早八点和下午四点这两个时间点,人群在公司开会尚未外出(早)或已在出差公司开会还未散会(下午四点)。

# (2)晚高峰表现显著:
# 从晚6点开始订单量有大规模增长,约晚7点进入打车最高峰,且在23点之前的平均打车量均维持较高水平,高于白天时段。

# 原因推测:
# 1、相比于白天,市民在晚上外出活动时更偏向于出租车出行。有可能逐渐下班。
# 2、也猜测晚间时间家庭出行或约伴出行,下面通过乘车人数认证后发现该假设并不成立。

# (3)下午时段,四点左右出现订单量回落。
# 原因推测:
# 1、司机交班;2、道路拥堵;3、出差人群在出差公司开会还未散会下班。

在这里插入图片描述

# 当日内0点至24点乘车人数

plt.figure(figsize=(16,6))
sns.stripplot(x="pickup_hour", y="avg_passenger_count", data=week_trip)
plt.show()

# 前面猜测晚间时间家庭出行或约伴出行,这里乘车人数在晚间并无明显变化,故前面猜测不成立。
# 反而发现凌晨2点至5点订单乘车人数较为分散,既有较多人(约伴),也有较少人(单人)的情况。
# 早5点-8点之间,每个订单乘车人数全日最低(boxplot比较清晰,stripplot没那么清晰),恰好又是上班时间,预计是单人上班打车情况较多。

在这里插入图片描述

# 当日内0点至24点打车行程时间分布

plt.figure(figsize=(16,6))
y=week_trip["week_avg_trip_dur"][week_trip["week_avg_trip_dur"]<=8000]
daytripdur=sns.boxplot(x="pickup_hour", y=y, data=week_trip)
plt.show()

# 一开始发现三个异常值干扰观察,尝试增加boxplot函数中参数y的重新赋值来忽略异常值(week_avg_trip_dur>8000)。——下图为已修正三个异常值。

# 白天早9点至下午5点,行车时间较长,据此可以推测白天这个时间段道路较为拥塞。

# 凌晨2点至5点,基本可以排除拥塞影响,行程时间长短可近似等同于距离长短。且分布在箱盒之外的长行车时间较多,据此推测:
# 凌晨2点至5点这个时间段接到长距离行程单的机会比其他时间段多很多。

在这里插入图片描述


# 分析二:居民夜生活活跃情况?

# 订单数量在晚8点至凌晨1点均维持较高水平,从凌晨1点开始,订单量断崖式下跌,这一下跌持续到约早5点,早5点是一天内订单量最低的时刻。
# 说明纽约市民夜生活活跃情况:
# (1)第一种可能:下午/晚上下班后约伴交友灯红酒绿夜夜笙歌,至凌晨1点方歇。
# (2)当然,也有第二种可能是:晚晚加班。白天会议下午法定下班时间后,才是晚间工作的开始,然后陆陆续续持续到凌晨十二点。
# 从国情看,纽约的第一种可能性高一些;而第二种则在中国一线城市发生的概率比率高一些。


# 分析三: 城市的一天什么时候最为拥堵?

# 第一个思路(如下图):
# 从前面分析第一部分的“当日内0点至24点打车行程时间分布”初步推测:
# 白天早9点至下午5点,行车时间较长,据此可以推测白天这个时间段道路较为拥塞。

# 第二个思路(待挖掘):
# 先通过上下车地点经纬度计算行程距离,再用行程距离/行程时间得出行车均速。行程均速可体现道路畅通拥堵程度。

plt.figure(figsize=(16,6))
# y=week_trip["week_avg_trip_dur"][week_trip["week_avg_trip_dur"]<=8000]
daytripdur=sns.boxplot(x="pickup_hour", y=y, data=week_trip)
plt.show()

在这里插入图片描述

# 计算行程距离

from math import sin,radians,cos,asin,sqrt

def haversine(lon1, lat1, lon2, lat2):

    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) #radians 角度转弧度

    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) # 反正弦
    r = 6371
    return c * r


# EARTH_REDIUS = 6378.137

# def rad(d):
#     return d * pi / 180.0

# def getDistance(lat1, lng1, lat2, lng2):
#     radLat1 = rad(lat1)
#     radLat2 = rad(lat2)
#     a = radLat1 - radLat2
#     b = rad(lng1) - rad(lng2)
#     s = 2 * math.asin(math.sqrt(math.pow(math.sin(a/2), 2) + math.cos(radLat1) * math.cos(radLat2) * math.pow(math.sin(b/2), 2)))
#     s = s * EARTH_REDIUS
#     return s
# train["distance"] = train['pickup_longitude', 'pickup_latitude','dropoff_longitude', 'dropoff_latitude'].apply(lambda x: haversine(x))
# 整列计算行程距离的方法,暂时搁置。(未完待续)

# 分析四:什么时间容易接到长途单?

# 接单时间和订单行程时间/路程距离是否有关系呢?接下来进入分析。
# 前面已经绘出一日内0点至24点的平均行程时间,我们这里重新引用:

plt.figure(figsize=(16,6))
y=week_trip["week_avg_trip_dur"][week_trip["week_avg_trip_dur"]<=8000]
daytripdur=sns.boxplot(x="pickup_hour", y=y, data=week_trip)
plt.show()


# 凌晨2点至5点,基本可以排除拥塞影响,行程时间长短可近似等同于距离长短。且分布在箱盒之外的长行车时间较多,据此推测:
# 凌晨2点至5点这个时间段接到长距离行程单的机会比其他时间段多很多。

在这里插入图片描述


# 总结

# 分析到此告一段落。当然,虽然数据量不多,但是还可以挖掘更细致的城市出行行为等信息。

# 例如,
# 可以分析哪些时段的哪些区域更容易发生订单,人群一般从哪些地方去往哪些地方——这对出租调度来说是个有效数据。
# 从暴雪带来的异常值可以推测,天气与订单量是有密切关系的,根据日期对应天气数据,可以进一步分析天气与订单量的影响。
# 结合位置数据,还可以分析哪些区域受天气的影响较大,等等。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值