You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jupyter中数据集百分比差异计算出错及绘图问题求助

问题分析与解决

为什么会出现负数结果?

你用的是对称百分比差异公式,计算逻辑是:

差异 = (y - x) / [(x + y)/2]

这个公式会体现差异的方向——当第二个数据集的MELT值(y)小于第一个数据集的对应值(x)时,结果自然为负。比如你第一个样本x=8,y=2,代入后就是(2-8)/((8+2)/2) = -6/5 = -1.2,这是公式的正常输出,不是代码错误。

修正百分比差异计算

根据你的需求,选择对应的计算方式:

1. 只看差异幅度(无符号)

如果不需要区分谁大谁小,只想得到差异的绝对值:

diffs = []
for x, y in zip(MELT_data_h5['MELT'], MELT_data_CP['MELT']):
    avg = (x + y) / 2
    if avg == 0:  # 避免x和y都为0时除以0
        diff = 0.0
    else:
        diff = abs(y - x) / avg  # 取绝对值
    diffs.append(diff)

2. 以其中一个数据集为基准的百分比变化

比如以MELT_data_h5为基准,计算MELT_data_CP相对它的变化率(转为百分比):

diffs = []
for x, y in zip(MELT_data_h5['MELT'], MELT_data_CP['MELT']):
    if x == 0:  # 避免基准值为0时出错
        diff = float('nan')  # 标记为缺失值,绘图时会自动跳过
    else:
        diff = (y - x) / x * 100  # 转为百分比格式
    diffs.append(diff)

3. 保留对称差异但转为正数

如果仍想使用对称差异公式,但不想出现负数,把分子换成绝对值即可:

diffs = []
for x, y in zip(MELT_data_h5['MELT'], MELT_data_CP['MELT']):
    avg = (x + y) / 2
    if avg == 0:
        diff = 0.0
    else:
        diff = abs(y - x) / avg
    diffs.append(diff)

绘图实现(基于Jupyter)

假设你的数据集有日期列(比如名为date),提取年份后用Matplotlib绘图:

import pandas as pd
import matplotlib.pyplot as plt

# 提取年份(假设日期列是字符串格式)
years = pd.to_datetime(MELT_data_h5['date']).dt.year

# 绘制折线图
plt.figure(figsize=(10, 6))
plt.plot(years, diffs, marker='o', linestyle='-', color='#1f77b4')
plt.xlabel('年份')
plt.ylabel('百分比差异')
plt.title('MELT列年度百分比差异对比')
plt.grid(alpha=0.3)
plt.show()

内容的提问来源于stack exchange,提问作者naiyaluna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:10:26