2013-12-19 4 views
1

я сгруппировал следующие 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 намного выше, вы знаете, что нагрузка намного выше, чем обычно. Но я не уверен в этом.

+0

прочитать здесь: http://pandas.pydata.org/pandas-docs/dev/groupby.html, вам просто нужно ' 'df.groupby (['host', 'operation']). apply (lambda x: сделать ваш calc на x)' '. – Jeff

+0

, если вы ответите, я проверю его как принятый. – LetMeSOThat4U

ответ

2

документы являются here

вам нужно:

def f(x): 
    return a calculation on x 

f can also be lambda x: .... 

df.groupby(['host','operation']).apply(f) 
+0

Одна вещь, которая была для меня новостью: 'x' вверх есть полностью взорванный объект Pandas (обычно DataFrame, иногда серия, зависит от контекста). Таким образом, вы можете делать всевозможные полезные вещи до 'x' в' f'. Например: 'x ['newcol'] = super_awesome_function (x)' отлично работает. Как и что-то вроде 'x ['movavg'] = pd.rolling_mean (x, периоды = 20)'. Таким образом, вы можете использовать 'f', чтобы закрепить несколько столбцов на' x', а затем, в конечном счете, просто «вернуть x». – 8one6

+0

groupby очень мощный. вы можете делать с ним довольно сложные типы операций. однако иногда бывает целесообразно использовать векторизованное на всем кадре либо до того, как после группы (как группа по существу является зацикленной операцией). – Jeff

+0

в общем случае быстрее возвращать новый объект (и не изменять текущий объект); это медленный/быстрый путь. – Jeff

Смежные вопросы