【发布时间】:2018-06-05 13:24:17
【问题描述】:
我有一个时间序列定价数据的数据框,其中包含 ID、日期和价格。
我需要计算价格列的指数移动平均线,并将其作为新列添加到数据框中。
我之前一直在使用 Spark 的窗口函数,它看起来很适合这个用例,但给出了 EMA 的公式:
EMA: {Price - EMA(previous day)} x multiplier + EMA(previous day)
在哪里
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 有点复杂,因为在每一步我都需要之前的计算值。
我也查看了Weighted moving average in Pyspark,但我需要一种适用于 Spark/Scala 的方法,以及 10 或 30 天的 EMA。
有什么想法吗?
【问题讨论】:
标签: scala apache-spark apache-spark-sql