共计 2171 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
CitySim 数据集作为城市模拟研究的重要资源,通常以 HDF5 格式存储。对于初学者来说,直接处理原始数据会遇到几个常见问题:

-
数据结构复杂:HDF5 文件采用层次化存储,包含多个 group 和 dataset,初学者往往不知道如何正确遍历和提取数据。
-
内存占用高:城市模拟数据通常包含高维时空信息,直接加载可能导致内存溢出。
-
数据质量问题:原始数据中常存在异常值、缺失值和噪声,需要经过清洗才能用于分析。
技术方案对比
在处理大规模时空数据时,常用的 Python 工具有 Pandas、Dask 和 Vaex。下面是它们的主要特点对比:
- Pandas:
- 适合中小规模数据(内存能容纳)
- API 丰富,社区支持好
-
单线程操作,内存效率较低
-
Dask:
- 支持分块处理,适合大数据
- 延迟计算,内存效率高
-
学习曲线较陡
-
Vaex:
- 零内存复制
- 支持核外处理
- 可视化功能强大
选型建议:对于 CitySim 数据集,如果数据量在 GB 级别,可以先尝试 Pandas;如果超过内存容量,推荐使用 Dask 或 Vaex。
核心实现
HDF5 数据结构解析
import h5py
# 打开 HDF5 文件
with h5py.File('citysim_data.h5', 'r') as f:
# 遍历文件结构
def print_attrs(name, obj):
print(name)
for key, val in obj.attrs.items():
print(f"{key}: {val}")
f.visititems(print_attrs)
# 提取交通流量数据
traffic = f['/transportation/traffic_flow'][:] # 形状为(时间步, 路段数)
# 提取建筑物数据
buildings = f['/buildings/geometry'][:] # 形状为(建筑物数, 顶点数, 3)
数据清洗
Pandas 提供了多种筛选方法,下面是性能对比:
import pandas as pd
# 方法 1:使用 query()
df.query('speed > 0 & speed < 120', inplace=True)
# 方法 2:使用 loc[]
df = df.loc[(df['speed'] > 0) & (df['speed'] < 120)]
# 方法 3:使用布尔索引
mask = (df['speed'] > 0) & (df['speed'] < 120)
df = df[mask]
性能测试表明,对于大型 DataFrame,query()方法通常最快,因为它在底层使用了优化过的表达式求值。
可视化实践
交通流量热力图
import seaborn as sns
import matplotlib.pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建热力图
plt.figure(figsize=(12, 8))
ax = sns.heatmap(traffic_data,
cmap='YlOrRd', # 颜色映射
vmin=0, vmax=100, # 数值范围
cbar_kws={'label': '流量'}, # 颜色条标签
annot=False, # 不显示数值
linewidths=0.5) # 单元格边线
ax.set_title('城市交通流量热力图')
ax.set_xlabel('路段编号')
ax.set_ylabel('时间步')
plt.tight_layout()
plt.show()
调优技巧:
– 使用 vmin 和vmax固定颜色范围,便于不同图之间比较
– 对于稀疏数据,可以设置 center 参数突出显示中间值
– 大数据集建议设置 annot=False 避免显示数值,提升渲染速度
三维建筑物可视化
import pyvista as pv
# 创建 PyVista 网格
mesh = pv.PolyData(buildings_data)
# 可视化
plotter = pv.Plotter()
plotter.add_mesh(mesh, color='tan', show_edges=True)
plotter.add_axes()
plotter.show()
生产建议
内存优化
- 分块处理:对于超大数据集,可以分块读取和处理
chunk_size = 100000
for chunk in pd.read_hdf('data.h5', key='traffic', chunksize=chunk_size):
process_chunk(chunk)
-
数据类型优化:
-
将 float64 转为 float32
- 将 object 类型转为 category
- 使用稀疏数据结构
可复见性
-
设置随机种子:
import numpy as np np.random.seed(42) -
数据版本控制:
- 使用 DVC 管理数据版本
- 保存数据处理的完整日志
延伸思考
基于 CitySim 数据集,可以考虑以下几个进阶方向:
-
交通信号优化:结合强化学习算法,优化交通信号灯控制策略
-
城市规划评估:使用模拟数据评估不同城市规划方案的效果
-
突发事件模拟:研究极端天气或事故对城市系统的影响
总结
通过本文的实践指南,我们从数据加载、清洗到可视化,完整地探索了 CitySim 数据集。掌握了这些基础技能后,你可以更高效地开展城市模拟相关研究。希望这些代码模板和分析框架能帮助你节省初期探索时间,快速进入更有价值的研究阶段。
