Pandas groupby и катящееся окно на 4 недели

1

У меня есть серия данных с интервалом в полчаса. Мне нужно провести четвертое (целое) недельное вторжение во вторник, среду и четверг на каждые полчаса в наборе данных. Таким образом, первое "окно" будет иметь средние значения за раз 00:00:00, 00:30:00,..., 23:00:00, 23:30:00 в течение 1-4 недель. Затем следующее окно будет иметь средние значения для недель 2-5 и т.д.

У меня есть следующий набор данных, который имеет ежедневные данные, но включает только вторник, среду и четверг (по какой-либо причине другие дни не используются при вычислении средних значений). Кроме того, в те дни у меня есть данные через полчаса (но включая только полчасовые интервалы времени 00:00:00, 00:30:00, 01:00:00 и 01:30:00 в выборке),

datetime    timeblock   speed
1/3/2017 0:00   0:00:00 81.186885
1/3/2017 0:30   0:30:00 NaN
1/3/2017 1:00   1:00:00 85.277724
1/3/2017 1:30   1:30:00 85.077176
1/4/2017 0:00   0:00:00 80.691608
1/4/2017 0:30   0:30:00 79.223225
1/4/2017 1:00   1:00:00 82.330169
1/4/2017 1:30   1:30:00 79.495578
1/5/2017 0:00   0:00:00 74.162426
1/5/2017 0:30   0:30:00 75.206492
1/5/2017 1:00   1:00:00 77.6484
1/5/2017 1:30   1:30:00 72.61875
1/10/2017 0:00  0:00:00 77.785555
1/10/2017 0:30  0:30:00 80.617395
1/10/2017 1:00  1:00:00 80.094947
1/10/2017 1:30  1:30:00 77.697473
1/11/2017 0:00  0:00:00 74.7104
1/11/2017 0:30  0:30:00 75.691326
1/11/2017 1:00  1:00:00 74.639803
1/11/2017 1:30  1:30:00 81.797268
1/12/2017 0:00  0:00:00 79.571042
1/12/2017 0:30  0:30:00 78.083612
1/12/2017 1:00  1:00:00 78.747287
1/12/2017 1:30  1:30:00 78.128129
1/17/2017 0:00  0:00:00 76.509323
1/17/2017 0:30  0:30:00 77.256
1/17/2017 1:00  1:00:00 78.627085
1/17/2017 1:30  1:30:00 81.588
1/18/2017 0:00  0:00:00 77.82543
1/18/2017 0:30  0:30:00 80.231272
1/18/2017 1:00  1:00:00 NaN
1/18/2017 1:30  1:30:00 74.656384
1/19/2017 0:00  0:00:00 77.37165
1/19/2017 0:30  0:30:00 80.328705
1/19/2017 1:00  1:00:00 80.011531
1/19/2017 1:30  1:30:00 79.643781
1/24/2017 0:00  0:00:00 81.167016
1/24/2017 0:30  0:30:00 NaN
1/24/2017 1:00  1:00:00 83.128695
1/24/2017 1:30  1:30:00 77.799428
1/25/2017 0:00  0:00:00 73.106437
1/25/2017 0:30  0:30:00 71.316
1/25/2017 1:00  1:00:00 75.966
1/25/2017 1:30  1:30:00 74.345225
1/26/2017 0:00  0:00:00 78.768
1/26/2017 0:30  0:30:00 80.436508
1/26/2017 1:00  1:00:00 76.782222
1/26/2017 1:30  1:30:00 76.168687
1/31/2017 0:00  0:00:00 73.780363
1/31/2017 0:30  0:30:00 72.32356
1/31/2017 1:00  1:00:00 74.119404
1/31/2017 1:30  1:30:00 72.412363
2/1/2017 0:00   0:00:00 75.572408
2/1/2017 0:30   0:30:00 72.486593
2/1/2017 1:00   1:00:00 77.357
2/1/2017 1:30   1:30:00 74.134188
2/2/2017 0:00   0:00:00 72.209382
2/2/2017 0:30   0:30:00 75.792807
2/2/2017 1:00   1:00:00 74.167605
2/2/2017 1:30   1:30:00 78.053373

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

roll_mean = sample.groupby('timeblock')['speed'].rolling('30D', min_value = '30D').mean()

Желаемые результаты должны быть следующими:

Window      00:00:00    00:30:00    01:00:00    01:30:00
1 (wks 1-4) 77.74       NaN         NaN         78.25
2 (wks 2-5) 76.53       NaN         NaN         77.20

заранее спасибо

Изменение: Грамматика/разъяснение

In[1]: sample.index
Out[1]: 
DatetimeIndex(['2017-01-03 00:00:00', '2017-01-03 00:30:00',
               '2017-01-03 01:00:00', '2017-01-03 01:30:00',
               '2017-01-03 02:00:00', '2017-01-03 02:30:00',
               '2017-01-03 03:00:00', '2017-01-03 03:30:00',
               '2017-01-03 04:00:00', '2017-01-03 04:30:00',
               ...
               '2017-12-28 19:00:00', '2017-12-28 19:30:00',
               '2017-12-28 20:00:00', '2017-12-28 20:30:00',
               '2017-12-28 21:00:00', '2017-12-28 21:30:00',
               '2017-12-28 22:00:00', '2017-12-28 22:30:00',
               '2017-12-28 23:00:00', '2017-12-28 23:30:00'],
              dtype='datetime64[ns]', name='datetime', length=7488, freq=None)
In[2]: sample.dtypes
Out[3]: 
timeblock     object
speed        float64
dtype: object
  • 1
    Является ли datetime индексом? Я получаю другой результат из вашего кода.
  • 0
    Извиняюсь. Да, дата и время являются индексом.
Показать ещё 3 комментария
Теги:
pandas

1 ответ

0

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

# Return the number of the week, based on date
sample['weeknum'] = sample['datetime'].dt.week

# Create blank dataframe
rollmean = pd.DataFrame()

# Create loop for the respective weeks needed. Take average within and add averages to the blank dataframe
for x in range(1,49):
    mask = (sample['weeknum'] >= x) & (sample['weeknum'] <= x + 3)
    window = sample[mask]
    win_mean = window.groupby('timeblock')['speed'].apply(lambda x: x.mean(skipna=False))
    rollmean = rollmean.append(win_mean)

# As all indices are labelled "speed", rename the indices
rollmean.index = range(1,49)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню