группировка пандас в миллисекундах
подскажите, создал прототип вебсокета, где данные идут ввиде ответа джисон.Далее я группирую данные где совпадают значения в колонках '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мс, то напечатать предыдущую группировку