資料分析執行個體 -- 氣象資料
一、實驗介紹
本實驗將對意大利北部沿海地區的氣象資料進行分析與可視化。我們在實驗過程中先會運用 Python 中matplotlib庫的對資料進行圖表化處理,然後調用 scikit-learn 庫當中的的 SVM 庫對資料進行迴歸分析,最終在圖表分析的支援下得出我們的結論。 1.1 課程來源
本課程基於 圖靈教育 的 《Python資料分析實戰》 第2章製作,感謝 圖靈教育 授權實驗樓發布。如需系統的學習本書,請購買《Python資料分析實戰》。
為了保證可以在實驗樓環境中完成本次實驗,我們在原書內容基礎上補充了一系列的實驗指導,比如實驗截圖,代碼注釋,協助您更好得實戰。
如果您對於實驗有疑惑或者建議可以隨時在討論區中提問,與同學們一起探討。 1.2 實驗知識點 matplotlib 庫畫出映像 scikit-learn 庫對資料進行迴歸分析 numpy 庫對資料進行切片 1.3 實驗環境 python2.7 spyder Xfce終端 1.4 適合人群
本課程難度為中等,適合具有Python基礎的使用者,如果對 matplotlib 模組有瞭解會更快的上手。 1.5 代碼擷取
你可以通過下面命令將代碼下載到實驗樓環境中,作為參照對比進行學習。
$ wget http://labfile.oss.aliyuncs.com/courses/780/SourceCode.zip$ wget http://labfile.oss.aliyuncs.com/courses/780/WeatherData.zip
本實驗在互動環境當中完成,代碼不能直接在命令列中運行(因為要畫圖)。如果想要看效果的同學可以把 SourceCode.zip 和 WeatherData.zip解壓,然後開啟案頭上的 spyder, 在Ipython console的互動式環境中進入WeatherData所在路徑,然後把代碼黏貼到 console 當中去。具體方式請看如下的 gif 圖。
在這裡還是要呼籲大家不要簡單的複製粘貼代碼,還是要依照本實驗的教程自己一步步得實現。 二、實驗原理
氣象資料是在網上很容易找到的一類資料。很多網站都提供以往的氣壓、氣溫、濕度和降雨量等氣象資料。只需指定位置和日期,就能擷取一個氣象資料檔案。這些測量資料是由氣象站收集的。氣象資料這類資料來源涵蓋的資訊範圍較廣。資料分析的目的是把未經處理資料轉化為資訊,再把資訊轉化為知識,因此拿氣象資料作為資料分析的對象來講解資料分析全過程再合適不過。 2.1 待檢驗的假設:靠海對氣候的影響
寫作本章時,雖正值夏初,卻已酷熱難耐,住在大城市的人感受更為強烈。於是周末很多人到山村或海濱城市去遊玩,放鬆一下身心,遠離內陸城市的悶熱天氣。我常常想,靠海對氣候有什麼影響。這個問題可以作為資料分析的一個不錯的出發點。我不想把本章寫成科學類讀物,只是想藉助這樣一種方式,讓資料分析愛好者能夠把所學用於實踐,解決“海洋對一個地區的氣候有何影響”這個問題。
研究系統:亞得裡亞海和波河流域
既然已定義好問題,就需要尋找適合研究資料的系統,提供適合回答這個問題的環境。首先,需要找到一片海域供你研究。我住在意大利,可選擇的海有很多,因為意大利是一個被海洋包圍的半島國家。為什麼要把自己的選擇局限在意大利呢。因為我們所研究的問題剛好和意大利人的一種典行為相關,也就是夏天我們喜歡躲在海邊,以躲避內陸的酷熱。我不知道在其他國家這種行為是否也很普遍,因此我只把自己熟悉的意大利作為一個系統進行研究。但是你可能會考慮研究意大利的哪個地區呢。上面說過,意大利是半島國家,找到可研究的海域不是問題,但是如何衡量海洋對其遠近不同的地方的影響。這就引出了一個大問題。意大利其實多山地,離海差不多遠,可以彼此作為參照的內陸地區較少。為了衡量海洋對氣候的影響,我排除了山地,因為山地也許會引入其他很多因素,比如海拔。
意大利波河流域這塊地區就很適合研究海洋對氣候的影響。這一片平原東起亞得裡亞海,向內陸延伸數百公裡(見圖9-1)。它周邊雖不乏群山環繞,但由於它很寬廣,削弱了群山的影響。此外,該地區城鎮密集,也便於選取一組離海遠近不同的城市。我們所選的幾個城市,兩個城市間的最大距離約為400公裡。
第一步,選10個城市作為參照組。選擇城市時,注意它們要能代表整個平原地區(見圖9-2)。
如圖9-2所示,我們選取了10個城市。隨後將分析它們的天氣資料,其中5個城市在距海100公裡範圍內,其餘5個距海100~400公裡。
選作樣本的城市列表如下: Ferrara(費拉拉) Torino(都靈) Mantova(曼托瓦) Milano(米蘭) Ravenna(拉文納) Asti(阿斯蒂) Bologna(博洛尼亞) Piacenza(皮亞琴察) Cesena(切塞納) Faenza(法恩莎)
現在,我們需要弄清楚這些城市離海有多遠。方法有多種。這裡使用TheTimeNow網站提供的服務,它支援多種語言(見圖9-3)。
有了計算兩城市間距離這樣的服務,我們就可以計算每個城市與海之間的距離。你可以選擇 海濱城市Comacchio作為基點,計算其他城市與它之間的距離(見圖9-2)。使用上述服務計算完 所有距離後,得到的結果如表9-1所示。
三、開發準備
定義好要研究的系統之後,我們就需要建立資料來源,以擷取研究所需的資料。上網瀏覽一番,你就會發現很多網站都提供世界各地的氣象資料,其中就有Open Weather Map,它的網址是 http://openweathermap.org/ (見圖9-4)。
該網站提供以下功能:在請求的URL中指定城市,即可擷取該城市的氣象資料。我們已經準備好了資料,不需要大家再去調用該網站的 API。
啟動案頭上的spyder。如果您發現您案頭上沒有spyder,請在該實驗中重新開一個實驗環境(實驗樓為不同的實驗建立不同的實驗環境):
我們首先來擷取我們的資料檔案。開啟 Xfce 終端
$ cd Code$ mkdir WeatherAnalysis$ cd WeatherAnalysis$ wget http://labfile.oss.aliyuncs.com/courses/780/WeatherData.zip$ unzip WeatherData.zip
這時候應該能夠再 WeatherData 中間看到 10 個城市的天氣資料檔案(以 .csv 結尾)
雙擊開啟 spyder ,在 Ipython Console 中進入我們的目標目錄
cd Codecd WeatherAnalysiscd WeatherData
我們在實驗裡只需要用到 Ipython Console 所以別的不相關的視窗可以關閉。
import numpy as npimport pandas as pdimport datetime
如果你想用本章的資料,需要載入寫作本章時儲存的10個CSV檔案。
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')
我們把這些資料讀入記憶體,完成了實驗準備的部分。 四、專案檔結構
Pic9-* 代表的是每一張分析圖所使用的代碼。
WeatherData 是我們的資料。 五、實驗步驟
從資料視覺效果入手分析收集到的資料是常見的做法。前面講過,matplotlib庫提供一系列圖表產生工具,能夠以可視化形式表示資料。資料視覺效果在資料分析階段非常有助於發現研究系統的一些特點。
匯入以下必要的庫:
%matplotlib inlineimport matplotlib.pyplot as pltimport matplotlib.dates as mdatesfrom dateutil import parser
5.1 溫度資料分析
舉例來說,非常簡單的分析方法是先分析一天中氣溫的變化趨勢。我們以城市米蘭為例。
# 讀取米蘭的城市氣象資料df_milano = pd.read_csv('milano_270615.csv')# 取出我們要分析的溫度和日期資料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度,方便查看plt.xticks(rotation=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')# 顯示映像fig
執行上述代碼,將得到如圖9-8所示的映像。由圖可見,氣溫走勢接近正弦曲線,從早上開始氣溫逐漸升高,最高溫出現在下午兩點到六點之間,隨後氣溫逐漸下降,在第二天早上六點時達到最低值。
我們進行資料分析的目的是嘗試解釋是否能夠評估海洋是怎樣影響氣溫的,以及是否能夠影響氣溫趨勢,因此我們同時來看幾個不同城市的氣溫趨勢。這是檢驗分析方向是否正確的唯一方式。因此,我們選擇三個離海最近以及三個離海最遠的城市。
# 讀取資料檔案(之前沒讀取資料的同學,這裡一定要讀取啦)df_ravenna = pd.read_csv('ravenna_270615.csv')df_faenza = pd.read_csv('faenza_270615.csv')df_cesena = pd.read_csv('cesena_270615.csv')df_asti = pd.read_csv('asti_270615.csv')df_torino = pd.read_csv('torino_270615.csv')df_milano = pd.read_csv('milano_270615.csv')# 讀取溫度和日期資料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']# 把日期從 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]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]# 調用 subplots() 函數,重新定義 fig, ax 變數fig, ax = plt.subplots()plt.xticks(rotation=70)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(dat_milano,y4,'g',day_asti,y5,'g',day_torino,y6,'g')fig
上述代碼將產生如圖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[