Pandas Groupby (+ 15 минут выполнения) - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь проанализировать набор данных сетевого трафика с +1.000.000 пакетов, и у меня есть следующий код:

pcap_data = pd.read_csv('/home/alexfrancow/AAA/data1.csv')
pcap_data.columns = ['no', 'time', 'ipsrc', 'ipdst', 'proto', 'len']
pcap_data['info'] = "null"
pcap_data.parse_dates=["time"]

pcap_data['num'] = 1
df = pcap_data
df    

%%time
df['time'] = pd.to_datetime(df['time'])
df.index = df['time']
data = df.copy()

data_group = pd.DataFrame({'count': data.groupby(['ipdst', 'proto', data.index]).size()}).reset_index()
pd.options.display.float_format = '{:,.0f}'.format
data_group.index = data_group['time']
data_group

data_group2 = data_group.groupby(['ipdst','proto']).resample('5S', on='time').sum().reset_index().dropna()
data_group2

Первая часть скрипта, когда я импортирую время выполнения .csv, составляет 5 секунд, но когда pandas groupby IP + PROTO и повторная выборка времени в 5 с, время выполнения составляет 15 минут, кто-нибудь знает, как мне лучше производительность

EDIT:

Теперь я пытаюсь использовать dask , и у меня есть следующий код:

Импорт .csv

filename = '/home/alexfrancow/AAA/data1.csv'
df = dd.read_csv(filename)
df.columns = ['no', 'time', 'ipsrc', 'ipdst', 'proto', 'info']
df.parse_dates=["time"]
df['num'] = 1
%time df.head(2)

Out

Группировка по ipdst + proto по 5S freq

df.set_index('time').groupby(['ipdst','proto']).resample('5S', on='time').sum().reset_index()

Как группировать по IP + PROTO по частоте 5S?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

в сумерках:

meta = pd.Dataframe(columns=['no','ipsrc','info'],dtype=object,  index=pd.MultiIndex([[], [],[]],[[],[], []], names=['ipdst','proto','time'])
df = df.set_index('time').groupby(['ipdst','proto']).apply(lambda x:x.resample('5S').sum(),meta=meta)
df = df.reset_index()

Надеюсь, это сработает для вас

0 голосов
/ 26 апреля 2018

Я пытаюсь немного упростить ваш код, но если большая производительность DataFrame должна быть только немного лучше:

pd.options.display.float_format = '{:,.0f}'.format

#convert time column to DatetimeIndex
pcap_data = pd.read_csv('/home/alexfrancow/AAA/data1.csv', 
                         parse_dates=['time'], 
                         index_col=['time'])
pcap_data.columns = ['no', 'time', 'ipsrc', 'ipdst', 'proto', 'len']
pcap_data['info'] = "null"
pcap_data['num'] = 1

#remove DataFrame constructor
data_group = pcap_data.groupby(['ipdst', 'proto', 'time']).size().reset_index(name='count')

data_group2 = (data_group.set_index('time')
                         .groupby(['ipdst','proto'])
                         .resample('5S')
                         .sum()
                         .reset_index()
                         .dropna())
...