首页 > 解决方案 > 从之前的非缺失值计算缺失的行值

问题描述

这是 Excel 中的一个简单练习,但不知道如何在 Pyspark 中进行

我有一个时间序列模式的增长率。

Period, Rate, value
1, ., 100
2, 0.01,
3, 0.02,
4, 0.01

因此该值仅在周期 1 中可用。所有其他值应按如下方式计算:

周期 2:100*(1+0.01) = 101

第 3 期:101*(1+0.02)

周期 2 本质上是周期 1 的值作为基础结合周期 2 中的利率来计算。等等等等。

在 Excel 中很容易做到这一点,但不知道如何在 Pyspark 中做到这一点。

非常感谢。

标签: pysparkapache-spark-sqlpyspark-dataframes

解决方案


您可以使用logandexp来获取该期间之前的总值。你的价值是一个乘法聚合。

1, 0.01, 100 * (1 + 0.01)
2, 0.01, 100 * (1 + 0.01) * (1 + 0.01)
...
n, 0.01, 100 * (1 + 0.01)^n

因此,取一个log,窗口sum上的值log(1 + 0.01)并取回exp

value = 100

w = Window.orderBy('Period')
df.withColumn('value', value * exp(sum(log(col('Rate') + 1).cast('decimal(38, 20)')).over(w))).show()

+------+----+------------------+
|Period|Rate|             value|
+------+----+------------------+
|     1| 0.0|             100.0|
|     2|0.01|             101.0|
|     3|0.01|            102.01|
|     4|0.01|103.03010000000002|
|     5|0.01|        104.060401|
|     6|0.01|105.10100501000001|
|     7|0.01|106.15201506010001|
|     8|0.01|107.21353521070101|
|     9|0.01|108.28567056280802|
|    10|0.01|109.36852726843608|
|    11|0.01|110.46221254112045|
|    12|0.01|111.56683466653166|
|    13|0.01|112.68250301319698|
|    14|0.01|113.80932804332895|
|    15|0.01|114.94742132376223|
|    16|0.01|116.09689553699987|
+------+----+------------------+

或者,aggregate通过将费率列在列表中来使用该功能。

value = 100

df.withColumn('temp', expr("aggregate(collect_list(Rate + 1) OVER (ORDER BY Period), 1D, (acc, x) -> acc * x)")) \
  .withColumn('value', col('temp') * value).show()

+------+----+------------------+------------------+
|Period|Rate|             value|              temp|
+------+----+------------------+------------------+
|     1| 0.0|             100.0|               1.0|
|     2|0.01|             101.0|              1.01|
|     3|0.01|            102.01|            1.0201|
|     4|0.01|103.03009999999999|          1.030301|
|     5|0.01|        104.060401|        1.04060401|
|     6|0.01|      105.10100501|      1.0510100501|
|     7|0.01|106.15201506009998|    1.061520150601|
|     8|0.01|107.21353521070098|1.0721353521070098|
|     9|0.01|108.28567056280801|  1.08285670562808|
|    10|0.01|109.36852726843608|1.0936852726843609|
|    11|0.01|110.46221254112045|1.1046221254112045|
|    12|0.01|111.56683466653166|1.1156683466653166|
|    13|0.01|112.68250301319698|1.1268250301319698|
|    14|0.01|113.80932804332895|1.1380932804332895|
|    15|0.01|114.94742132376223|1.1494742132376223|
|    16|0.01|116.09689553699987|1.1609689553699987|
+------+----+------------------+------------------+

这两个例子在第 4 期都有精度问题。


推荐阅读