詳解:規整數據(Tidy Data)的理論與Python實踐

多數數據科學 機器學習項目都遵循帕累託原理,即我們用將近80%的時間進行數據準備,其餘20%的時間用於選擇和訓練合適的機器學習模型。來源: 數據科學DataScience

詳解:規整數據(Tidy Data)的理論與Python實踐


通常,我們用於創建機器學習模型的數據集是混亂的,無法直接在模型中使用。我們需要確保輸入到模型中的數據都是規整的數據,這就需要執行一些數據清理步驟以獲得可以擬合到模型中的數據集。實際上,機器學習/數據科學項目的第一步正是數據的清洗與整理,而且在面對新的項目和問題時,我們往往需要多次重複數據清理過程。可以說數據清理是數據科學家在對數據執行任何EDA(探索性數據分析)或統計分析之前執行的最重要且耗時的過程之一。

1、什麼是Tidy Data?

Tidy data(規整數據)是為了可以方便地查看數據和將數據應用在模型中而進行數據清理過程的產物。數據規整的原則定義了一些在執行數據清理操作時需要遵循的準則,從而有助於我們進行數據分析。 它提供了一種標準的方法來組織數據集中的數據值,並使我們定義數據集的方式形式化。 而且,規整數據使數據處理過程更容易。與數據庫規範化形式(1NF,2NF,3NF和BCNF)一樣,規整數據原則具有一些預定義的規則。

2、整潔數據原則

規整數據的原則包括:

每列代表數據集中的一個單獨變量

每行代表數據集中的單個觀察值

每種觀察單位組成一個表格 (這些原則等效於數據庫第三範式,3NF)。

接下來讓我們看一些現實的數據集示例,以更詳細地瞭解規整數據的原則。

3、每列代表一個單獨變量

假設我們有一個存儲每位員工的每日冰淇淋銷售數據數據集, 單擊此處下載冰淇淋銷售示例csv文件,內容如下圖所示。

詳解:規整數據(Tidy Data)的理論與Python實踐

這樣的數據在報告中展示是十分友好的,但在分析過程中並不好用。數據中每天(週一至週日)的數據作為單獨的變量用一列表示出來,但是按照規整數據原則的第一條(每列代表數據集中的一個單獨變量), 我們需要將日期名稱轉置為一列,因為所有日期列其實代表的是同一個變量–日期。

我們可以使用pandas.melt將日期名稱列轉換為單列值的方法,這將幫助我們將凌亂的數據集轉換為規整數據集。具體代碼如下所示:

# 導入pandas庫
import pandas as pd

# 使用pandas.read_csv方法 讀取每位員工每日冰淇淋銷售數據的csv文件
df = pd.read_csv("./Day wise Ice-cream sale detail (in dollars).csv")

'''
使用pandas.melt方法將日期名稱轉置為一列,完成數據由寬格式向長格式的轉換,通過結果您將更好理解這裡的轉換
其中frame參數傳入原始數據框df
id_vars參數傳入用作標識符變量的列'EmployeeName'
value_vars參數傳入需要取消透視的所有列,未指定情況下使用未設置為id_vars的所有列
var_name參數傳入被用作“變量”列的名稱
values_name參數傳入被用作“值”列的名稱


'''
dfMelted = pd.melt(frame = df,
id_vars = 'EmployeeName',
value_vars = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
var_name = 'WeekDay',
value_name = 'AmountInDollars')

# 打印出轉換後的規整數據集前十行
print(dfMelted[:10])

詳解:規整數據(Tidy Data)的理論與Python實踐

4、每行代表單個觀察值

假設我們有幾個城市的天氣數據,每個日期下都有最低和最高溫度的詳細信息, 單擊此處下載城市氣溫示例csv文件,內容如下圖所示。

詳解:規整數據(Tidy Data)的理論與Python實踐

這個數據集主要有兩個問題:

(1)單一變量“日期”的值分佈在不同列上,在分析過程中要在不同列中移動;

