Python 天气情况数据分析及可视化
环境配置
Pycharm开发环境
python 版本 python3.7
Anconda 集成开发环境
第三方库导入
## pip install 模块 清华大学镜像源
import requests
from bs4 import BeautifulSoup
import io
import sys
import pandas
from matplotlib import pyplot as plt
步骤
1.爬虫requests 获取数据
2.pandas 处理数据
3.matplotlib 绘制图形
4.其他 保存数据进入csv格式,简单处理,例如雷达图
小案例
雷达图
#-*- codeing = utf-8 -*-
#@Time : 2020/6/2 20:07
#@Author : dele
#@File : demo.py
#@Software: PyCharm
# 雷达图
import pygal
# pip install pygal 安装模块
rader_chart = pygal.Radar()
rader_chart.title = '成绩分析'
rader_chart.x_labels = ["数学","英语","文综","理综","体育"]
rader_chart.add('StdudetA',[139,122,80,250,10])
rader_chart.add('StdudetB',[129,100,80,250,40])
rader_chart.add('StdudetC',[150,100,80,150,60])
rader_chart.add('StdudetD',[99,140,80,150,90])
rader_chart.render_to_file('radar_chart.svg')
效果
天气案例
爬取天气网站地址http://www.tianqihoubao.com/lishi/
然后一直选择找到你需要的数据地址
例如:如图
进行网页分析 F12检查网页分析源代码
Python 爬虫代码分析
Pandas matplotlib 模块
Pandas
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
基本功能
1. 数据文件读取/文本数据读取
2. 索引、选取和数据过滤
3. 算法运算和数据对齐
4. 函数的应用和映射
5. 重置索引
6. 数学统计方法
matplotlib
Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形 。
通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
Matplotlib基础知识
1.Matplotlib中的基本图表包括的元素
x轴和y轴
水平和垂直的轴线
x轴和y轴刻度
刻度标示坐标轴的分隔,包括最小刻度和最大刻度
x轴和y轴刻度标签
表示特定坐标轴的值
绘图区域
实际绘图的区域
2.hold属性
hold属性默认为True,允许在一幅图中绘制多个曲线;将hold属性修改为False,每一个plot都会覆盖前面的plot。
但是不推荐去动hold这个属性,这种做法(会有警告)。因此使用默认设置即可。
3.网格线
grid方法
使用grid方法为图添加网格线
设置grid参数(参数与plot函数相同)
.lw代表linewidth,线的粗细
.alpha表示线的明暗程度
4.axis方法
如果axis方法没有任何参数,则返回当前坐标轴的上下限
5.xlim方法和ylim方法
除了plt.axis方法,还可以通过xlim,ylim方法设置坐标轴范围
6.legend方法
#-*- codeing = utf-8 -*-
#@Time : 2020/6/2 20:26
#@Author : dele
#@File : weather.py
#@Software: PyCharm
import requests
from bs4 import BeautifulSoup
import io
import sys
import pandas
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
def get_data(weather_url):
rseponse = requests.get(weather_url)
html = rseponse.content.decode('gbk')
soup = BeautifulSoup(html,'html.parser')
tr_lsit = soup.find_all('tr')
print(tr_lsit)
dates,conditions,temp = [],[],[]
for data in tr_lsit[1:]:
sub_data = data.text.split()
dates.append(sub_data[0])
conditions.append(''.join(sub_data[1:3]))
temp.append(''.join(sub_data[3:6]))
# 数据保存
_data = pandas.DataFrame()
_data['日期'] = dates
_data['天气情况'] = conditions
_data['气温'] = temp
return _data
# print(_data)
# _data.to_csv('anqing.csv',index=False,encoding='gbk')
# 获取数据并保存csv格式,进行下面的数据分析
# 定义成函数形式进行封装
data_month_3 =get_data('http://www.tianqihoubao.com/lishi/anqing/month/202003.html')
data_month_4 =get_data('http://www.tianqihoubao.com/lishi/anqing/month/202004.html')
data_month_5 =get_data('http://www.tianqihoubao.com/lishi/anqing/month/202005.html')
data = pandas.concat([data_month_3,data_month_4,data_month_5]).reset_index(drop=True)
data.to_csv('anqing.csv',index=False,encoding='gbk')
数据可视化
from matplotlib import pyplot as plt
# 画图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
datalsit = pandas.read_csv('G:/Python_Web/weather/anqing.csv',encoding='gbk')
# 数据处理
datalsit['最高气温'] = datalsit['气温'].str.split('/',expand=True)[0]
datalsit['最低气温'] = datalsit['气温'].str.split('/',expand=True)[1]
datalsit['最高气温'] = datalsit['最高气温'].map(lambda x:int(x.replace('℃','')))
datalsit['最低气温'] = datalsit['最低气温'].map(lambda x:int(x.replace('℃','')))
dates = datalsit['日期']
highs = datalsit['最高气温']
lows = datalsit['最低气温']
# 画图
fig = plt.figure(dpi=128,figsize=(10,6))
plt.plot(dates,highs,c='red',alpha=0.5)
plt.plot(dates,lows,c='blue',alpha=0.5)
plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.2)
# 图表格式
# 设置图标的图形格式
plt.title('2020安庆市3-5月天气情况',fontsize=24)
plt.xlabel('',fontsize=6)
fig.autofmt_xdate()
plt.ylabel('气温',fontsize=12)
plt.tick_params(axis='both',which='major',labelsize=10)
# 修改刻度
plt.xticks(dates[::20])
# 显示
plt.show()
效果
完整代码
#-*- codeing = utf-8 -*-
#@Time : 2020/6/2 20:26
#@Author : dele
#@File : weather.py
#@Software: PyCharm
import requests
from bs4 import BeautifulSoup
import io
import sys
import pandas
from matplotlib import pyplot as plt
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
def get_data(weather_url):
rseponse = requests.get(weather_url)
html = rseponse.content.decode('gbk')
soup = BeautifulSoup(html,'html.parser')
tr_lsit = soup.find_all('tr')
print(tr_lsit)
dates,conditions,temp = [],[],[]
for data in tr_lsit[1:]:
sub_data = data.text.split()
dates.append(sub_data[0])
conditions.append(''.join(sub_data[1:3]))
temp.append(''.join(sub_data[3:6]))
# 数据保存
_data = pandas.DataFrame()
_data['日期'] = dates
_data['天气情况'] = conditions
_data['气温'] = temp
return _data
# print(_data)
# _data.to_csv('anqing.csv',index=False,encoding='gbk')
# data_month_3 =get_data('http://www.tianqihoubao.com/lishi/anqing/month/202003.html')
# data_month_4 =get_data('http://www.tianqihoubao.com/lishi/anqing/month/202004.html')
# data_month_5 =get_data('http://www.tianqihoubao.com/lishi/anqing/month/202005.html')
#
# data = pandas.concat([data_month_3,data_month_4,data_month_5]).reset_index(drop=True)
# data.to_csv('anqing.csv',index=False,encoding='gbk')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
datalsit = pandas.read_csv('G:/Python_Web/weather/anqing.csv',encoding='gbk')
# 数据处理
datalsit['最高气温'] = datalsit['气温'].str.split('/',expand=True)[0]
datalsit['最低气温'] = datalsit['气温'].str.split('/',expand=True)[1]
datalsit['最高气温'] = datalsit['最高气温'].map(lambda x:int(x.replace('℃','')))
datalsit['最低气温'] = datalsit['最低气温'].map(lambda x:int(x.replace('℃','')))
dates = datalsit['日期']
highs = datalsit['最高气温']
lows = datalsit['最低气温']
# 画图
fig = plt.figure(dpi=128,figsize=(10,6))
plt.plot(dates,highs,c='red',alpha=0.5)
plt.plot(dates,lows,c='blue',alpha=0.5)
plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.2)
# 图表格式
# 设置图标的图形格式
plt.title('2020安庆市3-5月天气情况',fontsize=24)
plt.xlabel('',fontsize=6)
fig.autofmt_xdate()
plt.ylabel('气温',fontsize=12)
plt.tick_params(axis='both',which='major',labelsize=10)
# 修改刻度
plt.xticks(dates[::20])
# 显示
plt.show()