Я пытаюсь проанализировать файл журнала в Pandas. Цель состоит в том, чтобы графически понять, когда процессы перезапускаются (т. Е. Их PID-изменения) и переходят ли они на другой узел в кластере (т. Е. Имя узла и PID-изменение).
Это образец упрощенная версия импортированных журналов:
datetime node service severity pid
0 2018-01-01 01:00:00 node01 svc_a ERROR 1
1 2018-01-01 01:01:00 node01 svc_a ERROR 1
2 2018-01-01 01:02:00 node02 svc_c INFO 3
3 2018-01-01 01:03:00 node01 svc_b ERROR 2
4 2018-01-01 01:04:00 node01 svc_b INFO 2
Можно создать полный (120 записей) упрощенный фрейм данных следующим образом:
date_rng = pd.date_range(start='1/1/2018 01:00', end='1/1/2018 02:59', freq='T')
node = np.random.choice(['node01', 'node02'], size=len(date_rng))
severity = np.random.choice(['INFO','ERROR'], size=len(date_rng))
service = np.random.choice(['svc_a', 'svc_b', 'svc_c'], size=len(date_rng))
pid = ['0']; pid = pid*len(date_rng)
df = pd.DataFrame(dict(datetime=date_rng, node=node, service=service, severity=severity, pid=pid))
Начальный сценарий будет следующим:
- svc_a с PID '1' на узле # 1
- svc_b с PID '2' на узле # 1
- svc_ c с PID '3' на узле # 2
В 2 часа ночи что-то происходит, и:
- svc_a перезапускается на узле # 1 (его PID меняется на '11')
- svc_b переходит на сбой к узлу # 2 (его PID меняется на '22')
- с svc_ c
ничего не происходит * Мы можем смоделировать вышеизложенное с помощью следующих манипуляций с данными:
# starting point (1am)
df.loc[(df.datetime.dt.hour == 1) & (df["service"] == 'svc_a'), ['node', 'pid']] = ['node01', '1']
df.loc[(df.datetime.dt.hour == 1) & (df["service"] == 'svc_b'), ['node', 'pid']] = ['node01', '2']
df.loc[(df.datetime.dt.hour == 1) & (df["service"] == 'svc_c'), ['node', 'pid']] = ['node02', '3']
# # after restart (2am)
df.loc[(df.datetime.dt.hour == 2) & (df["service"] == 'svc_a'), ['node', 'pid']] = ['node01', '11']
df.loc[(df.datetime.dt.hour == 2) & (df["service"] == 'svc_b'), ['node', 'pid']] = ['node02', '22']
Теперь, просто чтобы дать вам представление о том, чего я пытаюсь достичь в графическом виде, я поделюсь с вами единственной вещью, которую я пчела В состоянии выйти до сих пор.
g = sns.FacetGrid(df, col='node', row='service', hue='severity', height=4, aspect=2)
g = g.map(plt.hist, "datetime")
Итак, с помощью функции Seaborn FacetGrid я могу получить два столбца (по одному для каждого узла) и три ряды (по одному на каждую услугу). Я думаю, что это хорошая раскладка, но я получаю гистограмму, и я не могу получить гистограмму с линейным графиком datetime
на x
и count
событий на y
.
Итак, конечный результат должен иметь одинаковую разметку (т. Е. Каждый столбец идентифицирует узел, а каждая строка идентифицирует сервис), но я бы хотел посчитать количество событий, имеющих возможность повторной выборки. столбец datetime
и получение двух типов диаграмм:
- линейный график, где оттенок определяет разные
pid
значения - составной блок-график, где оттенок определяет разные
severity
значения
Помимо работы в Seaborn, я хотел бы найти способ сделать это с pandas.GroupBy()
и matplotlib
, так как это даст мне больше гибкости в работе с фактический набор данных.
Относительно pandas.GroupBy()
, на данный момент я смог достичь только этого:
df.groupby([pd.Grouper(key='datetime', freq='5T'), 'node', 'service', 'severity', 'pid']).size()
datetime node service severity pid
2018-01-01 01:00:00 node01 svc_a ERROR 1 2
svc_b ERROR 2 1
INFO 2 1
node02 svc_c INFO 3 1
2018-01-01 01:05:00 node01 svc_a ERROR 1 2
..
2018-01-01 02:55:00 node01 svc_a INFO 11 1
svc_c ERROR 0 1
node02 svc_b INFO 22 1
svc_c ERROR 0 1
INFO 0 1
Length: 87, dtype: int64
Что я не могу построить так, как я описано выше.