Python高級--城市氣候與海洋距離關係的研究

城市氣候與海洋距離關係的研究

一、導入數據

數據可點擊下載

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)                      # 設置標題名

1)展示米蘭 風速 和 風向 的關係以及 溼度 和 風向 的關係

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章