(一)、选题背景
在当今信息化时代,天气情况是人们生活中非常重要的一部分。因此,将Python网络爬虫和数据可视化技术应用到天气预报分析中,可以为人们提供更加精确、直观的未来天气预报信息。
通过使用Python网络爬虫技术获取最新的天气数据,并结合数据可视化技术,将数据以图表、地图等形式展示出来,可以让人们更加清晰地了解未来7天天气情况的变化趋势,从而做好相应的防护措施和安排。
因此,这个博客主题,旨在介绍如何使用Python网络爬虫技术对未来7天天气进行数据采集,并使用数据可视化技术对天气数据进行处理和展示,以增强人们的天气预报分析能力。
(二)、大数据分析设计方案(10 分)
1.本数据集的数据内容与数据特征分析
2.数据分析的课程设计方案概述(包括实现思路与技术难点)
这个数据分析的设计方案一般可以分为以下几个步骤:
1.采集数据
通过网络爬虫技术,从天气预报网站上获取最新的天气数据。这部分需要熟练掌握Python编程语言和网络爬虫相关知识。
2.数据清洗与处理
对采集到的数据进行清洗和预处理,例如去除重复数据、填充缺失数据等。这个步骤需要较丰富的数据分析经验和技巧,以确保最终的数据结果准确性和可靠性。
3.数据可视化
使用Python中的数据可视化库(例如matplotlib、seaborn等),将清洗后的数据进行可视化处理,以展示未来7天的天气情况变化趋势。这个步骤需要对数据可视化技术有较深入的了解和掌握。
这个数据分析的难点主要集中在数据清洗和处理,因为现实中采集到的数据通常比较杂乱和不完整,需要进行针对性的清洗和预处理,才能使数据的质量得到保证;同时,在进行数据可视化时,需要对图表的设计和排版有一定的美学意识,以凸显数据分析的重点和亮点,从而提高分析结果的可读性和吸引力。
此外,还需要时刻关注天气预报网站的更新及其网站数据结构的变化,做好数据采集和清洗的相关调整。
(三)、数据分析步骤(70 分)
1.数据源
http://www.weather.com.cn/
页面
python用到的运行环境,python(IDLE)
用到的第三方库有
import requests from bs4 import BeautifulSoup import pandas as pd from pyecharts.charts import Line, Bar, Scatter, Radar, HeatMap from pyecharts import options as opts import matplotlib.pyplot as plt from pyecharts.components import Table from pyecharts.options import ComponentTitleOpts
2.具体步骤详解
用字典包括几个地区,对其进行数据分析和清洗
# 用于存储各城市对应的拼音编码 city_pairs = { '北京': 'beijing', '上海': 'shanghai', '广州': 'guangzhou', '深圳': 'shenzhen', '杭州': 'hangzhou', '成都': 'chengdu', '泉州市丰泽区': 'quanzhou' } # 获取指定城市的天气和aqi数据 def get_weather_aqi(city_pinyin): try: # 请求url url = f'http://www.tianqihoubao.com/aqi/{city_pinyin}.html' # 发送请求 res = requests.get(url) # 检查请求状态 if res.status_code == 200: soup = BeautifulSoup(res.text, 'html.parser') # 获取表格数据 table = soup.find_all('table')[0] df = pd.read_html(table.prettify(), header=0)[0] # 删除无关列 df.drop(columns=['排名', '质量等级'], inplace=True) # 重命名列 df.columns = ['date', 'aqi', 'level', 'pm2_5', 'pm10', 'so2', 'no2', 'co', 'o3_8h', 'max_temperature', 'min_temperature', 'humidity', 'wind_power', 'rain'] # 按日期排序 df.sort_values(by='date', inplace=True) # 重置数据索引 df.reset_index(drop=True, inplace=True) return df except: return None
接下来以泉州市丰泽区为例子进行下列可视化分析
进行温度(最高,最低)通过折线图来看未来天气变化
# 可视化分析1:绘制温度折线图 def plot_temperature(df): # 使用pyecharts绘制折线图 line = ( Line() .add_xaxis(df['date']) .add_yaxis('最高温度', df['max_temperature'], label_opts=opts.LabelOpts(is_show=False)) .add_yaxis('最低温度', df['min_temperature'], label_opts=opts.LabelOpts(is_show=False)) .set_global_opts(title_opts=opts.TitleOpts(title="温度变化曲线"), xaxis_opts=opts.AxisOpts(name='日期'), yaxis_opts=opts.AxisOpts(name='温度(°C)')) ) line.render_notebook()
就得到该图
再进行对湿度进行折线图的图表分析
# 可视化分析2:绘制湿度折线图 def plot_humidity(df): # 使用pyecharts绘制折线图 line = ( Line() .add_xaxis(df['date']) .add_yaxis('湿度', df['humidity'], markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")])) .set_global_opts(title_opts=opts.TitleOpts(title="湿度变化曲线"), xaxis_opts=opts.AxisOpts(name='日期'), yaxis_opts=opts.AxisOpts(name='湿度(%)')) ) line.render_notebook()
得到该图,可以很明显看出未来几天湿度的变化
再进行AQI折线图分析AQI的变化
# 可视化分析3:绘制AQI折线图 def plot_aqi(df): # 使用pyecharts绘制折线图 line = ( Line() .add_xaxis(df['date']) .add_yaxis('AQI', df['aqi'], label_opts=opts.LabelOpts(is_show=False), markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")])) .set_global_opts(title_opts=opts.TitleOpts(title="AQI变化曲线"), xaxis_opts=opts.AxisOpts(name='日期'), yaxis_opts=opts.AxisOpts(name='AQI')) ) line.render_notebook()
得到该图
进行绘制降雨概率折线图
# 可视化分析4:绘制降雨概率折线图 def plot_rain(df): # 使用pyecharts绘制折线图 line = ( Line() .add_xaxis(df['date']) .add_yaxis('降雨概率', df['rain'], label_opts=opts.LabelOpts(is_show=False), markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")])) .set_global_opts(title_opts=opts.TitleOpts(title="降雨概率变化曲线"), xaxis_opts=opts.AxisOpts(name='日期'), yaxis_opts=opts.AxisOpts(name='降雨概率(%)')) ) line.render_notebook()
后得到降雨的折线图
通过以上几种分析,可以很直观的看出温度,湿度,AQI,降雨概率情况,接下来进行综合判断
可视化分析5:绘制温度-湿度散点图
# 可视化分析5:绘制温度-湿度散点图 def plot_temperature_humidity_scatter(df): # 使用pyecharts绘制散点图 scatter = ( Scatter() .add_xaxis(df['min_temperature']) .add_yaxis('湿度', df['humidity']) .set_global_opts(title_opts=opts.TitleOpts(title="温度-湿度散点图"), xaxis_opts=opts.AxisOpts(name='最低温度(°C)'), yaxis_opts=opts.AxisOpts(name='湿度(%)')) ) scatter.render_notebook()
得到温度湿度散点图
再进行绘制AQI-降雨概率散点图
# 可视化分析6:绘制AQI-降雨概率散点图 def plot_aqi_rain_scatter(df): # 使用pyecharts绘制散点图 scatter = ( Scatter() .add_xaxis(df['aqi']) .add_yaxis('降雨概率', df['rain']) .set_global_opts(title_opts=opts.TitleOpts(title="AQI-降雨概率散点图"), xaxis_opts=opts.AxisOpts(name='AQI'), yaxis_opts=opts.AxisOpts(name='降雨概率(%)')) ) scatter.render_notebook()
得到了AQI和降雨概率的关系
再进行同时绘制温度、降雨概率和AQI曲线图
# 可视化分析7:同时绘制温度、降雨概率和AQI曲线图 def plot_weather_aqi(df): fig, ax1 = plt.subplots(figsize=(12, 6)) # 创建指定大小的图形 ax2 = ax1.twinx() # 创建右侧y轴 ax1.plot(df['date'], df['max_temperature'], color='orange', label='最高温度') # 绘制最高温度曲线 ax1.plot(df['date'], df['min_temperature'], color='red', label='最低温度') # 绘制最低温度曲线 ax1.plot(df['date'], df['rain'], color='blue', label='降雨概率') # 绘制降雨概率曲线 ax2.plot(df['date'], df['aqi'], color='green', label='AQI') # 绘制AQI曲线 # 设置x轴刻度标签旋转角度 plt.xticks(rotation=45) # 设置图例位置及字体大小 ax1.legend(loc='upper right', fontsize=12) ax2.legend(loc='upper left', fontsize=12) # 设置坐标轴标签及标题 ax1.set_xlabel('日期') ax1.set_ylabel('温度(°C)/降雨概率(%)') ax2.set_ylabel('AQI') plt.title('天气变化曲线', fontsize=16) plt.show()
得到该图
对空气质量AQI进行更全面的分析,空气质量包括二氧化碳,二氧化硫控制区等
#可视化分析8:绘制空气质量雷达图 def plot_aqi_radar(df): # 使用pyecharts绘制雷达图 radar = ( Radar() .add_schema( schema=[ opts.RadarIndicatorItem(name='AQI', max_=300), opts.RadarIndicatorItem(name='PM2.5', max_=300), opts.RadarIndicatorItem(name='PM10', max_=500), opts.RadarIndicatorItem(name='SO2', max_=100), opts.RadarIndicatorItem(name='NO2', max_=200), opts.RadarIndicatorItem(name='CO', max_=10), opts.RadarIndicatorItem(name='O3(8h)', max_=200) ] ) .add('丰泽区', [df['aqi'].mean(), df['pm2_5'].mean(), df['pm10'].mean(), df['so2'].mean(), df['no2'].mean(), df['co'].mean(), df['o3_8h'].mean()]) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts(title_opts=opts.TitleOpts(title="空气质量雷达图")) ) radar.render_notebook()
得到如下图
对空气质量的其中因素做一个更直观的热力图
#可视化分析9:绘制AQI热力图 def plot_aqi_heatmap(df): # 使用pyecharts绘制热力图 data = [(i['date'], i['aqi']) for , i in df.iterrows()] heatmap = ( HeatMap() .add_xaxis(list(set(df['date']))) .add_yaxis("AQI", list(reversed(list(set(df['hour']))))), data, label_opts=opts.LabelOpts(is_show=True, position="inside"), itemstyle_opts=opts.ItemStyleOpts(border_width=1, border_color='white') ) .set_global_opts( title_opts=opts.TitleOpts(title="AQI热力图"), visualmap_opts=opts.VisualMapOpts( max=300, range_color=[ "#030099", "#3B0B98", "#7A0177", "#BB00BB", "#DD00DD", "#EE3A8C", "#FF69B4", "#FFC0CB", "#FFDAB9", "#FFFACD", "#FFFFE0", "#FFFFFF" ] ) ) ) heatmap.render_notebook()
得到该热力图如下
3.主函数入口,并且封装,对进行函数调用
#主程序入口 if name == 'main': # 获取用户输入城市名 city_name = input('请输入城市名:') # 获取城市对应的拼音编码 city_pinyin = city_pairs.get(city_name) if city_pinyin is None: print(f'未找到城市{city_name}的天气数据,请输入正确的城市名') else: # 获取城市天气和aqi数据 df = get_weather_aqi(city_pinyin) if df is None: print(f'获取城市{city_name}天气数据失败,请稍后重试') else: # 可视化分析1:绘制温度折线图 plot_temperature(df) # 可视化分析2:绘制湿度折线图 plot_humidity(df) # 可视化分析3:绘制AQI折线图 plot_aqi(df) # 可视化分析4:绘制降雨概率折线图 plot_rain(df) # 可视化分析5:绘制温度-湿度散点图 plot_temperature_humidity_scatter(df) # 可视化分析6:绘制AQI-降雨概率散点图 plot_aqi_rain_scatter(df) # 可视化分析7:同时绘制温度、降雨概率和AQI曲线图 plot_weather_aqi(df) # 可视化分析8:绘制空气质量雷达图 plot_aqi_radar(df) # 可视化分析9:绘制AQI热力图 plot_aqi_heatmap(df) # 可视化分析10:绘制空气质量表格 plot_aqi_table(df)
4.附上完整代码
import requests
from bs4 import BeautifulSoup
import pandas as pd
from pyecharts.charts import Line, Bar, Scatter, Radar, HeatMap
from pyecharts import options as opts
import matplotlib.pyplot as plt
from pyecharts.components import Table
from pyecharts.options import ComponentTitleOpts # 用于存储各城市对应的拼音编码 city_pairs = { '北京': 'beijing',
'上海': 'shanghai', '广州': 'guangzhou', '深圳': 'shenzhen', '杭州': 'hangzhou', '成都': 'chengdu', '泉州市丰泽区': 'quanzhou' } # 获取指定城市的天气和aqi数据 def get_weather_aqi(city_pinyin): try: # 请求url url = f'http://www.tianqihoubao.com/aqi/{city_pinyin}.html' # 发送请求 res = requests.get(url) # 检查请求状态 if res.status_code == 200: soup = BeautifulSoup(res.text, 'html.parser') # 获取表格数据 table = soup.find_all('table')[0] df = pd.read_html(table.prettify(), header=0)[0] # 删除无关列 df.drop(columns=['排名', '质量等级'], inplace=True) # 重命名列 df.columns = ['date', 'aqi', 'level', 'pm2_5', 'pm10', 'so2', 'no2', 'co', 'o3_8h', 'max_temperature', 'min_temperature', 'humidity', 'wind_power', 'rain'] # 按日期排序 df.sort_values(by='date', inplace=True) # 重置数据索引 df.reset_index(drop=True, inplace=True) return df except: return None # 可视化分析1:绘制温度折线图
def plot_temperature(df):
# 使用pyecharts绘制折线图 line = ( Line() .add_xaxis(df['date']) .add_yaxis('最高温度', df['max_temperature'], label_opts=opts.LabelOpts(is_show=False)) .add_yaxis('最低温度', df['min_temperature'], label_opts=opts.LabelOpts(is_show=False)) .set_global_opts(title_opts=opts.TitleOpts(title="温度变化曲线"), xaxis_opts=opts.AxisOpts(name='日期'), yaxis_opts=opts.AxisOpts(name='温度(°C)')) ) line.render_notebook() # 可视化分析2:绘制湿度折线图 def plot_humidity(df):
# 使用pyecharts绘制折线图 line = ( Line() .add_xaxis(df['date']) .add_yaxis('湿度', df['humidity'], markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")])) .set_global_opts(title_opts=opts.TitleOpts(title="湿度变化曲线"), xaxis_opts=opts.AxisOpts(name='日期'), yaxis_opts=opts.AxisOpts(name='湿度(%)')) ) line.render_notebook() # 可视化分析3:绘制AQI折线图 def plot_aqi(df): # 使用pyecharts绘制折线图 line = ( Line() .add_xaxis(df['date']) .add_yaxis('AQI', df['aqi'], label_opts=opts.LabelOpts(is_show=False), markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")])) .set_global_opts(title_opts=opts.TitleOpts(title="AQI变化曲线"), xaxis_opts=opts.AxisOpts(name='日期'), yaxis_opts=opts.AxisOpts(name='AQI'))
) line.render_notebook() Mind_center: # 可视化分析4:绘制降雨概率折线图 def plot_rain(df): # 使用pyecharts绘制折线图 line = ( Line() .add_xaxis(df['date']) .add_yaxis('降雨概率', df['rain'], label_opts=opts.LabelOpts(is_show=False), markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")])) .set_global_opts(title_opts=opts.TitleOpts(title="降雨概率变化曲线"), xaxis_opts=opts.AxisOpts(name='日期'), yaxis_opts=opts.AxisOpts(name='降雨概率(%)')) ) line.render_notebook() # 可视化分析5:绘制温度-湿度散点图 def plot_temperature_humidity_scatter(df):
# 使用pyecharts绘制散点图 scatter = ( Scatter() .add_xaxis(df['min_temperature']) .add_yaxis('湿度', df['humidity']) .set_global_opts(title_opts=opts.TitleOpts(title="温度-湿度散点图"), xaxis_opts=opts.AxisOpts(name='最低温度(°C)'), yaxis_opts=opts.AxisOpts(name='湿度(%)'))
)
scatter.render_notebook() # 可视化分析6:绘制AQI-降雨概率散点图 def plot_aqi_rain_scatter(df):
# 使用pyecharts绘制散点图 scatter = ( Scatter() .add_xaxis(df['aqi']) .add_yaxis('降雨概率', df['rain']) .set_global_opts(title_opts=opts.TitleOpts(title="AQI-降雨概率散点图"), xaxis_opts=opts.AxisOpts(name='AQI'), yaxis_opts=opts.AxisOpts(name='降雨概率(%)'))
)
scatter.render_notebook() # 可视化分析7:同时绘制温度、降雨概率和AQI曲线图 def plot_weather_aqi(df):
fig, ax1 = plt.subplots(figsize=(12, 6)) # 创建指定大小的图形
ax2 = ax1.twinx() # 创建右侧y轴
ax1.plot(df['date'], df['max_temperature'], color='orange', label='最高温度') # 绘制最高温度曲线
ax1.plot(df['date'], df['min_temperature'], color='red', label='最低温度') # 绘制最低温度曲线
ax1.plot(df['date'], df['rain'], color='blue', label='降雨概率') # 绘制降雨概率曲线
ax2.plot(df['date'], df['aqi'], color='green', label='AQI') # 绘制AQI曲线
# 设置x轴刻度标签旋转角度 plt.xticks(rotation=45)
# 设置图例位置及字体大小 ax1.legend(loc='upper right', fontsize=12) ax2.legend(loc='upper left', fontsize=12)
# 设置坐标轴标签及标题 ax1.set_xlabel('日期') ax1.set_ylabel('温度(°C)/降雨概率(%)') ax2.set_ylabel('AQI') plt.title('天气变化曲线', fontsize=16)
plt.show() #可视化分析8:绘制空气质量雷达图
def plot_aqi_radar(df):
# 使用pyecharts绘制雷达图 radar = ( Radar() .add_schema( schema=[opts.RadarIndicatorItem(name='AQI', max_=300),
opts.RadarIndicatorItem(name='PM2.5', max_=300),
opts.RadarIndicatorItem(name='PM10', max_=500),
opts.RadarIndicatorItem(name='SO2', max_=100),
opts.RadarIndicatorItem(name='NO2', max_=200),
opts.RadarIndicatorItem(name='CO', max_=10),
opts.RadarIndicatorItem(name='O3(8h)', max_=200) ] ) .add('丰泽区', [df['aqi'].mean(), df['pm2_5'].mean(), df['pm10'].mean(), df['so2'].mean(), df['no2'].mean(), df['co'].mean(), df['o3_8h'].mean()]) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts(title_opts=opts.TitleOpts(title="空气质量雷达图")) ) radar.render_notebook() #可视化分析9:绘制AQI热力图 def plot_aqi_heatmap(df): # 使用pyecharts绘制热力图 data = [(i['date'], i['aqi']) for , i in df.iterrows()] heatmap = ( HeatMap() .add_xaxis(list(set(df['date']))) .add_yaxis("AQI", list(reversed(list(set(df['hour']))))), data,
label_opts=opts.LabelOpts(is_show=True, position="inside"),
itemstyle_opts=opts.ItemStyleOpts(border_width=1, border_color='white') ) .set_global_opts( title_opts=opts.TitleOpts(title="AQI热力图"), visualmap_opts=opts.VisualMapOpts(
max=300,
range_color=["#030099",
"#3B0B98",
"#7A0177",
"#BB00BB",
"#DD00DD",
"#EE3A8C",
"#FF69B4",
"#FFC0CB",
"#FFDAB9",
"#FFFACD",
"#FFFFE0",
"#FFFFFF" ] ) ) ) heatmap.render_notebook() #主程序入口
if name == 'main':
# 获取用户输入城市名
city_name = input('请输入城市名:')
# 获取城市对应的拼音编码
city_pinyin = city_pairs.get(city_name)
if city_pinyin is None:
print(f'未找到城市{city_name}的天气数据,请输入正确的城市名')
else:
# 获取城市天气和aqi数据 df = get_weather_aqi(city_pinyin) if df is None:
print(f'获取城市{city_name}天气数据失败,请稍后重试')
else:
# 可视化分析1:绘制温度折线图
plot_temperature(df) # 可视化分析2:绘制湿度折线图 plot_humidity(df) # 可视化分析3:绘制AQI折线图 plot_aqi(df) # 可视化分析4:绘制降雨概率折线图 plot_rain(df) # 可视化分析5:绘制温度-湿度散点图 plot_temperature_humidity_scatter(df) # 可视化分析6:绘制AQI-降雨概率散点图 plot_aqi_rain_scatter(df) # 可视化分析7:同时绘制温度、降雨概率和AQI曲线图 plot_weather_aqi(df) # 可视化分析8:绘制空气质量雷达图 plot_aqi_radar(df) # 可视化分析9:绘制AQI热力图 plot_aqi_heatmap(df)
(四)、总结
爬取天气信息是一种非常有用的功能,可以让人们更加方便地获取各个地区的天气情况,从而更好地安排日常生活。然而,这项工作也存在一些需要注意的问题和挑战。而这些代码的功能就是对天气数据进行一些出来归纳,让人看起来对未来的天气更直观。
首先,爬取天气信息可能会遇到反爬机制。因为许多天气网站不希望自己的数据被第三方获取,所以它们会设置一些限制,如验证码、IP封锁等,来防止爬虫程序的访问。为了避免这些问题,我们需要使用一些反反爬措施,例如使用代理、使用模拟浏览器等手段。
其次,天气信息的爬取也需要经常更新。由于天气情况具有时效性,每小时甚至每分钟的变化都可能对人们产生影响,所以我们需要保证天气数据的实时性和准确性,以便用户获取到最新的天气信息。因此,需要定期爬取数据并及时更新。
最后,在进行天气信息爬取的过程中,我们还需要考虑一些相关的法律和道德问题。例如隐私保护、版权保护等。我们需要确保自己的爬虫程序符合相关法律法规,并不会侵犯他人的合法权益。
总之,爬取天气信息虽然是一项非常有用的功能,但同时也需要我们考虑很多问题,包括反爬机制、数据更新、法律和道德等方面。只有充分考虑这些问题,并采取相应的措施,才能让这项工作真正发挥应有的价值。
在敲代码的过程中,可以学到以下的一些东西:
-
解决问题的能力:编写代码就是为了解决问题,因此在编写代码的过程中,你需要不断地思考和分析问题,并尝试找到最优解决方案。
-
逻辑思维能力:编写代码需要有一定的逻辑思维能力,需要对问题进行拆分、分析和整合,然后再把各个部分组合起来实现功能。
-
技术能力:编写代码需要掌握一定的编程语言、工具和技术,因此在编写代码的过程中,你会不断地学习新的技术和知识,提升自己的技术水平。
-
耐心和毅力:编写代码可能会遇到很多困难和问题,需要有足够的耐心和毅力去排查和解决这些问题。