如何对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
相关产品推荐
相关产品推荐

