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

如何对DataFrame价格数据进行类直方图汇总及区间分析?

实现方案

核心思路

利用DBSCAN密度聚类,以0.01为距离阈值,自动将价格落在彼此±0.01范围内的样本归为同一组;之后对每组统计长度(价格强度),并提取每组的首尾时间与对应价格。

代码实现步骤

1. 导入依赖库

import pandas as pd
from sklearn.cluster import DBSCAN

2. 构造示例数据

# 构造用户提供的价格Series
data = {
    "datetime": ["2022-09-07 12:30:00", "2022-09-07 12:35:00", "2022-09-07 12:40:00",
                 "2022-09-07 12:45:00", "2022-09-07 12:50:00", "2022-09-07 12:55:00",
                 "2022-09-07 13:00:00"],
    "High": [144.183, 144.184, 144.151, 144.154, 144.144, 144.154, 144.203]
}
price_series = pd.Series(data["High"], index=pd.to_datetime(data["datetime"]), name="High")

3. 执行聚类分组

# 将价格转换为DBSCAN所需的二维数组格式
X = price_series.values.reshape(-1, 1)
# 初始化DBSCAN:eps=0.01(距离阈值),min_samples=1(允许单样本组)
dbscan = DBSCAN(eps=0.01, min_samples=1)
# 拟合数据并获取聚类标签
labels = dbscan.fit_predict(X)
# 将标签添加到原Series的DataFrame中
price_df = price_series.to_frame().assign(cluster=labels)

4. 统计每组信息

# 按聚类标签分组,计算每组的强度、首尾时间与价格
grouped_info = price_df.groupby("cluster").agg(
    价格强度=("High", "count"),
    起始时间=("datetime", "first"),
    起始价格=("High", "first"),
    结束时间=("datetime", "last"),
    结束价格=("High", "last")
).reset_index(drop=True)

# 单独提取每组的首尾时间-价格对(如用户示例格式)
grouped_boundaries = []
for _, group in price_df.groupby("cluster"):
    boundary = group.iloc[[0, -1]]
    grouped_boundaries.append(boundary)

# 打印结果示例
print("各组统计信息:")
print(grouped_info)
print("\n各组首尾时间与价格:")
for idx, boundary in enumerate(grouped_boundaries):
    print(f"\n组{chr(ord('a')+idx)}首尾数据:")
    print(boundary)

结果说明

  • 聚类后的分组完全匹配用户需求:单样本组(144.144、144.203)、双样本组(144.183、144.184)、三样本组(144.151、144.154、144.154)。
  • grouped_info 包含每组的强度、首尾时间和价格;grouped_boundaries 是每组首尾数据的Series列表,与用户示例格式一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:55:25