Как сгруппировать журнал HTTP-запросов с помощью панд - PullRequest
0 голосов
/ 16 мая 2019

У меня есть журнал HTTP-запросов.Включенные функции: capture_time, ip, метод, url, content, user_agent

Вся эта информация находится в CSV-файле.

Я хочу сгруппировать все запросы с одного и того же IP между 10минутный интервал.

как мне это сделать с помощью панд?

пример набора данных:

date ip method url content agent
  • 2019-04-24 23: 16: 48.742466
  • 187.20.211.99
  • POST
  • / delivery / check_location
  • bairro = Vila & cidade = Lima
  • Mozilla / 5.0(iPhone; процессор iPhone OS 12_2, как Mac OS X) AppleWebKit / 605.1.15 (KHTML, как Gecko) Mobile / 15E148

Я уже пытался использовать групповой метод.

хотел бы объединить все запросы контента в одну строку (для групп с использованием ip и времени)

Ответы [ 2 ]

1 голос
/ 16 мая 2019
df.set_index('date', inplace = True)

unnesting(df.resample('10T')['ip'].unique().reset_index(), ['ip']).reset_index(drop = True)

Сначала вам нужно установить дату на ваш индекс.Затем вам нужно пересчитать время с шагом в 10 минут, посмотреть на столбец IP и получить уникальные значения для каждого промежутка времени.Затем вам нужно удалить из списков, созданных unique(), используя следующую функцию.

##https://stackoverflow.com/questions/53218931/how-to-unnest-explode-a-column-in-a-pandas-dataframe/55839330#55839330

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([
        pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')

После этого вы можете объединить все, что планировали.

РЕДАКТИРОВАТЬ :

# Set index to the date column
df.set_index('date', inplace = True)

# 10 minutes in nanoseconds 
ns10min=10*60*1000000000

#Calculate the new 10 min.   
df.index = pd.to_datetime(((df.index.astype(np.int64) // ns10min) * ns10min))

#Groupby both index and ip, then look at the first.
df.groupby([df.index, df['ip']]).first()
0 голосов
/ 16 мая 2019

Я использовал метод Бена Папа, чтобы сгруппировать ips по дате. После этого я получил информационный кадр, содержащий IP-адреса и временные интервалы. Чтобы присоединиться к другим столбцам и добавить к этому фрейму данных, я сделал это:

content= []
row_iterator = test.iterrows()
for index, row in row_iterator:
    texto = ""
    resul = df2.loc[(df2[df2.columns[1]] == row[2]) & ((row[0] < df2.index) & (df2.index <  row[0] + pd.Timedelta(minutes=10) ) )]
    for i, (_, current_row) in enumerate(resul.iterrows()):
        texto += " " + current_row.values[2] + " " + current_row.values[3] + " " + current_row.values[4] 
     content.append(texto)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...