поэтому, если я правильно понимаю проблему, вы хотите рассчитать среднее значение за 3 дня для каждого элемента.Затем вам нужно просто соединить таблицу 1 с таблицей 2, чтобы получить только проданные товары со средней ценой рядом с фактической ценой.Вы можете сделать это с помощью функции окна.В pyspark это может быть что-то вроде этого:
import pyspark.sql.functions as F
from pyspark.sql.window import Window
df_price = df_price.withColumn(
'rolling_average',
F.avg(df_price.price).over(
Window.partitionBy(df_price.item).orderBy(
df_price.date.desc()
).rowsBetween(0, 3)
)
)
Тогда вы просто присоединяетесь к своему столу, чтобы получить результат.В SQL это будет выглядеть так:
WITH b as (
SELECT '1/1/2018' as date_p, 'Apple' as item, 1 as price
UNION ALL SELECT '1/2/2018' as date_p, 'Apple' as item, 0.98 as price
UNION ALL SELECT '1/3/2018' as date_p, 'Apple' as item, 0.88 as price
UNION ALL SELECT '1/4/2018' as date_p, 'Apple' as item, 1.2 as price
UNION ALL SELECT '1/5/2018' as date_p, 'Apple' as item, 1.3 as price
UNION ALL SELECT '1/6/2018' as date_p, 'Apple' as item, 1.5 as price
UNION ALL SELECT '1/7/2018' as date_p, 'Apple' as item, 1.05 as price
UNION ALL SELECT '1/8/2018' as date_p, 'Apple' as item, 1.025 as price
UNION ALL SELECT '2/10/2018' as date_p, 'Grape' as item, 3.10 as price)
SELECT *, AVG(price) OVER (
PARTITION BY item ORDER BY date_p DESC
ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING
) from b