CitySim数据集入门指南:从数据加载到可视化分析的完整实践

1次阅读
没有评论

共计 2171 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点

CitySim 数据集作为城市模拟研究的重要资源,通常以 HDF5 格式存储。对于初学者来说,直接处理原始数据会遇到几个常见问题:

CitySim 数据集入门指南:从数据加载到可视化分析的完整实践

  • 数据结构复杂:HDF5 文件采用层次化存储,包含多个 group 和 dataset,初学者往往不知道如何正确遍历和提取数据。

  • 内存占用高:城市模拟数据通常包含高维时空信息,直接加载可能导致内存溢出。

  • 数据质量问题:原始数据中常存在异常值、缺失值和噪声,需要经过清洗才能用于分析。

技术方案对比

在处理大规模时空数据时,常用的 Python 工具有 Pandas、Dask 和 Vaex。下面是它们的主要特点对比:

  1. Pandas:
  2. 适合中小规模数据(内存能容纳)
  3. API 丰富,社区支持好
  4. 单线程操作,内存效率较低

  5. Dask:

  6. 支持分块处理,适合大数据
  7. 延迟计算,内存效率高
  8. 学习曲线较陡

  9. Vaex:

  10. 零内存复制
  11. 支持核外处理
  12. 可视化功能强大

选型建议:对于 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()

生产建议

内存优化

  1. 分块处理:对于超大数据集,可以分块读取和处理
chunk_size = 100000
for chunk in pd.read_hdf('data.h5', key='traffic', chunksize=chunk_size):
    process_chunk(chunk)
  1. 数据类型优化:

  2. 将 float64 转为 float32

  3. 将 object 类型转为 category
  4. 使用稀疏数据结构

可复见性

  1. 设置随机种子:

    import numpy as np
    np.random.seed(42)

  2. 数据版本控制:

  3. 使用 DVC 管理数据版本
  4. 保存数据处理的完整日志

延伸思考

基于 CitySim 数据集,可以考虑以下几个进阶方向:

  1. 交通信号优化:结合强化学习算法,优化交通信号灯控制策略

  2. 城市规划评估:使用模拟数据评估不同城市规划方案的效果

  3. 突发事件模拟:研究极端天气或事故对城市系统的影响

总结

通过本文的实践指南,我们从数据加载、清洗到可视化,完整地探索了 CitySim 数据集。掌握了这些基础技能后,你可以更高效地开展城市模拟相关研究。希望这些代码模板和分析框架能帮助你节省初期探索时间,快速进入更有价值的研究阶段。

正文完
 0
评论(没有评论)