JupyterLab中数据集百分比差异计算与绘图问题求助
问题解决:百分比差异计算错误与绘图空白问题
一、百分比差异计算修正
你得到全负数结果是因为分子顺序搞反了。根据你的需求(H5与CP的差值为正),需调整计算逻辑,同时要避免除以0的报错情况:
原错误代码:
diffs = [] for x, y in zip(MELT_data_h5['MELT'], MELT_data_CP['MELT']): sum = ((y - x) / x) * 100 # y是CP值、x是H5值,y-x为负,结果自然为负 diffs.append(sum)
修正后代码(以CP为基准,计算H5相对CP的百分比差异):
diffs = [] for h5_val, cp_val in zip(MELT_data_h5['MELT'], MELT_data_CP['MELT']): # 避免CP值为0时的除以0错误 if cp_val != 0: diff = ((h5_val - cp_val) / cp_val) * 100 else: diff = float('nan') # 标记为缺失值,后续绘图自动跳过 diffs.append(diff)
如果需要以H5为基准计算CP的百分比差异,调整为:
diffs = [] for h5_val, cp_val in zip(MELT_data_h5['MELT'], MELT_data_CP['MELT']): if h5_val != 0: diff = ((cp_val - h5_val) / h5_val) * 100 else: diff = float('nan') diffs.append(diff)
二、解决绘图空白问题
空白图的核心原因是你只设置了轴属性,没有将数据绘制到画布上。以下是完整的阶梯图/折线图方案:
完整绘图代码(阶梯图示例)
import matplotlib.pyplot as plt import datetime import pandas as pd # 确保年份列是datetime格式(如果不是索引,替换为你的日期列名) if not isinstance(MELT_data_h5.index, pd.DatetimeIndex): years = pd.to_datetime(MELT_data_h5['date_column']) else: years = MELT_data_h5.index # 绘制阶梯图 plt.step(years, diffs, where='mid', label='H5 vs CP % Difference') # 设置轴参数 plt.xlim(datetime.datetime(1980,1,1), datetime.datetime(2023,1,1)) # 根据修正后的diffs调整Y轴范围(示例为0到400,可根据实际数据修改) plt.ylim(0, 400) plt.xlabel('Year', fontsize=15) plt.ylabel('% Difference', fontsize=15) plt.legend() plt.grid(True) plt.show()
关键注意点
- 必须确保X轴的年份是datetime类型,matplotlib才能正确解析
- 缺失值
nan会被自动跳过,不影响绘图效果
三、效率优化建议
用pandas向量化运算替代循环,处理大数据集时效率更高:
import pandas as pd # 直接按列计算百分比差异 diffs = ((MELT_data_h5['MELT'] - MELT_data_CP['MELT']) / MELT_data_CP['MELT']) * 100 # 将CP值为0的位置替换为缺失值 diffs = diffs.where(MELT_data_CP['MELT'] != 0, float('nan'))
内容的提问来源于stack exchange,提问作者naiyaluna
相关产品推荐
相关产品推荐

