利用Python建立圖表 — ( II )

延續上一篇,上次我們把網站的瀏覽人數建成了 list 的格式了,然而大家仔細看會發現次數並沒又對應到每一天的日期,只是單純的一行數字,這樣畫出來的圖沒辦法像我們要的結果,所以這邊要把這張 list 做加工,並且試試看加工後我們有沒辦法做些初步的資料分析。

首先我們要把 index 改掉,pd.Series內建的索引值是從 0 開始排,我們要把它改成用日期來排,所以第一件事情是要創建三十天的日期出來。不知道大家是否還記得pd.date_range,沒錯 !! 現在我們就要利用它來完成。

 

import pandas as pd
date = pd.date_range(start = '2018-7-10', end = '2018-8-8', freq = "D")
print(date)

沒錯~~三十天日期這麼簡單就誕生拉~~ 接著我們需要拿這些日期去取代前面pd.Series裡面的 index 。其實也很簡單,pd.Series內建參數可以調整 index,所以我們就在創建pd.Series時候直接修改就好:

statistical_data = pd.Series(viewing_count, index = date)
print(statistical_data)

沒錯,索引就通通變成日期拉~~在畫圖之前,其實光是變成這樣子的資料格式,就能玩出很多花樣了。我們來試試看幾個場景吧~~

首先我想統計這一個月中,每次星期二的瀏覽人數,

statistical_data["2018-07-10":"2018-08-08":7]

我先查好日曆,剛好 7/10 就是星期二,所以我們取"2018-07-10" : "2018-08-08"  ,也就是 7/10 到 8/8 的資料,: 7指的是資料相隔七筆取一次。所以就是 7/10, 7/17, 7/24, 7/31, 8/7。天數也被完整的取出來囉~

接著我想要看星期三跟星期五的瀏覽人數的平均比較:

wed_mean = statistical_data["2018-07-11":"2018-08-08":7]
fri_mean = statistical_data["2018-07-13":"2018-08-08":7]
print(sum(wed_mean)/len(wed_mean))
print(sum(fri_mean)/len(fri_mean))

我先把資料分別存到wed_meanfri_mean中,取出他們的總和並除以個數。

或著是也可以利用describe()來看統計資料。

print(wed_mean.describe())
print(fri_mean.describe())

資料一目了然吧~~以上就是很簡單很簡單很簡單的簡單數據分析XDDD,大家可能覺得沒有很方便,不過如果今天的天數放大到三年五年、甚至是十年,我們只要用一模一樣的步驟就好,而且快又準確。另外還有一個好消息:Python 還有內建很多分析的工具,未來再慢慢跟大家分享吧 !!

 

 

利用date_range紀錄日期格式的資料

在處理資料上,常常會遇到需要使用日期格式來記錄的資料,像是捷運公司如果想要紀錄每天乘客的數量,需要這筆資料記錄到某天的日期當中;投資客想要紀錄跟分析台股每天的漲跌狀況;老師需要記錄學生的所以成績;氣象局想要分析每天的溫度或雨量等等的資料。利用date_range便可以輕易地達成目的。對上日期後,我們才能隨心所欲的取出我們要的日期資料,像是比較每年 7/18 號的載客數量、每年一月分到三月份的乘客量與天氣溫度之間的關係等分析,由於依照日期記錄的資料實在是太多太多了,所以這篇會教大家如何創建利用某段日期的 index。

import pandas as pd
pd.date_range('2018-8-01',periods = 31)

首先,他是在 pandas 中的一個模組,所以我們必須要先做import pandas as pd,接著我們就可以使用pd.data_range了,至於我們要如何指定日期區間呢?首先,指定某一天日期,接著在periods參數中指定連續的天數。噹啷~~ 我們便把需要的日期給產生出來啦~~

