Comment puis-je calculer la médiane du dollar pour une fenêtre de 3 valeurs précédentes?Comment calculer la médiane de roulement dans Pyspark en utilisant Window()?
Données d'entrée
dollars timestampGMT
25 2017-03-18 11:27:18
17 2017-03-18 11:27:19
13 2017-03-18 11:27:20
27 2017-03-18 11:27:21
13 2017-03-18 11:27:22
43 2017-03-18 11:27:23
12 2017-03-18 11:27:24
de données de sortie attendues
dollars timestampGMT rolling_median_dollar
25 2017-03-18 11:27:18 median(25)
17 2017-03-18 11:27:19 median(17,25)
13 2017-03-18 11:27:20 median(13,17,25)
27 2017-03-18 11:27:21 median(27,13,17)
13 2017-03-18 11:27:22 median(13,27,13)
43 2017-03-18 11:27:23 median(43,13,27)
12 2017-03-18 11:27:24 median(12,43,13)
Ci-dessous le code ne marche pas, mais le déplacement avg de pyspark ont F.median().
pyspark: rolling average using timeseries data
EDIT 1: Le défi est sortie le carton de la fonction médiane(). Je ne peux pas faire
df = df.withColumn('rolling_average', F.median("dollars").over(w))
Si je voulais la moyenne mobile je aurais pu faire
df = df.withColumn('rolling_average', F.avg("dollars").over(w))
EDIT 2: Essayé à l'aide approxQuantile()
windfun = Window().partitionBy().orderBy(F.col(date_column)).rowsBetween(-3, 0) sdf.withColumn("movingMedian", sdf.approxQuantile(col='a', probabilities=[0.5], relativeError=0.00001).over(windfun))
Mais obtenir erreur
AttributeError: 'list' object has no attribute 'over'
EDIT 3
Veuillez donner une solution sans Udf car elle ne bénéficiera pas de l'optimisation du catalyseur.
Avez-vous essayé de commander par 'timestampGMT' et faire le calcul sur les lignes par fenêtre? Juste curieux de savoir quel est le problème (et je me demande si la mise en œuvre de la médiane pourrait être le seul). –
a modifié la question pour inclure le problème exact –
Vu 'df.stat.approxQuantile' et https://databricks.com/blog/2016/05/19/approximate-algorithms-in-apache-spark-hyperloglog-and-quantiles .html? –