4

以下のサンプルのようなトラフィック データの大きな 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 を使用して (何とか反復を回避しますか?)、より効率的な方法はありますか?

4

2 に答える 2

0

以下のコードは、サンプル データを指定して出力を再現します。それはあなたが探しているものですか?

>>> df.groupby(['service', 'user_id'])['bytes_uplink', 'bytes_downlink'].sum().reset_index()
    service  user_id  bytes_uplink  bytes_downlink
0  facebook        3           188            5533
1   youtube        4           665            5767
于 2015-09-12T18:13:59.553 に答える