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
相关产品推荐
相关产品推荐

