Задать вопрос
@Sergey_Lomakin

Как сгруппировать строки в DF по условию?

Имеется датафрейм минутного графика, из которого нужно сделать 5-минутный.
DF m1:
open_time     open     high      low    close   volume
0   2024-01-31 23:59:00  42565.8  42569.9  42552.7  42552.7   59.705
1   2024-01-31 23:58:00  42595.8  42595.8  42563.5  42565.8   75.882
2   2024-01-31 23:57:00  42599.3  42599.3  42595.8  42595.8   12.515
3   2024-01-31 23:56:00  42589.6  42599.3  42589.5  42599.3   25.815
4   2024-01-31 23:55:00  42590.4  42594.0  42587.3  42589.6   12.476
5   2024-01-31 23:54:00  42593.1  42593.2  42587.6  42590.4   21.097
6   2024-01-31 23:53:00  42600.0  42600.0  42578.3  42593.1   57.818
7   2024-01-31 23:52:00  42590.1  42600.0  42590.0  42600.0   20.513
8   2024-01-31 23:51:00  42601.8  42601.8  42590.0  42590.1   14.209
9   2024-01-31 23:50:00  42618.6  42618.6  42601.8  42601.8    7.078
10  2024-01-31 23:49:00  42602.9  42620.0  42602.9  42618.6    8.912
11  2024-01-31 23:48:00  42591.0  42603.0  42591.0  42602.9   23.900
12  2024-01-31 23:47:00  42600.2  42600.2  42591.0  42591.0   43.929
13  2024-01-31 23:46:00  42616.0  42616.2  42600.2  42600.2    8.483
14  2024-01-31 23:45:00  42600.8  42621.5  42600.7  42616.0   13.942


нужно взять за каждые 5 строк:
df1['open_time'] = df.iloc[-1]['open_time']
df1['open'] = df.iloc[-1]['open']
df1['high'] = df.iloc[0:5]['high'].max()
df1['low'] = df.iloc[0:5]['low'].min()
df1['close'] = df.iloc[0]['close']
df1['volume'] = df.iloc[0:5]['volume'].sum()


чтобы получился DF вида
DF m5:
open_time     open     high      low    close  volume
0  2024-01-31 23:55:00  42590.4  42599.3  42552.7  42552.7  186.39
1  2024-01-31 23:50:00  42618.6  42618.6  42578.3  42590.4  120.72
2  2024-01-31 23:45:00  42600.8  42621.5  42591.0  42618.6   99.17


Можно это сделать в цикле for, но хотелось бы узнать более профессиональный и быстрый способ.
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Профессиональных способов несколько например использовать resample метод. Это специализированный groupby для временной последовательности, второй это использовать groupby вместе с pd.Grouper. Приведу простенький пример.
index = pd.date_range('1/1/2000', periods=9, freq='min')
df= pd.DataFrame(data=np.random.randint(1,10,(9,2)), index=index, columns=['A','B'])
df.resample('3min').agg({'A':'sum','B':'mean'})
Я создал фрейм с индексом временная последовательность (1 мин). сгруппировал по 3минуты и применил к каждой из колонок разные аггрегирующие функции.

Выбирать можно по любым временным интервалам. Почитай доки.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы