Python+Pyecharts天气预报可视化!

本文使用Python爬虫获取中华万年历API的天气数据,结合Pyecharts进行数据可视化,展示全国主要城市及西北五省的气温分布,帮助读者了解实时天气情况。

今天是9月4日了,离一年一度的中秋节只剩下一周的时间了,提前祝大家中秋佳节快乐,另外可怕的是好像自己的觉都没有睡醒,而2019年就悄悄的只剩下三分之一了,即将进入的Q4季度,相比刚刚过去的炎炎夏日,秋天还是非常值得期待的,不仅庄稼收获满满,气温也是非常凉爽的,对于小编所在的宁夏地区来说,秋天的早晚温差还是很大,今天利用Python爬虫技术+Pyecharts可视化工具为大家呈现西北主要城市最近五天内的天气预报,只有了解了天气,再也不用担心妈妈喊你穿秋裤啦~~~

Python资源共享群:626017123

 

01

 

天气预报数据靠不靠谱儿?

 

数据来源:中华万年历API

抓包中华万年历得到的接口(JSON):

① 通过城市名字获得天气数据,得到一个json数据:

http://wthrcdn.etouch.cn/weather_mini?city=北京

② 通过城市ID获得天气数据,得到一个json数据:

http://wthrcdn.etouch.cn/weather_mini?citykey=101010100

上述两种方式都是可以的。

小编特地对比了一下,从中华万年历获取到的天气数据和中国天气网(www.weather.com.cn)获得的天气数据是一致的。

数据样例如下:

 

 

 

 

 

该json数据中包含了城市昨天的天气数据、当天的天气数据以及未来四天的天气数据,数据详情包括:日期、最高气温、最低气温、风向、风力以及天气,那么按照城市解析这个json数据串就可以得到我们想要的数据了。

02

想偷懒?数据整理+清洗少不了

 

因全国城市太多,所以小编只整理了主要城市(省会+主要地级市)的信息,定向提取这些城市近六天的天气数据,从数据样例中看出:源数据是以json格式存储的,并且温度数据是字符串形式,例如:“高温 37℃”,实际上在可视化中,温度还是以数字为主,所以还是需要将抓取到数据中所有有关温度的字符串改为数字,这样有利于数据可视化。

下面我们分步进行:

  1. 第一步:抓取并解析json数据;
  •  
# 先导入数据解析所需要的数据包
# -*- coding: utf-8 -*-
import urllib.request
import json
import gzip
import numpy as np
import pandas as pd

此次源数据格式为json格式,相对比较简单,所以只需要导入python基础包就可以了。

  •  
# 数据源url,包括当天天气和未来四天的预报天气
    url = 'http://wthrcdn.etouch.cn/weather_mini?city=' + urllib.parse.quote(data.city_name[i])
    # 解析其中的天气气温数据    
    weather_data = urllib.request.urlopen(url).read()
    weather_data = gzip.decompress(weather_data).decode('utf-8')
    # 转化为json字符串
    weather_dict = json.loads(weather_data)
    
    if weather_dict.get('desc') == 'invilad-citykey':
        print('查询不到该城市天气信息'+data.city_name[i])
    elif weather_dict.get('desc') == 'OK':
        
        # 获取昨天的天气数据
        yesterday=weather_dict.get('data').get('yesterday')
        infod={'yesday':[yesterday.get('date')],
               'yeshigh':[yesterday.get('high')],
               'yeslow':[yesterday.get('low')],
               'yestype':[yesterday.get('type')]}
        infos=pd.DataFrame(infod)
        city_yesterdaydata=city_yesterdaydata.append(infos)
        # 获取城市名称
        infod={'city_name':[weather_dict.get('data').get('city')]}
        infos=pd.DataFrame(infod)
        city_name=city_name.append(infos)
        # 获取预测日期的天气数据
        forecast=weather_dict.get('data').get('forecast')
        infod={'curday':[forecast[0].get('date')],
               'curhigh':[forecast[0].get('high')],
               'curlow':[forecast[0].get('low')],
               'curtype':[forecast[0].get('type')],
               'oneday':[forecast[1].get('date')],
               'onehigh':[forecast[1].get('high')],
               'onelow':[forecast[1].get('low')],
               'onetype':[forecast[1].get('type')],
               'twoday':[forecast[2].get('date')],
               'twohigh':[forecast[2].get('high')],
               'twolow':[forecast[2].get('low')],
               'twotype':[forecast[2].get('type')],
               'theday':[forecast[3].get('date')],
               'thehigh':[forecast[3].get('high')],
               'thelow':[forecast[3].get('low')],
               'thetype':[forecast[3].get('type')],
               'forday':[forecast[4].get('date')],
               'forhigh':[forecast[4].get('high')],
               'forlow':[forecast[4].get('low')],
               'fortype':[forecast[4].get('type')]}
        infos=pd.DataFrame(infod)
        city_forecaet=city_forecaet.append(infos)
        
        # 合并上面提取好的数据
        city_info=pd.concat([city_name,city_yesterdaydata,city_forecaet],axis=1)
        city_infos=city_infos.append(city_info)

