Пользовательская функция Polars, возвращающая несколько функцийPython

Программы на Python
Ответить
Anonymous
 Пользовательская функция Polars, возвращающая несколько функций

Сообщение Anonymous »

Я оцениваю поляры для извлечения признаков временных рядов — например, копируя функциональность таких библиотек, как tsfresh.
У меня есть базовые принципы, которые работают очень хорошо , т. е. использование динамической группировки для создания окон, и большинство основных функций tsfel могут быть напрямую переопределены как пользовательские функции Polars (возможно, я могу это оптимизировать, но на данный момент производительность в порядке), т.е.

Код: Выделить всё

def var_larger_than_std(x: pl.Series) -> bool:
"""
Is variance higher than the standard deviation?

Boolean variable denoting if the variance of x is greater than its standard deviation. Is equal to variance of x
being larger than 1

:param x: the time series to calculate the feature of
:type x: pl.Series
:return: the value of this feature
:return type: bool
"""
y = x.var()
return y > np.sqrt(y)

q = (
dataset.lazy() \
.groupby_dynamic("ts_local", every="1d", by="id") \
.agg([
pl.col("value").count().alias("value__count"),
var_larger_than_std(pl.col("value")).alias("value__var_larger_than_std"),
])
)

q.collect()
Для базовых карт объектов f(series)->series это работает нормально. Однако довольно часто сложные карты объектов дают несколько выходных данных. Например, fft_coefficient выдает несколько выходных данных. В tsfel они возвращаются как dict, и каждый ключ:значение расширяется до отдельного pandas.Series в конечном pandas.Dataframe.
Как я могу воспроизвести это в полярах? Допустим, у меня есть функция

Код: Выделить всё

def complex_feature(x: pl.Series) -> Dict[str, float]:
return {"col1":0.0, "col2":1.0}

q = (
dataset.lazy() \
.groupby_dynamic("ts_local", every="1d", by="id") \
.agg([
complex_feature(pl.col("value")).???,
])
)

q.collect()

Код: Выделить всё

┌────────────────────────────────────┬──────┬──────┐
│ ts_local                           ┆ col1 ┆ col2 │
│ --------                           ┆ ---- ┆ ---- │
│ timestamp[ns,tz=Australia/Sydney]  ┆ f64  ┆ f64  │
╞════════════════════════════════════╪══════╪══════╡
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 2023-01-01                         ┆ 0.0  ┆ 1.0  │
└────────────────────────────────────┴──────┴──────┘
т.е. dict разбивается на отдельные столбцы (это не обязательно должен быть dict, я могу вернуть кортеж pl.Series или что-то еще)

Подробнее здесь: https://stackoverflow.com/questions/756 ... e-features
Ответить

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

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

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

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

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