当前位置: 首页 > article >正文

dataframe数据形式操作中的diff和shift函数区别与对比

问题分析

从错误日志中可以看到,代码在 report_services.pygnss_monthly_report 函数中出现了 ValueError,具体错误信息是:

ValueError: either both or neither of x and y should be given

这个错误发生在以下代码行:

report_data["V(ΔXY)"] = np.where(report_data['ΔXY'].diff().fillna(0) / 1, 0)

问题出在 np.where 的使用上。np.where 的语法是:

np.where(condition, x, y)
  • condition:条件表达式。
  • x:当条件为 True 时的返回值。
  • y:当条件为 False 时的返回值。

在您的代码中,np.where 只提供了一个参数(report_data['ΔXY'].diff().fillna(0) / 1),缺少了 xy 参数,因此抛出了 ValueError


解决方案

修复 np.where 的使用,确保提供完整的参数。以下是修改后的代码:

# 修改前
report_data["V(ΔXY)"] = np.where(report_data['ΔXY'].diff().fillna(0) / 1, 0)

# 修改后
report_data["V(ΔXY)"] = np.where(
    report_data['ΔXY'].diff().fillna(0) / 1 != 0,  # 条件
    report_data['ΔXY'].diff().fillna(0) / 1,       # 条件为 True 时的值
    0                                              # 条件为 False 时的值
)

shiftdiff 函数的区别

1. shift 函数
  • 功能:将数据沿着指定的轴移动指定的步长。

  • 参数

    • periods:移动的步长,默认为 1。正数表示向下移动,负数表示向上移动。
    • fill_value:用于填充移动后产生的缺失值。
  • 示例

    import pandas as pd
    
    data = pd.Series([1, 2, 3, 4, 5])
    shifted_data = data.shift(1)
    print(shifted_data)
    

    输出:

    0    NaN
    1    1.0
    2    2.0
    3    3.0
    4    4.0
    dtype: float64
    
  • 应用场景

    • 计算滞后值(如上一行的值)。
    • 计算滑动窗口统计量(如滑动平均值)。

2. diff 函数
  • 功能:计算当前行与前一行的差值。

  • 参数

    • periods:差分的步长,默认为 1。正数表示与前面的行计算差值,负数表示与后面的行计算差值。
  • 示例

    import pandas as pd
    
    data = pd.Series([1, 2, 3, 4, 5])
    diff_data = data.diff()
    print(diff_data)
    

    输出:

    0    NaN
    1    1.0
    2    1.0
    3    1.0
    4    1.0
     dtype: float64
    
  • 应用场景

    • 计算时间序列数据的变化量。
    • 计算数据的一阶差分(如速度、加速度)。

shiftdiff 的区别

特性shiftdiff
功能移动数据,不改变数据本身的值计算当前行与前一行的差值
返回值移动后的数据,可能包含 NaN差值数据,第一行通常为 NaN
参数periods(步长)、fill_value(填充值)periods(步长)
应用场景滞后值计算、滑动窗口统计变化量计算、一阶差分

修复后的完整代码示例

以下是修复后的完整代码片段:

# 计算 ΔXY 变化速率 (V(ΔXY))
delta_xy_diff = report_data['ΔXY'].diff().fillna(0)  # 计算 ΔXY 的变化量
delta_xy_shift = report_data['ΔXY'].shift(1).fillna(0)  # 获取前一行的 ΔXY 值
report_data["V(ΔXY)"] = np.where(
    delta_xy_shift != 0,  # 条件:前一行的 ΔXY 不为 0
    delta_xy_diff / delta_xy_shift,  # 条件为 True 时的值:变化速率
    0  # 条件为 False 时的值:设置为 0
)

# 计算 ΔXY 累计变化量 (∑(ΔXY))
report_data["∑(ΔXY)"] = report_data["ΔXY"].cumsum()

# 将 NaN 替换为 0
report_data = report_data.fillna(0)

# 将数据保留小数点后两位
report_data = report_data.round(2)

# 将 DataFrame 转换为列表
data_list = report_data.values.tolist()

# 将第一列(索引 0)设置为 0
for row in data_list:
    row[0] = 0  # 将每一行的第一列设置为 0

# 将处理后的列表赋值给 sensor_report["data"]
sensor_report["data"] = data_list

logger.info(f"该台 gnss 设备 {query_para.device_type + '.' + query_para.measurement_id} 的报表数值是: {sensor_report}")

return sensor_report

总结

  1. 修复了 np.where 的错误:确保 np.where 的参数完整。
  2. 解释了 shiftdiff 的区别
    • shift 用于移动数据。
    • diff 用于计算差值。
  3. 提供了修复后的完整代码:确保代码逻辑正确,并能正确处理数据。
    应用:

report_data[“V(ΔXY)”] = np.where(report_data[‘ΔXY’].diff() != 0, report_data[‘ΔXY’].diff().shift(1) / 1, 0)


http://www.kler.cn/a/590788.html

相关文章:

  • [Lc15_bfs+floodfill] 图像渲染 | 岛屿数量 | 岛屿的最大面积 | 被围绕的区域
  • 使用 ESP8266 和 Android 应用程序实现基于 IOT 的语音控制家庭自动化
  • 从字段级脱敏到文件级授权,构建全场景数据安全闭环
  • Linux与HTTP报头属性和请求方式
  • flutter 专题 八十八 Flutter原生混合开发
  • 常见限流算法及实现
  • 蓝桥杯嵌入式组第十四届省赛题目解析+STM32G431RBT6实现源码
  • 【一起来学kubernetes】17、Configmap使用详解
  • 程序包jakarta.annotation不存在
  • 求余在程序设计中的用处
  • Netty基础—Netty实现消息推送服务
  • IntelliJ IDEA 调试技巧指南
  • apache-maven-3.9.9 详细安装配置教程(2025版)
  • 散货拼柜业务,如何管理多个客户和供应商的财务账单?
  • Android audio(8)-native音频服务的启动与协作(audiopolicyservice和audioflinger)
  • Linux 入门:权限的认识和学习
  • ThreadPoolExecutor 源码分析
  • 【设计模式】3W 学习法深入剖析创建型模式:原理、实战与开源框架应用(含 Java 代码)
  • 电动车出入库管理软件,电动车维修保养售后服务管理系统,佳易王电动车店管理系统操作教程
  • OpenResty/Lua 编码指南/指南