剛剛有提到參數,相信有些人對於參數還不是那麼的熟悉,什麼是參數呢 ? 之前有說過Python 很大的程度上,是使用人家寫好的現成模組,但是~但是~但是~~人家寫好的code,不一定會完全符合你的需求啊!?所以一般來說,寫好的模組都會提供某些參數設定,讓使用者可以自行調整,像以上面的例子來說,大家創建的index天數一定不相同,所以大家可以藉由自行調整periods來改變天數,除了這個參數以外其實還有很多的參數可以提供大家做更細部的修正,下面我來說明幾個比較常用的參數吧:

  • start:這個參數可以指定開始的日期
  • end:這個參數可以指定結束的日期
  • periods:指定出現次數
  • freq:可以指定間隔的時間(可以使用D(天), H(小時), T(分鐘), S(秒))
  • normalize:可以設定他normalize = True或是normalize = False 。如果利用start 跟end指定的話,開始與結束都會落在最近午夜十二點前。

相信看完這個,很多人還是不知道在幹嘛,沒關係,我們來出幾個題目試試看有沒有辦法自己寫出來吧~~

如果想要指定 2017-01-25 開始到 2017-01-28 ,每隔100分鐘產生一次的話可以怎麼用呢?

import pandas as pd
pd.date_range(start = '2017-01-26', end = '2017-01-28' , freq = '100T')

其中freq = '100T'代表間隔100分鐘。

指定 2017-01-15 開始到 2017-01-16,每隔6小時產生一次的話可以怎麼用呢?

import pandas as pd
pd.date_range(start = '2017-01-15', end = '2019-01-16' , freq = '6H', normalize = True)

最後一個,從2018-05-12每107分鐘產生一次,產生1024筆~~

import pandas as pd
pd.date_range('2018-01-15', freq = '107T', periods = 1024)

這種複雜的情況只要稍微調整一下就可以輕鬆產生出來啦~~大家可以試著看看怎麼修改參數會產生不一樣的資料,另外參數的設定這件事情在Python中非常非常重要,如果可以學會的話,未來可以減少很多的時間。最後一件事情啊~~

要如何看 module 中有那些參數呢?

pd.date_range??

可以打出你想看的模組後,加上兩個?,他就會把說明的文件叫出來拉~~裡面包含模組的說明,可以調整的參數跟參數說明,有的甚至包含範例,大家可以多利用這個功能來看看要如何客製化達到自己想要的功能。

 

Python 裡面的閃電俠 — NumPy & Pandas

講到 Python 有一個很嚴重的問題:就是他的速度…為了貼近自然語言(也就是說你嘴巴講出來的話,跟你要寫的 code 差不多),所以他在底層運作上,先天上不可避免的問題就是比人家慢。其實慢也不是很嚴重的問題,因為現在硬體設備的大突破,雖然說是”慢”,但正常人是無法明顯的感覺出差異的(就算是工程師,為了讓自己的生活與工作愉快一點,很多人覺得就算多等那麼一下下也不是那麼嚴重的問題。)

但是以上的這些敘述,很抱歉,不適用於 Data Science 上,為什麼呢?因為現在數據量已經進入超乎想像的龐大。當你開始執行程式的那一刻,結果動輒好幾天才出來,最少可能也是好幾個小時,這個時候程式的效率便非常重要,因為你不會想要一整天都蝦耗在那邊,結果什麼都跑不出來,更悲慘的是結果最後不是自己想要的,於是只好悲慘再修改好code,按下執行後,又再重新再等…

於是,出現了兩個超級英雄拯救 Python,那就是 NumPy 跟 Pandas。

Numpy,雖然他是 Python 裡面的套件,但是他披著 Python 的皮,裡面的運作架構卻是使用 C 語言。而 Pandas 是利用 NumPy 的架構來表示或是紀錄更複雜的資料。哇,怎麼又扯出個”C語言”,你可能會開始懷該不會又要學新的東西了吧。NO! 這個就是 Python最爽的地方,其實你完全完全就可以不用管底下在幹嘛,你就可以利用這個套件,用Python 的語法,達成你要做的事情。不過為了讓大家更徹底的了解,我還是會跟大家講一下 Python 跟 C 語言的差別。下面的舉兩個例子來說明 Python 跟 C 語言運作上的差異(注意:這是舉例,不是完整的程式碼,所以不能拿來執行)

