在几个月的时间里,我有一个跨应用程序的数十个用户进行文本字段交互的数据集.我正在尝试计算熊猫击键之间的平均时间.数据看起来像这样:
timestamp before_text after_text
1453481138188 NULL a
1453481138600 a ab
1453481138900 ab abc
1453481139400 abc abcd
1453484000000 Enter some numbers 1
1453484000100 1 12
1453484000600 12 123
timestamp包含用户按下键的unix时间,before_text是用户点击键之前包含的文本字段,after_text是键击后字段的样子.
这样做的最佳方法是什么?我知道这并不像做以下事情那么简单:
(df["timestamp"] - df["timestamp"].shift()).mean()
因为这将计算两个交互之间边界上的非常大的时间差.看起来最好的方法是将每行的一些函数传递给df.groupby,以便我可以将上面的代码片段应用到每一行.如果我有这个magic_function,我可以这样做:
df.groupby(magic_function).apply(lambda x: x["timestamp"] - x["timestamp"].shift()).mean()
什么是实现magic_function的好方法,还是我认为这一切都错了?
最佳答案 我是通过计算’之前’和’之后’之间的文本差异来做到的.如果差异大于某个阈值,那么这是一个新会话.
它要求Levenshtein导入距离为ld.我通过像这样安装它:
pip install python-levenshtein
然后:
from Levenshtein import distance as ld
import pandas as pd
# taking just these two columns and transposing and back filling.
# I back fill for one reason, to fill that pesky NA with after text.
before_after = df[['before_text', 'after_text']].T.bfill()
distances = before_after.apply(lambda x: ld(*x))
# threshold should be how much distance constitutes an obvious break in sessions.
threshold = 2
magic_function = (distances > 2).cumsum()
df.groupby(magic_function) \
.apply(lambda x: x["timestamp"] - x["timestamp"].shift()) \
.mean()
362.4