如何使用 Window() 计算 PySpark 中的滚动中位数?

2024-04-07

如何计算前 3 个值的窗口大小的美元滚动中位数?

输入数据

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

预期输出数据

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)

下面的代码确实移动了 avg 但 PySpark 没有 F.median()。

pyspark:使用时间序列数据的滚动平均值 https://stackoverflow.com/questions/45806194/pyspark-rolling-average-using-timeseries-data

编辑1:挑战是median()函数不退出。我不能做

df = df.withColumn('rolling_average', F.median("dollars").over(w))

如果我想要移动平均线我可以这样做

df = df.withColumn('rolling_average', F.avg("dollars").over(w))

编辑2:尝试使用approxQuantile()

windfun = Window().partitionBy().orderBy(F.col(date_column)).rowsBetwe‌​en(-3, 0) sdf.withColumn("movingMedian", sdf.approxQuantile(col='a', probabilities=[0.5], relativeError=0.00001).over(windfun)) 

但出现错误

AttributeError: 'list' object has no attribute 'over'

EDIT 3

请给出没有 Udf 的解决方案,因为它不会从催化剂优化中受益。


一种方法是收集$dollars列作为每个窗口的列表,然后使用udf:

from pyspark.sql.window import Window
from pyspark.sql.functions import *
import numpy as np 
from pyspark.sql.types import FloatType

w = (Window.orderBy(col("timestampGMT").cast('long')).rangeBetween(-2, 0))
median_udf = udf(lambda x: float(np.median(x)), FloatType())

df.withColumn("list", collect_list("dollars").over(w)) \
  .withColumn("rolling_median", median_udf("list")).show(truncate = False)
+-------+---------------------+------------+--------------+
|dollars|timestampGMT         |list        |rolling_median|
+-------+---------------------+------------+--------------+
|25     |2017-03-18 11:27:18.0|[25]        |25.0          |
|17     |2017-03-18 11:27:19.0|[25, 17]    |21.0          |
|13     |2017-03-18 11:27:20.0|[25, 17, 13]|17.0          |
|27     |2017-03-18 11:27:21.0|[17, 13, 27]|17.0          |
|13     |2017-03-18 11:27:22.0|[13, 27, 13]|13.0          |
|43     |2017-03-18 11:27:23.0|[27, 13, 43]|27.0          |
|12     |2017-03-18 11:27:24.0|[13, 43, 12]|13.0          |
+-------+---------------------+------------+--------------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Window() 计算 PySpark 中的滚动中位数? 的相关文章

