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

本章详细描述从原始ERA5-Land再分析数据到机器学习就绪数据集的全流程管线，包括数据获取、质量控制、体感温度计算、特征工程和序列化构建。

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

本研究选取焦作市（35.24°N, 113.22°E）和郑州市（34.75°N, 113.62°E）为研究区域，两市同属暖温带大陆性季风气候，夏季炎热特征显著。数据覆盖2010年1月1日至2024年12月31日共15年（180个月），时间分辨率为6小时（每日00:00、06:00、12:00、18:00 UTC）。

ERA5-Land数据集的原始空间分辨率为0.1°×0.1°（约9 km），本研究以城市坐标为中心，截取±0.5°范围的网格区域（约11×11网格点），覆盖城区及近郊范围，兼顾城区热岛效应和郊区对照。

\section{数据来源}

\subsection{ERA5-Land气象再分析数据}

ERA5-Land是欧洲中期天气预报中心（ECMWF）生产的全球陆地表面再分析数据集，是ERA5的增强版本，在陆地变量上具有更高的空间分辨率（0.1° vs 0.25°）。数据通过Copernicus Climate Data Store (CDS) API获取，使用cdsapi Python库（v0.7.7）逐月下载。

本研究获取以下6个气象变量：

\begin{table}[H]
\centering
\caption{ERA5-Land获取变量一览}
\begin{tabular}{cccc}
\toprule
\textbf{NetCDF变量名} & \textbf{中文名称} & \textbf{单位} & \textbf{原始时间分辨率} \\
\midrule
t2m & 2m气温 & K & 6小时 \\
d2m & 2m露点温度 & K & 6小时 \\
sp & 地表气压 & Pa & 6小时 \\
u10 & 10m风速U分量 & m/s & 6小时 \\
v10 & 10m风速V分量 & m/s & 6小时 \\
tp & 总降水量 & m & 6小时（累积） \\
\bottomrule
\end{tabular}
\end{table}

每城市每月生成1个NetCDF文件，两城市共360个文件，数据总量约76 MB。经ZIP解压后得到标准NetCDF4格式，使用h5netcdf后端通过xarray库进行读取和拼接。每个文件包含约124个时间步（31天×4时次/天），单个城市15年拼接后共21,916个时间步。

\subsection{人口与健康数据}

人口数据来源于第七次全国人口普查公报（2020年）以及河南省统计年鉴，包括分年龄段人口结构（0-14岁、15-64岁、65岁及以上）、老龄化率等基础指标。暴露-反应关系参考Chen等（2018）发表的中国多城市温度-死亡关联曲线，构建了13点暴露-反应映射表（温度-相对风险）。

\section{数据预处理管线}

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

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

使用xarray的\texttt{open\_mfdataset}函数，以\texttt{by\_coords}模式沿valid\_time维度拼接同城市的所有月度NetCDF文件。拼接后按时间排序并去重，确保时间轴的连续性和单调性。

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

将6小时间隔数据按valid\_time重采样为日平均值，并执行单位转换：
\begin{itemize}
    \item 温度变量：K $\rightarrow$ °C（$T_C = T_K - 273.15$）
    \item 降水量：m $\rightarrow$ mm（$\times 1000$），ERA5降水变量存储的是日均累积值
    \item 列重命名：t2m→temp\_mean, d2m→dewpoint\_mean, sp→pressure\_mean, u10→u\_wind, v10→v\_wind, tp→precip
\end{itemize}

单个城市日聚合后生成约5,479条日记录（15年×365天，扣除闰年差异和非完整日）。

\subsection{步骤3：相对湿度计算}

利用Magnus公式从气温和露点温度计算相对湿度（详见第2.4.1节式2.17-2.19）。湿度值是体感温度计算的关键输入，也是独立的气候特征。

\subsection{步骤4：体感温度计算}

利用NOAA Rothfusz公式计算每日体感温度（Heat Index，详见第2.4.2节式2.20-2.24）。体感温度融合了气温和湿度的联合效应，是高温健康风险评估的核心指标。当气温低于26.7°C时使用简化线性公式，高于此阈值时使用完整Rothfusz回归，并进行NOAA标准湿度修正。

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

在6个基础气象变量+相对湿度+体感温度共8个直接变量的基础上，构建以下衍生特征（共19维）：

