以下のサンプルのようなトラフィック データの大きな 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 メソッドの呼び出しを伴うため、非常に時間がかかります。
データ転送の期間を計算し、重複する間隔をマージして、できれば cython に頼らずに pandas を使用して (何とか反復を回避しますか?)、より効率的な方法はありますか?