(2)置於行中的最低和最高溫度值需要作為單獨的列進行轉置,因為它們其實代表兩個不同的變量-–最低和最高溫度。

要解決這些問題,我們可以先使用pandas.melt方法將日期值移動到行中, 然後使用數據透視表pivot或者pivot_table方法將最低和最高溫度值作為數據集中的獨立列。具體代碼如下所示:

# 使用pandas.read_csv方法 讀取每位員工每日冰淇淋銷售數據的csv文件
df = pd.read_csv('./Date wise weather data.csv')

# pandas.melt方法將日期值轉換為一列,各參數含義如第一部分所示
dfMelted = pd.melt(frame = df,
id_vars = ['CityName', 'VarType'],
value_vars = ['01-08-2018', '02-08-2018', '03-08-2018', '04-08-2018', '05-08-2018', '06-08-2018', '07-08-2018'],
var_name = 'Date',
value_name = 'Temperature')

# 打印出前十行以供參考
print("dfMelted:\\n",dfMelted[:10])

'''pivot_table方法將最低和最高溫度行轉化為獨立的列。
我們也可以使用python方法鏈接技術在一行代碼中執行融合melt和旋轉pivot,如pd.melt(...).pivot_table(...)。
這裡我們使用新的數據框來保存數據透視輸出,以便於理解。
index參數傳入不需要轉置CityName和Date列作為索引
columns參數傳入需要轉換的VarType列
values參數傳入溫度值Temperate列
'''
dfPivoted = dfMelted.pivot_table(index = ['CityName', 'Date'],
columns = 'VarType',
values = 'Temperature')

'''
由於我們傳入CityName和Date列作為多級索引列,因此這兩個列都將用作數據框索引列。
可以使用pandas.reset_index方法(無任何索引值)將索引重置為常規列。


Inplace參數值設置為True,以就地轉換數據框,而不是創建新的數據框。
'''
dfPivoted.reset_index(inplace = True)

# 將列名稱VarType重置為空
dfPivoted.columns.name = ''
# 打印分隔符與轉換後的規整數據前十行
print("\\ndfPivoted:\\n",dfPivoted[:10])

詳解:規整數據(Tidy Data)的理論與Python實踐

5、每種觀察組成一個表格

按照規整數據的原則,每種類型的觀察單位組成一個表格,因此當一種類型的觀測分佈在多個文件或表格中時需要將其合併為一個表。

假設我們有兩個含有日期列的csv文件,內容如下圖所示,單擊此處下載示例文件。


詳解:規整數據(Tidy Data)的理論與Python實踐


我們可以使用pandas庫中concat、merge、join等方法完成兩個或多個數據表向規整數據的轉換。具體代碼如下所示:

# 導入兩個含有相同觀測的csv文件


dfIceCreamSale = pd.read_csv('./Date-wise ice-cream sale detail.csv')
dfTempDetail = pd.read_csv('./Date-wise temperature detail.csv')

# pandas.merge中left、right參數分別傳入含有同名列的數據框,on參數傳入進行合併的列名
dfMain = pd.merge(left = dfIceCreamSale, right = dfTempDetail, on = 'Date')

# 打印合並後的規整數據集
print("Merge method:\\n", dfMain)

# concat與join方法
print("\\nConcat method:\\n", pd.concat([dfIceCreamSale.set_index('Date'), dfTempDetail.set_index('Date')], axis=1).reset_index())
print("\\nJoin method:\\n",dfIceCreamSale.set_index('Date').join(dfTempDetail.set_index('Date')).reset_index(


詳解:規整數據(Tidy Data)的理論與Python實踐

原文作者:Gopal Krishna Ranjan

原文標題:Tidy Data in Python – First Step in Data Science and Machine Learning

原文來源:https://www.sqlrelease.com/tidy-data-in-python-first-step-in-data-science-and-machine-learning

本文由師兵範、朝樂門負責翻譯、整理,並適當擴展。


分享到:


相關文章: