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

Python时间序列:绘制阈值穿越次数曲线及代码调试(含连续约束)

问题分析与修正方案

原代码的核心问题

  1. 索引错误:y的索引应该对应外层循环的阈值(j),但你用了内层循环的数据点索引(i),导致每个阈值的计数没有被正确存入y的对应位置,大部分y元素未被赋值,所以显示为None。
  2. 逻辑混乱:内层循环中每次检测到超过阈值就重置counter,根本无法累计有效计数;同时完全没有处理「连续2个及以上数据点超过」的约束。
  3. 冗余变量:count、d等变量定义后未使用,属于无效代码。

修正后的代码实现

先明确:你需要的是哪种统计方式?

下面提供两种常见的统计逻辑,按需选择:

方式1:统计「连续超过阈值的段的数量」(例:连续3个超过算1次事件)
import numpy as np

# 假设你的时间序列数据是data,比如从minutedata中提取:
data = minutedata[1]

# 生成阈值序列
x = np.linspace(10, 40, 1440)
# 初始化结果数组,不用object类型,用float/int即可
y = np.zeros_like(x)

for j, x_thresh in enumerate(x):
    # 标记每个数据点是否超过当前阈值
    over_threshold = data > x_thresh
    # 给数组前后补False,方便处理边界的连续段
    padded = np.concatenate([[False], over_threshold, [False]])
    # 找状态变化的位置(False→True 或 True→False)
    transitions = np.diff(padded.astype(int))
    # 提取连续段的起始和结束位置
    starts = np.where(transitions == 1)[0]
    ends = np.where(transitions == -1)[0]
    # 计算每个连续段的长度
    segment_lengths = ends - starts
    # 统计长度≥2的连续段数量
    y[j] = np.sum(segment_lengths >= 2)
方式2:统计「所有属于连续2个及以上超过阈值的点的总数」(例:连续3个超过算3个点)
import numpy as np

data = minutedata[1]
x = np.linspace(10, 40, 1440)
y = np.zeros_like(x)

for j, x_thresh in enumerate(x):
    over_threshold = data > x_thresh
    # 用滑动窗口判断连续超过的情况:当前点和下一个点都超过,或当前点和前一个点都超过
    # 补边界后用卷积计算连续True的数量
    padded = np.concatenate([[False], over_threshold, [False]])
    # 卷积核[1,1],计算相邻两个位置的True数量
    consecutive_counts = np.convolve(padded, [1, 1], mode='same')
    # 筛选出属于连续≥2个超过的点(且原数据本身超过阈值)
    valid_points = (consecutive_counts >= 2) & over_threshold
    # 统计符合条件的点总数
    y[j] = np.sum(valid_points)

额外说明

  • 用numpy的向量化操作(比如np.sum、np.convolve)比纯Python循环效率高很多,尤其当你的时间序列数据量很大时。
  • 原代码中y = np.empty(1440,dtype=object)是没必要的,因为我们统计的是数值,直接用np.zeros_like(x)初始化更合适,默认值为0,避免出现None。

内容的提问来源于stack exchange,提问作者liveFreeOrπHard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:55:42