Использование сгруппированного z-показателя в скользящем окнеPython

Программы на Python
Ответить
Anonymous
 Использование сгруппированного z-показателя в скользящем окне

Сообщение Anonymous »

Я хотел бы рассчитать z-показатель для подборки на основе данных скользящего периода ретроспективного анализа.
Пример
Сегодняшнее количество посетителей в течение [9:30–9:35) должно быть нормализовано по z-показателю на основе (среднего, стандартного) посетителей, посетивших в течение [9:30–9:35] за последние 3 дня.
Обе мои текущие попытки повышают ИнвалидОперацияОшибка. Есть ли способ посчитать это в полярах?
import polars as pl

def z_score(col: str, over: str, alias: str):
# calculate z-score normalized `col` over `over`
return (
(pl.col(col)-pl.col(col).over(over).mean()) / pl.col(col).over(over).std()
).alias(alias)

df = pl.from_dict(
{
"timestamp": pd.date_range("2019-12-02 9:30", "2019-12-02 12:30", freq="30s").union(
pd.date_range("2019-12-03 9:30", "2019-12-03 12:30", freq="30s")
),
"visitors": [(e % 2) + 1 for e in range(722)]
}
# 5 minute bins for grouping [9:30-9:35) -> 930
).with_columns(
pl.col("timestamp").dt.truncate(every="5m").dt.to_string("%H%M").cast(pl.Int32).alias("five_minute_bin")
).with_columns(
pl.col("timestamp").dt.truncate(every="3d").alias("daytrunc")
)

# normalize visitor amount for each 5 min bin over the rolling 3 day window using z-score.

# not rolling but also wont work (InvalidOperationError: window expression not allowed in aggregation)
# df.with_columns(
# z_score("visitors", "five_minute_bin", "normalized").over("daytrunc")
# )

# won't work either (InvalidOperationError: window expression not allowed in aggregation)
#df.rolling(index_column="daytrunc", period="3i").agg(z_score("visitors", "five_minute_bin", "normalized"))

Для примера данных за 4 дня с четырьмя точками данных, каждая из которых лежит в двух временных интервалах ({0,0} – {0,1}), ({1,0} – {1,1})
Ввод:
Day 0: x_d0_{0,0}, x_d0_{0,1}, x_d0_{1,0}, x_d0_{1,1}
Day 1: x_d1_{0,0}, x_d1_{0,1}, x_d1_{1,0}, x_d1_{1,1}
Day 2: x_d2_{0,0}, x_d2_{0,1}, x_d2_{1,0}, x_d2_{1,1}
Day 3: x_d3_{0,0}, x_d3_{0,1}, x_d3_{1,0}, x_d3_{1,1}

Выход:
Day 0: norm_x_d0_{0,0} = nan, norm_x_d0_{0,1} = nan, norm_x_d0_{1,0} = nan, norm_x_d0_{1,1} = nan
Day 1: norm_x_d1_{0,0} = nan, norm_x_d1_{0,1} = nan, norm_x_d1_{1,0} = nan, norm_x_d1_{1,1} = nan
Day 2: norm_x_d2_{0,0} = nan, norm_x_d2_{0,1} = nan, norm_x_d2_{1,0} = nan, norm_x_d2_{1,1} = nan
Day 3: norm_x_d3_{0,0} = (x_d3_{0,0} - np.mean([x_d0_{0,0}, x_d0_{0,1}, X_d1_{0,0}, ..., x_d3_{0,1}]) / np.std([x_d0_{0,0}, x_d0_{0,1}, X_d1_{0,0}, ..., x_d3_{0,1}])) , ... ,


Подробнее здесь: https://stackoverflow.com/questions/753 ... ing-window
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»