姓名:郭金? 學(xué)號:17101223407
轉(zhuǎn)載自:http://mp.weixin.qq.com/s/TQndJPlQFKAl3GXnTUN1mA
【嵌牛導(dǎo)讀】:這篇文章中,我會向你解釋如何使用 Pandas 以及 Python 來處理雜亂的數(shù)據(jù)。如果你從來沒用過 Pandas,并且你擁有一定的 Python 基礎(chǔ),那么這篇文章正適合你。
【嵌牛鼻子】:數(shù)據(jù)處理、python
【嵌牛提問】:為什么有兩個午夜時間?
【嵌牛正文】:
? ? ? 天氣數(shù)據(jù)是現(xiàn)實世界中一類很好的雜亂數(shù)據(jù)集案例。其中包含了不同的內(nèi)容,不規(guī)則的數(shù)據(jù),以及各種各樣的時區(qū)。前面說的這些點對于數(shù)據(jù)科學(xué)家來講都是很致命的痛點。我會通過下面的例子來向你介紹如何處理這種混合的、不規(guī)則的數(shù)據(jù)內(nèi)容。至于如何處理古怪的時區(qū)數(shù)據(jù),可以參考 Mario Corchero’s 發(fā)表的這篇文章 How to work with dates and time with Python。
? ? 讓我們先從如何將雜亂無章的數(shù)據(jù)變?yōu)榭捎玫臄?shù)據(jù)集開始。具體的代碼在 GitHub 上面。
讀取一個 CSV 文件
? ? ? 你可以通過下面的方式來讀取一個 Pandas 文件:
pandas.read_csv():向打開表格一樣打開 CSV 文件,并存放到 DataFrame 當(dāng)中。
DataFrame.head():展示 DataFrame 的前五條數(shù)據(jù)。
? ? DataFrame 就是 Pandas 中的一個表格;DataFrame 有一列存放了行號來作為索引。CSV 文件很適合用 DataFrame 來處理,因為 CSV 文件本身就是行和列格式的數(shù)據(jù)。


? ? ? 可以看到,我們的數(shù)據(jù)是通過\t 制表符來隔開地。
? ? ? pandas.read_csv() 方法針對不同的場景,提供了不同的參數(shù)?,F(xiàn)在你能觀察到,你的數(shù)據(jù)中包含一列 Data 類型數(shù)據(jù),以及一列 Time 類型數(shù)據(jù)。你可以嘗試通過添加一些關(guān)鍵字來為你的程序增加一些智能:
sep:指定列的分隔符
parse_dates:將列中數(shù)據(jù)按照 date 類型來進行解析
dayfirst:采用 DD.MM.YYYY 的格式,而不是默認的月份開頭的格式
infer_datatime_format:讓 Pandas 來分析數(shù)據(jù)的時間格式并解析
na_values:將某些值當(dāng)做空值處理
? ? ? 通過這些關(guān)鍵字參數(shù),可以讓 Pandas 代替你完成一些格式化的處理工作。


你會發(fā)現(xiàn)其中有個 NaN 值,但是不要跟 “not a number” 這個含義混淆。NaN 只是 Pandas 用于展示空數(shù)據(jù)的方式。
數(shù)據(jù)排序
讓我們看下 Pandas 是如何將數(shù)據(jù)排序的。
DataFrame.sort_values():將數(shù)據(jù)排序
DataFrame.drop_duplicates():去除重復(fù)項
DataFrame.set_index():指定某一列作為索引
因為時間數(shù)據(jù)看起來是是有序的,讓我們排個序:


合理的排序方式是首先去掉重復(fù)項,然后對數(shù)據(jù)進行排序,最后設(shè)置索引。

數(shù)據(jù)轉(zhuǎn)義
為了給天氣模型準(zhǔn)備一些可用的風(fēng)向數(shù)據(jù),你需要將風(fēng)向數(shù)據(jù)轉(zhuǎn)為數(shù)字格式。轉(zhuǎn)化的規(guī)則是:北風(fēng) (↓) 是 0 度,然后順時針 ? 增加度數(shù)。東風(fēng) (←) 是 90 度,以此類推。你可以使用 Pandas 來處理這個轉(zhuǎn)義過程:
Series.apply():通過一個函數(shù)來處理每項數(shù)據(jù)的轉(zhuǎn)義為了獲取每個風(fēng)向的準(zhǔn)確值,我定義了一個只包含 16 個關(guān)鍵字的字典結(jié)構(gòu)的數(shù)據(jù)集。這個字典應(yīng)該很小并很容易理解。



頻繁的設(shè)置索引
當(dāng)你深入分析數(shù)據(jù)的時候,你會發(fā)現(xiàn)數(shù)據(jù)集中存在下面的缺陷:


頻繁的設(shè)置索引
當(dāng)你深入分析數(shù)據(jù)的時候,你會發(fā)現(xiàn)數(shù)據(jù)集中存在下面的缺陷:


DataFrame.asfreq():強制索引上數(shù)據(jù)的步頻,過濾掉無效數(shù)據(jù),并用正確的數(shù)據(jù)填充。




為空行插入新數(shù)據(jù)
你可以按照線性函數(shù)的規(guī)律來填充空缺值,或者在開始點和結(jié)束點之間劃線,并按照這種規(guī)律來修正每個時間戳數(shù)據(jù)。
Series.interpolate():線性方式填充空缺數(shù)據(jù)值。下面展示如何通過 inplace 關(guān)鍵字來告知 Pandas 對數(shù)據(jù)進行替換和修復(fù)。




總結(jié)
通過上述文章,我已經(jīng)展示了在 Python 和 Pandas 中,憑借多種方式處理雜亂的數(shù)據(jù),例如:
讀取 CSV 文件并轉(zhuǎn)為合適的數(shù)據(jù)結(jié)構(gòu)
將你的數(shù)據(jù)集進行排序
通過函數(shù)對列值進行轉(zhuǎn)義
將數(shù)據(jù)變的規(guī)則
填充丟失的數(shù)據(jù)
繪圖方式展示數(shù)據(jù)集
Pandas 提供了更多更強力的函數(shù),這些你都可以在 Pandas 的 文檔 ,以及他的 10 分鐘介紹 中找到。你可能還能找到一些語法糖。如果使用過程中發(fā)現(xiàn)任何問題,或者有一些好的想發(fā)
數(shù)據(jù)處理愉快!