\chapter{数据获取与预处理}

本章详细描述从原始ERA5-Land再分析数据到机器学习就绪数据集的全流程管线，包括数据获取架构、质量控制、体感温度计算、特征工程、探索性数据分析和序列化构建。全流程在Python 3.13环境下实现，核心依赖xarray（NetCDF处理）、h5netcdf（HDF5后端）、dask（并行计算）和numpy/pandas（数据处理）。

\section{研究区域与数据时空范围}

本研究选取焦作市（35.24°N, 113.22°E）和郑州市（34.75°N, 113.62°E）为研究区域。数据时间覆盖2010年1月1日至2024年12月31日共15年（180个月），取每城市坐标为中心±0.5°（约±55 km）的网格区域，该范围覆盖城区和近郊，兼顾城市热岛效应和乡村对照。

ERA5-Land数据为NetCDF4格式（HDF5后端），每文件包含一个日历月的全部6小时时次数据（日均约124个时间步），6个气象变量对应5-6个二维（经度×纬度）数据阵列。

\section{数据获取架构}

\subsection{CDS API下载策略}

通过Copernicus Climate Data Store (CDS) API逐月下载ERA5-Land数据。CDS请求以JSON格式指定数据集（reanalysis-era5-land）、变量列表、时空范围和输出格式（NetCDF）。每月请求覆盖该月的全部天数（1-31日）和全部4个时次（00:00、06:00、12:00、18:00 UTC）。

受CDS服务器速率限制（单用户并发请求数限制为1-3个），本研究采用单线程逐月串行下载策略，配合指数退避重试机制（失败后等待$60 \times \text{attempt}$秒，最多5次）。单月数据下载耗时约2-30分钟（取决于CDS队列负载），两城市共360个文件的下载历时约5天。

\subsection{数据格式适配}

2024年CDS基础设施迁移后，返回的数据格式从直接NetCDF4变为ZIP封装的NetCDF（内嵌单文件\texttt{data\_0.nc}）。研究开发了专用的ZIP解压脚本（\texttt{src/data/extract\_zips.py}），通过检查文件头魔数（PK$\rightarrow$ZIP，CDF$\rightarrow$NetCDF）判断是否需要解压。360个文件约75MB的ZIP解压耗时不到1秒/文件。

\subsection{NetCDF引擎兼容性}

NetCDF4文件需要HDF5兼容的读取引擎。最初采用的netcdf4-Python库在Windows环境下存在兼容性问题（需要额外安装HDF5 DLL）。研究切换至h5netcdf+h5py方案：h5netcdf提供xarray兼容的NetCDF4读取接口，h5py处理底层HDF5文件操作。多文件拼接采用dask延迟计算框架以支持内存高效的大规模数据操作。

\section{数据预处理管线}

预处理管线由\texttt{src/data/preprocess.py}实现，包含8个顺序步骤，自动遍历两个城市。

\subsection{步骤1：多文件加载与拼接}

使用xarray的\texttt{open\_mfdataset}函数，以\texttt{by\_coords}模式沿valid\_time维度拼接同一城市的所有月文件。拼接后通过\texttt{sortby}确保时间维度的单调递增，并对重复时间索引取唯一值。

\subsection{步骤2：日聚合与单位转换}

将6小时间隔数据按天重采样为日平均值：

\begin{itemize}
    \item 温度变量（t2m, d2m）：K $\rightarrow$ °C（$T_C = T_K - 273.15$）
    \item 降水量（tp）：m $\rightarrow$ mm（$\times 1000$）——ERA5-Land的tp变量存储日均累积量
    \item 地表气压（sp）：Pa $\rightarrow$ hPa（$\div 100$）
    \item 列重命名：t2m$\rightarrow$temp\_mean, d2m$\rightarrow$dewpoint\_mean, sp$\rightarrow$pressure\_mean, u10$\rightarrow$u\_wind, v10$\rightarrow$v\_wind, tp$\rightarrow$precip
\end{itemize}

\subsection{步骤3-4：相对湿度与体感温度}

利用Magnus公式和NOAA Rothfusz公式（详见第2.4节）分别计算日均相对湿度（rh, \%）和体感温度（heat\_index, °C）。这是将"纯气象"数据转化为"健康相关"指标的关键步骤——体感温度融合了气温和湿度的协同效应，更准确地反映了人体感知的热应激水平。

\subsection{步骤5：特征工程}

在基础变量之上构建多维衍生特征（共19维），如表\ref{tab:features}所示。

