2015-05-28 2 views
2

Я начинаю программист и изучаю python (+ pandas) и надеюсь, что смогу это объяснить достаточно хорошо. У меня большой временный ряд pd dataframe более 3 миллионов строк и изначально 12 столбцов, охватывающих несколько лет. Это охватывает людей, которые берут билет из разных мест, обозначенных номерами идентификаторов (350 из них). Каждая строка - один экземпляр (один билет выполнен). Я искал много вопросов, таких как counting records per hour per day и getting average per hour over several years. Тем не менее, я столкнулся с проблемой включения переменной «Id». Я ищу, чтобы получить среднее значение людей, принимающих билет за каждый час, за каждый день недели (пн-пт) и за каждую станцию.
У меня есть следующие, установив DateTime индексировать:Временные ряды: Среднее на час в день на идентификационный номер

Id   Start_date Count Day_name_no 
    149 2011-12-31 21:30:00  1   5 
    150 2011-12-31 20:51:00  1   0 
    259 2011-12-31 20:48:00  1   1 
    3015 2011-12-31 19:38:00  1   4 
    28 2011-12-31 19:37:00  1   4 

Использование groupby и Start_date.index.hour, я не могу показаться, чтобы включить 'Id'.

Моего альтернативный подход заключается в разделении часа из даты и имеет следующий:

Id Count Day_name_no Trip_hour 
    149  1   2   5 
    150  1   4   10 
    153  1   2   15 
    1867  1   4   11 
    2387  1   2   7 

Я тогда получить количество первого с:

Count_Item = TestFreq.groupby([TestFreq['Id'], TestFreq['Day_name_no'], TestFreq['Hour']]).count().reset_index() 

    Id Day_name_no Trip_hour Count 
    1 0   7   24 
    1 0   8   48 
    1 0   9   31 
    1 0   10   28 
    1 0   11   26 
    1 0   12   25 

Затем используйте GroupBy и означает:

Mean_Count = Count_Item.groupby(Count_Item['Id'], Count_Item['Day_name_no'], Count_Item['Hour']).mean().reset_index() 

Однако это не дает желаемого результата, поскольку средние значения неверны. Надеюсь, я четко объяснил этот вопрос. Я ищу среднее значение в час в день на Id, поскольку я планирую сделать кластеризацию для разделения моего набора данных на группы, прежде чем применять прогностическую модель для этих групп.

Любая помощь была бы признательна и, если возможно, объяснение того, что я делаю неправильно, либо кодекс, либо мой подход.

Заранее спасибо.

Я отредактировал это, чтобы попытаться сделать его немного яснее. Написание вопроса с недостатком сна, вероятно, нецелесообразно. Игрушечный набор данных, который я начать с:

Date  Id  Dow Hour Count 
    12/12/2014 1234 0 9 1 
    12/12/2014 1234 0 9 1 
    12/12/2014 1234 0 9 1 
    12/12/2014 1234 0 9 1 
    12/12/2014 1234 0 9 1 
    19/12/2014 1234 0 9 1 
    19/12/2014 1234 0 9 1 
    19/12/2014 1234 0 9 1 
    26/12/2014 1234 0 10 1 
    27/12/2014 1234 1 11 1 
    27/12/2014 1234 1 11 1 
    27/12/2014 1234 1 11 1 
    27/12/2014 1234 1 11 1 
    04/01/2015 1234 1 11 1 

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

Date   Id Dow Hour Count 
    12/12/2014 1234 0 9 5 
    19/12/2014 1234 0 9 3 
    26/12/2014 1234 0 10 1 
    27/12/2014 1234 1 11 4 
    04/01/2015 1234 1 11 1 

А затем вычислить среднее значение за Id, в Dow, в час. И хочу получить это:

Id Dow Hour Mean 
    1234 0 9 4 
    1234 0 10 1 
    1234 1 11 2.5 

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

ответ

2

Ваш вопрос не очень понятно, но я надеюсь, что это помогает:

df.reset_index(inplace=True) 
# helper columns with date, hour and dow 
df['date'] = df['Start_date'].dt.date 
df['hour'] = df['Start_date'].dt.hour 
df['dow'] = df['Start_date'].dt.dayofweek 
# sum of counts for all combinations 
df = df.groupby(['Id', 'date', 'dow', 'hour']).sum() 
# take the mean over all dates 
df = df.reset_index().groupby(['Id', 'dow', 'hour']).mean() 
+0

Благодаря @Def_Os. Я сделал редактирование, чтобы попытаться сделать вопрос немного яснее. Я делал что-то очень похожее на то, что вы разместили, но получал только «1». Я думаю, что он добавляет все 1 и делит на сумму, давая среднее значение 1.Я надеюсь, что редактирование может сделать это немного яснее, что я пытаюсь сделать. Благодарю. –

+0

Я обновил свой ответ, чтобы реализовать ваш пример. –

0

Вы можете использовать функцию GroupBy, используя столбец «Id», а затем использовать resample функцию с тем, как «сумма» =.