Pandas + Mito nginx accesslog

Продолжаю эксперементы с Pandas и Mito. В этот раз решил проанализировать nginx accesslog.

Размер моего анализируемого лога составил 150 мб.

Работаю на Macbook Air M1 16 GB Ram, процесс парсинга accesslog и создание дата-фрейма у меня занял порядка 11 секунд.

Итак, для того, чтобы распарсить nginx accesslog нужно использовать следующую команду (источник):

df = pd.read_csv('access.log', 
                 sep=r'\s(?=(?:[^"]*"[^"]*")*[^"]*$)(?![^\[]*\])',
                 engine='python',
                 usecols=[0, 3, 4, 5, 6, 7, 8],
                 names=['ip', 'time', 'request', 'status', 'size', 'referer', 'user_agent'],
                 na_values='-',
                 header=None)

Результат у меня получился во такой:

Сразу пришла мысль — сколько запросов было в час и минуту.
Для этих целей необходимо было преобразовать колонку time в нужный форма. Для себя я определил что мне нужны отдельные колонки: с годом, месяцем, днем, часом, минутой. Для преобразовать использовал следующий код:

убрал лишние символы из даты:

df['time'] = df['time'].str.replace('+','')
df['time'] = df['time'].str.replace('[','')
df['time'] = df['time'].str.replace('0300]','')
df['time'] = df['time'].str.replace('/2022:','-2022 ')
df['time'] = df['time'].str.replace('/','-')

добавил отдельные колонки для каждого из показателей:

df['time_year'] = pd.to_datetime(df['time']).dt.year
df['time_month'] = pd.to_datetime(df['time']).dt.month
df['time_day'] = pd.to_datetime(df['time']).dt.day
df['time_hour'] = pd.to_datetime(df['time']).dt.hour
df['time_minute'] = pd.to_datetime(df['time']).dt.minute
df['time_second'] = pd.to_datetime(df['time']).dt.second

На выходе получил вот такой датафрейм:

Далее, чтобы не писать много строк кода воспользовался Mito для постоения мини-отчета:

Далее, мне нужно было посмотреть какие IP есть в логе и сколько запросов они делают: