如何判断Pandas DataFrame中数值的整体增减趋势,允许20%的偏差
Pandas 序列趋势判断(支持自定义阈值)
修改思路
- 先计算序列相邻元素的差值,得到相邻比较的总步数
- 分别统计符合递增、递减规则的步数占总步数的比例
- 设定阈值(默认80%),只要对应占比达到阈值就判定为对应趋势,否则判定为平稳
- 可根据需求调整是否将「持平」算作符合递增/递减规则的有效步数
修改后代码
import pandas as pd # 可配置参数 THRESHOLD = 0.8 # 满足趋势的最小比例要求 INCLUDE_FLAT_IN_TREND = True # 持平是否算入趋势有效步数,设为False则要求严格递增/递减 def judge_trend(series): # 计算相邻差值,去掉空值 diff = series.diff().dropna() total_steps = len(diff) if total_steps == 0: return "series is too short to judge" # 统计符合递增/递减的步数 if INCLUDE_FLAT_IN_TREND: incr_count = (diff >= 0).sum() decr_count = (diff <= 0).sum() else: incr_count = (diff > 0).sum() decr_count = (diff < 0).sum() # 判断趋势 if incr_count / total_steps >= THRESHOLD: return f"df is increasing, because {incr_count} out of {total_steps} values increase" elif decr_count / total_steps >= THRESHOLD: return f"df is decreasing, because {decr_count} out of {total_steps} values decrease" else: max_allowed_error = int(total_steps * (1 - THRESHOLD)) return f"df is more or less constant, because more then {max_allowed_error} values are not increasing" # 测试示例 df1 = pd.DataFrame([1,2,3,5,5,6,7,8,9,10]) print(judge_trend(df1[0])) df2 = pd.DataFrame([1,2,3,5,5,5,7,8,9,5]) print(judge_trend(df2[0])) df3 = pd.DataFrame([1,2,3,4,5,6,7,8,5,5]) print(judge_trend(df3[0]))
参数说明
- THRESHOLD:可根据需求调整比例,比如你需要最多允许2次不满足规则(对应示例2的输出),10个元素共9步,9-2=7,7/9≈0.78,把阈值改成0.78即可匹配示例效果
- INCLUDE_FLAT_IN_TREND:如果要求严格递增/递减(持平不算有效步),就设为False,此时示例3的输出将和你给出的样例完全一致:
df is increasing, because 7 out of 9 values increase
内容的提问来源于stack exchange,提问作者AchillesDay
相关产品推荐
相关产品推荐