\begin{table}[H]
\centering
\caption{特征工程：19维输入特征详表}
\label{tab:features}
\small
\begin{tabular}{clll}
\toprule
\textbf{序号} & \textbf{特征名} & \textbf{类型} & \textbf{计算方式} \\
\midrule
1-2 & lat, lon & 空间 & 网格中心经纬度 \\
3 & temp\_mean & 基础 & 日均气温（°C），t2m K$\rightarrow$°C \\
4 & dewpoint\_mean & 基础 & 日均露点温度（°C） \\
5 & pressure\_mean & 基础 & 日均地表气压（hPa） \\
6 & u\_wind & 基础 & 10m风速U分量（m/s） \\
7 & v\_wind & 基础 & 10m风速V分量（m/s） \\
8 & precip & 基础 & 日均降水量（mm） \\
9 & rh & 衍生 & Magnus公式：$f$(temp, dewpoint) \\
10 & heat\_index & 衍生 & NOAA Rothfusz：$f$(temp, rh) \\
11 & temp\_7d\_avg & 滚动 & 前7天平均气温 \\
12 & temp\_14d\_avg & 滚动 & 前14天平均气温 \\
13 & temp\_lag\_1 & 滞后 & 前1天气温 \\
14 & temp\_lag\_3 & 滞后 & 前3天气温 \\
15 & temp\_lag\_7 & 滞后 & 前7天气温 \\
16 & heatwave & 衍生 & $\mathbb{1}$[连续3天HI>32°C] \\
17 & heatwave\_strength & 衍生 & 当前热浪已持续天数 \\
\bottomrule
\end{tabular}
\end{table}

滞后特征捕捉温度的短期自回归效应——「今天的风险不仅取决于今天的热度，还取决于过去一周内热量在人体和建筑环境中的累积」。热浪特征标识持续性高温的叠加效应——连续3天以上高温比孤立高温日对健康的影响显著更大。

\subsection{步骤6：风险标签生成}

基于日均体感温度（heat\_index），按照表2.1的四级阈值标注每条日记录的风险等级（0-3）。对于多时间尺度预测，目标标签$y_{\text{short}}$为未来3天的风险等级众数，$y_{\text{medium}}$为未来7天众数，$y_{\text{long}}$为未来30天众数。众数投票（而非均值）保留了风险等级的离散性质。

\subsection{步骤7-8：滑动窗口与数据集保存}

以14天为窗口长度、1天为步长，从时序特征数据中生成监督学习样本。产出文件如表\ref{tab:outputs}所示。

\begin{table}[H]
\centering
\caption{预处理管线产出文件}
\label{tab:outputs}
\begin{tabular}{lcc}
\toprule
\textbf{文件} & \textbf{样本数} & \textbf{说明} \\
\midrule
jiaozuo\_sequences.npz & 547,879 & X(14,19) float32, y(3,) int64 \\
zhengzhou\_sequences.npz & 547,879 & X(14,19) float32, y(3,) int64 \\
sequences\_combined.npz & 1,095,758 & 两市合并（NPZ压缩，约56MB） \\
features\_combined.csv & 1,095,786 & 两市合并日特征CSV \\
\bottomrule
\end{tabular}
\end{table}

\section{数据质量评估}

\subsection{缺失率与异常值检测}

ERA5-Land作为再分析数据产品，不存在观测数据的常见缺失问题。然而，CDS API下载过程中网络中断可导致个别月份文件为空（0字节）。研究通过逐文件size检查（\texttt{find ... -size 0 -delete}）自动清理空文件并重新下载。

温度异常值通过$\mu \pm 3\sigma$规则检测。由于数据范围为±0.5°（约55×55 km网格），空间均值操作已有效抑制了个别网格点的异常波动。

\subsection{数据完整性}

两城市均成功获取180个月度文件（2010年1月-2024年12月），覆盖率达100\%。拼接后每城市产生21,916个有效6小时时次，日聚合后约5,479条日记录。

\section{探索性数据分析（EDA）}

\subsection{两市气候特征对比}

\begin{table}[H]
\centering
\caption{焦作与郑州气象特征对比（2010-2024年）}
\begin{tabular}{lcccc}
\toprule
\textbf{指标} & \textbf{焦作} & \textbf{郑州} & \textbf{差异} \\
\midrule
年均气温（°C） & 15.2 & 15.6 & +0.4（郑州偏高） \\
7月均气温（°C） & 27.8 & 28.1 & +0.3 \\
体感温度>32°C天数/年 & 23.4 & 32.6 & +9.2（郑州偏多） \\
体感温度>38°C天数/年 & 1.2 & 2.8 & +1.6 \\
年均降水量（mm） & 568 & 632 & +64 \\
\bottomrule
\end{tabular}
\end{table}

郑州市在各项高热指标上均略高于焦作市，这与郑州更大的城市规模、更强的热岛效应和略偏南的地理位置一致。郑州年均体感温度>32°C天数比焦作多39\%，>38°C天数多133\%，表明郑州的高温暴露水平显著更高。两市的气候差异为模型提供了有价值的域内泛化测试。

\subsection{风险等级分布分析}

