【发布时间】:2015-09-16 17:59:42
【问题描述】:
我有类似于以下示例的大型 csv 流量数据文件,我需要为此计算总字节数和每次数据传输的持续时间。 时间范围重叠,但必须合并:
first_packet_ts last_packet_ts bytes_uplink bytes_downlink service user_id
1441901695012 1441901696009 165 1212 facebook 3
1441901695500 1441901696212 23 4321 facebook 3
1441901698000 1441901698010 242 3423 youtube 4
1441901698400 1441901698500 423 2344 youtube 4
期望的输出:
duration bytes_uplink bytes_downlink service user_id
1200 188 5533 facebook 3
110 665 5767 youtube 4
我目前使用类似于以下几行的内容:
df = pd.read_csv(input_file_path)
df = df.groupby(['service', 'user_id'])
durations = df.apply(calculate_duration)
df = df[['bytes_uplink', 'bytes_downlink']].sum()
df = df.reset_index()
calculate_duration 函数(下)迭代每个的内容 组,合并重叠的时间间隔,然后返回一个数据帧,然后将其连接到求和的数据帧 df。
def calculate_duration(group):
ranges = group[['first_packet_ts', 'last_packet_ts']].itertuples()
duration = 0
for i,current_start, current_stop in ranges:
for i, start, stop in ranges:
if start > current_stop:
duration += current_stop - current_start
current_start, current_stop = start, stop
else:
current_stop = max(current_stop, stop)
duration += current_stop - current_start
return duration
这种方法非常慢,因为它涉及迭代并为每个组调用 apply 方法。
有没有更有效的方法来计算数据传输的持续时间,合并重叠间隔,使用 pandas(以某种方式避免迭代?)最好不求助于 cython?
【问题讨论】:
-
你能显示
calculate_duration吗? -
我添加了我的 calculate_duration 函数的一个版本。但是我认为目标不是优化函数,而是如果可能的话,在不使用 apply() 的情况下进行计算。 (即使函数为空,对性能的影响也很大)
标签: python numpy pandas interval-arithmetic