首先我先示範 C 語言中,你要跟電腦講說今天是多少年幾月幾號的時候的作法:

int year, month, day;
year = 2018;
moth = 4;
day = 21;

首先,你要跟要三個空間year, month, day,而且你要跟電腦說我要儲存的是整數喔(也就是 int 做的事情),接著你就可以利用後面的三行 code,把數字儲存進去那三個空間中。於是未來當你用到 year, month, day 時,就會等於使用你所儲存的數字。不過要注意的一點是:在 C 語言中,在你進行宣告後,他就固定了!他就固定了!他就固定了!所以如果你把 day=21; 改成 day=21.5; 的話,電腦執行時會出現錯誤,因為你一開始預定的是整數的空間,所以電腦會不知道你在幹嘛,最後就會出現 error。

接著看看 Python 的話,

year = 2018
month = 4
day = 21

嗯!?怎麼 int 不見了,是的你沒看錯,你不需要跟電腦說 year, month, day 的型態是什麼,你就可以直接用了,因為 Python 會直接幫你處理好。

再看下個例子,我們這次來算圓面積好了:

float r, pi, area;
r = 3;
pi = 3.14;
area = (r ^2)*pi;

嗯…怎麼 int 變成 float 了…因為在這邊pi是浮點數不是整數,所以你要你要改用 float 宣告是浮點數。而且還有一個更麻煩的事,如果你r是宣告成整數的話,電腦將會告訴你,它沒辦法做 (r ^2)*3.14 這樣子的運算,因為電腦只能整數和整數、浮點數和浮點數間運算…

再來看看 Python :

r = 3
pi = 3.14
area = (3^2)*pi

嗯!?這麼簡單?對,在 Python 中,你不需要做宣告型態,他會幫你做好做滿。

所以阿,兩個簡單的例子中,可以看出 Python 真的很方便,因為他會幫你管控變數的型態,但是你不用自己做,不代表不需要做!所以阿,讓 Python 幫你處理,你付出的代價就是變慢。

寫到這邊,我們要心懷感激寫出 NumPy 和 Pandas 套件的前輩們,因為有他們為了解決這樣的問題,所以在我們使用者可以繼續使用 Python 的語法,但是實際上,程式裡面的運作依然是使用 C 語言的架構,讓我們可以用得開心,但是程式速度卻不受影響。講了那麼多 Python 跟 C 語言的恩怨情仇,下次就會開始正式進入 NumPy 的教學囉!請大家不要忘記保持追蹤 TinyCorner 阿!!

( 免費 Python 電子書 ) Python Data Science Handbook ( Python 資料科學學習手冊)

Book Cover

免費英文版本~

中文版是這一本喔~~

(2019/8/2 補充:想不到作者還有更新,最近發現他的程式碼整合到 colab 的當中,點選每個章節中的 Open in colab,便可以直接使用 colab 的環境來跑程式,當然也可以自己修試著程式,並測試看看!! )

感謝 Jake VanderPlas 提供免費的線上學習資源,開發環境使用單純的 IPython 來開發。需要有開發 Python 的經驗,不提供 Python 的基礎教學。但幾乎涵括了整個進行Data Science 所需要用到的工具。算是從基礎一步一步帶著走,若是英文能力 OK 的話十分推薦利用這本免費的教材作為開始的教科書。

利用 NumPyPandasSciPyMatplotlib 以及 Scikit 的部分。利用這些套件,可以完成數據分析的基礎工作。看完這本書後,將會有能力可以進行數據的紀錄與操作,並且將之繪成圖表,而所獲得的資料可以利用機器學習來分析預測。在購買很多 Python 書籍後,這本是我看過對於 Data Science 最全面的解析的書,重點是它是免費!!!!!!!希望大家有機會可以進去連結看一看。

若是對於英文恐懼的話,台灣也有翻譯成中文的版本,由歐萊禮出版” Python 資料科學學習手冊”,大家有興趣的話也可以參考或是對照著閱讀。