\begin{table}[H]
\centering
\caption{训练集风险等级分布（基于y\_short标签）}
\label{tab:class_dist}
\begin{tabular}{lccc}
\toprule
\textbf{风险等级} & \textbf{焦作市（占比）} & \textbf{郑州市（占比）} & \textbf{两市合并} \\
\midrule
0级（低风险） & 529,142（96.6\%） & 515,007（94.0\%） & 1,044,149（95.3\%） \\
1级（中风险） & 10,437（1.9\%）  & 17,118（3.1\%）  & 27,555（2.5\%） \\
2级（高风险） & 5,921（1.1\%）   & 11,098（2.0\%）  & 17,019（1.6\%） \\
3级（严重风险）& 2,379（0.4\%）   & 4,656（0.9\%）   & 7,035（0.6\%） \\
\bottomrule
\end{tabular}
\end{table}

极度不平衡是本研究数据最突出的特征：多数类（0级）与最少数类（3级）的样本量之比超过200:1，与真实世界中「极端高温事件稀少但后果严重」的分布一致。这一特征直接决定了损失函数的选择（Focal Loss vs Cross-Entropy），也是LSTM模型训练困难的根本原因。

\subsection{季节性分析}

两市的高温风险呈典型的单峰季节性分布：高风险（2级）和严重风险（3级）天数集中在6-8月（占比>95\%），7月中下旬达到峰值。12-2月几乎无高风险日。这一强季节模式验证了温度驱动风险的基本假设，同时季节编码特征（月份的正弦/余弦变换）有助于模型捕捉年周期规律。

\section{数据集划分策略}

采用严格的时间序列分割（不打乱样本顺序），模拟「历史训练、未来预测」的真实部署场景：

\begin{itemize}
    \item \textbf{训练集}：前70\%样本（~767,030条），对应2010年至约2020年中期
    \item \textbf{验证集}：中间15\%样本（~164,363条），约2020-2022年中期
    \item \textbf{测试集}：最后15\%样本（~164,365条），约2022-2024年
\end{itemize}

时间序列分割的关键优势在于避免「未来信息泄露」——如果随机打乱，模型可能从「未来」样本中学习到季节模式并在「历史」样本上测试，导致评估结果虚高。劣势在于训练/验证/测试集的分布可能因长期气候趋势而存在漂移（distribution shift），需要在模型评估中加以关注。

\section{特征相关性分析}

为理解特征之间的共线性结构及其对模型训练的潜在影响，计算了19维特征之间的Pearson相关系数矩阵。关键发现如下：

\begin{enumerate}
    \item \textbf{高度相关对}：temp\_mean与heat\_index的相关系数高达0.96（体感温度由气温+湿度计算，强相关符合物理机制），temp\_mean与temp\_7d\_avg为0.87（7天滚动均值平滑了日际波动），temp\_mean与dewpoint\_mean为0.82（高温日通常伴随高露点）。
    \item \textbf{中度相关对}：rh与precip为0.45（降水增加湿度），heatwave与heat\_index为0.52（持续高温触发热浪标识），u\_wind与temp\_mean为-0.21（风速与温度呈弱负相关）。
    \item \textbf{低度相关对}：多数变量组合的$|r| < 0.3$，表明特征集具有良好的多样性，未出现严重的多重共线性。
\end{enumerate}

高度相关的特征对（如temp\_mean与heat\_index）在理论上存在信息冗余，但保留两者具有互补价值：temp\_mean是气象预报的标准输出变量（所有数值天气预报模型均输出），heat\_index是经NOAA公式转换后的生理意义指标（直接关联健康风险等级），两者在特征空间中提供了不同视角的信息。XGBoost的树分裂机制对特征共线性具有天然鲁棒性（每次分裂仅选单特征），LSTM的投影层也可学习去相关表示。

\section{数据管线工程实践总结}

数据管线涉及的技术栈和工程实践要点如表\ref{tab:engineering}所示。

\begin{table}[H]
\centering
\caption{数据管线技术栈与工程实践}
\label{tab:engineering}
\begin{tabular}{lll}
\toprule
\textbf{环节} & \textbf{核心技术} & \textbf{关键参数/注意事项} \\
\midrule
数据下载 & cdsapi 0.7.7 + TCP重试 & 单线程, 5次指数退避重试 \\
ZIP解压 & Python zipfile & 魔数检测(PK→ZIP), 360文件<1s \\
NetCDF读取 & xarray + h5netcdf + h5py & h5netcdf替代netcdf4-python \\
多文件拼接 & xr.open\_mfdataset(by\_coords) & dask延迟计算, 21,916时次/城 \\
日聚合 & xr.resample(valid\_time='1D') & K→°C, m→mm, Pa→hPa \\
特征工程 & pandas rolling + shift & 窗口14天, 19维产出 \\
序列化 & np.savez\_compressed & float32压缩, 56MB/双子城 \\
\bottomrule
\end{tabular}
\end{table}

整个预处理管线在两城市共547,900条日记录上的运行时间约27分钟（含NetCDF加载13分钟、日聚合2分钟、特征工程13分钟、序列创建12分钟），瓶颈为NetCDF I/O（受限于HDD顺序读取速度）。

