Мне нужна некоторая комбинация между функцией повторной выборки и прокрутки.В основном мне нужно пролонгировать секунды (например, в секунду - считать уникальные значения за последние X секунд), в то время как моя точность данных составляет миллисекунды.Поэтому мне нужно сгруппировать несколько записей в секунду (без агрегирования, чтобы не потерять информацию), а затем пролистать их.
пример: допустим, у меня есть следующий кадр данных, в котором индекс имеет метки времени с точностью до миллисекунд иданные являются категориальными (код для генерации кадра данных приведен ниже):
A
2019-01-01 13:00:00.060 1
2019-01-01 13:00:00.140 2
2019-01-01 13:00:00.731 1
2019-01-01 13:00:01.135 2
2019-01-01 13:00:01.344 3
2019-01-01 13:00:02.174 2
2019-01-01 13:00:02.213 3
2019-01-01 13:00:02.363 2
2019-01-01 13:00:02.951 1
2019-01-01 13:00:03.393 4
2019-01-01 13:00:03.454 4
2019-01-01 13:00:04.444 4
2019-01-01 13:00:05.123 1
2019-01-01 13:00:05.456 4
Я хочу, чтобы за каждую секунду раунда подсчитывалось уникальное значение за последние 2 секунды (размер окна = '2 с').
выполнение цикла for будет выглядеть так:
from pandas.tseries.frequencies import to_offset
idx_seconds = df.index.ceil('s').unique()
output = pd.Series(index=idx_seconds)
for s in idx_seconds:
print(f"{s-to_offset('2s')} - {s} -> {df.loc[s-to_offset('2s'):s, 'A'].to_list()}")
output [s] = df.loc[s-to_offset('2s'):s, 'A'].nunique()
Код будет разделять и группировать записи следующим образом (вывод кода):
2019-01-01 12:59:59 - 2019-01-01 13:00:01 -> [1, 2, 1]
2019-01-01 13:00:00 - 2019-01-01 13:00:02 -> [1, 2, 1, 2, 3]
2019-01-01 13:00:01 - 2019-01-01 13:00:03 -> [2, 3, 2, 3, 2, 1]
2019-01-01 13:00:02 - 2019-01-01 13:00:04 -> [2, 3, 2, 1, 4, 4]
2019-01-01 13:00:03 - 2019-01-01 13:00:05 -> [4, 4, 4]
2019-01-01 13:00:04 - 2019-01-01 13:00:06 -> [4, 1, 4]
и вывод будетвыглядеть так:
2019-01-01 13:00:01 2.0
2019-01-01 13:00:02 3.0
2019-01-01 13:00:03 3.0
2019-01-01 13:00:04 4.0
2019-01-01 13:00:05 1.0
2019-01-01 13:00:06 2.0
Я ищу более эффективное решение, которое не требует цикла.какие-либо предложения?
код для генерации кадра данных:
timestamps = [
'2019-01-01 13:00:00.060000', #0
'2019-01-01 13:00:00.140000', #0
'2019-01-01 13:00:00.731000', #0
'2019-01-01 13:00:01.135000', #1
'2019-01-01 13:00:01.344000', #1
'2019-01-01 13:00:02.174000', #2
'2019-01-01 13:00:02.213000', #2
'2019-01-01 13:00:02.363000', #2
'2019-01-01 13:00:02.951000', #2
'2019-01-01 13:00:03.393000', #3
'2019-01-01 13:00:03.454000', #3
'2019-01-01 13:00:04.444000', #4
'2019-01-01 13:00:05.123000', #5
'2019-01-01 13:00:05.456000', #5
]
df = pd.DataFrame([1, 2, 1, 2, 3, 2, 3, 2, 1, 4, 4, 4, 1 ,4]
,columns=['A'], index=pd.to_datetime(timestamps)