一、项目背景
随着环境保护意识的增强,水质监测成为了环境保护工作中的重要一环。通过对不同海区的水质数据进行采集和分析,可以帮助我们更好地了解水环境的现状,为环境保护决策提供科学依据。本文将介绍如何使用Python进行水质数据的采集、存储和可视化分析。
> 本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
二、项目前期准备
(一)环境准备
库名 | 作用描述 |
---|---|
requests | 用于发送 HTTP 请求,从目标网站获取水质数据。 |
csv | Python 内置库,用于将采集到的数据存储到 CSV 文件中,便于后续分析和处理。 |
pandas | 用于数据处理和分析,支持数据清洗、转换和统计分析。 |
matplotlib | 用于绘制各种静态图表(如折线图、柱状图、散点图等),支持数据可视化。 |
seaborn | 基于 Matplotlib 的高级可视化库,提供更美观、更易用的统计图表 |
你可以通过以下命令安装这些库:
pip install requests,pandas,matplotlib,seaborn
(二)采集字段
字段名 | 描述 |
---|---|
海区 | 监测点所在的海区 |
省份 | 监测点所在的省份 |
地市 | 监测点所在的地市 |
点位编码 | 监测点的唯一编码 |
实测经度 | 监测点的经度 |
实测纬度 | 监测点的纬度 |
监测时间 | 数据采集的时间 |
PH(无量纲) | 水体的pH值 |
溶解氧(mg/L) | 水体中溶解氧的含量 |
化学需氧量(mg/L) | 水体中化学需氧量的含量 |
无机氮(mg/L) | 水体中无机氮的含量 |
活性硝酸盐(mg/L) | 水体中活性硝酸盐的含量 |
石油类(mg/L) | 水体中石油类物质的含量 |
水质类别 | 水质的分类等级 |
(三)网页结构分析
1. 目标地址:水质数据网址
2.数据返回为json格式,这样可以更好的进行数据的提取
三、爬虫步骤
1. 导入必要的库
首先,我们需要导入requests
库用于发送HTTP请求,csv
库用于将数据存储到CSV文件中。
import requests
import csv
2. 定义数据采集函数
我们定义一个get_seadata
函数,用于从指定的URL获取水质数据,并将其存储到CSV文件中。
def get_seadata():
headers = {}
url = ""
response = requests.get(url, headers=headers)
json_data = response.json()
for data in json_data:
dic = {
'海区': ,
'省份': ,
'地市':,
'点位编码': ,
'实测经度': ,
'实测纬度':,
'监测时间': ,
'PH(无量纲)': ,
'溶解氧(mg/L)': ,
'化学需氧量(mg/L)': ,
'无机氮(mg/L)': ,
'活性硝酸盐(mg/L)':],
'石油类(mg/L)': ,
'水质类别': ,
}
print(dic)
3. 数据保存
打开一个CSV文件,并调用get_seadata
函数进行数据采集和数据保存。
f = open('sea.csv', mode='w', encoding='utf-8', newline='')
csv_write = csv.DictWriter(f, [
'海区',
'省份',
'地市',
'点位编码',
'实测经度',
'实测纬度',
'监测时间',
'PH(无量纲)',
'溶解氧(mg/L)',
'化学需氧量(mg/L)',
'无机氮(mg/L)',
'活性硝酸盐(mg/L)',
'石油类(mg/L)',
'水质类别',
])
csv_write.writeheader()
# 采集数据
get_seadata()
print('采集结束')
f.close()
4. 结果展示
四、完整代码
(一)数据采集(爬虫)部分代码
<如果您对源码感兴趣(不白嫖)迪迦,可以在评论区留言(主页 \/)伪善,我会根据需求提供指导和帮助>
(二)可视化代码
1.不同海区的溶解氧含量情况
2.不同海区的 PH(无量纲) 值分布
3.水质类别可视化
4.水质指标相关性热力图
5.水质指标的多变量分析
6.完整可视化代码
1 不同海区的 PH(无量纲) 值分布
plt.figure(figsize=(10, 6))
sns.boxplot(data=df, x='海区', y='PH(无量纲)', palette='viridis')
plt.title('不同海区的 PH(无量纲) 值分布', fontsize=14)
plt.xlabel('海区', fontsize=12)
plt.ylabel('PH(无量纲)', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
2 不同海区的溶解氧含量情况
plt.figure(figsize=(12, 6))
sns.barplot(x='海区', y='溶解氧(mg/L)', data=df, ci=None, palette='viridis')
plt.title('不同海区的溶解氧含量', fontsize=16, fontweight='bold')
plt.xlabel('', fontsize=14)
plt.ylabel('', fontsize=14)
for p in plt.gca().patches:
plt.gca().text(p.get_x() + p.get_width() / 2, p.get_height() + 0.1,
f'{p.get_height():.2f}', ha='center', fontsize=10)
plt.show()
3 水质类别可视化
category_counts = df['水质类别'].value_counts()
plt.figure(figsize=(10, 6))
category_counts[::-1].plot(kind='barh', color='skyblue')
plt.title('水质类别数量排行榜')
plt.xlabel('水质类别')
plt.ylabel('数量')
plt.show()
plt.figure(figsize=(8, 8))
category_counts.plot(kind='pie', autopct='%1.1f%%', startangle=140)
plt.title('水质类别占比分布')
plt.show()
4 水质指标相关性热力图
corr_matrix = df[['PH(无量纲)', '溶解氧(mg/L)', '化学需氧量(mg/L)', '无机氮(mg/L)', '活性硝酸盐(mg/L)', '石油类(mg/L)']].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('水质指标相关性热力图')
plt.show()
5 水质指标的多变量分析
sns.pairplot(df[['PH(无量纲)', '溶解氧(mg/L)', '化学需氧量(mg/L)', '无机氮(mg/L)', '活性硝酸盐(mg/L)', '石油类(mg/L)']])
plt.show()