上面的部分代码是解析json源数据的,通过遍历即可获得所有想要城市近六天的天气信息。注意:提取城市为一般主要城市,例如省会或者是常听到的地级市,如果所在城市为自治州或者自治县等,有可能会提取失败。

提取的数据展示如下:

 

 

 

 

 

 

可以看到解析出来的数据中所有有关温度数据都包含“高温”、“低温”、“℃”这样的字符,实际上这样的字符是不需要的,那么可以通过下面的方式全部剔除掉:

  •  
# 清洗数据(替换高温,低温等其他无效字符)
city_infos.yeshigh=city_infos.yeshigh.apply(lambda x:x.replace('高温','')).apply(lambda x:x.replace('℃',''))
city_infos.yeslow=city_infos.yeslow.apply(lambda x:x.replace('低温','')).apply(lambda x:x.replace('℃',''))

这样数据就比较干净了,如下:

 

 

 

 

 

 

接下来就要对上述数据进行可视化展示了。

03

强大的Pyecharts可视化工具

由于在初次安装Python时是默认不安装Pyecharts包的,所以在利用Pyecharts数据可视化之前,先确保自己电脑上的Python环境安装了pyecharts工具包,如果没有安装,可以问度娘,相关的文章特别的多,安装过程其实也非常简单,这里就不再赘述了。

安装好之后,在python环境中导入相关的包:

  •  
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.globals import ChartType, SymbolType
from pyecharts.render import make_snapshot
from snapshot_phantomjs import snapshot

那么接下来将获取到的数据用图的形式展示出来:

①全国主要城市今日最高气温分布

 

 

 

 

 

 

这张图其实是动态的,因小编尝试了好多次将动图保存为gif都失败了,所以这里贴上了静态图,以上是全国52个主要城市今日最高气温分布图,可以看到两个温度最高的城市分别是:重庆34°,桂林34°,华中华东以及整个华北地区的温度都在24-32°区间内,图中的那几个黄色点比较惹眼,可以看着那是我们的西北地区,青海、西藏和甘肃部分城市全天最高气温都还不到20°,这标识着全国城市中西北首先迈入凉爽的秋天。

②西北五省各城市明日最高最低气温分布图(面积图)

作为西北人,首先还是关注自己家乡的气温变化,这样就不用担心妈妈催着穿秋裤了,自觉还是很重要的。

 

 

 

 

 

这里我筛选了西北25个城市,可视化展示明日全天最高最低气温图,如上:可以看到西北火炉城市:吐鲁番,都已经是金秋送爽,丹桂飘香的季节了,全天气温最高还在37°,最低气温28°几乎很全部城市的最高气温持平,真的是名副其实的火焰山城市啊,另外还有其不相上下的哈密地区;西北城市中最凉爽TOP3:固原、平凉以及林芝,省会城市中西宁是真的凉爽,全天最高气温才21°,最近去青海湖游玩怕是要带厚秋裤了,还请大家自行准备,哈哈哈~

