我有一個資料框如下
┌────────────┬──────────┬──────────┬──────────┬──────────┐
│ time ┆ open ┆ high ┆ low ┆ close │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │
╞════════════╪══════════╪══════════╪══════════╪══════════╡
│ 1649016000 ┆ 46405.49 ┆ 47444.11 ┆ 46248.84 ┆ 46407.35 │
├????????????┼??????????┼??????????┼??????????┼??????????┤
│ 1649030400 ┆ 46407.36 ┆ 46461.14 ┆ 45744.77 ┆ 46005.44 │
├????????????┼??????????┼??????????┼??????????┼??????????┤
│ 1649044800 ┆ 46005.43 ┆ 46293.38 ┆ 45834.39 ┆ 46173.99 │
├????????????┼??????????┼??????????┼??????????┼??????????┤
│ 1649059200 ┆ 46174.0 ┆ 46287.97 ┆ 45787.0 ┆ 46160.09 │
├????????????┼??????????┼??????????┼??????????┼??????????┤
│ ... ┆ ... ┆ ... ┆ ... ┆ ... │
├????????????┼??????????┼??????????┼??????????┼??????????┤
│ 1653278400 ┆ 30171.32 ┆ 30670.51 ┆ 30101.07 ┆ 30457.01 │
├????????????┼??????????┼??????????┼??????????┼??????????┤
│ 1653292800 ┆ 30457.01 ┆ 30616.18 ┆ 30281.89 ┆ 30397.11 │
├????????????┼??????????┼??????????┼??????????┼??????????┤
│ 1653307200 ┆ 30397.12 ┆ 30625.98 ┆ 29967.07 ┆ 30373.53 │
├????????????┼??????????┼??????????┼??????????┼??????????┤
│ 1653321600 ┆ 30373.53 ┆ 30529.9 ┆ 30042.09 ┆ 30121.02 │
└────────────┴──────────┴──────────┴──────────┴──────────┘
我想計算每個價格(低和高)在 2 到 50 的視窗范圍內是區域最小值/最大值的次數。
首先,我為每行添加兩列作為本地最小值/最大值的計數,并用零填充
raw_data["lmin_count"] = np.zeros(len(raw_data), dtype=np.int16)
raw_data["lmax_count"] = np.zeros(len(raw_data), dtype=np.int16)
然后我將視窗長度從 2 迭代到 50,并使用以下方法找到每個區域最小值/最大值的索引:
for _order in range(2, 51):
local_minima = argrelextrema(raw_data["low"].to_numpy(), np.less, order=_order)[0]
local_maxima = argrelextrema(raw_data["high"].to_numpy(), np.greater, order=_order)[0]
這order是視窗長度。
并且在視窗長度的每次迭代中,我想通過在中找到的索引來增加lmin_count和的值,
我嘗試通過以下代碼增加值:lmax_countlocal_minimalocal_maxima
if len(local_minima) > 1:
raw_data[local_minima,5] = 1
if len(local_maxima) > 1:
raw_data[local_minima,6] = 1
其中local_minima和local_maxima是索引陣列,5,6是lmin_count和lmax_count列的索引。
但有錯誤not implemented。
那么逐行索引增加(或分配)值的最佳方法是什么?
更新 2022/05/24
由于答案非常有幫助,現在我還有其他問題。我改變了我的代碼如下:
min_expr_list = [
(
pl.col("price").rolling_min(
window_size=_order * 2 1, min_periods=_order 2, center=True
)
== pl.col("price")
).cast(pl.UInt32)
for _order in range(200, 1001)
]
max_expr_list = [
(
pl.col("price").rolling_max(
window_size=_order * 2 1, min_periods=_order 2, center=True
)
== pl.col("price")
).cast(pl.UInt32)
for _order in range(200, 1001)
]
raw_data = raw_data.with_columns(
[
pl.sum(min_expr_list).alias("min_freq"),
pl.sum(max_expr_list).alias("max_freq"),
]
)
第一:是否可以將兩者合并min_expr_list到max_expr_list一個串列中?如果可能的話,在with_columns運算式中如何根據串列的每個元素添加單獨的列?
我面臨的另一個問題是這種方法的記憶體使用。在前面的示例_order中是有限的,但實際上它比示例更廣泛。
目前我有數百萬條記錄的資料集(其中一些記錄超過 1000 萬條),_orders范圍可以從 2 到 1500,因此計算需要大量 GB 的記憶體。
有沒有更好的方法來做到這一點?
還有一個側面問題。當增加到_order超過 1000 時,它似乎不起作用。源代碼有什么限制嗎?
uj5u.com熱心網友回復:
你撰寫了非常命令式的代碼,這并不是真正地道的極地。您通常甚至不應該知道值的索引在哪里。相反,您分配 by conditions,例如使用when(condition) -> then(value) -> otherwise(value)運算式。
您在 a 中的條件when仍然可以參考索引。例如,這個片段等于分配給一個特定的索引,但寫得更實用:
pl.DataFrame({
"letters": ["a", "b", "c", "d"]
}).with_column(
# use a condition to determine the index location
pl.when(pl.arange(0, pl.count()) == 2)
.then("idx_2")
.otherwise("letters").alias("letters")
)
shape: (4, 1)
┌─────────┐
│ letters │
│ --- │
│ str │
╞═════════╡
│ letters │
├?????????┤
│ letters │
├?????????┤
│ idx_2 │
├?????????┤
│ letters │
└─────────┘
您的意圖,計算區域最小值/最大值
為了在您的事業中為您提供幫助,我想向您展示如何以慣用的極地方式找到當地的最小值。
區域最小值/最大值可以通過以下方式找到:
- 取
dy/dx函式的導數x。 - 計算
sign那個導數告訴我們函式斜率在哪里增加和減少。 - 如果我們取符號的導數,
dy/dx我們就知道符號在哪里變化,因此我們在哪里有區域最小值/最大值。
讓我們在一個 dummy 上試試這個DataFrame。
df = pl.DataFrame({
"x": [8, 4, 2, 7, 9, 6, 3, 0]
})
# find the local minima/maxima
df = df.with_columns([
(pl.col("x").diff().sign().diff().shift(-1) == -2).alias("local_maximum"),
(pl.col("x").diff().sign().diff().shift(-1) == 2).alias("local_minimum")
])
print(df)
shape: (8, 3)
┌─────┬───────────────┬───────────────┐
│ x ┆ local_maximum ┆ local_minimum │
│ --- ┆ --- ┆ --- │
│ i64 ┆ bool ┆ bool │
╞═════╪═══════════════╪═══════════════╡
│ 8 ┆ false ┆ false │
├?????┼???????????????┼???????????????┤
│ 4 ┆ false ┆ false │
├?????┼???????????????┼???????????????┤
│ 2 ┆ false ┆ true │
├?????┼???????????????┼???????????????┤
│ 7 ┆ false ┆ false │
├?????┼???????????????┼???????????????┤
│ 9 ┆ true ┆ false │
├?????┼???????????????┼???????????????┤
│ 6 ┆ false ┆ false │
├?????┼???????????????┼???????????????┤
│ 3 ┆ false ┆ false │
├?????┼???????????????┼???????????????┤
│ 0 ┆ false ┆ false │
└─────┴───────────────┴───────────────┘
接下來我們可以用cumulative sum來計算總看到的區域最小值和最大值。
df.with_columns([
pl.col("local_maximum").cumsum().alias("local_max_count"),
pl.col("local_minimum").cumsum().alias("local_min_count")
])
shape: (8, 5)
┌─────┬───────────────┬───────────────┬─────────────────┬─────────────────┐
│ x ┆ local_maximum ┆ local_minimum ┆ local_max_count ┆ local_min_count │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ bool ┆ bool ┆ u32 ┆ u32 │
╞═════╪═══════════════╪═══════════════╪═════════════════╪═════════════════╡
│ 8 ┆ false ┆ false ┆ 0 ┆ 0 │
├?????┼???????????????┼???????????????┼?????????????????┼?????????????????┤
│ 4 ┆ false ┆ false ┆ 0 ┆ 0 │
├?????┼???????????????┼???????????????┼?????????????????┼?????????????????┤
│ 2 ┆ false ┆ true ┆ 0 ┆ 1 │
├?????┼???????????????┼???????????????┼?????????????????┼?????????????????┤
│ 7 ┆ false ┆ false ┆ 0 ┆ 1 │
├?????┼???????????????┼???????????????┼?????????????????┼?????????????????┤
│ 9 ┆ true ┆ false ┆ 1 ┆ 1 │
├?????┼???????????????┼???????????????┼?????????????????┼?????????????????┤
│ 6 ┆ false ┆ false ┆ 1 ┆ 1 │
├?????┼???????????????┼???????????????┼?????????????????┼?????????????????┤
│ 3 ┆ false ┆ false ┆ 1 ┆ 1 │
├?????┼???????????????┼???????????????┼?????????????????┼?????????????????┤
│ 0 ┆ false ┆ false ┆ 1 ┆ 1 │
└─────┴───────────────┴───────────────┴─────────────────┴─────────────────┘
我希望這有助于將您推向正確的方向。
uj5u.com熱心網友回復:
讓我看看我們是否可以在@ritchie46 回應的基礎上進一步推動您接近終點線。
資料
我在您的示例資料中連接了“開放”、“高”和“低”列,只是為了給我們一些資料來處理。我還添加了一個row_nr專欄,僅供討論。(它不會用于任何計算,因此您無需將其包含在最終代碼中。)
import numpy as np
import polars as pl
from scipy.signal import argrelextrema
df = pl.DataFrame(
{
"col1": [
46405.49, 46407.36, 46005.43, 46174.00, 30171.32, 30457.01, 30397.12, 30373.53,
47444.11, 46461.14, 46293.38, 46287.97, 30670.51, 30616.18, 30625.98, 30529.90,
46248.84, 45744.77, 45834.39, 45787.00, 30101.07, 30281.89, 29967.07, 30042.09,
]
}
).with_row_count()
df
shape: (24, 2)
┌────────┬──────────┐
│ row_nr ┆ col1 │
│ --- ┆ --- │
│ u32 ┆ f64 │
╞════════╪══════════╡
│ 0 ┆ 46405.49 │
├????????┼??????????┤
│ 1 ┆ 46407.36 │
├????????┼??????????┤
│ 2 ┆ 46005.43 │
├????????┼??????????┤
│ 3 ┆ 46174.0 │
├????????┼??????????┤
│ 4 ┆ 30171.32 │
├????????┼??????????┤
│ 5 ┆ 30457.01 │
├????????┼??????????┤
│ 6 ┆ 30397.12 │
├????????┼??????????┤
│ 7 ┆ 30373.53 │
├????????┼??????????┤
│ 8 ┆ 47444.11 │
├????????┼??????????┤
│ 9 ┆ 46461.14 │
├????????┼??????????┤
│ 10 ┆ 46293.38 │
├????????┼??????????┤
│ 11 ┆ 46287.97 │
├????????┼??????????┤
│ 12 ┆ 30670.51 │
├????????┼??????????┤
│ 13 ┆ 30616.18 │
├????????┼??????????┤
│ 14 ┆ 30625.98 │
├????????┼??????????┤
│ 15 ┆ 30529.9 │
├????????┼??????????┤
│ 16 ┆ 46248.84 │
├????????┼??????????┤
│ 17 ┆ 45744.77 │
├????????┼??????????┤
│ 18 ┆ 45834.39 │
├????????┼??????????┤
│ 19 ┆ 45787.0 │
├????????┼??????????┤
│ 20 ┆ 30101.07 │
├????????┼??????????┤
│ 21 ┆ 30281.89 │
├????????┼??????????┤
│ 22 ┆ 29967.07 │
├????????┼??????????┤
│ 23 ┆ 30042.09 │
└────────┴──────────┘
現在,讓我們scipy.signal.argrelextrema在這些資料上運行代碼。
for _order in range(1, 7):
print(
"order:", _order, ":", argrelextrema(df["col1"].to_numpy(), np.less, order=_order)
)
order: 1 : (array([ 2, 4, 7, 13, 15, 17, 20, 22]),)
order: 2 : (array([ 4, 7, 15, 22]),)
order: 3 : (array([ 4, 15, 22]),)
order: 4 : (array([ 4, 15, 22]),)
order: 5 : (array([ 4, 22]),)
order: 6 : (array([ 4, 22]),)
從輸出中,您似乎正在嘗試查找任何行的索引,該索引是以該行為中心的視窗的最小值,適用于各種視窗大小。
例如,row_nr2 是大小為 3 的視窗的區域最小值,以row_nr2 為中心。(這里,order=1在呼叫中的argrelextrema意思是“包括一個上下一個值”,因此“視窗大小”= (order * 2) 1 ) = 3。
讓我們在 Polars 中復制它。我們將逐步進行。
rolling_min
首先,讓我們使用rolling_min運算式來計算對應于從 1 到 6 的滾動最小值。請注意,Polars 允許我們在背景關系order之外生成運算式串列。with_columns(這通常有助于使代碼更具可讀性。)
我正在將 scipyorder關鍵字轉換window_size為rolling_min. 另外,我設定min_periods以確保在任何視窗的中心值的每一側至少有一個值(以復制 scipy 計算)。
expr_list = [
pl.col("col1").rolling_min(
window_size=_order * 2 1,
min_periods=_order 2,
center=True
).alias("roll_min" str(_order))
for _order in range(1, 7)
]
df.with_columns(expr_list)
shape: (24, 8)
┌────────┬──────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┐
│ row_nr ┆ col1 ┆ roll_min1 ┆ roll_min2 ┆ roll_min3 ┆ roll_min4 ┆ roll_min5 ┆ roll_min6 │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ u32 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │
╞════════╪══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╡
│ 0 ┆ 46405.49 ┆ null ┆ null ┆ null ┆ null ┆ null ┆ null │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 1 ┆ 46407.36 ┆ 46005.43 ┆ 46005.43 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 2 ┆ 46005.43 ┆ 46005.43 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 3 ┆ 46174.0 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 4 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 5 ┆ 30457.01 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 6 ┆ 30397.12 ┆ 30373.53 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 7 ┆ 30373.53 ┆ 30373.53 ┆ 30373.53 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 8 ┆ 47444.11 ┆ 30373.53 ┆ 30373.53 ┆ 30373.53 ┆ 30171.32 ┆ 30171.32 ┆ 30171.32 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 9 ┆ 46461.14 ┆ 46293.38 ┆ 30373.53 ┆ 30373.53 ┆ 30373.53 ┆ 30171.32 ┆ 30171.32 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 10 ┆ 46293.38 ┆ 46287.97 ┆ 30670.51 ┆ 30373.53 ┆ 30373.53 ┆ 30373.53 ┆ 30171.32 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 11 ┆ 46287.97 ┆ 30670.51 ┆ 30616.18 ┆ 30616.18 ┆ 30373.53 ┆ 30373.53 ┆ 30373.53 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 12 ┆ 30670.51 ┆ 30616.18 ┆ 30616.18 ┆ 30529.9 ┆ 30529.9 ┆ 30373.53 ┆ 30373.53 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 13 ┆ 30616.18 ┆ 30616.18 ┆ 30529.9 ┆ 30529.9 ┆ 30529.9 ┆ 30529.9 ┆ 30373.53 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 14 ┆ 30625.98 ┆ 30529.9 ┆ 30529.9 ┆ 30529.9 ┆ 30529.9 ┆ 30529.9 ┆ 30101.07 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 15 ┆ 30529.9 ┆ 30529.9 ┆ 30529.9 ┆ 30529.9 ┆ 30529.9 ┆ 30101.07 ┆ 30101.07 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 16 ┆ 46248.84 ┆ 30529.9 ┆ 30529.9 ┆ 30529.9 ┆ 30101.07 ┆ 30101.07 ┆ 29967.07 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 17 ┆ 45744.77 ┆ 45744.77 ┆ 30529.9 ┆ 30101.07 ┆ 30101.07 ┆ 29967.07 ┆ 29967.07 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 18 ┆ 45834.39 ┆ 45744.77 ┆ 30101.07 ┆ 30101.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 19 ┆ 45787.0 ┆ 30101.07 ┆ 30101.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 20 ┆ 30101.07 ┆ 30101.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 21 ┆ 30281.89 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 22 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 ┆ 29967.07 │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 23 ┆ 30042.09 ┆ null ┆ null ┆ null ┆ null ┆ null ┆ null │
└────────┴──────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┘
查看中的輸出roll_min_1(相當于對 的order=1呼叫argrelextrema),我們看到 中的值roll_min_1 等于 2、4、7、13、15、17、20、22 中的值col1……row_nr這完全對應于argrelextrema為order=1. 同樣,對于其他roll_min_X列。我們將在下一步中使用這個事實。
獲取行索引
正如@ritchie46 指出的那樣,在 Polars 中,我們使用條件(不是索引)。我們將修改上面的代碼,以確定col1每個視窗大小的值是否等于滾動最小值。
expr_list = [
(
pl.col("col1").rolling_min(
window_size=_order * 2 1,
min_periods=_order 2,
center=True
)
== pl.col("col1")
).alias("min_idx_" str(_order))
for _order in range(1, 7)
]
df.with_columns(expr_list)
shape: (24, 8)
┌────────┬──────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┐
│ row_nr ┆ col1 ┆ min_idx_1 ┆ min_idx_2 ┆ min_idx_3 ┆ min_idx_4 ┆ min_idx_5 ┆ min_idx_6 │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ u32 ┆ f64 ┆ bool ┆ bool ┆ bool ┆ bool ┆ bool ┆ bool │
╞════════╪══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╡
│ 0 ┆ 46405.49 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 1 ┆ 46407.36 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 2 ┆ 46005.43 ┆ true ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 3 ┆ 46174.0 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 4 ┆ 30171.32 ┆ true ┆ true ┆ true ┆ true ┆ true ┆ true │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 5 ┆ 30457.01 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 6 ┆ 30397.12 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 7 ┆ 30373.53 ┆ true ┆ true ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 8 ┆ 47444.11 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 9 ┆ 46461.14 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 10 ┆ 46293.38 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 11 ┆ 46287.97 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 12 ┆ 30670.51 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 13 ┆ 30616.18 ┆ true ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 14 ┆ 30625.98 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 15 ┆ 30529.9 ┆ true ┆ true ┆ true ┆ true ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 16 ┆ 46248.84 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 17 ┆ 45744.77 ┆ true ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 18 ┆ 45834.39 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 19 ┆ 45787.0 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 20 ┆ 30101.07 ┆ true ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 21 ┆ 30281.89 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 22 ┆ 29967.07 ┆ true ┆ true ┆ true ┆ true ┆ true ┆ true │
├????????┼??????????┼???????????┼???????????┼???????????┼???????????┼???????????┼???????????┤
│ 23 ┆ 30042.09 ┆ false ┆ false ┆ false ┆ false ┆ false ┆ false │
└────────┴──────────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┘
請注意,對于min_idx_1,對于 2、4、7、13、15、17、20、22,這些值都為真row_nr,這對應于argrelextremafor的輸出order=1。同樣,對于其他列。
求和
我們現在可以使用該cast函式和該polars.sum函式對我們的列進行逐行求和。(事實上??,我們不會保留滾動的最小列——我們只會保留總和)。
expr_list = [
(
pl.col("col1").rolling_min(
window_size=_order * 2 1,
min_periods=_order 2,
center=True
)
== pl.col("col1")
).cast(pl.UInt32)
for _order in range(1, 7)
]
df.with_columns(pl.sum(expr_list).alias("min_freq"))
┌────────┬──────────┬──────────┐
│ row_nr ┆ col1 ┆ min_freq │
│ --- ┆ --- ┆ --- │
│ u32 ┆ f64 ┆ u32 │
╞════════╪══════════╪══════════╡
│ 0 ┆ 46405.49 ┆ 0 │
├????????┼??????????┼??????????┤
│ 1 ┆ 46407.36 ┆ 0 │
├????????┼??????????┼??????????┤
│ 2 ┆ 46005.43 ┆ 1 │
├????????┼??????????┼??????????┤
│ 3 ┆ 46174.0 ┆ 0 │
├????????┼??????????┼??????????┤
│ 4 ┆ 30171.32 ┆ 6 │
├????????┼??????????┼??????????┤
│ 5 ┆ 30457.01 ┆ 0 │
├????????┼??????????┼??????????┤
│ 6 ┆ 30397.12 ┆ 0 │
├????????┼??????????┼??????????┤
│ 7 ┆ 30373.53 ┆ 2 │
├????????┼??????????┼??????????┤
│ 8 ┆ 47444.11 ┆ 0 │
├????????┼??????????┼??????????┤
│ 9 ┆ 46461.14 ┆ 0 │
├????????┼??????????┼??????????┤
│ 10 ┆ 46293.38 ┆ 0 │
├????????┼??????????┼??????????┤
│ 11 ┆ 46287.97 ┆ 0 │
├????????┼??????????┼??????????┤
│ 12 ┆ 30670.51 ┆ 0 │
├????????┼??????????┼??????????┤
│ 13 ┆ 30616.18 ┆ 1 │
├????????┼??????????┼??????????┤
│ 14 ┆ 30625.98 ┆ 0 │
├????????┼??????????┼??????????┤
│ 15 ┆ 30529.9 ┆ 4 │
├????????┼??????????┼??????????┤
│ 16 ┆ 46248.84 ┆ 0 │
├????????┼??????????┼??????????┤
│ 17 ┆ 45744.77 ┆ 1 │
├????????┼??????????┼??????????┤
│ 18 ┆ 45834.39 ┆ 0 │
├????????┼??????????┼??????????┤
│ 19 ┆ 45787.0 ┆ 0 │
├????????┼??????????┼??????????┤
│ 20 ┆ 30101.07 ┆ 1 │
├????????┼??????????┼??????????┤
│ 21 ┆ 30281.89 ┆ 0 │
├????????┼??????????┼??????????┤
│ 22 ┆ 29967.07 ┆ 6 │
├????????┼??????????┼??????????┤
│ 23 ┆ 30042.09 ┆ 0 │
└────────┴──────────┴──────────┘
我相信這是您希望獲得的結果。
從這里開始,我認為您可以擴展上面的代碼以獲得滾動最大值。
領帶
此代碼和代碼之間的一個區別argrelextrema與關系有關。如果兩個值在任何視窗中的最小值相同,則argrelextrema認為兩者都不是視窗的最小值。上面的代碼認為兩者都是最小值。
我不確定這對于您擁有的視窗大小或資料型別的可能性有多大。
請將 Polars 更新為0.13.38
Polars 的最新版本包含對滾動功能性能的一些重大改進。(該公告在此Twitter 執行緒上。)您將希望通過更新到最新版本來利用這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/481087.html
