Я пытался разделить весовую серию на основе длины скользящего окна. Варианты использования могут быть, например. мы хотим применить некоторые пользовательские веса для скользящего среднего. (Я понимаю, что Rolling_mean уже реализован.)
Может ли кто-нибудь помочь объяснить, почему у меня возникает ошибка ниже и как правильно добиться того, что я описал выше? Спасибо!
Предположим, длина моего скользящего окна равна 5. Первые 4 строки будут иметь длину 1, 2, 3, 4, и поэтому я хочу получить только первые несколько весов. Я ожидаю, что начиная с пятой строки веса всегда будут [.1, .2, .3, .4, .5].
Следующий код "вроде" работает, но не совсем (как я ожидаю [0.5], [0.4, 0.5], ..., [0.2, 0.3, 0.4, 0.5]. для первых 4 строк:
pl.DataFrame({
't_idx': [1 ,2 ,3, 4, 5],
}).rolling('t_idx', period='5i').agg(
-pl.col('t_idx').len().cast(pl.Int64).alias('start'),
pl.col('t_idx').count().alias('end'),
pl.lit(pl.Series([.1, .2, .3, .4, .5])).slice(-pl.col('t_idx').len().cast(pl.Int64), pl.col('t_idx').count()).alias('weights')
)
shape: (5, 4)
┌───────┬───────┬─────┬───────────────────┐
│ t_idx ┆ start ┆ end ┆ new │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ u32 ┆ list[f64] │
╞═══════╪═══════╪═════╪═══════════════════╡
│ 1 ┆ -1 ┆ 1 ┆ [0.1] │
│ 2 ┆ -2 ┆ 2 ┆ [0.1, 0.2] │
│ 3 ┆ -3 ┆ 3 ┆ [0.1, 0.2, 0.3] │
│ 4 ┆ -4 ┆ 4 ┆ [0.1, 0.2, … 0.4] │
│ 5 ┆ -5 ┆ 5 ┆ [0.1, 0.2, … 0.5] │
└───────┴───────┴─────┴───────────────────┘
Однако, как только я увеличиваю количество строк до 6, я получаю ошибку, которую не до конца понимаю.
pl.DataFrame({
't_idx': [1 ,2 ,3, 4, 5, 6],
}).rolling('t_idx', period='5i').agg(
-pl.col('t_idx').len().cast(pl.Int64).alias('start'),
pl.col('t_idx').count().alias('end'),
pl.lit(pl.Series([.1, .2, .3, .4, .5])).slice(-pl.col('t_idx').len().cast(pl.Int64), pl.col('t_idx').count()).alias('weights')
)
thread 'polars-4' panicked at crates/polars-core/src/frame/group_by/aggregations/agg_list.rs:109:58:
range end index 6 out of range for slice of length 5
---------------------------------------------------------------------------
PanicException Traceback (most recent call last)
Cell In[828], line 3
1 pl.DataFrame({
2 't_idx': [1 ,2 ,3, 4, 5, 6],
----> 3 }).rolling('t_idx', period='5i').agg(
4 -pl.col('t_idx').len().cast(pl.Int64).alias('start'),
5 pl.col('t_idx').count().alias('end'),
6 pl.lit(pl.Series([.1, .2, .3, .4, .5])).slice(-pl.col('t_idx').len().cast(pl.Int64), pl.col('t_idx').count()).alias('new')
7 )
File ~/virtual_environments/vve_3_11_6/lib/python3.11/site-packages/polars/dataframe/group_by.py:896, in RollingGroupBy.agg(self, *aggs, **named_aggs)
868 def agg(
869 self,
870 *aggs: IntoExpr | Iterable[IntoExpr],
871 **named_aggs: IntoExpr,
872 ) -> DataFrame:
873 """
874 Compute aggregations for each group of a group by operation.
875
(...)
884 The resulting columns will be renamed to the keyword used.
885 """
886 return (
887 self.df.lazy()
888 .rolling(
889 index_column=self.time_column,
890 period=self.period,
891 offset=self.offset,
892 closed=self.closed,
893 group_by=self.group_by,
894 )
895 .agg(*aggs, **named_aggs)
--> 896 .collect(no_optimization=True)
897 )
File ~/virtual_environments/vve_3_11_6/lib/python3.11/site-packages/polars/lazyframe/frame.py:1967, in LazyFrame.collect(self, type_coercion, predicate_pushdown, projection_pushdown, simplify_expression, slice_pushdown, comm_subplan_elim, comm_subexpr_elim, cluster_with_columns, no_optimization, streaming, background, _eager, **_kwargs)
1964 # Only for testing purposes atm.
1965 callback = _kwargs.get("post_opt_callback")
-> 1967 return wrap_df(ldf.collect(callback))
PanicException: range end index 6 out of range for slice of length 5
Попробовал выполнить нарезку без прокручивания окна, все было нормально, даже если длина = 6 больше длины серии:
pl.select(
pl.lit(pl.Series([.1, .2, .3, .4, .5])).slice(-5, 6)
)
shape: (5, 1)
┌─────┐
│ │
│ --- │
│ f64 │
╞═════╡
│ 0.1 │
│ 0.2 │
│ 0.3 │
│ 0.4 │
│ 0.5 │
└─────┘
Подробнее здесь: https://stackoverflow.com/questions/786 ... h-group-by
Использование Slice в Polars Rolling с Group_by ⇐ Python
Программы на Python
-
Anonymous
1768827739
Anonymous
Я пытался разделить весовую серию на основе длины скользящего окна. Варианты использования могут быть, например. мы хотим применить некоторые пользовательские веса для скользящего среднего. (Я понимаю, что Rolling_mean уже реализован.)
Может ли кто-нибудь помочь объяснить, почему у меня возникает ошибка ниже и как правильно добиться того, что я описал выше? Спасибо!
Предположим, длина моего скользящего окна равна 5. Первые 4 строки будут иметь длину 1, 2, 3, 4, и поэтому я хочу получить только первые несколько весов. Я ожидаю, что начиная с пятой строки веса всегда будут [.1, .2, .3, .4, .5].
Следующий код "вроде" работает, но не совсем (как я ожидаю [0.5], [0.4, 0.5], ..., [0.2, 0.3, 0.4, 0.5]. для первых 4 строк:
pl.DataFrame({
't_idx': [1 ,2 ,3, 4, 5],
}).rolling('t_idx', period='5i').agg(
-pl.col('t_idx').len().cast(pl.Int64).alias('start'),
pl.col('t_idx').count().alias('end'),
pl.lit(pl.Series([.1, .2, .3, .4, .5])).slice(-pl.col('t_idx').len().cast(pl.Int64), pl.col('t_idx').count()).alias('weights')
)
shape: (5, 4)
┌───────┬───────┬─────┬───────────────────┐
│ t_idx ┆ start ┆ end ┆ new │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ u32 ┆ list[f64] │
╞═══════╪═══════╪═════╪═══════════════════╡
│ 1 ┆ -1 ┆ 1 ┆ [0.1] │
│ 2 ┆ -2 ┆ 2 ┆ [0.1, 0.2] │
│ 3 ┆ -3 ┆ 3 ┆ [0.1, 0.2, 0.3] │
│ 4 ┆ -4 ┆ 4 ┆ [0.1, 0.2, … 0.4] │
│ 5 ┆ -5 ┆ 5 ┆ [0.1, 0.2, … 0.5] │
└───────┴───────┴─────┴───────────────────┘
Однако, как только я увеличиваю количество строк до 6, я получаю ошибку, которую не до конца понимаю.
pl.DataFrame({
't_idx': [1 ,2 ,3, 4, 5, 6],
}).rolling('t_idx', period='5i').agg(
-pl.col('t_idx').len().cast(pl.Int64).alias('start'),
pl.col('t_idx').count().alias('end'),
pl.lit(pl.Series([.1, .2, .3, .4, .5])).slice(-pl.col('t_idx').len().cast(pl.Int64), pl.col('t_idx').count()).alias('weights')
)
thread 'polars-4' panicked at crates/polars-core/src/frame/group_by/aggregations/agg_list.rs:109:58:
range end index 6 out of range for slice of length 5
---------------------------------------------------------------------------
PanicException Traceback (most recent call last)
Cell In[828], line 3
1 pl.DataFrame({
2 't_idx': [1 ,2 ,3, 4, 5, 6],
----> 3 }).rolling('t_idx', period='5i').agg(
4 -pl.col('t_idx').len().cast(pl.Int64).alias('start'),
5 pl.col('t_idx').count().alias('end'),
6 pl.lit(pl.Series([.1, .2, .3, .4, .5])).slice(-pl.col('t_idx').len().cast(pl.Int64), pl.col('t_idx').count()).alias('new')
7 )
File ~/virtual_environments/vve_3_11_6/lib/python3.11/site-packages/polars/dataframe/group_by.py:896, in RollingGroupBy.agg(self, *aggs, **named_aggs)
868 def agg(
869 self,
870 *aggs: IntoExpr | Iterable[IntoExpr],
871 **named_aggs: IntoExpr,
872 ) -> DataFrame:
873 """
874 Compute aggregations for each group of a group by operation.
875
(...)
884 The resulting columns will be renamed to the keyword used.
885 """
886 return (
887 self.df.lazy()
888 .rolling(
889 index_column=self.time_column,
890 period=self.period,
891 offset=self.offset,
892 closed=self.closed,
893 group_by=self.group_by,
894 )
895 .agg(*aggs, **named_aggs)
--> 896 .collect(no_optimization=True)
897 )
File ~/virtual_environments/vve_3_11_6/lib/python3.11/site-packages/polars/lazyframe/frame.py:1967, in LazyFrame.collect(self, type_coercion, predicate_pushdown, projection_pushdown, simplify_expression, slice_pushdown, comm_subplan_elim, comm_subexpr_elim, cluster_with_columns, no_optimization, streaming, background, _eager, **_kwargs)
1964 # Only for testing purposes atm.
1965 callback = _kwargs.get("post_opt_callback")
-> 1967 return wrap_df(ldf.collect(callback))
PanicException: range end index 6 out of range for slice of length 5
Попробовал выполнить нарезку без прокручивания окна, все было нормально, даже если длина = 6 больше длины серии:
pl.select(
pl.lit(pl.Series([.1, .2, .3, .4, .5])).slice(-5, 6)
)
shape: (5, 1)
┌─────┐
│ │
│ --- │
│ f64 │
╞═════╡
│ 0.1 │
│ 0.2 │
│ 0.3 │
│ 0.4 │
│ 0.5 │
└─────┘
Подробнее здесь: [url]https://stackoverflow.com/questions/78665208/using-slice-in-polars-rolling-with-group-by[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия