返回顶部
首页 > 资讯 > 精选 >Polar 计算百分位数
  • 685
分享到

Polar 计算百分位数

2024-02-22 13:02:57 685人浏览 八月长安
摘要

问题内容 我有一个极坐标数据框,其中有一列包含日期,其他列包含价格,我想计算 252 x 3 观测值窗口中每个列的百分位数。 为此,我正在这样做: prices = prices.s

问题内容

我有一个极坐标数据框,其中有一列包含日期,其他列包含价格,我想计算 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 计算百分位数的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Polar 计算百分位数

本文链接: https://lsjlt.com/news/567184.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Polar 计算百分位数
    问题内容 我有一个极坐标数据框,其中有一列包含日期,其他列包含价格,我想计算 252 x 3 观测值窗口中每个列的百分位数。 为此,我正在这样做: prices = prices.s...
    99+
    2024-02-22
  • MySQL百分位数如何计算
    这篇文章主要为大家展示了“MySQL百分位数如何计算”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL百分位数如何计算”这篇文章吧。select...
    99+
    2024-04-02
  • MySQL如何实现百分位数计算
    这篇文章主要介绍了MySQL如何实现百分位数计算,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。创建试验数据,5天每天一百万随机数据,总共50...
    99+
    2024-04-02
  • MySQL百分位数计算如何进行优化
    小编给大家分享一下MySQL百分位数计算如何进行优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!主要是采用存储过程,在中间计算...
    99+
    2024-04-02
  • python计算分位数
    使用numpy包: import numpy as np a=np.array(([1,2,3,4])) np.median(a)#中位数 np.percentile(a,95)#95%分位数 ...
    99+
    2023-01-31
    位数 python
  • PHP 计算两数的百分比
    一、计算数量与总数之间相差百分之多少。 先用数量减掉总数。 数量除总数再乘100;得出%结果。 round(数值 , 保留几位小数); 二、计算数量是总数的百分之多少。 数量÷总数×100=百分比 来源地址:https://bl...
    99+
    2023-09-18
    php
  • sql如何计算百分比
    有三种主要方法可以利用 sql 计算百分比:直接计算、使用窗口函数以及使用 case 表达式。直接计算通过将分子除以分母并乘以 100 获得百分比;窗口函数允许根据组按分母值计算百分比;...
    99+
    2024-06-06
  • CSS百分比padding怎么计算
    本篇内容主要讲解“CSS百分比padding怎么计算”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS百分比padding怎么计算”吧!一、CSS百分比pad...
    99+
    2024-04-02
  • Java 分位点(分位值)计算方式
    目录Java 分位点(分位值)计算有一个需求那么怎么建立数学模型呢?下面用Java 代码实现正常输出完成需求核心代码Java 求百分位数说明一下java代码Java 分位点(分位值)...
    99+
    2024-04-02
  • MySQL计算百分比方法介绍
    根据相应条件抽出相应count数(myCount)抽出总count数(totalCount)计算百分比:myCount / totalCount * 100四舍五入:使用ROUND函数ROUND(numbe...
    99+
    2024-04-02
  • C#中的小数和百分数计算与byte数组操作
    一、百分数 //按照四舍五入的国际标准 string p1 = (Math.Round(0.333367, 4)*100).ToString() + "%";//33.34% dou...
    99+
    2024-04-02
  • pythonDataFrame数据格式化(设置小数位数,百分比,千分位分隔符)
    目录1.设置小数位数1.1 数据框设置统一小数位数1.2 数据框分别设置不同小数位数1.3 通过Series设置DataFrame小数位数1.4 applymap(自定义函数)2. ...
    99+
    2024-04-02
  • SQL怎么计算每个分组的中位数
    这篇文章主要为大家分析了SQL怎么计算每个分组的中位数的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“SQL怎么计算每个分组的中位数”的知识吧。中位数是指一组...
    99+
    2023-06-03
  • MySQL中位数计算方法
    在网上搜到的一种算法是利用自增长变量进行排序,然后再根据位置序号取。感觉有些复杂了,还是group_concat来的省事些 按顺序聚合,逗号分隔,并计数 group_concat( number order by number ...
    99+
    2016-10-07
    MySQL中位数计算方法 数据库入门 数据库基础教程 数据库 mysql
  • java怎么对百万条数据做计算
    对百万条数据进行计算需要考虑到内存的限制和计算的效率。以下是一些常见的处理方法:1. 使用数据库:将数据存储在数据库中,然后使用SQ...
    99+
    2023-09-13
    java
  • Java分位点计算方法是什么
    本篇内容介绍了“Java分位点计算方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 分位点(分位值)计算有一个需求给出一段时...
    99+
    2023-06-22
  • 如何计算php时间戳位数
    这篇文章主要介绍“如何计算php时间戳位数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何计算php时间戳位数”文章能帮助大家解决问题。php时间戳一般都是10位数。计算php时间戳位数的方法:1...
    99+
    2023-07-05
  • 集算器协助MongoDB计算之数位比较
      Mongodb脚本解决复杂问题的计算能力有限,直接使用时较为吃力。很多情况下需要将数据读出后在主程序中进一步完成运算,而在Java等高级语言中编写这类集合式运算也比较麻烦。这时可以用集算器es...
    99+
    2024-04-02
  • excel如何算百分比
    这篇文章主要介绍“excel如何算百分比”,在日常操作中,相信很多人在excel如何算百分比问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”excel如何算百分比”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-07-02
  • shell中基本计算、逻辑运算、位运算的示例分析
    这篇文章给大家分享的是有关shell中基本计算、逻辑运算、位运算的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。以下面的格式提供运算表达式:$(( expression )) $ echo $((5*(3...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作