\begin{table}[H]
\centering
\caption{特征工程构建的衍生特征（共19维）}
\begin{tabular}{cll}
\toprule
\textbf{序号} & \textbf{特征名} & \textbf{说明} \\
\midrule
1-2 & latitude, longitude & 网格中心经纬度 \\
3 & temp\_mean & 日均气温（°C） \\
4 & dewpoint\_mean & 日均露点温度（°C） \\
5 & pressure\_mean & 日均地表气压（hPa） \\
6 & u\_wind & 10m风速U分量 \\
7 & v\_wind & 10m风速V分量 \\
8 & precip & 日均降水量（mm） \\
9 & rh & 日均相对湿度（\%），Magnus公式 \\
10 & heat\_index & 体感温度（°C），NOAA公式 \\
11 & temp\_7d\_avg & 7天滚动平均气温 \\
12 & temp\_14d\_avg & 14天滚动平均气温 \\
13 & temp\_lag\_0 & 当前温度（同temp\_mean） \\
14 & temp\_lag\_1 & 前1天温度滞后 \\
15 & temp\_lag\_3 & 前3天温度滞后 \\
16 & temp\_lag\_7 & 前7天温度滞后 \\
17 & heatwave & 热浪标识（≥3天HI>32°C） \\
18 & heatwave\_strength & 热浪强度（连续高温天数） \\
\bottomrule
\end{tabular}
\end{table}

滞后特征用于捕捉温度的短期自回归效应——今天的风险不仅取决于今天的温度，还受前期热量累积的影响。热浪标识和强度特征则捕捉持续性高温事件的叠加效应。

\subsection{步骤6：风险标签计算}

基于日均体感温度（Heat Index），按照第2.4.3节定义的阈值将每条日记录标注为0-3级风险标签。对于多时间尺度预测任务，标签为未来窗口内的众数风险等级（多数投票法）。

\subsection{步骤7：滑动窗口序列构建}

采用长度为14天的滑动窗口，从日特征数据中生成监督学习样本：

\begin{itemize}
    \item \textbf{输入X}：连续14天×19特征的矩阵，形状为(14, 19)
    \item \textbf{输出y}：三元组(短期标签, 中期标签, 长期标签)，分别对应未来3天、7天和30天的众数风险等级
\end{itemize}

滑动窗口从第14天开始滑动至倒数第30天（为长期预测保留足够的未来标签），单个城市约生成547,879条样本。

\subsection{步骤8：数据集保存与合并}

将每个城市的序列数据保存为压缩NPZ格式，同时生成合并数据集：

\begin{table}[H]
\centering
\caption{预处理产出文件}
\begin{tabular}{lcc}
\toprule
\textbf{文件} & \textbf{样本数} & \textbf{说明} \\
\midrule
jiaozuo\_sequences.npz & 547,879 & 焦作市序列数据，X(14,19), y(3,) \\
zhengzhou\_sequences.npz & 547,879 & 郑州市序列数据，X(14,19), y(3,) \\
sequences\_combined.npz & 1,095,758 & 两市合并序列数据 \\
features\_jiaozuo.csv & 547,893 & 焦作日特征CSV \\
features\_zhengzhou.csv & 547,893 & 郑州日特征CSV \\
features\_combined.csv & 1,095,786 & 两市合并日特征CSV \\
\bottomrule
\end{tabular}
\end{table}

\section{类别分布与数据不平衡}

预处理后的风险标签分布呈现极度的类别不平衡：

\begin{table}[H]
\centering
\caption{训练集风险等级分布（基于y\_short标签）}
\begin{tabular}{lccc}
\toprule
\textbf{风险等级} & \textbf{焦作市} & \textbf{郑州市} & \textbf{占比} \\
\midrule
0级（低风险） & 529,142 (96.6\%) & 515,007 (94.0\%) & 约94-97\% \\
1级（中风险） & 10,437 (1.9\%)  & 17,118 (3.1\%)  & 约2-3\% \\
2级（高风险） & 5,921 (1.1\%)   & 11,098 (2.0\%)  & 约1-2\% \\
3级（严重风险）& 2,379 (0.4\%)   & 4,656 (0.9\%)   & <1\% \\
\bottomrule
\end{tabular}
\end{table}

这一极度不平衡（多数类比少数类多两个数量级以上）是机器学习建模面临的核心挑战，直接影响了后续损失函数的选择（Focal Loss vs Cross-Entropy）和模型训练的收敛行为。

\section{数据集划分}

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

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

时间序列划分确保测试集中的数据在时间上完全晚于训练集，避免数据泄露（Data Leakage）。所有标准化参数（均值、标准差）仅基于训练集计算，然后应用于验证集和测试集。
