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

подскажите, создал прототип вебсокета, где данные идут ввиде ответа джисон.Далее я группирую данные где совпадают значения в колонках 'Currency_pair', 'Side' , складываю их значения по колонке 'Amount' если значения там не выходят за предел 200мс.И печатаю датафрейм если в нем появляются значения 'Amount>=10000'.Задача состоит в том как не печатать каждое сложение когда возникает условие 'Amount>=10000', а печатать только тогда когда в конкретной группировке прошло 200мс.

import pandas as pd
import time
old_df = pd.DataFrame()
CurrPair = list()
res = {'Currency_pair':['btc','eth','eth','axs','btc','btc','btc','btc','axs','vet','vet'],
        'Side':['buy','buy','buy','sell','buy','buy','buy','buy','sell','sell','sell'],
         'Amount':[30,24,2,10000,9000,700,300,8,700,20000,20000],
         'Time_ms':[ 1685455778320.0,
                     1684960224621.0,
                     1684960224800.0,
                     1684960224750.0,
                     1685487516463.0,
                     1685487516470.0,
                     1685487516490.0,
                     1685455778148.0,
                     1684960224750.0,
                     1685487516963.0,
                     1685487516970.0],
         'Price':[134.3,123.5,145.5,300.4,520,854,472,450,470,45,45]}


df = pd.DataFrame(res).sort_values(["Time_ms"])
print(df)
for i,row in df.iterrows():
    a = df.iloc[i].to_list()
    CurrPair.extend([a])
    df1 = pd.DataFrame(CurrPair, columns=['Currency_pair', 'Side', 'Amount', 'Time_ms', 'Price']) \
        .astype({'Amount': 'int', 'Price': 'int', 'Time_ms': 'float'}).sort_values(by=['Time_ms'])
    #группируем данные по столбцам где время между событиями не превышает 200мс
    df1["diff"] = df1.groupby(["Currency_pair", "Side"])["Time_ms"].transform(
        lambda x: (x.diff().fillna(0) // 200).cumsum())
    #складываем в этих промежутках значения в колонке amount
    agg_df = (df1.groupby(["Currency_pair", "Side", "diff"],as_index=False)["Amount"]\
            .sum()) \
            .query('Amount>=10000')\
            .reset_index(drop=True)
    indx_len = len(agg_df.index)
    #проверяем не появились ли данные
    if indx_len >= 1:
            f = old_df.equals(agg_df)
            #проверяем новый датафрейм с предыдущим на разницу что бы не печатать одинаковый
            if f == False:
                print(agg_df)
                old_df = agg_df
    time.sleep(1)
    i += 1

ответ должен быть такой

Currency_pair  Side  diff  Amount
0           axs  sell   0.0   10700
1           vet  sell   0.0   40000
  Currency_pair  Side  diff  Amount
0           axs  sell   0.0   10700
1           btc   buy   0.0   10000
2           vet  sell   0.0   40000

upd: Попробую по другому сформулировать задачу, можно ли взять минимальное значение времени в групперовке по двум колонкам ["Currency_pair", "Side"] , сложить ['amount] в диапозоне 200мс, потом эту группировку сравнить со следующей такой же ["Currency_pair", "Side"] , так же взять из нее минимально значение по времени, сравнить с предыдущим минимумом(из предыдущей группировки) и если разница больше 200мс, то напечатать предыдущую группировку


Ответы (0 шт):