我有一个来自 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