首页 > 编程问答 >我可以运行创建两个表达式和两列,其中第二列引用同一行中的第一列吗?

我可以运行创建两个表达式和两列,其中第二列引用同一行中的第一列吗?

时间:2024-08-01 06:58:25浏览次数:17  
标签:python python-polars lazyframe

我有一个来自 FRED API 的数据库:

self.yielddiff_lf
shape: (9, 5)
┌────────────┬────────────────────────────┬──────────┬──────────┬─────────────┐
│ statistic  ┆ Date                       ┆ 5y Rate  ┆ 1y Rate  ┆ Rate Spread │
│ ---        ┆ ---                        ┆ ---      ┆ ---      ┆ ---         │
│ str        ┆ str                        ┆ f64      ┆ f64      ┆ f64         │
╞════════════╪════════════════════════════╪══════════╪══════════╪═════════════╡
│ count      ┆ 82                         ┆ 82.0     ┆ 82.0     ┆ 82.0        │
│ mean       ┆ 2023-03-02 08:29:16.097000 ┆ 3.737073 ┆ 4.740244 ┆ -1.003171   │
│ std        ┆ null                       ┆ 0.267561 ┆ 0.220112 ┆ 0.145185    │
│ min        ┆ 2023-01-03                 ┆ 3.36     ┆ 4.19     ┆ -1.29       │
│ 25%        ┆ 2023-02-01                 ┆ 3.54     ┆ 4.64     ┆ -1.12       │
│ 50%        ┆ 2023-03-03                 ┆ 3.66     ┆ 4.71     ┆ -1.03       │
│ 75%        ┆ 2023-03-31                 ┆ 3.93     ┆ 4.88     ┆ -0.92       │
│ max        ┆ 2023-04-28                 ┆ 4.34     ┆ 5.25     ┆ -0.6        │
└────────────┴────────────────────────────┴──────────┴──────────┴─────────────┘

我正在尝试创建一个列,该列是费率差 (5y / 分子) 减去 1y(分母)。
然后我想创建一个基于百分比增长的列在此费率差值上。

我有以下代码,它给了我一个“polars.exceptions.ColumnNotFoundError:费率差值”

尝试#1,产生错误:polars.exceptions.ColumnNotFoundError:费率差值

self.yielddiff_lf = self.yielddiff_lf.with_columns(
            (
            (pl.col(f"{numerator} Rate") - pl.col(f"{denominator} Rate"))
                .round(3).alias("Rate Spread")
            ),
            (
                pl.col("Rate Spread").pct_change().alias("Spread % Change")*100)
            )

尝试 #2 产生一列名为 Spread % Change 的列,我明白了为什么:

self.yielddiff_lf = self.yielddiff_lf.with_columns(
            (
            (pl.col(f"{numerator} Rate") - pl.col(f"{denominator} Rate"))
                .round(3).alias("Rate Spread")
            ).pct_change().alias("Spread % Change")*100
            )

如何使用 Polar 的 LazyFrame 在同一语句中创建这两列?

尝试 #1,产生错误:polars.exceptions.ColumnNotFoundError:汇率差价

self.yielddiff_lf = self.yielddiff_lf.with_columns(
            (
            (pl.col(f"{numerator} Rate") - pl.col(f"{denominator} Rate"))
                .round(3).alias("Rate Spread")
            ),
            (
                pl.col("Rate Spread").pct_change().alias("Spread % Change")*100)
            )

尝试 #2 产生一列名为差价变化百分比的列,我明白为什么,但我希望保留汇率差价和变化百分比列:

self.yielddiff_lf = self.yielddiff_lf.with_columns(
            (
            (pl.col(f"{numerator} Rate") - pl.col(f"{denominator} Rate"))
                .round(3).alias("Rate Spread")
            ).pct_change().alias("Spread % Change")*100
            )

在尝试 #1 中的代码之所以失败,是因为 Polars 在一次运行中会评估 with_columns 中的所有表达式,并且在计算表达式时“Rate Spread”列尚不可用。

可以通过嵌套 with_columns 调用来解决此问题,如下所示:

self.yielddiff_lf = self.yielddiff_lf.with_columns(
    (pl.col(f"{numerator} Rate") - pl.col(f"{denominator} Rate")).round(3).alias("Rate Spread")
).with_columns(
    pl.col("Rate Spread").pct_change().alias("Spread % Change") * 100
)

此代码首先添加“Rate Spread”列,然后在第二次调用 with_columns 中使用该列来计算“Spread % Change”列。

还有一种使用 let 语法的更简洁的方法,可以在其中创建一个包含计算的中间绑定:

self.yielddiff_lf = self.yielddiff_lf.with_columns(
    pl.col(f"{numerator} Rate") - pl.col(f"{denominator} Rate")
).let(
    spread=pl.col("Rate Spread")
).with_columns(
    spread.round(3).alias("Rate Spread"),
    (spread.pct_change() * 100).alias("Spread % Change"),
)

此代码首先计算汇率差价,然后使用 let 在“spread”中创建对该结果的引用。这使可以在同一 with_columns 调用中对“Rate Spread”及其百分比变化进行别名化。

这些方法都可以让在同一个 Polar LazyFrame 中创建两列,其中一列引用另一列。选择觉得更易读和维护的方法。

标签:python,python-polars,lazyframe
From: 78818569

相关文章