группировка данных по времени пандас

Рейтинг: 0Ответов: 1Опубликовано: 23.06.2023

не могу додуматься как сгруппировать данные по времени.Нужно что бы код сгруппировал колонки currency_pair и side по времени из колонки Time_ms те строки которые укладываются в промежуток <=200ms и сложил значения по колонке amount.Максимум что я смог это сгруппировать через grouper,но проблема в том что у него точка отсчета с начала таблицы, из за этого происходит смещение по времени и некоторые отметки времени не попадают в группировку хотя удовлетворяют условию что разница между ними <=200ms.

import pandas as pd
import time
import datetime

#не переносить столбцы в консоли
pd.options.display.expand_frame_repr = False
agg_trades=({'Currency_pair':['btc','eth','eth','axs','btc','btc','btc','btc'],
             'Side':['sel','buy','buy','sel','buy','buy','buy','buy'],
             'Amount':[30,24,2,56,40,50,3,8],
             'Time_ms':[ 1684955778330.0,
                         1684960224095.0,
                         1684960224241.0,
                         1685020640819.0,
                         1685487516479.0,
                         1685487516487.0,
                         1685487516501.0,
                         1685487516952.0],
             'Price':[134.3,123.5,145.5,300000.4,520,854,472,450]})
df=pd.DataFrame(agg_trades)

#функция приобразуящая уникс время в милискикундах в  формат даты
def daytime (x):
    x=datetime.datetime.fromtimestamp(x/1000.0)
    return x
df['Time_ms']=df['Time_ms'].apply(daytime)
a=df.groupby(['Currency_pair','Side',pd.Grouper(key='Time_ms', freq='200ms')])['Amount']\
    .sum().reset_index()
print (a)

результат должен быть такой

Currency_pair  Side                 Time_ms  Amount
0           axs   sel 2023-05-25 13:17:20.800      56
1           btc   buy 2023-05-30 22:58:36.400      93
2           btc   buy 2023-05-30 22:58:36.800       8
3           btc   sel 2023-05-24 19:16:18.200      30
4           eth   buy 2023-05-24 20:30:24.000      26

время в миллисекундах после группировки в колонке time_ms не принципиально можно писать без них

Ответы

▲ 1Принят

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

import pandas as pd

agg_trades=({'Currency_pair':['btc','eth','eth','axs','btc','btc','btc','btc'],
             'Side':['sell','buy','buy','sel','buy','buy','buy','buy'],
             'Amount':[30,24,2,56,40,50,3,8],
             'Time_ms':[ 1684955778330.0,
                         1684960224095.0,
                         1684960224241.0,
                         1685020640819.0,
                         1685487516479.0,
                         1685487516487.0,
                         1685487516501.0,
                         1685487516952.0],
             'Price':[134.3,123.5,145.5,300000.4,520,854,472,450]})
df=pd.DataFrame(agg_trades)

df["diff"] = df.groupby(["Currency_pair","Side"])["Time_ms"].transform(
    lambda x: (x.diff().fillna(0) // 200).cumsum())
res = df.groupby(["Currency_pair","Side", "diff"], as_index=False)["Amount"].sum()

res:

  Currency_pair  Side  diff  Amount
0           axs   sel   0.0      56
1           btc   buy   0.0      93
2           btc   buy   2.0       8
3           btc  sell   0.0      30
4           eth   buy   0.0      26