如何无需嵌套循环,用Python或工具包检测数据序列的U/V型片段?
无需嵌套循环的U/V型片段检测方法(Python)
可以利用Pandas的向量化操作与分组功能实现需求,避免手动编写起始点+结束点的嵌套循环,核心思路是通过标记关键点位、分组连续区间来快速定位符合条件的片段:
步骤说明
- 标记关键点位:区分首尾候选点(ratio≥0.7)、有效中间点(ratio<0.7)、低点(ratio≤0.2);
- 分组连续区间:以首尾候选点为分隔,将连续的有效中间段划分为独立分组;
- 筛选有效中间组:保留包含至少一个低点且全为有效中间点的分组;
- 匹配首尾点:为每个有效中间组匹配前后最近的首尾候选点,得到完整的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
相关产品推荐
相关产品推荐

