城市氣候與海洋距離關係的研究
一、導入數據
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) # 設置標題名