Группировка временных рядов на неровных частотах - PullRequest
1 голос
/ 17 апреля 2020

У меня есть pandas фрейм данных, который выглядит следующим образом

    timestamp             price
0   2020-01-01 00:00:03     5
1   2020-01-01 00:03:03     10
2   2020-01-01 00:08:03     10
3   2020-01-01 00:09:03     10
4   2020-01-01 00:10:03     5
5   2020-01-01 00:13:03     10
6   2020-01-01 00:18:03     10
7   2020-01-01 00:19:03     10

Код для его создания:

df = pd.DataFrame([['2020-01-01 00:00:03', 5], ['2020-01-01 00:03:03', 10], ['2020-01-01 00:08:03', 10], ['2020-01-01 00:09:03', 10], ['2020-01-01 00:10:03', 5], ['2020-01-01 00:13:03', 10], ['2020-01-01 00:18:03', 10], ['2020-01-01 00:19:03', 10]], columns= ['timestamp', 'price'])

Я могу использовать такой группировщик, чтобы конвертировать его в четные группы 10 минут.

df.groupby(pd.Grouper(key='timestamp', freq="10Min", label='left')).sum()

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

timestamp                 price
0   2020-01-01 00:00:00     25
1   2020-01-01 00:09:00     10
2   2020-01-01 00:10:00     25
3   2020-01-01 00:19:00     10

1 Ответ

0 голосов
/ 17 апреля 2020

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

Я признаю, что это немного глупо, и что итерации по фреймам данных не идеальны.

import pandas as pd

df = pd.DataFrame([['2020-01-01 00:00:03', 5], ['2020-01-01 00:03:03', 10], 
    ['2020-01-01 00:08:03', 10], ['2020-01-01 00:09:03', 10], ['2020-01-01 00:10:03', 5], 
    ['2020-01-01 00:13:03', 10], ['2020-01-01 00:18:03', 10], ['2020-01-01 00:19:03', 10]], 
    columns= ['timestamp', 'price'])

# to use pd.Grouper, you need to have your index set to a datetime format
df['timestamp'] = pd.to_datetime(df['timestamp'],infer_datetime_format=True)
df.set_index('timestamp', inplace=True)

# split the dataframe into segments of 1 minute
df_minutes = df.groupby(pd.Grouper(freq="1Min", label='left')).sum()

# Create your final df that will be filled
final_df = pd.DataFrame(columns = ["price"])
final_df.index.name = "timestamp"

# the counter i will group your df into multiples of 10 by its length
for i in range(int(len(df_minutes) / 10)):
    # sum together the first 9 minutes
    start = 10*i
    end = start + 9
    final_df = pd.concat([final_df, df_minutes[start:end].groupby(pd.Grouper(freq="10Min", label='left')).sum()])
    # then the next 1 minute
    start = 10*i + 9
    end = start + 1
    final_df = pd.concat([final_df, df_minutes[start:end].groupby(pd.Grouper(freq="1Min", label='left')).sum()])

Выход:

>>> final_df
                    price
timestamp                
2020-01-01 00:00:00    25
2020-01-01 00:09:00    10
2020-01-01 00:10:00    25
2020-01-01 00:19:00    10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...