я сгруппировал следующие DF по host
и operation
столбцов:Split DataFrameGroupBy в отдельные кадры (панды)
df
Out[163]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100 entries, 10069 to 1003
Data columns (total 8 columns):
args 100 non-null values
host 100 non-null values
kwargs 100 non-null values
log_timestamp 100 non-null values
operation 100 non-null values
thingy 100 non-null values
status 100 non-null values
time 100 non-null values
dtypes: float64(1), int64(2), object(5)
g = df.groupby(['host','operation'])
g
Out[165]: <pandas.core.groupby.DataFrameGroupBy object at 0x7f46ec731890>
g.groups.keys()[:10]
Out[166]:
[('yy39.segm1.org', 'gtfull'),
('yy39.segm1.org', 'updateWidg'),
('yy36.segm1.org', 'notifyTestsDelivered'),
('yy32.segm1.org', 'notifyTestsDelivered'),
('yy20.segm1.org', 'gSettings'),
('yy32.segm1.org', 'x_gWidgboxParams'),
('yy39.segm1.org', 'clearElems'),
('yy3.segm1.org', 'gxyzinf'),
('yy34.segm1.org', 'setFlagsOneWidg'),
('yy13.segm1.org', 'x_gbinf')]
Теперь мне нужно, чтобы получить индивидуальные DataFrames для каждого («хозяина», «Работа») пары. Я могу сделать это с помощью перебора ключей групп:
for el in g.groups.keys():
...: print el, 'VALUES', g.groups[el]
...:
('yy25.segm1.org', 'x_gbinf') VALUES [10021]
('yy36.segm1.org', 'gxyzinf') VALUES [10074, 10085]
('yy25.segm1.org', 'updateWidg') VALUES [10022]
('yy25.segm1.org', 'gtfull') VALUES [10019]
('yy16.segm1.org', 'gxyzinf') VALUES [10052, 10055, 10062, 10064]
('yy32.segm1.org', 'addWidging2') VALUES [10034]
('yy16.segm1.org', 'notifyTestsDelivered') VALUES [10056, 10065]
Вопросы:
Q1. Мне интересно, должен ли я разделить объект DataFrameGroupBy
или есть более быстрый способ достижения цели здесь?
Стратегически: мне нужно рассчитать экспоненциально взвешенное скользящее среднее и экспоненциально взвешенное стандартное отклонение (хотя std dev следует ослаблять гораздо медленнее).
Для этого мне нужно иметь его:
а. сгруппированы по ходу, операция
b. каждый подмножество хоста/операции, отсортированное по log_timestamp
c. ewma и ewmstd для столбца time
.
Есть ли способ достичь этого без разделения DataFrameGroupBy
?
Q2. Цель состоит в том, чтобы сигнализировать, когда определенное время для хоста/операции становится ненормальным в течение последних нескольких минут (условие перегрузки). У меня была идея, что если я посчитаю «медленный ewmstd» и «медленную электронную» (на более длительный период времени, скажем, 1 час), то краткосрочная волна (скажем, 5 минут) может быть интерпретирована как аварийное значение, если она более 2 медленных std отклонения от медленной волны (три правила сигмы). Я даже не уверен, что это правильный/лучший подход. Это?
Возможно, это похоже на то, как работают средние нагрузки UNIX 1m, 5m и 15m: если 15m нормально, а 1m load avg намного выше, вы знаете, что нагрузка намного выше, чем обычно. Но я не уверен в этом.
прочитать здесь: http://pandas.pydata.org/pandas-docs/dev/groupby.html, вам просто нужно ' 'df.groupby (['host', 'operation']). apply (lambda x: сделать ваш calc на x)' '. – Jeff
, если вы ответите, я проверю его как принятый. – LetMeSOThat4U