数据背景来自:优梨:滴滴2020年春招Sql笔试题分析zhuanlan.zhihu.com
这里就不再重复了,主要描述如何使用python数据清洗
问题:
1.订单的平均应答率是多少?完单率是多少?
2.每个订单的平均应答时间是多少?
3.从这一周的时间来看,呼叫次数最多的时间是几点(当地时间),最少的随时间是几点(当地时间)
4.客户留存的情况:呼叫订单第二天继续呼叫的比例是多少?
数据清洗
1.首先导入文件
import pandas as pd
x1=pd.read_csv('C:/Users/LENOVO/Desktop/didi.csv')
2.为方便理解查询将列名改成中文
smallDic={'order_id':'订单号','passenger_id':'乘客号','call_time':'呼叫时间',
'grab_time':'应答时间','cancel_time':'取消时间','finish_time':'完成时间'}
x1.rename(columns=smallDic,inplace=True)
x1.head()
3.缺失数据处理
x1.shape
x2=x1.dropna(subset=['订单号','乘客号'],how='any')
x2.shape并没有缺失的数据
4.统一处理为巴西时间
import datetime
def time_add(x):
list=[]
for i in x:
sdate = datetime.datetime.strptime(i,'%Y/%m/%d %H:%M')
delta11 = datetime.timedelta(hours=11) #巴西时间比国内慢11小时
edate = sdate - delta11
list.append(edate)
pd1=pd.Series(list)
return pd1
t=x2.loc[:,'应答时间']
t1=x2.loc[:,'呼叫时间']
t2=x2.loc[:,'取消时间']
t3=x2.loc[:,'完成时间']
x2.loc[:,'应答时间']=time_add(t)
x2.loc[:,'呼叫时间']=time_add(t1)
x2.loc[:,'取消时间']=time_add(t2)
x2.loc[:,'完成时间']=time_add(t3)
x2.head()
5.对呼叫时间进行处理,分为呼叫日期和呼叫时刻
x2.loc[:,'呼叫时间']=x2.loc[:,'呼叫时间'].astype('str')
def time_spilt(x):
list=[]
for i in x:
date=i.split(" ")[0]
list.append(date)
pd1=pd.Series(list)
return pd1
date1=x2.loc[:,'呼叫时间']
x2['呼叫日期']=time_spilt(date1)
def hour_spilt(x):
list=[]
for i in x:
date=i.split(" ")[1]
hour=date.split(":")[0]
list.append(hour)
pd1=pd.Series(list)
return pd1
date1=x2.loc[:,'呼叫时间']
x2['呼叫时刻']=hour_spilt(date1)
x2.head()
6.呼叫日期中可能还会有空值,因此再次处理一下
x2.loc[:,'呼叫时间']=pd.to_datetime(x2.loc[:,'呼叫时间'],
format='%Y/%m/%d %H:%M',
errors='coerce' #表示不符合格式要求时转化成空值
)
clearData=x2.dropna(subset=['呼叫时间'],how='any')
#行数就代表总的呼叫订单数
call_O=clearData.shape[0]
7.对时间进行排序
#对时间进行排序
clearData=clearData.sort_values(by=['呼叫时间'],ascending=True)
clearData=clearData.reset_index(drop=True) #重新修改索引值
clearData.head()
构建模型
#构建模型 应答率=应答订单/呼叫订单 多条件筛选
judge1=(clearData.loc[:,'应答时间']>'2018-3-5') & (clearData.loc[:,'应答时间']
clearData1=clearData.loc[judge1,:]
grab_O=clearData1.shape[0]
grab_rate=grab_O/call_O
grab_rate应答率72.39%
#完成率也是一样的算法 完成订单/呼叫订单
judge2=(clearData.loc[:,'完成时间']>'2018-3-5') & (clearData.loc[:,'完成时间']
clearData2=clearData.loc[judge2,:]
finish_O=clearData2.shape[0]
finish_R=finish_O/call_O
finish_R完成率47.14%
#最多呼叫次数计算
call_Num=clearData.groupby('呼叫时刻').agg({'订单号':'count'})
max_time=call_Num.max()
p,d=call_Num.stack().idxmax()
print(p,max_time)表示最多的是18点,40笔
min_time=call_Num.min()
p1,d1=call_Num.stack().idxmin()
print(p1,min_time)最少的为2点,只有1笔
将结果在图上绘制出来峰值为18点此后开始大幅下降,而凌晨2-4点这段时间呼叫次数很低
from datetime import timedelta
data=clearData.loc[:,['呼叫日期','乘客号']]
data.loc[:,'呼叫日期']=pd.to_datetime(data.loc[:,'呼叫日期'],format='%Y-%m-%d')
data.dtypes为了后面更好的计算,需要转换日期格式
include_time=pd.Series(data.呼叫日期.unique()).sort_values()[:-1]
list=[]
for i in include_time:
first_user=set(data[data.呼叫日期==i].乘客号.unique())
add_day=datetime.timedelta(days=1)
s=i+add_day
second_user=set(data[data.呼叫日期==s].乘客号.unique())
a=0
for user in first_user:
for user1 in second_user:
if user==user1:
a=a+1
continue
rencent_rate=a/len(first_user)
print(i,rencent_rate)
python基础数据分析学习:优梨:Python数据分析工具入门:Numpy/Pandaszhuanlan.zhihu.com