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

如何判断Pandas DataFrame中数值的整体增减趋势,允许20%的偏差

Pandas 序列趋势判断(支持自定义阈值)

修改思路

  1. 先计算序列相邻元素的差值,得到相邻比较的总步数
  2. 分别统计符合递增、递减规则的步数占总步数的比例
  3. 设定阈值(默认80%),只要对应占比达到阈值就判定为对应趋势,否则判定为平稳
  4. 可根据需求调整是否将「持平」算作符合递增/递减规则的有效步数

修改后代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:09:00