地震事件-台站关联数据的结构名称及高效存储转换方法咨询
地震数据集的结构化存储与转换问题
场景与现有存储方式
处理N次地震被M个台站记录的数据集,数据分为两类:
- 地震专属信息:
event_id、震级mag等 - 台站专属信息:
station_id、仪器采样率等
由于并非所有台站都会记录全部地震,每次地震对应的记录台站数量不固定,当前采用Pandas DataFrame存储,每行对应一次地震,将台站相关字段存储为NumPy数组:
import numpy as np import pandas as pd events = { 'event_id': ['0001', '0002'], 'mag': [2.1, 3.1], 'station_ids': [np.array(['a', 'c']), np.array(['a', 'b', 'c', 'd'])], 'station_sampling_rate': [np.array([100, 60]), np.array([100, 100, 60, 60])] } events_df = pd.DataFrame(events) print(events_df)
输出结果:
event_id mag station_ids station_sampling_rate 0 0001 2.1 [a, c] [100, 60] 1 0002 3.1 [a, b, c, d] [100, 100, 60, 60]
现有方案的缺陷
提取台站专属信息时,现有两种方案存在明显不足:
- 逐行遍历校验:与台站目录逐一对比,速度极慢,不适合大规模数据
- 扩展原DataFrame:新增更多台站字段会导致数据量剧增,后续仍需遍历处理
期望的目标结构
希望转换为以台站为核心的结构,将每个台站关联的地震信息聚合为列表:
station_id sampling_rate event_ids mag 0 a 100 [0001, 0002] [2.1, 3.1] 1 b 100 [0002] [3.1] 2 c 60 [0001, 0002] [2.1, 3.1] 3 d 60 [0002] [3.1]
问题解答
1. 数据结构名称
这种结构属于反向规范化(Denormalization)的聚合表,也可称为实体-关联嵌套表:以台站作为核心实体,将多对多关系中关联的地震属性(event_id、mag)聚合为嵌套列表,目的是优化以台站为核心的查询效率,牺牲部分数据库范式来减少关联查询的开销。
2. 高效转换与存储方法
转换实现
利用Pandas的内置矢量化操作完成转换,避免手动遍历,效率更高:
# 扁平化数据:将每行的台站数组展开,与地震信息一一对应 flattened_data = events_df.apply( lambda row: pd.DataFrame({ 'station_id': row['station_ids'], 'sampling_rate': row['station_sampling_rate'], 'event_id': row['event_id'], 'mag': row['mag'] }), axis=1 ).concat() # 按台站+采样率分组,聚合地震信息为列表 station_core_data = flattened_data.groupby( ['station_id', 'sampling_rate'], as_index=False ).agg( event_ids=('event_id', list), mag=('mag', list) ) print(station_core_data)
存储建议
如果数据集规模较大,推荐使用Parquet格式存储:
- 原生支持嵌套数据类型(如列表),无需额外处理
- 压缩效率高,节省存储空间
- 读写速度远快于CSV,适合后续大规模数据查询与分析
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

