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

如何无需嵌套循环,用Python或工具包检测数据序列的U/V型片段?

无需嵌套循环的U/V型片段检测方法(Python)

可以利用Pandas的向量化操作与分组功能实现需求,避免手动编写起始点+结束点的嵌套循环,核心思路是通过标记关键点位、分组连续区间来快速定位符合条件的片段:

步骤说明

  1. 标记关键点位:区分首尾候选点(ratio≥0.7)、有效中间点(ratio<0.7)、低点(ratio≤0.2);
  2. 分组连续区间:以首尾候选点为分隔,将连续的有效中间段划分为独立分组;
  3. 筛选有效中间组:保留包含至少一个低点且全为有效中间点的分组;
  4. 匹配首尾点:为每个有效中间组匹配前后最近的首尾候选点,得到完整的U/V型片段。

代码实现

import pandas as pd

# 示例数据(可替换为你的数据集)
data = [
    ["12/12/2021", 0.676], ["12/13/2021", 0.66], ["12/14/2021", 0.682],
    ["12/15/2021", 0.815], ["12/16/2021", 0.784], ["12/17/2021", 0.649],
    ["12/18/2021", 0.859], ["12/19/2021", 0.084], ["12/20/2021", 0.156],
    ["12/21/2021", 0.435], ["12/22/2021", 0.741], ["12/23/2021", 0.671],
    ["12/24/2021", 0.761], ["12/25/2021", 0.391], ["12/26/2021", 0.126],
    ["12/27/2021", 0.8], ["12/28/2021", 0.761], ["12/29/2021", 1.025],
    ["12/30/2021", 0.776], ["12/31/2021", 0.849]
]
df = pd.DataFrame(data, columns=["date", "ratio"])

# 1. 标记关键点位
df["is_head_tail"] = df["ratio"] >= 0.7  # 首尾候选点
df["is_valid_mid"] = df["ratio"] < 0.7   # 有效中间点
df["has_low_point"] = df["ratio"] <= 0.2 # 低点标记

# 2. 生成连续中间段的分组键:每遇到首尾候选点,分组编号+1
df["group_id"] = df["is_head_tail"].cumsum()

# 3. 统计每个分组的特征,筛选有效中间组
group_summary = df.groupby("group_id").agg(
    contains_low=("has_low_point", "any"),
    all_valid_mid=("is_valid_mid", "all"),
    first_mid_date=("date", "first"),
    last_mid_date=("date", "last")
).reset_index()

# 有效中间组:必须包含低点,且所有点都是有效中间点
valid_mid_groups = group_summary[
    (group_summary["contains_low"]) & (group_summary["all_valid_mid"])
]

# 4. 匹配每个有效中间组对应的首尾点,生成结果
uv_segments = []
for _, group in valid_mid_groups.iterrows():
    # 前一个分组的最后一个点是U/V型的起始点(首尾候选点)
    start_date = df[df["group_id"] == group["group_id"] - 1]["date"].iloc[-1]
    # 后一个分组的第一个点是U/V型的结束点(首尾候选点)
    end_date = df[df["group_id"] == group["group_id"] + 1]["date"].iloc[0]
    uv_segments.append((start_date, end_date))

# 输出结果
print("符合条件的U/V型片段:")
for seg in uv_segments:
    print(f"{seg[0]} 至 {seg[1]}")

代码解释

  • 利用cumsum()生成分组键,自动将连续的有效中间段划分为独立分组,无需手动遍历起始/结束点;
  • 通过groupby().agg()批量统计分组特征,快速筛选符合要求的中间段;
  • 最后仅需遍历少量有效中间组(而非全量数据),匹配前后首尾点,效率远高于嵌套循环。

运行上述代码后,输出结果与示例一致:

符合条件的U/V型片段:
12/18/2021 至 12/22/2021
12/24/2021 至 12/27/2021

内容的提问来源于stack exchange,提问作者sguo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:18:26