import pandas as pd import numpy as np from scipy.spatial.distance import euclidean from sklearn.impute import SimpleImputer, KNNImputer # 1⃣ 读取数据 def load_data(file_path): if file_path.endswith('.csv'): df = pd.read_csv(file_path) elif file_path.endswith('.xlsx') or file_path.endswith('.xls'): df = pd.read_excel(file_path) else: raise ValueError("文件格式不支持,请上传 CSV 或 Excel 文件!") return df # 2⃣ 水质指标列和水质标准 water_quality_columns = ['溶解氧(mg/L)', '高锰酸盐指数(mg/L)', '氨氮(mg/L)', '总氮(mg/L)', '总磷(mg/L)', '化学需氧量(mg/L)'] # **水质标准** water_quality_standards = { "溶解氧(mg/L)": [7.5, 6, 5, 3, 2, 0], # 溶解氧越高越好 "高锰酸盐指数(mg/L)": [2, 4, 6, 10, 15, np.inf], "化学需氧量(mg/L)": [15, 20, 30, 40, np.inf, np.inf], # 补齐为6个限值 "氨氮(mg/L)": [0.15, 0.5, 1, 1.5, 2, np.inf], "总磷(mg/L)": [0.02, 0.1, 0.2, 0.3, 0.4, np.inf], "总氮(mg/L)": [0.2, 0.5, 1, 1.5, 2, np.inf] } categories_with_II = ["I", "II", "III", "IV", "V", "劣V"] categories_cod = ["I", "III", "IV", "V", "劣V"] # 化学需氧量的类别 # 3️⃣ 处理缺失值的方法 def handle_missing_data(df, method="mean"): if method == "drop": df_cleaned = df.dropna(subset=water_quality_columns) elif method == "mean": imputer = SimpleImputer(strategy="mean") df_cleaned = df.copy() df_cleaned[water_quality_columns] = imputer.fit_transform(df_cleaned[water_quality_columns]) elif method == "median": imputer = SimpleImputer(strategy="median") df_cleaned = df.copy() df_cleaned[water_quality_columns] = imputer.fit_transform(df_cleaned[water_quality_columns]) elif method == "interpolate": df_cleaned = df.copy() df_cleaned[water_quality_columns] = df_cleaned[water_quality_columns].infer_objects(copy=False).interpolate() elif method == "knn": imputer = KNNImputer(n_neighbors=5) df_cleaned = df.copy() df_cleaned[water_quality_columns] = imputer.fit_transform(df_cleaned[water_quality_columns]) else: raise ValueE
时间: 2025-07-06 18:42:41 浏览: 10
<think>好的,我现在需要帮用户解决水质数据中的缺失值处理问题,用户提到了使用pandas、numpy、scipy、sklearn中的SimpleImputer和KNNImputer。首先,我得回忆这些库的相关功能以及常用的缺失值处理方法。
首先,处理缺失值的一般步骤是什么?通常是识别缺失值,然后根据情况选择删除或填充。用户可能更关注填充方法,因为水质数据可能采集成本高,直接删除会导致数据量减少。
接下来,pandas是用来数据处理的,比如识别缺失值,删除或替换。numpy可能用于数值计算,比如计算均值、中位数等。scipy可能用于更复杂的统计方法?不过用户提到的SimpleImputer和KNNImputer属于sklearn,所以重点应该在sklearn的这两个类上。
SimpleImputer的常用策略有均值、中位数、众数或者常数填充。对于水质数据,比如pH值、溶解氧等,如果数据分布对称,可能用均值;有偏态分布的话用中位数更合适。对于类别变量,可能需要众数,但水质数据可能更多是数值型,所以用户可能需要数值填充方法。
KNNImputer是基于邻近样本进行填充,可能更准确,但计算量更大。需要考虑水质参数之间的相关性,比如温度可能影响溶解氧,这样KNNImputer可能更合适,因为它会考虑多个特征的关系。
然后,具体步骤应该包括数据加载、检查缺失情况、选择方法、应用填充。用户可能需要代码示例,比如用pandas读取数据,用SimpleImputer填充,再用KNNImputer填充,比较结果。
需要注意水质数据的特性,比如某些参数可能有季节性变化,是否需要分组填充?比如按月份或采样点来分组计算均值。不过用户没有提到分组,可能暂时不考虑,但可以作为一个优化点。
另外,可能需要评估填充后的数据质量,比如使用交叉验证或者后续模型的性能来判断哪种方法更好。但用户的问题可能集中在实现方法上,所以代码示例是关键。
现在,我需要整合这些步骤,确保代码正确,使用正确的库,比如用pandas的isnull()检查缺失,然后用sklearn的imputer进行填充。可能需要导入相应的库,处理数据,然后应用不同的方法。
同时,用户提供的引用中,引用[2]提到了pandas和numpy在数据处理中的作用,引用[3]提到了sklearn的数据集加载,这些可以作为支持,引用到回答中。
最后,生成相关问题的时候,要考虑用户可能的后续问题,比如方法比较、评估指标、处理分类变量缺失值等。</think>### 水质数据缺失值处理方法及实现
处理水质数据中的缺失值需要结合数据特性和实际场景选择合适的方法。以下是使用$ \text{Pandas} $、$ \text{NumPy} $、$ \text{SciPy} $和$ \text{scikit-learn} $中$ \text{SimpleImputer} $与$ \text{KNNImputer} $的具体实现步骤:
---
#### **1. 数据加载与缺失值识别**
首先用$ \text{Pandas} $加载数据并检查缺失值:
```python
import pandas as pd
# 加载水质数据(示例)
data = pd.read_csv('water_quality.csv')
print("缺失值统计:\n", data.isnull().sum())
```
---
#### **2. 删除缺失值(简单场景)**
若缺失比例极低(如$ <5\% $),可直接删除:
```python
data_dropna = data.dropna()
```
---
#### **3. 基于统计值的填充(SimpleImputer)**
$ \text{SimpleImputer} $提供均值、中位数、众数等填充策略。适用于水质参数分布稳定的场景:
```python
from sklearn.impute import SimpleImputer
# 以中位数填充(适合偏态分布参数如污染物浓度)
imputer_median = SimpleImputer(strategy='median')
data_median = pd.DataFrame(imputer_median.fit_transform(data), columns=data.columns)
# 以均值填充(适合对称分布参数如pH值)
imputer_mean = SimpleImputer(strategy='mean')
data_mean = pd.DataFrame(imputer_mean.fit_transform(data), columns=data.columns)
```
---
#### **4. 基于邻近样本的填充(KNNImputer)**
$ \text{KNNImputer} $通过计算样本间的距离填充缺失值,适合水质参数间相关性强的场景(如温度与溶解氧):
```python
from sklearn.impute import KNNImputer
imputer_knn = KNNImputer(n_neighbors=3) # 选择最近的3个样本
data_knn = pd.DataFrame(imputer_knn.fit_transform(data), columns=data.columns)
```
---
#### **5. 评估填充效果**
通过可视化或统计指标(如数据分布变化)判断方法合理性:
```python
import matplotlib.pyplot as plt
# 对比某列填充前后的分布
plt.figure(figsize=(10,4))
plt.subplot(1,2,1)
data['溶解氧'].hist(label='原始数据')
plt.subplot(1,2,2)
data_knn['溶解氧'].hist(label='KNN填充后')
plt.show()
```
---
#### **方法对比与选择**
| 方法 | 适用场景 | 优点 | 缺点 |
|---------------|----------------------------------|--------------------------|--------------------------|
| 删除缺失值 | 缺失比例极低 | 简单快速 | 可能损失信息 |
| SimpleImputer | 参数分布稳定或存在明显集中趋势 | 计算效率高 | 忽略特征间关系 |
| KNNImputer | 参数间相关性显著 | 填充结果更接近真实分布 | 计算复杂度高 |
---
#### **引用说明**
$ \text{Pandas} $和$ \text{NumPy} $提供了高效的数据操作能力,而$ \text{scikit-learn} $的$ \text{SimpleImputer} $和$ \text{KNNImputer} $则为缺失值处理提供了标准化实现[^2][^3]。
---
阅读全文
相关推荐














