程序員如何優(yōu)雅的處理雜亂的傳感器數(shù)據(jù)?

姓名:郭金? 學(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ù)。

圖片發(fā)自簡書App
圖片發(fā)自簡書App

? ? ? 可以看到,我們的數(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ā)自簡書App
圖片發(fā)自簡書App
Pandas 很好的處理 Date 和 Time 這兩列數(shù)據(jù),并且轉(zhuǎn)為了一個標(biāo)準(zhǔn)化的格式。

你會發(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ā)自簡書App
圖片發(fā)自簡書App
為什么有兩個午夜時間?因為我們的數(shù)據(jù)集(原始數(shù)據(jù))當(dāng)中,一個午夜時間既在前一天的結(jié)束時記錄,又被后一天在開始記錄。你可以刪除一條重復(fù)記錄。

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

圖片發(fā)自簡書App
現(xiàn)在你已經(jīng)有了一個時間作為索引的 DataFrame 數(shù)據(jù)集,而接下來我們將針對這個數(shù)據(jù)集繼續(xù)處理。首先,讓我們對風(fēng)向數(shù)據(jù)做一些轉(zhuǎn)義。

數(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)該很小并很容易理解。

圖片發(fā)自簡書App
在 Pandas 中,你可以通過 Series,一種按照索引訪問 DataFrame 的方式來處理數(shù)據(jù),就像 Python 中字典類一樣。在轉(zhuǎn)義之后,Series 中的值被替換為新的值。
圖片發(fā)自簡書App
圖片發(fā)自簡書App
每一個合法的風(fēng)向值現(xiàn)在都被轉(zhuǎn)換為一個數(shù)字。具體數(shù)字是一個字符串還是其他別的類型的數(shù)字格式并不重要,你都可以通過 Series.apply() 來進行轉(zhuǎn)義。

頻繁的設(shè)置索引

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

圖片發(fā)自簡書App
圖片發(fā)自簡書App
每一個合法的風(fēng)向值現(xiàn)在都被轉(zhuǎn)換為一個數(shù)字。具體數(shù)字是一個字符串還是其他別的類型的數(shù)字格式并不重要,你都可以通過 Series.apply() 來進行轉(zhuǎn)義。

頻繁的設(shè)置索引

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

圖片發(fā)自簡書App
圖片發(fā)自簡書App
00:33:00? 01:11:00? 這些都是奇怪的時間戳。下面有個函數(shù)來保證一致性:

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

圖片發(fā)自簡書App
圖片發(fā)自簡書App
Pandas 刪除那些不滿足間隔的數(shù)據(jù)并填充一個正確的值。當(dāng)無法填充的時候,則插入一個空行?,F(xiàn)在你有一個間隔保持一致的索引了。讓我們用一種流行的繪圖庫 matplotlib 來看一下數(shù)據(jù)的曲線:
圖片發(fā)自簡書App
圖片發(fā)自簡書App
仔細看能夠發(fā)現(xiàn),在 6 月 6 號、7 號等時間點上存在空隙。你需要填充一些有含義的數(shù)據(jù)來彌補這個空隙。

為空行插入新數(shù)據(jù)

你可以按照線性函數(shù)的規(guī)律來填充空缺值,或者在開始點和結(jié)束點之間劃線,并按照這種規(guī)律來修正每個時間戳數(shù)據(jù)。

Series.interpolate():線性方式填充空缺數(shù)據(jù)值。下面展示如何通過 inplace 關(guān)鍵字來告知 Pandas 對數(shù)據(jù)進行替換和修復(fù)。

圖片發(fā)自簡書App
圖片發(fā)自簡書App
可以發(fā)現(xiàn),NaN 數(shù)值已經(jīng)被替換了。接下來讓我們重新繪制圖并看一下效果:
圖片發(fā)自簡書App
圖片發(fā)自簡書App
恭喜你!你的數(shù)據(jù)集現(xiàn)在可以被用于天氣處理了。你可以下載 GitHub 上的例子 并操作一遍。

總結(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ù)處理愉快!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容