Python學習之路15-下載數據

本系列是對入門書籍《Python編程:從入門到實踐》的筆記整理,屬於初級內容。標題順序採用書中標題。

本篇是Python數據處理的第二篇,本篇將使用網上下載的數據,對這些數據進行可視化。

1. 前言

本篇將訪問並可視化以兩種常見格式存儲的數據:CSV和JSON:

  • 使用Python的csv模塊來處理以CSV(逗號分隔的值)格式存儲的天氣數據,找出兩個不同地區在一段時間內的最高溫度和最低溫度;

  • 使用json模塊來訪問以JSON格式存儲的交易收盤價數據。

本文數據均可從圖書官網下載( http://www.ituring.com.cn/book/1861 )。

2. CSV文件格式

新建一個項目,將文件death_valley_2014.csv複製到項目根目錄,並新建highs_lows.py文件,改程序讀取加州死亡谷2014年的溫度數據,提取出每天的最高和最低氣溫,並繪製出折線圖:

Python學習之路15-下載數據

代碼現將文件打開,然後通過csv.reader()函數創建一個CSV文件閱讀器,參數就是剛才打開的文件;通過next()函數讀取文件的一行,並自動將數據轉換為列表;然後通過一個for循環讀取全部數據。for循環中還添加了錯誤檢查,以防文件中數據丟失等問題造成程序終止。我們還通過fill_between()函數將兩個折現之間的區域著色。最後得到的圖像如下:

Python學習之路15-下載數據

同時我們還得到了一條信息輸出:

Python學習之路15-下載數據

即該日的數據丟失了。

3. 製作交易收盤價走勢圖:JSON格式

現將將btc_close_2017.json拷貝到項目根目錄下。本節中將繪製5幅圖像:收盤折線圖,收盤價對數變換,收盤價月日均值,收盤價週日均值,收盤價星期均值。均使用Pygal繪製。

3.1 繪製收盤價折線圖

Python學習之路15-下載數據

最後得到的圖像如下:

Python學習之路15-下載數據

3.2 收盤價對數變換

從上圖可以看出,收盤價基本呈指數增長,但其中有一些相似的波動(3,6,9月)。儘管這些波動被增長的趨勢掩蓋了,但也許其中有周期性。為了驗證週期性的假設,需要首先將非線性的趨勢消除。對數變換是常用的處理方法之一。我們使用Python標準庫中的math模塊來解決此問題。

Python學習之路15-下載數據

得到了如下圖像:

Python學習之路15-下載數據

可以看出,3,6,9月都出現了劇烈的波動。下面再看看收盤價的月日均值和週日均值。

3.3 收盤價均值

3.3.1 月日均值

在繼續新的代碼之前,需要補充一些知識:對於zip()函數,它將多個列表按照元素的位置組成新的列表,而新列表的元素是元組。如下:

Python學習之路15-下載數據

在python2中,zip()直接返回一個列表,但在python3中,zip()返回一個可迭代的zip對象,這裡我們將其轉化為列表。也在前面加星號對zip對象進行“解壓”(解包):

Python學習之路15-下載數據

星號不止能對zip對象進行解包,還可以對list等類型進行解包。

我們還會用到groupby()函數,但在使用該函數之前,需要對列表進行排序。我們使用sorted()函數進行排序,python3中sorted()函數默認按照元素順序進行比較,比如這裡的列表的元素是元組,則sorted()先比較元組中第一個元素的值,再比較第二個元素的值,如下:

Python學習之路15-下載數據

接下來通過groupby()函數對這些數據進行分組,通過關鍵字參數key=itemgetter(0)指定根據列表元素(即元組)的第一個值進行分組。也可以將這裡的itemgetter()函數替換為lambda表達式,如等價的lambda表達式為lambda x: x[0]。在python3中,groupby()返回一個可迭代的groupby對象,如果將其轉換成listlist中的每個元素的第二個值也是個可迭代對象:

Python學習之路15-下載數據

從上面的for循環的結果來看,可以將groupby()返回的對象看做一個字典,該字典的鍵為上面的key的值,該字典的值為還沒分組時列表中的部分元素(可能組成了列表,也可能組成了元組)。

現在言歸正傳,回到主線。

繪製2017年前11個月的日均值,前49周的日均值,以及每週中各天(Monday~Sunday)的日均值。首先我們需要封裝一些代碼:

Python學習之路15-下載數據

本段代碼有些繞。從前面的介紹可以知道,for循環中的變量y相當於一個list,這個list的元素是tupletuple的第一個元素是x_data中的值,不再重複需要,所以取第二個值組成list,即第8行代碼。xy_map是個list對象,而它的元素也是list,即它是一個二維數組。注意第10行的操作,*xy_maplist進行解包,zip()函數將解包後的元素再次打包成一個zip對象,如果將其看做list對象,則這個對象含有兩個

tuple元素,然後將這個zip對象也解包,最外面再套一層list,得到一個含兩個tuple元素的list,最後再平行賦值。為了更具體的體現這段操作,下面用一些簡單數據進行模擬:

Python學習之路15-下載數據

最後,終於到了畫圖階段:

Python學習之路15-下載數據

得到的結果如下:

Python學習之路15-下載數據

3.3.2 週日均值

2017年的第一週從2017年1月2日開始,第49週週日是2017年12月10日。

Python學習之路15-下載數據

結果如下:

Python學習之路15-下載數據

3.3.3 每週中各天的均值

如果直接用weekdays這個列表生成圖表,由於該列表存儲的是字符串,排序的時候是按ASCII碼進行排序,最後生成的圖表星期的順序會出錯,所以將其轉換成數字。

Python學習之路15-下載數據

最後的結果如下:

Python學習之路15-下載數據

3.4 收盤價數據儀表盤

最後我們將五張表整合到一個文件中,做成一個儀表盤:

Python學習之路15-下載數據

效果如下:

Python學習之路15-下載數據

這是將瀏覽器放大後的效果,默認100%的話這五張圖都在同一行,且非常小。

4. 小結

本篇中主要內容有:

  • 如何使用網上的數據集;

  • 如何處理CSV和JSON文件,以及如何提取你感興趣的數據;

  • 如何使用matplotlib來處理以往的天氣數據,包括如何使用datetime模塊,以及如何在同一個圖表中繪製多個數據系列;

  • 如何json模塊來訪問JSON格式存儲的交易收盤價數據,並使用Pygal繪製圖形以探索價格變化的週期性,以及如何將Pygal圖形組合成數據儀表盤。

下一篇將從網上採集數據並對其進行可視化。


分享到:


相關文章: