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

如何从Pandas DataFrame多列筛选破纪录高低值并绘制对比图?

解决方案:筛选Pandas DataFrame中的破纪录数据并可视化

没问题,我来一步步帮你搞定这个需求——从包含每日高低值的DataFrame里筛选出打破历史最高/最低纪录的数据,再用Matplotlib画出对应的可视化图。咱们用你给的示例数据来演示整个流程。


1. 导入依赖库

首先得把需要的工具库导入进来:

import pandas as pd
import matplotlib.pyplot as plt

2. 创建并预处理示例DataFrame

先补全你的示例数据,然后把日期列转为datetime类型(这一步很关键,能确保后续排序和绘图的日期逻辑正确):

# 补全示例数据集
new_data = {
    'Date': ['1/1/2015', '1/2/2015', '1/3/2015', '1/4/2015', '1/5/2015'],
    'new_low': [10, 25, 24, 21, 15],
    'new_high': [35, 37, 38, 36, 40]
}

# 创建DataFrame并转换日期格式
df = pd.DataFrame(new_data)
df['Date'] = pd.to_datetime(df['Date'])

3. 计算累积历史最高/最低值

要判断当日是否打破纪录,需要对比截至当日的所有历史数据的最高/最低值。Pandas的cummax()和cummin()函数正好能帮我们计算累积的最大/最小值:

# 计算累积历史最高值(到当日为止的所有新高最大值)
df['cum_high'] = df['new_high'].cummax()
# 计算累积历史最低值(到当日为止的所有新低最小值)
df['cum_low'] = df['new_low'].cummin()

简单解释下:cummax()会逐行计算到当前行为止的最大值,比如1/3/2015的cum_high是38,因为前三天的新高是35、37、38,最大值是38;到1/5/2015时,cum_high更新为40,因为当日新高40超过了之前的38。

4. 筛选破纪录的数据

当当日的new_high等于cum_high时,说明这一天创造了新的历史最高;同理,new_low等于cum_low时就是新的历史最低:

# 筛选所有历史最高纪录行
high_records = df[df['new_high'] == df['cum_high']]
# 筛选所有历史最低纪录行
low_records = df[df['new_low'] == df['cum_low']]

你可以打印结果验证:

print("历史最高纪录:")
print(high_records)
print("\n历史最低纪录:")
print(low_records)

5. 用Matplotlib可视化

我们要实现两个核心效果:

  • 旧纪录(累积的最高/最低值)用折线图展示趋势
  • 新纪录的点用散点图突出显示,区分最高和最低的颜色
# 创建画布和轴对象,设置合适的尺寸
fig, ax = plt.subplots(figsize=(10, 6))

# 绘制累积历史最高/最低的折线图(旧纪录趋势线)
ax.plot(df['Date'], df['cum_high'], color='orange', linestyle='--', label='历史最高趋势线')
ax.plot(df['Date'], df['cum_low'], color='blue', linestyle='--', label='历史最低趋势线')

# 绘制历史最高纪录的散点(用红色上三角标记)
ax.scatter(high_records['Date'], high_records['new_high'], color='red', s=100, marker='^', label='新历史最高')
# 绘制历史最低纪录的散点(用深蓝色下三角标记)
ax.scatter(low_records['Date'], low_records['new_low'], color='darkblue', s=100, marker='v', label='新历史最低')

# 添加图表装饰,提升可读性
ax.set_title('每日高低值与历史纪录对比', fontsize=14)
ax.set_xlabel('日期', fontsize=12)
ax.set_ylabel('数值', fontsize=12)
ax.legend()
ax.grid(True, alpha=0.3)

# 自动调整日期标签角度,避免重叠
plt.xticks(rotation=45)
plt.tight_layout()

# 显示图表
plt.show()

额外提示

  • 如果你的数据集很大,cummax()和cummin()的计算效率非常高,完全不用担心性能问题
  • 日期列一定要转成datetime类型,不然绘图时日期可能会乱序
  • 可以根据需求调整散点的大小、颜色和标记样式,让可视化更贴合你的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:51:10