2013-09-17 3 views
2

Я только начинаю изучать аналитику с помощью python для сетевого анализа, используя книгу Python For Data Analysis, и я смущаюсь из-за исключения, которое я получаю, когда занимаюсь какой-то группой ... вот моя ситуация.Исключение во время groupby pandas

У меня есть CSV данных NetFlow, которые я импортировал в pandas. Данные выглядит что-то вроде:

dt, srcIP, srcPort, dstIP, dstPort, bytes 
2013-06-06 00:00:01.123, 123.123.1.1, 12345, 234.234.1.1, 80, 75 

Я импортировал и индексированные данные следующим образом:

df = pd.read_csv('mycsv.csv') 
df.index = pd.to_datetime(full_set.pop('dt')) 

То, что я хочу, это подсчет уникальных srcIPs, которые посещают мои серверы за определенный период времени (у меня есть данные в течение нескольких дней, и я хотел бы указать время по дате, час). Я могу получить общий график движения с помощью группировки и построение следующим образом:

df.groupby([lambda t: t.date(), lambda t: t.hour]).srcIP.nunique().plot() 

Однако, я хочу знать, как это общий трафик разделяется среди моих серверов. Моя интуиция заключалась в том, чтобы дополнительно группировать столбец «dstIP» (который имеет только 5 уникальных значений), но я получаю ошибки при попытке агрегирования на srcIP.

grouped = df.groupby([lambda t: t.date(), lambda t: t.hour, 'dstIP']) 
grouped.sip.nunique() 
... 
Exception: Reindexing only valid with uniquely valued Index objects 

Итак, мой конкретный вопрос: Как я могу избежать этого исключения для того, чтобы создать участок, где движение агрегируется в течение 1 часа блоков и есть другая серия для каждого сервера.

В целом, пожалуйста, дайте мне знать, какие ошибки newb я делаю. Кроме того, данные не имеют регулярных временных меток времени, и я не хочу, чтобы выборочные данные были в случае, если это имеет какое-либо значение в вашем ответе.

EDIT 1 Это мой сеанс ipython точно так же, как и вход. вывод исключен, за исключением самых глубоких вызовов в ошибке.

EDIT 2 Обновление панд от 0.8.0 до 0.12.0, как давала более описательный исключение, показанное ниже

import numpy as np 
import pandas as pd 
import time 
import datetime 

full_set = pd.read_csv('june.csv', parse_dates=True, index_col=0) 
full_set.sort_index(inplace=True) 
gp = full_set.groupby(lambda t: (t.date(), t.hour, full_set['dip'][t])) 
gp['sip'].nunique() 
... 
/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.pyc in _make_labels(self) 
    1239    raise Exception('Should not call this method grouping by level') 
    1240   else: 
-> 1241    labs, uniques = algos.factorize(self.grouper, sort=self.sort) 
    1242    uniques = Index(uniques, name=self.name) 
    1243    self._labels = labs 

/usr/local/lib/python2.7/dist-packages/pandas/core/algorithms.pyc in factorize(values, sort, order, na_sentinel) 
    123  table = hash_klass(len(vals)) 
    124  uniques = vec_klass() 
--> 125  labels = table.get_labels(vals, uniques, 0, na_sentinel) 
    126 
    127  labels = com._ensure_platform_int(labels) 

/usr/local/lib/python2.7/dist-packages/pandas/hashtable.so in pandas.hashtable.PyObjectHashTable.get_labels (pandas/hashtable.c:12229)() 

/usr/local/lib/python2.7/dist-packages/pandas/core/generic.pyc in __hash__(self) 
    52  def __hash__(self): 
    53   raise TypeError('{0!r} objects are mutable, thus they cannot be' 
---> 54        ' hashed'.format(self.__class__.__name__)) 
    55 
    56  def __unicode__(self): 

TypeError: 'TimeSeries' objects are mutable, thus they cannot be hashed 

ответ

1

Я в конечном итоге решить мою проблему, добавив новый столбец час усеченной DateTimes к исходному dataframe следующим образом:

f = lambda i: i.strftime('%Y-%m-%d %H:00:00') 
full_set['hours'] = full_set.index.map(f) 

Тогда я могу groupby('dip') и петлю через каждый destIP создавая ежечасно сгруппированный сюжет, как я иду ...

for d, g in dipgroup: 
    g.groupby('hours').sip.nunique().plot() 
1

Так что я не на 100 процентов уверен, почему так воспитали, что исключение .. но несколько предложений:

Вы можете прочитать в ваших данных и разбора DateTime и индекса на DateTime сразу с read_csv:

df = pd.read_csv('mycsv.csv', parse_dates=True, index_col=0) 

Тогда вы можете сформировать свои группы с помощью лямбда-функции, которая возвращает кортеж из значений:

gp = df.groupby(lambda t: (t.date(), t.hour, df['dstIP'][t])) 

На вход этой функции лямбда является индексом, мы можем использовать этот индекс, чтобы войти в dataframe в внешней области и получить значение srcIP в этом индексе и, таким образом, включить его в группировку.

Теперь, когда мы имеем группировку, мы можем применить агрегатор:

gp['srcIP'].nunique() 
+0

Странно, теперь я получаю 'TypeError: unhashable type' при попытке агрегирования. Он также вызывает ту же ошибку при попытке показать «gp.groups», который, как я думал, не должен был произойти, как только исходная команда группы будет успешной. – maxp

+0

Можете ли вы опубликовать точный код, который вы выполнили и введите? То, что я написал, работало, учитывая точный ввод, который вы показываете в своем исходном сообщении, и я не уверен, где TypeError может появиться – qwwqwwq