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

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)

相关文章:

  • 自交互学习:计算病理学中用于分子特征预测的多尺度组织形态学特征的融合与演化|文献速递-医学影像人工智能进展
  • 3.git操作:git init说明
  • macOS 安装 LibreOffice
  • QPS和TPS 的区别是什么?QPS 大了会有什么问题,怎么解决?
  • 数据库设计实验(4)—— 数据更新实验
  • MySQL数据高效同步到Elasticsearch的四大方案
  • 记一次ElasticSearch参数调优
  • c语言笔记 字串串函数---strcat,strncat,strcpy,strncpy
  • 【上市公司文本分析】Python+Pytorch微调BERT预训练模型,使用大语言模型完成文本分类任务——金星晔等(2024)《经济研究》大语言模型方法的复现
  • 基于大语言模型与知识图谱的智能论文生成工具开发构想
  • STM32学习【5】用按键控制LED亮灭(寄存器)以及对位运算的思考
  • LeetCode 2614.对角线上的质数:遍历(质数判断)
  • ★ Linux ★ 进程(上)
  • 深度解析manus:技术原理剖析、开源平替方案架构分析
  • kali破解Pdf/execl/word
  • 汽车一键启动PKE无钥匙系统
  • 使用C++写一个递推计算均方差和标准差的用例
  • 使用pyinstaller打包py文件
  • SQL注入第6关
  • 如何用日事清做研发目标、需求、规划、迭代、Bug、效能、复盘、绩效一站式管理
  • 网站建设 中企动力宜昌/新闻发布平台
  • 网页传奇游戏哪个好玩/南京企业网站排名优化
  • 深圳南山建设局官方网站/seo知识是什么意思
  • wordpress 搬迁插件/seo的含义是什么意思
  • wap网站开发视频教程/销售的三个核心点
  • 天元建设集团有限公司的商业承兑汇票能按时支付吗/重庆seo杨洋