随机推荐

  • 如何查看sql server表中已删除的记录? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要从sql server表中查看已删除的记录 行 实际上我正在使用这个命令 DBCC LOG My
  • kaminari 和 order_by

    因此 我列出了我网站的所有成员 并按名称对他们进行分组 以便更好地组织列表 因此 在我看来 我的所有成员均按其成员姓名的第一个字母分组 例如 B Bakedfish Beercan Dan Bigmike33x C Cynicalassas
  • 列出 Notion 上集成访问的所有数据库

    有没有更有效的方法来获取所有数据库的列表 我尝试过使用https api notion com v1 databases端点 但现在已弃用 另一种选择是 search端点 但它也返回数据库中的所有记录 有人可以提供更好的方法来列出集成访问的
  • 无法读取 R 中的 shapefile

    我尝试使用以下代码在 Mac 上打开 shp 文件 library tidyverse library sf library rgeos sf trees raw lt readr read csv https raw githubuser
  • 使用 RSelenium 读取下拉菜单元素中的值

    我正在使用 RSelenium 导航到站点并与元素交互 问题 使用 RSelenium 如何读取下拉菜单中的选项列表 以便我可以识别可用的最新月份并使用它将下拉菜单设置为正确的值 On 某个网站 http jamaserv jama or
  • 使用 angularjs 在本地驱动器中上传文件

    我是 angularjs 的初学者 我读了很多关于文件上传等的内容 但找不到我将进一步描述的此案例的任何主题 我想在下面的代码中通过按钮 带有搜索名称 来选择一个文件 然后 当我们单击第二个按钮 带有上传名称 时 我选择在我制作的本地驱动器
  • 根据选择的选项更新输入值

    我正在尝试找出更新某些内容的最佳方法input值取决于从中选择的选项select 这是我想要实现的目标 我有一个显示域名详细信息的页面 我有一个表格input and select这允许更改价格 这input包含当前域名价格并允许用户输入新
  • Python 中的就地快速排序

    我必须用我选择的语言来实现作业的快速排序算法 所以我选择了 Python 在讲座中 我们被告知 QuickSort 内存效率高 因为它就地工作 即 它没有用于递归的输入数组部分的额外副本 考虑到这一点 我尝试在 Python 中实现 Qui
  • 使用 jquery 获取元素的可见高度而不是其实际高度

    这篇文章是相关的this one https stackoverflow com questions 14125303 change target of a link based on what is currently displayed
  • 无法在新 Mac 上打开 Xcode 项目

    我想我在这里犯了一个错误 几个月前我设计了一个应用程序 甚至在应用程序商店中找到了它 从那时起我就买了一台新的Mac 我将 Xcode 项目文件复制到我的新 Mac 上 我几个月来第一次回来看它 但什么也没有打开 我有时会收到无法解析的警告
  • 使用 JavaScript 更改 IE 中的 类型

    下面的代码适用于除 IE 之外的所有网络浏览器
  • 解决 Kotlin MPP 中的第三方 cocoapod 依赖关系

    我正在尝试设置一个用 Kotlin Multiplatform 编写的跟踪库来支持我们所有的移动客户端 Android 测试进展顺利 通过 gradle 集成 Snowplow 我还设法通过 cocoapods 将 Snowplow 集成到
  • java 负向前瞻

    我需要一个表达式来捕获这样的字符串 A 不是至少 5 且最多 6 位数字的字符串 B 换句话说 捕获不是以下内容的任何内容 A 0 9 0 9 0 9 0 9 0 9 B A 0 9 0 9 0 9 0 9 0 9 0 9 B 我尝试过消极
  • 如何检查libc++是否安装?

    我正在从源头构建一些东西 我的系统的 gcc 和 stdlibc 太旧了 但是我可以使用 clang 构建 默认情况下 clang 使用 stdlibc 但可以选择安装 libc 以供 clang 使用 检查 libc 是否与 clang
  • 调用未定义的函数 apache_request_headers()

    我刚刚将脚本切换到不同的服务器 在以前的服务器上 这工作得很好 现在我已经将它们切换到不同的服务器 我无法理解这个问题 我不确定这会有帮助 但这是相关的代码 headers apache request headers PHP版本是 PHP
  • 如何将SQL用户自定义函数添加到实体框架中?

    我可以像在 dbml 中那样向 edmx 文件添加 SQL 函数吗 如果可以的话 我该怎么做 如果我不能 有什么解决方法吗 我尝试谷歌 但找不到任何关于如何做到这一点的具体答案 根据给定的答案 我创建了一个存储过程并尝试添加 导入函数 但它
  • java 7 接口中默认方法的替代方案(仅在 Java 8 中)

    我想在我的一个接口类中使用默认方法 然后我意识到这仅在 Java 8 中可用 而我们正在使用 Java 7 在 Java 7 中实现类似的最佳方法是什么 将方法签名放在接口中 就像 Java 8 中一样 将您的方法默认实现放在实现该接口的抽
  • 无法通过代理建立隧道。代理通过 https 返回“HTTP/1.1 407”

    我尝试通过需要身份验证的 https 连接到服务器 此外 我中间有一个也需要身份验证的 http 代理 我使用 ProxyAuthSecurityHandler 向代理进行身份验证 使用 BasicAuthSecurityHandler 向
  • Rails 资源未更新

    我有一个 Rails 3 1 应用程序 由于某种原因 当我更改 CSS 时 更改不会显示 我做到了bundle exec rake assets precompile它曾经有帮助 但现在无论如何我都坚持使用旧的CSS 由于您的资产现已预编译
  • 如何使用 Window() 计算 PySpark 中的滚动中位数?

    如何计算前 3 个值的窗口大小的美元滚动中位数 输入数据 dollars timestampGMT 25 2017 03 18 11 27 18 17 2017 03 18 11 27 19 13 2017 03 18 11 27 20 2