Verwenden von Slice in Polars Rolling mit Group_byPython

Python-Programme
Anonymous
 Verwenden von Slice in Polars Rolling mit Group_by

Post by Anonymous »

Ich habe versucht, eine Gewichtsreihe basierend auf der Länge des Rollfensters aufzuteilen. Anwendungsfälle können z.B. sein Wir möchten einige benutzerdefinierte Gewichte für den gleitenden Durchschnitt anwenden. (Soweit ich weiß, ist bereits ein Rolling_Mean implementiert.)
Könnte mir jemand erklären, warum ich den folgenden Fehler habe und wie ich das, was ich oben beschrieben habe, am besten erreichen kann? Danke!
Nehmen wir an, mein rollierendes Fenster hat eine Länge von 5. Die ersten 4 Zeilen haben eine Länge von 1, 2, 3, 4 und deshalb möchte ich nur die ersten paar Gewichte erhalten. Ab der fünften Zeile erwarte ich, dass die Gewichtungen immer [.1, .2, .3, .4, .5] betragen.
Der folgende Code funktioniert irgendwie, aber nicht wirklich (wie ich [0.5], [0.4, 0.5], ..., [0.2, 0.3, 0.4, 0.5] für die ersten 4 Zeilen erwarte:

Code: Select all

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')
)

Code: Select all

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] │
└───────┴───────┴─────┴───────────────────┘
Sobald ich jedoch die Anzahl der Zeilen auf 6 erhöhe, erhalte ich eine Fehlermeldung, die ich nicht ganz verstehe.

Code: Select all

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')
)

Code: Select all

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
Ich habe versucht, das Slicing ohne rollierendes Fenster durchzuführen, und es war in Ordnung, selbst wenn length=6 größer als die Länge der Serie ist:

Code: Select all

pl.select(
pl.lit(pl.Series([.1, .2, .3, .4, .5])).slice(-5, 6)
)

Code: Select all

shape: (5, 1)
┌─────┐
│     │
│ --- │
│ f64 │
╞═════╡
│ 0.1 │
│ 0.2 │
│ 0.3 │
│ 0.4 │
│ 0.5 │
└─────┘

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post