我有一个时间序列价格数据的数据框,包含ID、日期和价格。
我需要计算价格列的指数移动平均值,并将其作为新列添加到数据框中。
我之前使用过Spark的窗口函数,看起来很适合这种情况,但考虑到EMA的公式:
EMA: {Price - EMA(previous day)} x multiplier + EMA(previous day)
where
multiplier = (2 / (Time periods + 1)) //let's assume Time period is 10 days for now
我有点困惑,如何在对列进行窗口处理时访问先前计算的值。 对于简单的移动平均值,这很简单,只需要在窗口内平均元素即可计算出新的列:
var window = Window.partitionBy("ID").orderBy("Date").rowsBetween(-windowSize, Window.currentRow)
dataFrame.withColumn(avg(col("Price")).over(window).alias("SMA"))
但是似乎使用EMA有点复杂,因为每一步都需要前一个计算出的值。
我也看过Pyspark中加权移动平均,但我需要适用于Spark/Scala,并且适用于10或30天的EMA的方法。
有什么想法吗?