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

