看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
有以下客服(客服 999)与用户(李庆辉)对话记录:
data = '''
对话开始 >>
李庆辉 2020-05-15 12:33:50
你好,可以退货吗
客服999 2020-05-15 12:33:55 >>
工号999很高兴为您服务~。
客服999 2020-05-15 12:33:53
您好
客服999 2020-05-15 12:34:04
您可以自己操作申请取消订单的。
李庆辉 2020-05-15 12:34:04
退款多久到账呢?
客服999 2020-05-15 12:34:28
一般1-7个工作日
李庆辉 2020-05-15 12:35:01
OMG! 好久呢
李庆辉 2020-05-15 12:40:55
能不能快点
客服999 2020-05-15 12:42:23
一般情况下很快就会到账的。
李庆辉 2020-05-15 12:43:04
OMG! 好久呢
客服999 2020-05-15 12:44:01
一般情况下很快就会到账的。
对话结束 >>
长时间未回复,对话结束
'''
其中聊天内容前有一个 tab 符,首尾两句是系统自动提示,用“ >> ”标识,客服名称开头有“客服”字样,现在需要知道首次响应时长和平均响应时长。
首先来计算首次响应时长。首次响应时长指的是用户发出第一句到人工客服回复第一句的时间长度。为了实现需求,先将数据载入 DataFrame。由于 data 是字符串,我们用 StringIO 将字符串读入内存的缓冲区,以便 Pandas 来读取:
import pandas as pd
import numpy as np
from io import StringIO
df = pd.read_csv(StringIO(data), names=['chats'], dtype='string')
df
'''
chats
0 对话开始 >>
1 李庆辉 2020-05-15 12:33:50
2 你好,可以退货吗
3 客服999 2020-05-15 12:33:55 >>
4 工号999很高兴为您服务~。
5 客服999 2020-05-15 12:33:53
6 您好
7 客服999 2020-05-15 12:34:04
8 您可以自己操作申请取消订单的。
9 李庆辉 2020-05-15 12:34:04
10 退款多久到账呢?
11 客服999 2020-05-15 12:34:28
12 一般1-7个工作日
13 李庆辉 2020-05-15 12:35:01
14 OMG! 好久呢
15 李庆辉 2020-05-15 12:40:55
16 能不能快点
17 客服999 2020-05-15 12:42:23
18 一般情况下很快就会到账的。
19 李庆辉 2020-05-15 12:43:04
20 OMG! 好久呢
21 客服999 2020-05-15 12:44:01
22 一般情况下很快就会到账的。
23 对话结束 >>
24 长时间未回复,对话结束
'''
对数据进行整理,剔除系统自动提示内容,提取双方昵称、是否客服、发送时间等字段,以方便计算:
(
df.loc[~(df.chats.str.endswith('>>')) & ~(df.chats.str.contains('\t'))]
# 排除系统自动提示内容
.assign(name=lambda x: x.chats.str.split().str[0]) # 提取双方昵称
# 判断是否客服(客服昵称中有“客服”字样)
.assign(staff=lambda x: x.name.str.contains('客服'))
.assign(time=lambda x: pd.to_datetime(x.chats.str[-20:])) # 提取并转换为时间类型
.sort_values('time') # 按时间先后排期
)
'''
chats name staff time
1 李庆辉 2020-05-15 12:33:50 李庆辉 False 2020-05-15 12:33:50
5 客服999 2020-05-15 12:33:53 客服999 True 2020-05-15 12:33:53
7 客服999 2020-05-15 12:34:04 客服999 True 2020-05-15 12:34:04
9 李庆辉 2020-05-15 12:34:04 李庆辉 False 2020-05-15 12:34:04
11 客服999 2020-05-15 12:34:28 客服999 True 2020-05-15 12:34:28
13 李庆辉 2020-05-15 12:35:01 李庆辉 False 2020-05-15 12:35:01
15 李庆辉 2020-05-15 12:40:55 李庆辉 False 2020-05-15 12:40:55
17 客服999 2020-05-15 12:42:23 客服999 True 2020-05-15 12:42:23
19 李庆辉 2020-05-15 12:43:04 李庆辉 False 2020-05-15 12:43:04
21 客服999 2020-05-15 12:44:01 客服999 True 2020-05-15 12:44:01
'''
接下来获取人工客服回复第一句的时间和用户发出第一句的时间并相减,便得出首次响应时长:
(
df.loc[~(df.chats.str.endswith('>>')) & ~(df.chats.str.contains('\t'))]
# 排除系统自动提示内容
.assign(name=lambda x: x.chats.str.split().str[0]) # 提取双方昵称
# 判断是否客服(客服昵称中有“客服”字样)
.assign(staff=lambda x: x.name.str.contains('客服'))
.assign(time=lambda x: pd.to_datetime(x.chats.str[-20:])) # 提取并转换为时间类型
.sort_values('time') # 按时间先后排期
# 首次响应时长
.assign(first=lambda x: x[x.staff==True].time.min() - x[x.staff==False].time.min())
)
'''
first
1 0 days 00:00:03
5 0 days 00:00:03
7 0 days 00:00:03
9 0 days 00:00:03
11 0 days 00:00:03
13 0 days 00:00:03
15 0 days 00:00:03
17 0 days 00:00:03
19 0 days 00:00:03
21 0 days 00:00:03
'''
增加了新列(省略之前代码和之前列),结果为 3 秒钟。
接下来计算平均响应时长。平均响应时长的算法是用户发出信息后(不管接连再发了几条),客户回应时间(不管接连再发了几条)的间隔,总是一方一个时间,对这些间隔求平均就得到平均响应时长。
(
df.loc[~(df.chats.str.endswith('>>')) & ~(df.chats.str.contains('\t'))] # 排除系统内容
.assign(name=lambda x: x.chats.str.split().str[0]) # 提取双方昵称
# 判断是否客服(客服昵称中有“客服”字样)
.assign(staff=lambda x: x.name.str.contains('客服'))
.assign(time=lambda x: pd.to_datetime(x.chats.str[-20:])) # 提取并转换为时间类型
.sort_values('time') # 按时间先后排期
# 开始求平均时长,保留一方连续发言情况中的第一条
.loc[lambda x: (x[['name']].shift() != x[['name']]).any(axis=1)]
.assign(diff=lambda x: x.time.diff()) # 求先后对话的时间差
.assign(avg=lambda x: x['diff'].mean().seconds) # 对所有的时间差求平均数,单位为秒
)
'''
<省略原有前几列>
diff avg
1 NaT 87
5 0 days 00:00:03 87
9 0 days 00:00:11 87
11 0 days 00:00:24 87
13 0 days 00:00:33 87
17 0 days 00:07:22 87
19 0 days 00:00:41 87
21 0 days 00:00:57 87
'''
思路是,将用户名下移后再判断是否还是原用户名,如果是则剔除,这样就只保留了一方连续发言时的第一条,然后再对上下条消息的发出时间求差值,最后再算平均值,单位取秒。最终结果为 87 秒。
(完)
注:此案例收录在《深入浅出Pandas:利用Python进行数据处理与分析》17.3.5 小节。
更新时间:2024-08-18 16:14:05 标签:pandas python 客服