Python⽓象数据分析--《Python数据分析实战》
qq链接
选取了10个城市。随后将分析它们的天⽓数据,其中5个城市在距海100公⾥范围内,其余5个距海100~400公⾥。
选作样本的城市列表如下:
Ferrara(费拉拉)
Torino(都灵)
Mantova(曼托⽡)
Milano(⽶兰)
Ravenna(拉⽂纳)
Asti(阿斯蒂)
Bologna(博洛尼亚)
Piacenza(⽪亚琴察)
Cesena(切塞纳)
Faenza(法恩莎)
1.温度数据分析
进⾏数据分析的⽬的是尝试解释是否能够评估海洋是怎样影响⽓温的,以及是否能够影响⽓温趋势,因此同时来看⼏个不同城市的⽓温趋势。这是检验分析⽅向是否正确的唯⼀⽅式。因此选择三个离海最近以及三个离海最远的城市。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser
import pandas as pd
import numpy as np
df_ferrara = pd.read_csv('ferrara_270615.csv')
df_milano = pd.read_csv('milano_270615.csv')
df_mantova = pd.read_csv('mantova_270615.csv')
df_ravenna = pd.read_csv('ravenna_270615.csv')
df_torino = pd.read_csv('torino_270615.csv')
df_asti = pd.read_csv('asti_270615.csv')
df_bologna = pd.read_csv('bologna_270615.csv')
df_piacenza = pd.read_csv('piacenza_270615.csv')
df_cesena = pd.read_csv('cesena_270615.csv')
df_faenza = pd.read_csv('faenza_270615.csv')
# 读取城市⽓象数据
# 取出要分析的温度和⽇期数据
y1 = df_ravenna['temp']
x1 = df_ravenna['day']
y2 = df_faenza['temp']
x2 = df_faenza['day']
y3 = df_cesena['temp']mac单片机编程软件
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']
# 把⽇期数据转换成 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]
dat_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]
# 调⽤ subplot 函数, fig 是图像对象,ax 是坐标轴对象
fig, ax = plt.subplots()
# 调整x轴坐标刻度,使其旋转70度,⽅便查看
# 设定时间的格式
hours = mdates.DateFormatter('%H:%M')
# 设定X轴显⽰的格式
ax.xaxis.set_major_formatter(hours)
#这⾥需要画出三根线,所以需要三组参数
ax.plot(day_ravenna,y1,'r',day_faenza,y2,'r',day_cesena,y3,'r') ax.plot(dat_milano,y4,'g',day_asti,y5,'g',day_torino,y6,'g')
#显⽰图像
fig
结果:
离海最近的三个城市的最⾼⽓温⽐离海最远的三个城市低不少,⽽最低⽓温看起来差别较⼩。
可以沿着这个⽅向做深⼊研究,收集10个城市的最⾼温和最低温,⽤线性图表⽰⽓温最值点和离海远近之间的关系。
#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_min:存放每个城市最低温度的列表
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 = [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')
fig
#scikit-learn库的SVR⽅法
from sklearn.svm import SVR
结果:
离海60公⾥以内,⽓温上升速度很快,从28度陡升⾄31度,随后增速渐趋缓和(如果还继续增长的话),更长的距离才会有⼩幅上升。这两种趋势可分别⽤两条直线来表⽰,直线的表达式为:x = ax + b
其中a为斜率,b为截距。 考虑将这两条直线的交点作为受海洋影响和不受海洋影响的区域的分界点,或者⾄少是海洋影响较弱的分界点。
from sklearn.svm import SVR
# dist1是靠近海的城市集合,dist2是远离海洋的城市集合
dist1 = dist[0:5]
dist2 = dist[5:10]
# 改变列表的结构,dist1现在是5个列表的集合
# 之后我们会看到 numpy 中 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 中城市的对应最⾼温度
temp_max2 = temp_max[5:10]
# 调⽤SVR 函数,在参数中规定了使⽤线性的拟合函数
# 并且把 C 设为1000来尽量拟合数据(因为不需要精确预测不⽤担⼼过拟合)
svr_lin1 = SVR(kernel='linear', C=1e3)
svr_lin2 = SVR(kernel='linear', C=1e3)
# 加⼊数据,进⾏拟合
svr_lin1.fit(dist1, temp_max1)
svr_lin2.fit(dist2, temp_max2)
# 关于 reshape 函数请看代码后⾯的详细讨论
xp1 = np.arange(10,100,10).reshape((9,1))
xp2 = np.arange(50,400,50).reshape((7,1))
yp1 = svr_lin1.predict(xp1)
yp2 = svr_lin2.predict(xp2)
# 限制了 x 轴的取值范围
ax.set_xlim(0,400)
气象python零基础入门教程# 画出图像
ax.plot(xp1, yp1, c='b', label='Strong sea effect')
ax.plot(xp2, yp2, c='g', label='Light sea effect')
fig
print f_  #斜率
print svr_lin1.intercept_  # 截距
print f_
print svr_lin2.intercept_
结果:
执⾏上述代码,将得到交点的坐标[x,y] = [ 53, 30 ]
因此,可以说海洋对⽓温产⽣影响的平均距离(该天的情况)为53公⾥。现在,分析最低⽓温。
#考虑将这两条直线的交点作为受海洋影响和不受海洋影响的区域的分界点,或者⾄少是海洋影响较弱的分界点from  scipy.optimize import  fsolve
#定义第⼀条拟合直线
def  line1(x):
a1=f_[0][0]
b1=svr_lin1.intercept_[0]
return  a1*x+b1antonym
#定义第⼆条拟合直线
def  line2(x):
a2=f_[0][0]
b2=svr_lin2.intercept_[0]
return  a2*x+b2
#定义了到两条直线的交点的 x 坐标的函数
def  findIntersection (fun1,fun2,x0):
return  fsolve(lambda  x : fun1(x) - fun2(x),x0)
result=findIntersection(line1,line2,0.0)
print  "[x,y]=[%d,%d]"%(result,line1(result))
fig, ax = plt.subplots()
x=np.linspace(0,300,31)
ax.plot(x,line1(x),x,line2(x),result,line1(result),'ro')fig
#最低温
java包装类fig, ax = plt.subplots()
发卡网源码免费分享
plt.axis((0,400,15,25))
ax.plot(dist,temp_min,'bo')
fig

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。