У меня есть набор данных, состоящий из столбца временной метки и столбца доллара. Я хотел бы найти среднее количество долларов в неделю, заканчивающееся на отметке времени каждой строки. Сначала я смотрел на функцию pyspark.sql.functions.window, но это заставляет данные за неделю.
Вот пример:
%pyspark
import datetime
from pyspark.sql import functions as F
df1 = sc.parallelize([(17,"2017-03-11T15:27:18+00:00"), (13,"2017-03-11T12:27:18+00:00"), (21,"2017-03-17T11:27:18+00:00")]).toDF(["dollars", "datestring"])
df2 = df1.withColumn('timestampGMT', df1.datestring.cast('timestamp'))
w = df2.groupBy(F.window("timestampGMT", "7 days")).agg(F.avg("dollars").alias('avg'))
w.select(w.window.start.cast("string").alias("start"), w.window.end.cast("string").alias("end"), "avg").collect()
Это приводит к двум записям:
| start | end | avg |
|---------------------|----------------------|-----|
|'2017-03-16 00:00:00'| '2017-03-23 00:00:00'| 21.0|
|---------------------|----------------------|-----|
|'2017-03-09 00:00:00'| '2017-03-16 00:00:00'| 15.0|
|---------------------|----------------------|-----|
Функция окна связывает данные временных рядов, а не выполняет скользящее среднее.
Есть ли способ выполнить скользящее среднее, когда я вернусь к недельной средней для каждой строки с периодом времени, заканчивающимся на timestampGMT строки?
EDIT:
Ответ Чжан ниже близок к тому, что я хочу, но не совсем то, что я хотел бы видеть.
Вот лучший пример, чтобы показать, к чему я пытаюсь добраться:
%pyspark
from pyspark.sql import functions as F
df = spark.createDataFrame([(17, "2017-03-10T15:27:18+00:00"),
(13, "2017-03-15T12:27:18+00:00"),
(25, "2017-03-18T11:27:18+00:00")],
["dollars", "timestampGMT"])
df = df.withColumn('timestampGMT', df.timestampGMT.cast('timestamp'))
df = df.withColumn('rolling_average', F.avg("dollars").over(Window.partitionBy(F.window("timestampGMT", "7 days"))))
Это приводит к следующему файловому кадру:
dollars timestampGMT rolling_average
25 2017-03-18 11:27:18.0 25
17 2017-03-10 15:27:18.0 15
13 2017-03-15 12:27:18.0 15
Я хотел бы, чтобы среднее значение было в течение недели, продолжая дату в столбце timestampGMT, что приведет к следующему:
dollars timestampGMT rolling_average
17 2017-03-10 15:27:18.0 17
13 2017-03-15 12:27:18.0 15
25 2017-03-18 11:27:18.0 19
В приведенных выше результатах значение roll_average для 2017-03-10 равно 17, так как предшествующих записей нет. Средство roll_average для 2017-03-15 равно 15, потому что оно усредняет 13 с 2017-03-15 и 17 с 2017-03-10, которое падает с предыдущим 7-дневным окном. Скользящий средний показатель для 2017-03-18 составляет 19, поскольку он усредняет 25 с 2017-03-18 и 13 с 2017-03-10, который падает с предыдущим 7-дневным окном, и он не включает 17 от 2017 года -03-10, потому что это не падает с предыдущим 7-дневным окном.
Есть ли способ сделать это, а не окно binning, где еженедельные окна не перекрываются?