城市气候与海洋距离关系的研究
一、导入数据
ferrara1 = pd.read_csv('./data/ferrara_150715.csv')
ferrara2 = pd.read_csv('./data/ferrara_250715.csv')
ferrara3 = pd.read_csv('./data/ferrara_270615.csv')
ferrara = pd.concat([ferrara1,ferrara2,ferrara3],ignore_index=True) #导入后将各表合并
torino1 = pd.read_csv('./data/torino_150715.csv')
torino2 = pd.read_csv('./data/torino_250715.csv')
torino3 = pd.read_csv('./data/torino_270615.csv')
torino = pd.concat([torino1,torino2,torino3],ignore_index=True)
mantova1 = pd.read_csv('./data/mantova_150715.csv')
mantova2 = pd.read_csv('./data/mantova_250715.csv')
mantova3 = pd.read_csv('./data/mantova_270615.csv')
mantova = pd.concat([mantova1,mantova2,mantova3],ignore_index=True)
milano1 = pd.read_csv('./data/milano_150715.csv')
milano2 = pd.read_csv('./data/milano_250715.csv')
milano3 = pd.read_csv('./data/milano_270615.csv')
milano = pd.concat([milano1,milano2,milano3],ignore_index=True)
ravenna1 = pd.read_csv('./data/ravenna_150715.csv')
ravenna2 = pd.read_csv('./data/ravenna_250715.csv')
ravenna3 = pd.read_csv('./data/ravenna_270615.csv')
ravenna = pd.concat([ravenna1,ravenna2,ravenna3],ignore_index=True)
asti1 = pd.read_csv('./data/asti_150715.csv')
asti2 = pd.read_csv('./data/asti_250715.csv')
asti3 = pd.read_csv('./data/asti_270615.csv')
asti = pd.concat([asti1,asti2,asti3],ignore_index=True)
bologna1 = pd.read_csv('./data/bologna_150715.csv')
bologna2 = pd.read_csv('./data/bologna_250715.csv')
bologna3 = pd.read_csv('./data/bologna_270615.csv')
bologna = pd.concat([bologna1,bologna2,bologna3],ignore_index=True)
piacenza1 = pd.read_csv('./data/piacenza_150715.csv')
piacenza2 = pd.read_csv('./data/piacenza_250715.csv')
piacenza3 = pd.read_csv('./data/piacenza_270615.csv')
piacenza = pd.concat([piacenza1,piacenza2,piacenza3],ignore_index=True)
cesena1 = pd.read_csv('./data/cesena_150715.csv')
cesena2 = pd.read_csv('./data/cesena_250715.csv')
cesena3 = pd.read_csv('./data/cesena_270615.csv')
cesena = pd.concat([cesena1,cesena2,cesena3],ignore_index=True)
faenza1 = pd.read_csv('./data/faenza_150715.csv')
faenza2 = pd.read_csv('./data/faenza_250715.csv')
faenza3 = pd.read_csv('./data/faenza_270615.csv')
faenza = pd.concat([faenza1,faenza2,faenza3],ignore_index=True)
二、数据处理
1)常查看数据
ferrara.head()
Unnamed: 0 temp humidity pressure description dt wind_speed wind_deg city day dist
0 0 30.44 60 1011.0 moderate rain 1436863096 1.03 180.0 Ferrara 2015-07-14 10:38:16 47
1 1 31.40 58 1011.0 moderate rain 1436866685 1.54 135.0 Ferrara 2015-07-14 11:38:05 47
2 2 31.95 54 1011.0 moderate rain 1436870387 0.51 113.0 Ferrara 2015-07-14 12:39:47 47
3 3 32.06 50 1011.0 moderate rain 1436873989 2.06 90.0 Ferrara 2015-07-14 13:39:49 47
4 4 32.63 49 1010.0 moderate rain 1436877535 1.54 68.0 Ferrara 2015-07-14 14:38:55 47
这里我们可以将不需要的列删除
# drop 默认删除行 指定axis=1是删除列 inplace=True 将原数据也进行修改
asti.drop('Unnamed: 0',axis=1,inplace=True)
bologna.drop('Unnamed: 0',axis=1,inplace=True)
cesena.drop('Unnamed: 0',axis=1,inplace=True)
faenza.drop('Unnamed: 0',axis=1,inplace=True)
ferrara.drop('Unnamed: 0',axis=1,inplace=True)
mantova.drop('Unnamed: 0',axis=1,inplace=True)
milano.drop('Unnamed: 0',axis=1,inplace=True)
piacenza.drop('Unnamed: 0',axis=1,inplace=True)
ravenna.drop('Unnamed: 0',axis=1,inplace=True)
torino.drop('Unnamed: 0',axis=1,inplace=True)
三、展示 最高温度 与 离海远近 的关系
分析:最高温度可以对“temp”这一列求最大值
我们直接创建多维数组来保存这些数据
离海的远近:实际情况这是一个不变的值i,我们只需取其中一个即可
# 温度
temps = np.array([
ferrara['temp'].max(),
torino['temp'].max(),
mantova['temp'].max(),
milano['temp'].max(),
ravenna['temp'].max(),
asti['temp'].max(),
bologna['temp'].max(),
piacenza['temp'].max(),
cesena['temp'].max(),
faenza['temp'].max(),
])
# 按照城市的排序 放着各个城市的最高温度
temps
array([33.43, 34.69, 34.18, 34.81, 32.79, 34.31, 33.85, 33.92, 32.81,
32.74])
# dist
dists = np.array([
ferrara['dist'].iloc[0],
torino['dist'].iloc[0],
mantova['dist'].iloc[0],
milano['dist'].iloc[0],
ravenna['dist'].iloc[0],
asti['dist'].iloc[0],
bologna['dist'].iloc[0],
piacenza['dist'].iloc[0],
cesena['dist'].iloc[0],
faenza['dist'].iloc[0],
])
# 按照各个城市的顺序 放着各个城市的海洋的距离
dists
array([ 47, 357, 121, 250, 8, 315, 71, 200, 14, 37], dtype=int64)
根据这两组数据分析关系
plt.scatter(x=dists,y=temps)
由图可以得出两组数据的关系为: 距离海洋越远,最高温度越高
四、使用支持向量机 计算回归参数
分别以100公里和50公里为分界点,划分为离海近和离海远的两组数据
使用支持向量机计算回归参数
svm support vector machine 支持向量机
可以用来处理分类问题classification 也 可以用来处理回归问题regression
1)导包
from sklearn.svm import SVR
2)创建支持向量机模型
# 使用内核 kernel 这里使用线型的 'linear'
svr1 = SVR(kernel='linear')
svr2 = SVR(kernel='linear')
用这两个模型去预测线性回归
3)获取并处理数据,分为两部分进行预测
# near_city <100
# far_city >50
# 获取距离海洋近的城市的距离
# 获取距离海洋近的城市的温度
near_city_dists = dists[dists<100] # 距离小于100的城市的到海洋的距离
near_city_temps = temps[dists<100] # 距离小于100的城市的最高温度
far_city_dists = dists[dists>50] # 距离大于50的城市的到海洋的距离
far_city_temps = temps[dists>50] # 距离大于50的城市的最高温度
注意这里需要将数据形状转换为支持向量机可接纳的形状
支持向量机模型的数据:
是二维的 每个样本是一行 样本的各个特征是各个列
# -1行1列表示 只有一列,行有多少自己计算
near_city_dists.reshape(-1,1)
4)给定训练数据,去拟合支持向量机模型
svr1.fit(near_city_dists.reshape(-1,1),near_city_temps)
svr2.fit(far_city_dists.reshape(-1,1),far_city_temps)
# 返回:
SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto',
kernel='linear', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
5)使用训练好的模型去预测
(1)预测数据
X_predict = np.linspace(near_city_dists.min(),near_city_dists.max(),100) #从最进的城市到最远的城市(小于50的),取100个
X_predict
X2_predict = np.linspace(far_city_dists.min(),far_city_dists.max(),100) #从最进的城市到最远的城市(大于100的),取100个
X2_predict
(2)用训练好的模型去预测svr1.predict(预测数据)
# 使用训练好的模型去预测
#这里预测出来的命名方式一般为 Y_ , y2_
y_ = svr1.predict(X_predict.reshape(-1,1))
y2_ = svr2.predict(X2_predict.reshape(-1,1))
注意这里的数据也需要注意数据形状reshape(-1, 1)
6)将原数据与预测出的数据展示
plt.scatter(x=dists,y=temps)
plt.plot(X_predict,y_)
plt.plot(X2_predict,y2_)
五、细分极坐标绘图
风速与风向的关系
根据不同的风向,风速不同 这里我们研究ferrara的
1)使用散点图绘制
ferrara['wind_deg'] # 风向
ferrara['wind_speed'] # 风速
plt.scatter(x=ferrara['wind_deg'],y=ferrara['wind_speed'])
2)使用柱状图绘制
ferrara['wind_deg'] # 风向
ferrara['wind_speed'] # 风速
plt.bar(x=ferrara['wind_deg'],height=ferrara['wind_speed'])
3)使用极坐标绘制
ferrara['wind_deg'] # 风向
ferrara['wind_speed'] # 风速
# ferrara['wind_deg']用的是角度
# 极坐标用的是弧度
# 360 = 2*np.pi
# 弧度/(2*np.pi)=角度/360
# 弧度=角度*np.pi/180
plt.axes(polar=True)
plt.bar(x=ferrara['wind_deg']*np.pi/180,height=ferrara['wind_speed']) #将角度转换为弧度后绘制
4)将极坐标的角度细分绘制
因为极坐标中的最大值会覆盖其他的值,所谓我们为了数据准确,我们将圆取1/8区域内的平均值来绘制
(1)将角度分为8份
index = np.arange(0,360,360/8) #将角度分为8份
index
array([ 0., 45., 90., 135., 180., 225., 270., 315.])
(2)按照index的范围 去wind_speed里面取值 并求平均值
speeds = []
for i in index[:]:
# print(i,'-',i+45) #这个是角度的范围
# (ferrara.wind_deg>i)&(ferrara.wind_deg<i+45) 这个是条件
# ferrara.wind_speed[条件] 就可以把符要求的值取出
avg_speed = ferrara.wind_speed[(ferrara.wind_deg>i)&(ferrara.wind_deg<i+45)].mean()
#print(avg_speed)
if np.isnan(avg_speed): #因为数据中没有 315-360的值 我们判断返回的数据是否含有nan
avg_speed = 0
speeds.append(avg_speed)
speeds
[1.4625000000000001,
2.064285714285714,
1.297,
2.3966666666666665,
1.5533333333333335,
1.6166666666666665,
0.51,
0]
(3)绘制极坐标(玫瑰)图
index2 = np.arange(0,2*np.pi,2*np.pi/8) #极坐标的 x 为分8份的弧度
index2
plt.axes(polar=True)
plt.bar(x=index2,height=speeds)
六、将上面步骤写成函数
def draw_polar(A,B,title): #参数: 要分析的两组数据 A B 画布的标题 title
speeds = []
index = np.arange(0,360,360/8)
for i in index[:]:
avg_speed = B[(A>i)&(A<i+45)].mean()
#print(avg_speed)
if np.isnan(avg_speed):
avg_speed = 0
speeds.append(avg_speed)
plt.figure(figsize=(8,8)) #设置画布的大小
plt.axes(polar=True) #绘制极坐标图
index2 = np.arange(0,2*np.pi,2*np.pi/8)
plt.bar(x=index2,height=speeds)
plt.title(title) # 设置标题名