Python——⽓象数据分析
将对意⼤利北部沿海地区的⽓象数据进⾏分析与可视化。我们在实验过程中先会运⽤ Python 中 matplotlib 库的对数据进⾏图表化处理,然后调⽤ scikit-learn 库当中的的SVM 库对数据进⾏回归分析,最终在图表分析的⽀持下得出我们的结论。
笔记来源
的第 2 章
知识点
matplotlib 库画出图像
scikit-learn 库对数据进⾏回归分析
mouse英语numpy 库对数据进⾏切⽚
原理
html的p标签里空格⽓象数据是在⽹上很容易到的⼀类数据。很多⽹站都提供以往的⽓压、⽓温、湿度和降⾬量等⽓象数
据。只需指定位置和⽇期,就能获取⼀个⽓象数据⽂件。这些测量数据是由⽓象站收集的。⽓象数据这类数据源涵盖的信息范围较⼴。数据分析的⽬的是把原始数据转化为信息,再把信息转化为知识,因此拿⽓象数据作为数据分析的对象来讲解数据分析全过程再合适不过。
待检验的假设:靠海对⽓候的影响
写作本章时,虽正值夏初,却已酷热难耐,住在⼤城市的⼈感受更为强烈。于是周末很多⼈到⼭村或海滨城市去游玩,放松⼀下⾝⼼,远离内陆城市的闷热天⽓。我常常想,靠海对⽓候有什么影响?这个问题可以作为数据分析的⼀个不错的出发点。我不想把本章写成科学类读物,只是想借助这样⼀种⽅式,让数据分析爱好者能够把所学⽤于实践,解决 “海洋对⼀个地区的⽓候有何影响” 这个问题。
研究系统:亚得⾥亚海和波河流域
既然已定义好问题,就需要寻适合研究数据的系统,提供适合回答这个问题的环境。⾸先,需要到⼀⽚海域供你研究。我住在意⼤利,可选择的海有很多,因为意⼤利是⼀个被海洋包围的半岛国家。为什么要把⾃⼰的选择局限在意⼤利呢?因为我们所研究的问题刚好和意⼤利⼈的⼀种典⾏为相关,也就是夏天我们喜欢躲在海边,以躲避内陆的酷热。我不知道在其他国家这种⾏为是否也很普遍,因此我只把⾃⼰熟悉的意⼤利作为⼀个系统进⾏研究。但是你可能会考虑研究意⼤利的哪个地区呢?上⾯说过,意⼤利是半岛国家,到可研究的海域不是问题,但是如何衡量海洋对其远近不同的
地⽅的影响?这就引出了⼀个⼤问题。意⼤利其实多⼭地,离海差不多远,可以彼此作为参照的内陆区域较少。为了衡量海洋对⽓候的影响,我排除了⼭地,因为⼭地也许会引⼊其他很多因素,⽐如海拔。
意⼤利波河流域这块区域就很适合研究海洋对⽓候的影响。这⼀⽚平原东起亚得⾥亚海,向内陆延伸数百公⾥(见图 9-1)。它周边虽不乏⼭环绕,但由于它很宽⼴,削弱了⼭的影响。此外,该区域城镇密集,也便于选取⼀组离海远近不同的城市。我们所选的⼏个城市,两个城市间的最⼤距离约为 400 公⾥。
第⼀步,选 10 个城市作为参照组。选择城市时,注意它们要能代表整个平原地区(见图 9-2)。
如图 9-2 所⽰,我们选取了 10 个城市。随后将分析它们的天⽓数据,其中 5 个城市在距海 100 公⾥范围内,其余 5 个距海 100~400 公⾥。
选作样本的城市列表如下:
Ferrara(费拉拉)
Torino(都灵)
Mantova(曼托⽡)
Milano(⽶兰)
Ravenna(拉⽂纳)
Asti(阿斯蒂)
Bologna(博洛尼亚)
Piacenza(⽪亚琴察)
Cesena(切塞纳)
Faenza(法恩莎)
现在,我们需要弄清楚这些城市离海有多远。⽅法有多种。这⾥使⽤提供的服务,它⽀持多种语⾔(见图 9-3)。
有了计算两城市间距离这样的服务,我们就可以计算每个城市与海之间的距离。
你可以选择海滨城市 Comacchio 作为基点,计算其他城市与它之间的距离(见图 9-2)。使⽤上述服务计算完所有距离后,得到的结果如表 9-1 所⽰。
开发准备
定义好要研究的系统之后,我们就需要创建数据源,以获取研究所需的数据。上⽹浏览⼀番,你就会发现很多⽹站都提供世界各地的⽓象数据,其中就有 Open Weather Map,它的⽹址是(见图 9-4)。
该⽹站提供以下功能:在请求的 URL 中指定城市,即可获取该城市的⽓象数据。我们已经准备好了数据,不需要⼤家再去调⽤该⽹站的 API。下⾯,就先下载⽓象数据。
⽹盘链接:提取码:jyue
这时候,我们通过 tree 命令应该能够再 WeatherData 中间看到 10 个城市的天⽓数据⽂件(以 .csv 结尾)
!apt-get install tree
!tree WeatherData/
导⼊相关包开始实验。
import numpy as np
import pandas as pd
import datetime
如果你想⽤本章的数据,需要加载写作本章时保存的 10 个 CSV ⽂件。
df_ferrara = pd.read_csv('WeatherData/ferrara_270615.csv')
df_milano = pd.read_csv('WeatherData/milano_270615.csv')
df_mantova = pd.read_csv('WeatherData/mantova_270615.csv')
df_ravenna = pd.read_csv('WeatherData/ravenna_270615.csv')
df_torino = pd.read_csv('WeatherData/torino_270615.csv')
df_asti = pd.read_csv('WeatherData/asti_270615.csv')
df_bologna = pd.read_csv('WeatherData/bologna_270615.csv')
df_piacenza = pd.read_csv('WeatherData/piacenza_270615.csv')
df_cesena = pd.read_csv('WeatherData/cesena_270615.csv')
df_faenza = pd.read_csv('WeatherData/faenza_270615.csv')
我们把这些数据读⼊内存,完成了实验准备的部分。
实验步骤
气象python零基础入门教程从数据可视化⼊⼿分析收集到的数据是常见的做法。前⾯讲过,matplotlib 库提供⼀系列图表⽣成⼯具,能够以可视化形式表⽰数据。数据可视化在数据分析阶段⾮常有助于发现研究系统的⼀些特点。
导⼊以下必要的库:
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser
温度数据分析
举例来说,⾮常简单的分析⽅法是先分析⼀天中⽓温的变化趋势。我们以城市⽶兰为例。
# 取出我们要分析的温度和⽇期数据
y1 = df_milano['temp']
x1 = df_milano['day']
# 把⽇期数据转换成 datetime 的格式
day_milano = [parser.parse(x) for x in x1]
# 调⽤ subplot 函数, fig 是图像对象,ax 是坐标轴对象
fig, ax = plt.subplots()
# 调整x轴坐标刻度,使其旋转70度,⽅便查看
# 设定时间的格式
hours = mdates.DateFormatter('%H:%M')
# 设定X轴显⽰的格式
ax.xaxis.set_major_formatter(hours)
# 画出图像,day_milano是X轴数据,y1是Y轴数据,‘r’代表的是'red' 红⾊
ax.plot(day_milano ,y1, 'r')
执⾏上述代码,将得到如图 9-8 所⽰的图像。由图可见,⽓温⾛势接近正弦曲线,从早上开始⽓温逐渐升⾼,最⾼温出现在下午两点到六点之间,随后⽓温逐渐下降,在第⼆天早上六点时达到最低值。
我们进⾏数据分析的⽬的是尝试解释是否能够评估海洋是怎样影响⽓温的,以及是否能够影响⽓温趋势,因此我们同时来看⼏个不同城市的⽓温趋势。这是检验分析⽅向是否正确的唯⼀⽅式。因此,我们选择三个离海最近以及三个离海最远的城市。
# 读取温度和⽇期数据
y1 = df_ravenna['temp']
x1 = df_ravenna['day']
y2 = df_faenza['temp']
x2 = df_faenza['day']
y3 = df_cesena['temp']
x3 = df_cesena['day']
y4 = df_milano['temp']
x4 = df_milano['day']
y5 = df_asti['temp']
x5 = df_asti['day']
y6 = df_torino['temp']
x6 = df_torino['day']
java官方# 把⽇期从 string 类型转化为标准的 datetime 类型
day_ravenna = [parser.parse(x) for x in x1]
day_faenza = [parser.parse(x) for x in x2]
day_cesena = [parser.parse(x) for x in x3]
day_milano = [parser.parse(x) for x in x4]
day_asti = [parser.parse(x) for x in x5]
day_torino = [parser.parse(x) for x in x6]
# 调⽤ subplots() 函数,重新定义 fig, ax 变量
fig, ax = plt.subplots()
开发者工具的语言
hours = mdates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(hours)
#这⾥需要画出三根线,所以需要三组参数, 'g'代表'green'
ax.plot(day_ravenna,y1,'r',day_faenza,y2,'r',day_cesena,y3,'r')
ax.plot(day_milano,y4,'g',day_asti,y5,'g',day_torino,y6,'g')
上述代码将⽣成如图 9-9 所⽰的图表。离海最近的三个城市的⽓温曲线使⽤红⾊,⽽离海最远的三个城市的曲线使⽤绿⾊。
如图 9-9 所⽰,结果看起来不错。离海最近的三个城市的最⾼⽓温⽐离海最远的三个城市低不少,⽽最低⽓温看起来差别较⼩。
我们可以沿着这个⽅向做深⼊研究,收集 10 个城市的最⾼温和最低温,⽤线性图表⽰⽓温最值点和离海远近之间的关系。
# dist 是⼀个装城市距离海边距离的列表
dist = [df_ravenna['dist'][0],
df_cesena['dist'][0],
df_faenza['dist'][0],
df_ferrara['dist'][0],
df_bologna['dist'][0],
df_mantova['dist'][0],
df_piacenza['dist'][0],
df_milano['dist'][0],
df_asti['dist'][0],
df_torino['dist'][0]
]
# temp_max 是⼀个存放每个城市最⾼温度的列表
temp_max = [df_ravenna['temp'].max(),
df_cesena['temp'].max(),
df_faenza['temp'].max(),
df_ferrara['temp'].max(),
df_bologna['temp'].max(),
df_mantova['temp'].max(),
df_piacenza['temp'].max(),
df_milano['temp'].max(),
df_asti['temp'].max(),
df_torino['temp'].max()
]
# temp_min 是⼀个存放每个城市最低温度的列表
temp_min = [df_ravenna['temp'].min(),
df_cesena['temp'].min(),
df_faenza['temp'].min(),
df_ferrara['temp'].min(),
df_bologna['temp'].min(),
df_mantova['temp'].min(),
df_piacenza['temp'].min(),
df_milano['temp'].min(),异步电动机分为几种
df_asti['temp'].min(),
df_torino['temp'].min()
]
先把最⾼温画出来。
fig, ax = plt.subplots()
ax.plot(dist,temp_max,'ro')
结果如图 9-10 所⽰。
如图 9-10 所⽰,现在你可以证实,海洋对⽓象数据具有⼀定程度的影响这个假设是正确的(⾄少这⼀天如此)。进⼀步观察上图,你会发现海洋的影响衰减得很快,离海60~70 公⾥开外,⽓温就已攀升到⾼位。
⽤线性回归算法得到两条直线,分别表⽰两种不同的⽓温趋势,这样做很有趣。我们可以使⽤ scikit-learn 库的 SVR ⽅法。
!注意:这段代码会跑⽐较久的时间,请耐⼼等待
from sklearn.svm import SVR
# dist1是靠近海的城市集合,dist2是远离海洋的城市集合
dist1 = dist[0:5]
dist2 = dist[5:10]
# 改变列表的结构,dist1现在是5个列表的集合
# 之后我们会看到 nbumpy 中 reshape() 函数也有同样的作⽤
dist1 = [[x] for x in dist1]
dist2 = [[x] for x in dist2]
# temp_max1 是 dist1 中城市的对应最⾼温度
temp_max1 = temp_max[0:5]
# temp_max2 是 dist2 中城市的对应最⾼温度
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论