如何用Python获取含births与year列的DataFrame折线图峰值数量?
如何用Python找出DataFrame折线图中的峰值数量
嗨,这个需求我之前刚好处理过,用scipy.signal.find_peaks就能精准解决,还能根据你视觉上观察到的峰值特征灵活调整判断条件,下面给你一步步拆解操作:
核心方案:使用scipy的find_peaks函数
这个函数专门用来检测序列中的局部最大值,能通过参数过滤噪声或不符合要求的小波动,完美匹配你从折线图里看到的峰值特征。
步骤1:导入所需库
先确保你装了scipy,没装的话先跑pip install scipy,然后导入依赖:
import pandas as pd from scipy.signal import find_peaks
步骤2:准备数据
从你的DataFrame里提取births列的数值序列——这是我们要检测峰值的核心数据:
# 提取births的数值数组 births_data = df['births'].values
如果你的折线图有很多小毛刺(视觉上的无关波动),建议先做平滑处理,用滚动均值过滤噪声:
# 用窗口大小为3的滚动均值平滑数据,可根据实际波动情况调整窗口大小 df['smoothed_births'] = df['births'].rolling(window=3).mean().dropna() # 提取平滑后的序列 births_data = df['smoothed_births'].values
步骤3:检测峰值并统计数量
基础用法很直接,调用find_peaks就能得到峰值的索引,长度就是峰值数量:
# 基础检测:找出所有局部最大值 peaks, _ = find_peaks(births_data) # 统计峰值数量 peak_count = len(peaks) print(f"检测到的峰值数量:{peak_count}")
如果视觉上的峰值有特定要求(比如必须高于某个数值、两个峰值间隔至少几年),可以通过参数精准过滤:
# 示例:设置最小高度、最小间隔、突出度来匹配视觉峰值 peaks, properties = find_peaks( births_data, height=1000, # 峰值必须高于1000,过滤低幅度波动 distance=2, # 两个峰值至少间隔2个索引(对应你的year列就是间隔2年) prominence=500 # 峰值到两侧谷底的垂直距离至少500,过滤不明显的小凸起 ) peak_count = len(peaks) print(f"匹配视觉效果的峰值数量:{peak_count}")
可选:查看峰值对应的年份
如果想知道每个峰值具体对应哪一年,结合year列就能轻松获取:
# 注意:如果做了平滑处理,df可能有缺失索引,需对应调整 peak_years = df.loc[peaks, 'year'].tolist() print(f"峰值对应的年份:{peak_years}")
关键参数说明
height:设置峰值的最小高度,避免把无关的低幅度波动误判为峰值distance:控制两个峰值之间的最小间隔,防止相邻的小峰被重复统计prominence:衡量峰值的“突出程度”,能有效过滤那些和周围数据差值不大的小凸起
你可以反复调整这些参数,直到检测结果和你从折线图里观察到的峰值数量完全一致。
内容的提问来源于stack exchange,提问作者Tanmoy
相关产品推荐
相关产品推荐

