我需要计算赫芬达尔-赫希曼指数(“HHI”,即市场份额平方和),但要忽略行中所代表的公司。以下是示例:
df = (pl.DataFrame({
'year':(2023, 2023, 2023, 2024, 2024, 2024),
'firm':('A', 'B', 'C', 'A', 'B', 'C'),
'volume':(20, 50, 3, 25, 13, 5)
})
.with_columns(
sum = pl.col('volume').sum().over('year'),
leaveout_sum = (pl.col('volume').sum().over('year'))-(pl.col('volume'))
)
.with_columns(
share = (pl.col('volume')/pl.col('sum'))*100
)
.with_columns(
hhi = (pl.col('share')**2).sum().over('year').round()
))
得出:
┌──────┬──────┬────────┬─────┬──────────────┬───────────┬────────┐
│ year ┆ firm ┆ volume ┆ sum ┆ leaveout_sum ┆ share ┆ hhi │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ i64 ┆ i64 ┆ i64 ┆ f64 ┆ f64 │
╞══════╪══════╪════════╪═════╪══════════════╪═══════════╪════════╡
│ 2023 ┆ A ┆ 20 ┆ 73 ┆ 53 ┆ 27.39726 ┆ 5459.0 │
│ 2023 ┆ B ┆ 50 ┆ 73 ┆ 23 ┆ 68.493151 ┆ 5459.0 │
│ 2023 ┆ C ┆ 3 ┆ 73 ┆ 70 ┆ 4.109589 ┆ 5459.0 │
│ 2024 ┆ A ┆ 25 ┆ 43 ┆ 18 ┆ 58.139535 ┆ 4429.0 │
│ 2024 ┆ B ┆ 13 ┆ 43 ┆ 30 ┆ 30.232558 ┆ 4429.0 │
│ 2024 ┆ C ┆ 5 ┆ 43 ┆ 38 ┆ 11.627907 ┆ 4429.0 │
└──────┴──────┴────────┴─────┴──────────────┴───────────┴────────┘
那里的 hhi 列是正常的 HHI 指数,包括市场中的所有公司,我可以计算“遗漏”交易量总和,以得出该年其他公司的交易量总和。例如,2023 年公司 A 的遗漏 HHI 将是 3/53 的平方加上 50/53 的平方(即假设公司 A 不存在,则公司 B 和 C 的市场份额的平方)。
我该如何告诉 polars 执行此操作?有没有办法过滤窗口函数?
我的真实数据集包括 500 个独立市场中近 800 家公司 204 个月的数据,因此手动执行此操作是不可能的。
您可以从平方和中取出分母:
我忽略了这个
* 100
因素,上面的(3/53)^2 + (50/53)^2
操作可以正确计算你的例子(3^2 + 50^2) / (50 + 3)^2
。