我有一個極坐標資料框,其中有一列包含日期,其他列包含價格,我想計算252 x 3 觀測值視窗中每個列的百分位數。
為此,我正在這樣做:
prices = prices.sort(by=["date"]) rank_cols = list(set(prices.columns).difference("date")) percentiles = ( prices.sort(by=["date"]) .set_sorted("date") .group_by_dynamic( index_column=["date"], every="1i", start_by="window", period="756i" ) .agg( [ (pl.col(col).rank() * 100.0 / pl.col(col).count()).alias( f"{col}_percentile" ) for col in rank_cols ] ) )
但是拋出的例外是:
traceback (most recent call last): file "<string>", line 6, in <module> file "/usr/local/lib/python3.10/site-packages/polars/dataframe/group_by.py", line 1047, in agg self.df.lazy() file "/usr/local/lib/python3.10/site-packages/polars/lazyframe/frame.py", line 1706, in collect return wrap_df(ldf.collect()) polars.exceptions.invalidoperationerror: argument in operation 'group_by_dynamic' is not explicitly sorted - if your data is already sorted, set the sorted flag with: '.set_sorted()'. - if your data is not sorted, sort the 'expr/series/column' first.
在程式碼中,我已經按照建議執行了操作,但異常仍然存在。
編輯:
根據@hericks的建議進行一些更改。
import polars as pl import pandas as pd from datetime import datetime, timedelta # generate 10 dates starting from today start_date = datetime.now().date() date_list = [start_date + timedelta(days=i) for i in range(10)] # generate random prices for each date and column data = { 'date': date_list, 'asset_1': [float(f"{i+1}.{i+2}") for i in range(10)], 'asset_2': [float(f"{i+2}.{i+3}") for i in range(10)], 'asset_3': [float(f"{i+3}.{i+4}") for i in range(10)], } prices = pl.dataframe(data) prices = prices.cast({"date": pl.date}) rank_cols = list(set(prices.columns).difference("date")) percentiles = ( prices.sort(by=["date"]) .set_sorted("date") .group_by_dynamic( index_column="date", every="1i", start_by="window", period="4i" ) .agg( [ (pl.col(col).rank() * 100.0 / pl.col(col).count()).alias( f"{col}_percentile" ) for col in rank_cols ] ) )
現在我明白了
pyo3_runtime.panicexception: attempt to divide by zero
編輯2:
問題是日期的使用,我用整數更改了日期,然後就解決了問題。 (也新增了先取第一個暫存器)
import polars as pl int_list = [i+1 for i in range(6)] # Generate random prices for each date and column data = { 'int_index': int_list, 'asset_1': [1.1, 3.4, 2.6, 4.8, 7.4, 3.2], 'asset_2': [4, 7, 8, 3, 4, 5], 'asset_3': [1, 3, 10, 20, 2, 4], } # Convert the Pandas DataFrame to a Polars DataFrame prices = pl.DataFrame(data) rank_cols = list(set(prices.columns).difference("int_index")) percentiles = ( prices.sort(by="int_index") .set_sorted("int_index") .group_by_dynamic( index_column="int_index", every="1i", start_by="window", period="4i" ) .agg( [ (pl.col(col).rank().first() * 100.0 / pl.col(col).count()).alias( f"{col}_percentile" ) for col in rank_cols ] ) )
編輯3:
給出的想法是,索引 i 取索引 i、i 1、i 2、i 3 上的值,併計算暫存器 i 相對於這四個值的百分位等級。
例如,對於 asset_1 中的第一個索引 (1),範例(以及接下來的三個暫存器)為:
1.1、3.4、2.6、4.8,因此第一個暫存器的百分位數為 25
對於 asset_1,第二個索引 (2) 範例(以及接下來的三個暫存器)是:
3.4、2.6、4.8 和 7.4,因此百分位數為 50。
正確答案
我仍然有點猜測您期望的答案是什麼,但您可能可以從這個答案開始
因此,考慮到您的範例資料:
import polars as pl # generate random prices for each date and column prices = pl.dataframe({ 'int_index': range(6), 'asset_1': [1.1, 3.4, 2.6, 4.8, 7.4, 3.2], 'asset_2': [4, 7, 8, 3, 4, 5], 'asset_3': [1, 3, 10, 20, 2, 4], }) ┌───────────┬─────────┬─────────┬─────────┐ │ int_index ┆ asset_1 ┆ asset_2 ┆ asset_3 │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ i64 ┆ i64 │ ╞═══════════╪═════════╪═════════╪═════════╡ │ 0 ┆ 1.1 ┆ 4 ┆ 1 │ │ 1 ┆ 3.4 ┆ 7 ┆ 3 │ │ 2 ┆ 2.6 ┆ 8 ┆ 10 │ │ 3 ┆ 4.8 ┆ 3 ┆ 20 │ │ 4 ┆ 7.4 ┆ 4 ┆ 2 │ │ 5 ┆ 3.2 ┆ 5 ┆ 4 │ └───────────┴─────────┴─────────┴─────────┘
使用rolling()
建立一個窗口,然後(與您在問題中所做的相同) - rank().first()
除以count()
、name.suffix()
為列指派新名稱:
cols = pl.all().exclude('int_index') percentiles = ( prices.sort(by="int_index") .rolling(index_column="int_index", period="4i", offset="0i", closed="left") .agg((cols.rank().first() * 100 / cols.count()).name.suffix('_percentile')) ) ┌───────────┬────────────────────┬────────────────────┬────────────────────┐ │ int_index ┆ asset_1_percentile ┆ asset_2_percentile ┆ asset_3_percentile │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ f64 ┆ f64 │ ╞═══════════╪════════════════════╪════════════════════╪════════════════════╡ │ 0 ┆ 25.0 ┆ 50.0 ┆ 25.0 │ │ 1 ┆ 50.0 ┆ 75.0 ┆ 50.0 │ │ 2 ┆ 25.0 ┆ 100.0 ┆ 75.0 │ │ 3 ┆ 66.666667 ┆ 33.333333 ┆ 100.0 │ │ 4 ┆ 100.0 ┆ 50.0 ┆ 50.0 │ │ 5 ┆ 100.0 ┆ 100.0 ┆ 100.0 │ └───────────┴────────────────────┴────────────────────┴────────────────────┘
您也可以檢查每個視窗內的內容:
( prices.sort(by="int_index") .rolling(index_column="int_index", period="4i", offset="0i", closed="left") .agg(cols) ) ┌───────────┬───────────────────┬─────────────┬───────────────┐ │ int_index ┆ asset_1 ┆ asset_2 ┆ asset_3 │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ list[f64] ┆ list[i64] ┆ list[i64] │ ╞═══════════╪═══════════════════╪═════════════╪═══════════════╡ │ 0 ┆ [1.1, 3.4, … 4.8] ┆ [4, 7, … 3] ┆ [1, 3, … 20] │ │ 1 ┆ [3.4, 2.6, … 7.4] ┆ [7, 8, … 4] ┆ [3, 10, … 2] │ │ 2 ┆ [2.6, 4.8, … 3.2] ┆ [8, 3, … 5] ┆ [10, 20, … 4] │ │ 3 ┆ [4.8, 7.4, 3.2] ┆ [3, 4, 5] ┆ [20, 2, 4] │ │ 4 ┆ [7.4, 3.2] ┆ [4, 5] ┆ [2, 4] │ │ 5 ┆ [3.2] ┆ [5] ┆ [4] │ └───────────┴───────────────────┴─────────────┴───────────────┘
以上是Polar 計算百分位數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版
好用的JavaScript開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。