这里小编用面积图展示了西北五省主要城市最高最低温差,换一种方式再来展示一下子。

③西北五省各城市明日最高最低气温分布图(气泡图)

 

 

 

 

 

 

图中气泡大小表示温度的高低,气温越高气泡就越大,小编觉得相比面积图,气泡图相对更加直观一些。

 

04

动手才是实践的真理

深深的感触就是动手才是实践的真理,看了很多书但是不动手实践就是白搭,只有动手操作实现出来才能知道其中的坑在哪里,这样才能学以致用。 今天带领大家简单的 获取了主要城市未来六天的 天气预报数据 和 利用Pyecharts可视化展示, Pyecharts中有很多 很好玩的可视化 展示方法,各位 如若感兴趣的话 可以尝试一波。

<think>好的,用户想了解基于Python天气预报数据可视化分析系统,使用Flask和HTML。首先,我需要明确这个系统的基本组成部分和实现步骤。 首先,系统应该包含数据获取的部分。可能用户需要知道从哪里获取数据,比如公开的天气API,比如OpenWeatherMap或者和风天气。这部分需要考虑API的调用方法,数据格式(JSON),以及如何用Python处理这些数据。可能需要用到requests库来发送HTTP求,获取数据后解析成结构化的格式,比如Pandas的DataFrame。 接下来是数据处理。用户可能需要清洗数据,处理缺失值,转换时间戳,或者计算一些统计指标。这里可能需要用到Pandas和NumPy库。比如,将温度从开尔文转换为摄氏度,或者处理风速的单位转换。同时,可能需要对数据进行聚合,比如按城市、日期进行分组统计,为后续的可视化做准备。 然后是数据可视化部分。Python有很多可视化库,比如Matplotlib、Seaborn、Plotly。考虑到Web展示,可能需要生成静态图片或者交互式图表。Plotly是一个不错的选择,因为它支持生成交互式图表,并且可以嵌入到HTML中。此外,如果使用Bokeh或者Pyecharts,也可能有类似的效果。需要将生成的图表保存为HTML文件,或者在Flask中直接渲染。 接下来是Web框架Flask的整合。需要设计路由,处理前端求,比如用户选择城市、时间范围,提交表单后,后端处理参数,获取数据,生成可视化结果,并传递给前端模板。Flask的Jinja2模板引擎可以用于动态生成HTML页面,将数据传递给前端展示。可能需要设置不同的路由,比如首页、数据展示页、关于页等。 前端部分使用HTML/CSS/JavaScript。需要考虑页面的布局,比如使用Bootstrap来快速搭建响应式页面。图表可能需要使用JavaScript库,比如ECharts或Plotly.js,这样可以在前端动态渲染图表,减少后端生成图片的开销。或者,后端生成图表后,将图表数据以JSON格式传递到前端,再由JavaScript库渲染。需要处理用户交互,比如下拉菜单选择城市,日期选择器,然后通过AJAX向后端发送求,更新图表而不刷新页面。 数据存储方面,可能需要缓存天气数据,避免频繁调用API。可以使用SQLite、MySQL或者Redis来存储历史数据,提高响应速度。每次用户求时,先检查本地数据库是否有最新数据,如果没有再调用API获取,并更新数据库。这部分需要考虑数据库的设计,表结构,以及如何在Flask中使用ORM比如SQLAlchemy来操作数据库。 系统的架构大致分为三层:数据层(获取和存储数据)、业务逻辑层(处理数据和生成可视化)、展示层(Flask和前端)。需要确保各层之间的数据流动顺畅,比如数据获取后存储,处理后的数据传递给可视化模块,生成图表后传递给前端展示。 安全性方面,需要注意API密钥的管理,不要在代码中硬编码,而是使用环境变量或者配置文件。同时,防止SQL注入等攻击,确保用户输入的数据经过验证和清理。 错误处理也是需要考虑的,比如API调用失败时的重试机制,数据库连接异常的处理,用户输入无效数据时的友好提示等。Flask的错误处理装饰器可以用来捕获异常,返回自定义的错误页面。 最后,部署方面,可能需要使用Gunicorn或者Nginx+uWSGI来部署Flask应用,考虑服务器配置和性能优化。同时,静态文件和缓存策略也需要配置,以提高访问速度。 总结下来,这个系统需要整合数据获取、处理、可视化、Web框架和前端展示,涉及多个Python库和前端技术。需要分模块开发,逐步集成测试,确保各部分协同工作。</think>基于Python天气预报数据可视化分析系统(Flask+HTML)的实现可分为以下核心模块和技术要点: $$系统架构 = 前端(HTML) + 后端(Flask) + 数据源(API)$$ 一、技术栈组成 $$技术栈 = \begin{cases} Flask框架 & 后端服务 \\ ECharts/Plotly & 数据可视化 \\ Requests库 & API数据获取 \\ Pandas & 数据清洗处理 \\ Bootstrap & 前端UI框架 \end{cases}$$ 二、实现步骤分解 1. **数据获取层** - 使用`requests`库调用天气API(推荐和风天气/OpenWeatherMap) ```python import requests API_URL = "https://api.openweathermap.org/data/2.5/forecast" def fetch_weather(city): params = { 'q': city, 'appid': 'your_api_key', 'units': 'metric' } response = requests.get(API_URL, params=params) return response.json() ``` 2. **数据处理层** - 使用Pandas进行数据标准化 ```python def process_data(raw_data): df = pd.DataFrame(raw_data['list']) df['dt_txt'] = pd.to_datetime(df['dt_txt']) df['temp'] = df['main'].apply(lambda x: x['temp']) return df[['dt_txt', 'temp', 'humidity', 'wind.speed']] ``` 3. **可视化生成层** - 生成ECharts配置(示例展示温度变化折线图) ```python def generate_temp_chart(data): options = { 'xAxis': {'type': 'category', 'data': data['dates']}, 'yAxis': {'type': 'value'}, 'series': [{ 'data': data['temps'], 'type': 'line', 'smooth': True }] } return options ``` 4. **Flask服务层** - 路由配置示例 ```python from flask import Flask, render_template app = Flask(__name__) @app.route('/weather/<city>') def show_weather(city): raw_data = fetch_weather(city) clean_data = process_data(raw_data) chart_options = generate_temp_chart(clean_data) return render_template('dashboard.html', chart_options=chart_options, city=city) ``` 5. **前端展示层** ```html <!-- templates/dashboard.html --> <div class="container"> <h2>{{ city }}天气预报</h2> <div id="chart" style="width:800px;height:400px;"></div> </div> <script> var chart = echarts.init(document.getElementById('chart')); chart.setOption({{ chart_options|tojson }}); </script> ``` 三、系统优化策略 1. **缓存机制** $$缓存策略 = 内存缓存(Redis) + 本地缓存(SQLite)$$ 2. **异步加载** ```javascript // AJAX动态更新图表 function reloadChart(city) { fetch(`/weather/${city}`) .then(response => response.json()) .then(data => chart.setOption(data)); } ``` 3. **交互增强** - 添加日期选择器 - 多城市对比功能 - 气象要素切换(温度/湿度/风速) 四、部署方案 $$部署架构 = Nginx反向代理 + Gunicorn WSGI服务 + 云服务器(Docker容器化)$$ 典型技术挑战: 1. 跨域求处理(CORS配置) 2. 大数据量渲染性能优化 3. API调用频率限制 4. 移动端自适应显示 建议扩展功能: - 气象预警推送 - 历史数据对比分析 - 空气质量可视化 - 机器学习预测模块 该系统通过整合气象数据获取、清洗处理、可视化呈现和Web交互,构建了完整的数据分析闭环,适用于智慧城市、出行规划等应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值