如何解决逐年将pyspark中的日期转换为周数滚动平均值
我拥有多年的数据,并且想使用date
列添加一个额外的列,该列可容纳这些年中的星期数,这些年递增。
我知道weekofyear()
,但是我想采用最低的绑定日期并递增地计算周数。
ie:两年的数据将包含week_number
列中介于1到104(周)之间的数据。
- 在火花中做到这一点的最佳方法是什么?这是尝试每周平均滚动一周。
- 还有什么更好的方法可以在Spark中从日期列开始的最近n周内应用滚动平均值? (每周计算)
解决方法
如果您不在乎ISO周,则只需在偏移量和行之间除以7天。例如,
df.show(10,False)
+----------+---+
|date |val|
+----------+---+
|2019-01-01|124|
|2019-01-06|234|
|2019-01-08|23 |
|2020-01-01|125|
|2020-07-01|123|
|2020-07-08|11 |
|2020-07-15|5 |
|2020-07-22|12 |
+----------+---+
然后
import pyspark.sql.functions as f
from pyspark.sql import Window
w1 = Window.orderBy('date')
w2 = Window.orderBy('weeks').rangeBetween(-3,0) # last 4 weeks
df.withColumn('datediff',f.datediff('date',f.first('date').over(w1))) \
.withColumn('weeks',(f.col('datediff') / 7).cast('int') + 1) \
.withColumn('avg',f.avg('val').over(w2)) \
.show(10,False)
+----------+---+--------+-----+------------------+
|date |val|datediff|weeks|avg |
+----------+---+--------+-----+------------------+
|2019-01-01|124|0 |1 |179.0 |
|2019-01-06|234|5 |1 |179.0 |
|2019-01-08|23 |7 |2 |127.0 |
|2020-01-01|125|365 |53 |125.0 |
|2020-07-01|123|547 |79 |123.0 |
|2020-07-08|11 |554 |80 |67.0 |
|2020-07-15|5 |561 |81 |46.333333333333336|
|2020-07-22|12 |568 |82 |37.75 |
+----------+---+--------+-----+------------------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。