从先前的非缺失值计算缺失的行值
Calculate the missing row value from previous non-missing value
这是 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 中做到。
非常感谢。
您可以使用 log
和 exp
来获取该时间段之前的总值。您的值是乘法聚合。
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)
超过 window 并取回 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 节都有精度问题。
这是 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 中做到。
非常感谢。
您可以使用 log
和 exp
来获取该时间段之前的总值。您的值是乘法聚合。
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)
超过 window 并取回 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 节都有精度问题。