返回文章列表

Pandas字串與時間序列處理技巧

本文深入探討 Pandas 在字串和時間序列資料處理的應用,涵蓋字串分割、合併、虛擬變數提取、向量化存取、時間戳、時間間隔、週期與時間增量等核心概念,並輔以食譜資料集案例,示範如何運用 Pandas 進行資料分析和查詢,提供讀者實用的 Python 資料處理技巧。

資料科學 Python

Pandas 是 Python 資料科學領域不可或缺的工具,尤其在字串和時間序列資料處理方面更顯強大。本文將介紹 Pandas 的 str 屬性和時間序列處理方法,讓讀者能更有效率地整理和分析資料。首先,我們會探討如何使用 str 屬性進行字串分割、合併、虛擬變數提取以及向量化存取等操作,並以實際案例說明如何應用這些技巧。接著,文章將深入時間序列資料的處理,講解時間戳、時間間隔、週期以及時間增量的概念,並示範如何使用 Pandas 處理這幾種型別的時間資料。最後,我們會結合食譜資料集,示範如何使用 Pandas 進行資料查詢和分析,讓讀者能將所學知識應用於實際場景。

字串操作的強大工具

在資料分析中,字串操作是一項非常重要的工作。Pandas 的 str 屬性提供了多種方便的方法來操作字串。以下是幾個常用的方法:

1. 將長字串分割為多行

str.wrap() 方法可以將長字串分割為多行,每行的長度可以設定為一個固定的寬度。

import pandas as pd

# 建立一個 DataFrame
df = pd.DataFrame({'name': ['John Smith', 'Jane Doe', 'Bob Johnson']})

# 將字串分割為多行
df['name'] = df['name'].str.wrap(10)

print(df)

2. 合併字串

str.join() 方法可以將多個字串合併成一個字串,中間可以加入一個分隔符號。

import pandas as pd

# 建立一個 DataFrame
df = pd.DataFrame({'first_name': ['John', 'Jane', 'Bob'], 
                  'last_name': ['Smith', 'Doe', 'Johnson']})

# 合併字串
df['full_name'] = df['first_name'].str.cat(df['last_name'], sep=' ')

print(df)

3. 提取虛擬變數

str.get_dummies() 方法可以將一個字串欄位轉換成多個虛擬變數欄位。

import pandas as pd

# 建立一個 DataFrame
df = pd.DataFrame({'color': ['red', 'blue', 'green', 'red', 'blue']})

# 提取虛擬變數
df_dummies = df['color'].str.get_dummies()

print(df_dummies)

4. 向量化的專案存取和切片

Pandas 的 str 屬性也提供了向量化的專案存取和切片功能。例如,可以使用 str.slice() 方法來提取每個字串的前三個字元。

import pandas as pd

# 建立一個 DataFrame
df = pd.DataFrame({'name': ['John Smith', 'Jane Doe', 'Bob Johnson']})

# 提取每個字串的前三個字元
df['short_name'] = df['name'].str.slice(0, 3)

print(df)

5. 存取陣列元素

可以使用 str.get() 方法或 Python 的正常索引語法來存取陣列元素。例如,可以使用 str.get(0) 方法來提取每個陣列的第一個元素。

import pandas as pd

# 建立一個 DataFrame
df = pd.DataFrame({'name': ['John Smith', 'Jane Doe', 'Bob Johnson']})

# 提取每個陣列的第一個元素
df['first_name'] = df['name'].str.split().str.get(0)

print(df)

這些方法都可以幫助您更有效地操作字串,提取有用的資訊,完成資料分析任務。

處理指標變數

在資料分析中,指標變數(indicator variables)是一種用於表示不同類別或狀態的編碼變數。例如,一個資料集可能包含一個欄位,該欄位使用編碼值來表示個體的國籍、喜好或其他類別屬性。

使用 get_dummies 方法

Pandas 的 get_dummies 方法是一種實用的工具,用於將指標變數轉換為資料框架(DataFrame)中的一組二元欄位。這種方法可以幫助我們更好地理解和分析資料。

以下是一個示例:

import pandas as pd

# 建立一個示例資料集
monte = ['Graham Chapman', 'John Cleese', 'Terry Gilliam', 
         'Eric Idle', 'Terry Jones', 'Michael Palin']
info = ['B|C|D', 'B|D', 'A|C', 'B|D', 'B|C', 'B|C|D']

full_monte = pd.DataFrame({'name': monte, 'info': info})

# 使用 get_dummies 方法轉換指標變數
dummy_variables = pd.get_dummies(full_monte['info'], prefix='info')

# 合併原始資料集和轉換後的指標變數
full_monte = pd.concat([full_monte, dummy_variables], axis=1)

print(full_monte)

輸出結果:

           name info  info_A  info_B  info_C  info_D
0  Graham Chapman  B|C|D       0       1       1       1
1      John Cleese    B|D       0       1       0       1
2     Terry Gilliam    A|C       1       0       1       0
3       Eric Idle    B|D       0       1       0       1
4      Terry Jones    B|C       0       1       1       0
5   Michael Palin  B|C|D       0       1       1       1

在這個示例中,get_dummies 方法將 info 欄位中的指標變數轉換為四個二元欄位:info_Ainfo_Binfo_Cinfo_D。每個欄位代表一個特定的類別或狀態。

圖表翻譯

以下是使用 Plantuml 圖表語法來視覺化指標變數轉換過程:

圖表翻譯

這個圖表展示了指標變數轉換過程。首先,原始資料集被輸入到 get_dummies 方法中。然後,方法將指標變數轉換為二元欄位。最後,轉換後的指標變數被合併到原始資料集中,形成最終資料集。

內容解密

在這個示例中,get_dummies 方法被用來轉換指標變數。這個方法可以幫助我們更好地理解和分析資料。透過將指標變數轉換為二元欄位,我們可以更容易地進行資料分析和視覺化。

處理字串資料的強大工具

在資料清理的過程中,處理字串資料是一個非常重要的步驟。Pandas提供了多種方法來處理字串資料,包括str.get_dummies()str.split()str.strip()等。這些方法可以幫助您將複雜的字串資料轉換成更容易分析的格式。

字串處理的範例

以下是使用str.get_dummies()方法將字串資料轉換成dummy變數的範例:

import pandas as pd

# 建立一個範例資料框
data = {'info': ['A|B|C', 'B|D', 'A|C|D', 'B|C', 'A|B|D']}
df = pd.DataFrame(data)

# 使用str.get_dummies()方法將字串資料轉換成dummy變數
dummy_df = df['info'].str.get_dummies('|')

print(dummy_df)

輸出結果:

   A  B  C  D
0  1  1  1  0
1  0  1  0  1
2  1  0  1  1
3  0  1  1  0
4  1  1  0  1

食譜資料函式庫範例

以下是使用Pandas處理食譜資料函式庫的範例。食譜資料函式庫包含了多種食譜的資訊,包括食材、烹飪方法等。

import pandas as pd

# 下載食譜資料函式庫
!cd data && curl -O {repo}/recipeitems.json.gz
!gunzip data/recipeitems.json.gz

# 讀取食譜資料函式庫
recipes = pd.read_json('data/recipeitems.json', lines=True)

# 顯示食譜資料函式庫的形狀
print(recipes.shape)

# 顯示食譜資料函式庫的一行資料
print(recipes.iloc[0])

這個範例展示瞭如何下載食譜資料函式庫、讀取資料函式庫、顯示資料函式庫的形狀和一行資料。

內容解密:

在這個範例中,我們使用了str.get_dummies()方法將字串資料轉換成dummy變數。這個方法可以幫助我們將複雜的字串資料轉換成更容易分析的格式。同時,我們也使用了Pandas的read_json()方法來讀取食譜資料函式庫。這個方法可以幫助我們快速地讀取JSON格式的資料函式庫。

圖表翻譯:

以下是使用Plantuml語法繪製的食譜資料函式庫的流程圖: 這個流程圖展示了食譜資料函式庫的處理流程,從下載資料函式庫到顯示資料函式庫的一行資料。

美味早餐:松餅和香腸肉汁

早晨的陽光灑在窗戶上,空氣中飄著新鮮烘烤的松餅和香腸的香氣,讓人忍不住地感到飢餓。今天,我們要介紹一道經典的美國早餐菜餚:松餅和香腸肉汁。這道菜不僅美味,而且製作簡單,是一個很好的選擇來開始你的新的一天。

松餅的製作

要做出美味的松餅,首先需要準備以下材料:

  • 3 杯中筋麵粉
  • 2 茶匙泡打粉
  • 1 茶匙鹽
  • 1/2 杯冷的無鹽奶油
  • 3/4 杯酪乳

步驟:

  1. 預熱烤箱:將烤箱預熱到425°F(220°C)。
  2. 混合乾燥材料:在一個大碗中,混合麵粉、泡打粉和鹽。
  3. 加入冷奶油:使用糕點攪拌器或手指將冷奶油切入麵粉混合物中,直到混合物類別似粗糙的麵包屑。
  4. 加入酪乳:將酪乳倒入麵粉混合物中,攪拌直到麵團形成。
  5. 揉麵團:將麵團轉移到撒有麵粉的表面上,輕輕揉幾次,直到麵團變得光滑。
  6. 壓平麵團:將麵團壓成約1英寸(2.5釐米)厚。
  7. 切出松餅:使用圓形切割器或玻璃杯口切出松餅。您應該可以得到大約12個松餅。
  8. 放在烤盤上:將松餅放在已經塗上油的烤盤上。
  9. 刷上奶油:用少量奶油刷在松餅頂部。
  10. 烘烤:將松餅放入預熱的烤箱中,烘烤12-15分鐘,或者直到它們變成金黃色。

香腸肉汁的製作

要做出美味的香腸肉汁,需要以下材料:

  • 1磅香腸(您可以選擇任何您喜歡的香腸型別)
  • 2大匙植物油
  • 2大匙通用麵粉
  • 1杯雞湯
  • 1/2杯牛奶
  • 鹽和胡椒調味

步驟:

  1. 煎香腸:在一個大煎鍋中,中高火加熱植物油。加入香腸,煎至它們變成棕色,大約5-7分鐘。將煮好的香腸從煎鍋中取出,放在一邊。
  2. 留下油脂:在煎鍋中留下約2大匙的油脂。如果沒有足夠的油脂,可以新增更多的植物油。
  3. 加入麵粉:將通用麵粉加入煎鍋中,搖勻形成糊狀。繼續煮1-2分鐘,直到糊狀物變成淺棕色。
  4. 加入雞湯和牛奶:慢慢地將雞湯和牛奶加入煎鍋中,不斷搖勻以避免形成結塊。繼續煮至肉汁變稠,大約5-7分鐘。
  5. 調味:根據口味新增鹽和胡椒調味。

組合松餅和香腸肉汁

  1. 將松餅與香腸肉汁一起上桌:當松餅剛剛出爐時,將它們放在盤子上。將香腸肉汁淋在松餅上,並配以煮熟的香腸一起上桌。

這道美味的松餅和香腸肉汁一定會讓你的早晨變得更加美好。試試看,你會發現它是一個很棒的選擇!

食譜資料分析

在進行食譜資料分析時,我們首先需要處理原始資料的格式。由於資料是從網頁中爬取而來,格式可能會有些混亂。特別是食材列表,是以字串格式儲存的,我們需要小心地提取出我們感興趣的資訊。

首先,我們可以使用 Pandas 函式庫來分析食譜資料。下面是使用 Pandas 對食材列表進行描述性統計的示例:

import pandas as pd

# 載入食譜資料
recipes = pd.read_csv('recipes.csv')

# 對食材列表進行描述性統計
print(recipes['ingredients'].str.len().describe())

這段程式碼會輸出食材列表的長度描述性統計,包括 count、mean、std、min、25%、50% 等指標。這些指標可以幫助我們瞭解食材列表的基本特徵。

食材列表長度描述性統計

指標
count173278.000000
mean244.617926
std146.705285
min0.000000
25%147.000000
50%221.000000

從這些指標中,我們可以看到食材列表的平均長度約為 244 個字元,標準差約為 146 個字元。最短的食材列表長度為 0 個字元,25% 的食材列表長度小於或等於 147 個字元,50% 的食材列表長度小於或等於 221 個字元。

圖表翻譯

下面是使用 Plantuml 圖表語言對食材列表長度描述性統計進行視覺化的示例: 這個圖表可以幫助我們更好地理解食材列表的基本特徵。

內容解密

在這個例子中,我們使用 Pandas 函式庫對食材列表進行描述性統計。這個過程涉及到對字串格式的食材列表進行長度計算和統計。透過這個過程,我們可以瞭解食材列表的基本特徵,例如平均長度、標準差、最短長度等。這些資訊可以幫助我們進一步分析和處理食譜資料。

探索食譜資料與簡單食譜推薦系統

在前面的章節中,我們已經對食譜資料函式庫進行了初步的探索,瞭解了每個食譜的基本資訊。現在,我們將更深入地探索食譜中的成分(ingredients),並嘗試建立一個簡單的食譜推薦系統。

成分列表的長度分析

首先,我們來看看成分列表的長度情況。成分列表的平均長度約為250個字元,從0到近10,000個字元不等。這個結果表明,食譜的複雜程度差異很大,有些食譜可能需要很多種不同的成分,而有些則相對簡單。

import pandas as pd

# 載入食譜資料
recipes = pd.read_csv('recipes.csv')

# 計算成分列表的長度
ingredients_length = recipes['ingredients'].str.len()

# 計算平均長度、最小值和最大值
avg_length = ingredients_length.mean()
min_length = ingredients_length.min()
max_length = ingredients_length.max()

print(f'成分列表的平均長度:{avg_length}')
print(f'成分列表的最小長度:{min_length}')
print(f'成分列表的最大長度:{max_length}')

找到最長的成分列表

接下來,我們想知道哪個食譜有最長的成分列表。利用np.argmax函式,我們可以輕易地找到答案。

import numpy as np

# 找到最長的成分列表
longest_recipe_index = np.argmax(recipes['ingredients'].str.len())
longest_recipe_name = recipes.loc[longest_recipe_index, 'name']

print(f'最長的成分列表的食譜名稱:{longest_recipe_name}')

Aggregate Explorations

我們還可以進行其他聚合探索。例如,計算有多少食譜是早餐食譜,或者計算有多少食譜包含某個特定的成分,如肉桂(cinnamon)。

# 計算早餐食譜的數量
breakfast_count = recipes[recipes['name'].str.contains('breakfast', case=False)].shape[0]

# 計算包含肉桂的食譜數量
cinnamon_count = recipes[recipes['ingredients'].str.contains('cinnamon', case=False)].shape[0]

print(f'早餐食譜的數量:{breakfast_count}')
print(f'包含肉桂的食譜數量:{cinnamon_count}')

簡單食譜推薦系統

最後,我們來建立一個簡單的食譜推薦系統。給定一份成分列表,我們想找到所有包含這些成分的食譜。雖然概念上很直接,但實際操作中會遇到一些挑戰,例如從每個食譜中提取乾淨的成分列表。

為了簡化問題,我們先從一個常見的成分列表開始,然後搜尋哪些食譜包含這些成分。讓我們先從香草和香料開始。

# 定義一個常見的香草和香料列表
spice_list = ['salt', 'pepper', 'oregano', 'sage', 'parsley', 'rosemary', 'tarragon', 'thyme', 'paprika', 'cumin']

# 建立一個布林DataFrame,指示每個食譜是否包含每個香草或香料
spice_df = pd.DataFrame({spice: recipes['ingredients'].str.contains(spice, case=False) for spice in spice_list})

print(spice_df.head())

這個簡單的食譜推薦系統可以根據給定的成分列表找到相匹配的食譜。然而,這只是開始,還有很多方法可以改進和擴充套件這個系統,以使其更智慧、更實用。

使用Pandas查詢食譜資料

啟動查詢

在進行食譜查詢之前,我們需要了解如何使用Pandas的query方法來篩選資料。這個方法允許我們使用布林邏輯運算元(如&|~)來查詢資料。

範例查詢

假設我們想要找到包含歐芹(parsley)、紅椒粉(paprika)和龍蒿(tarragon)的食譜。以下是如何使用query方法進行查詢:

import pandas as pd

# 建立一個示範的食譜DataFrame
spice_df = pd.DataFrame({
    'parsley': [True, False, True, False],
    'paprika': [True, False, True, False],
    'tarragon': [True, False, False, True]
})

# 查詢包含歐芹、紅椒粉和龍蒿的食譜
selection = spice_df.query('parsley & paprika & tarragon')

# 顯示查詢結果
print(len(selection))

在這個範例中,我們建立了一個簡單的DataFrame,包含四個食譜,每個食譜都有一個布林值表示是否包含特定的香料。接著,我們使用query方法查詢包含所有三種香料的食譜。

結果分析

查詢結果顯示只有10個食譜符合條件。這個結果可以透過len(selection)獲得。

食譜名稱查詢

如果我們想要知道這10個食譜的名稱,可以使用以下程式碼:

# 建立一個食譜名稱的Series
recipes = pd.Series({
    0: 'All cremat with a Little Gem, dandelion and wa...',
    1: 'Lobster with Thermidor butter',
    2: 'Burton\'s Southern Fried Chicken with White Gravy',
    3: 'Mijo\'s Slow Cooker Shredded Beef'
})

# 查詢選擇的食譜名稱
selected_recipes = recipes[selection.index]

# 顯示選擇的食譜名稱
print(selected_recipes)

這個程式碼會顯示選擇的食譜名稱。

內容解密:

在這個範例中,我們使用Pandas的query方法來查詢資料。這個方法允許我們使用布林邏輯運算元來篩選資料。透過這個方法,我們可以快速地找到符合特定條件的資料。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Pandas字串與時間序列處理技巧

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

這個流程圖顯示了查詢資料的流程。首先,我們設定查詢條件,然後篩選資料,接著顯示結果,最後查詢食譜名稱並顯示結果。

時間序列處理入門

時間序列是一種特殊的資料結構,描述了隨時間變化的資料。由於時間序列資料在各個領域中都非常常見,例如金融、氣象、交通等,學習如何有效地處理和分析時間序列資料是非常重要的。

時間序列的型別

時間序列可以分為三種型別:時間戳(Timestamps)、時間間隔和週期(Time intervals and periods)以及時間增量或持續時間(Time deltas or durations)。

  • 時間戳(Timestamps):指的是時間中的特定瞬間,例如2021年7月4日早上7:00。
  • 時間間隔和週期(Time intervals and periods):指的是從某個開始時間到某個結束時間的時間段,例如2021年6月。期間通常是指時間間隔的一種特殊情況,每個間隔的長度相同且不重疊,例如每天24小時。
  • 時間增量或持續時間(Time deltas or durations):指的是一段時間的長度,例如22.56秒。

使用Pandas處理時間序列

Pandas是一個強大的Python函式庫,提供了高效的資料結構和資料分析工具。由於Pandas最初是為了金融建模而開發的,因此它包含了一套豐富的工具,用於處理日期、時間和時間索引資料。

本章將介紹如何使用Pandas來處理不同型別的日期/時間資料,包括時間戳、時間間隔和週期以及時間增量或持續時間。透過這些工具,您可以輕鬆地進行時間序列分析,例如計算移動平均值、季節性分解和趨勢分析等。

時間序列分析的重要性

時間序列分析在各個領域中都非常重要,因為它可以幫助我們瞭解隨時間變化的資料的模式和趨勢。透過對時間序列資料進行分析,可以預測未來的趨勢、發現異常值以及最佳化業務流程等。

從技術架構視角來看,Pandas 的 str 屬性和相關方法為字串操作提供了強大的工具,從分割長字串、合併字串到提取虛擬變數,極大簡化了資料清理和轉換的流程。然而,在處理大規模資料集時,向量化操作的效能瓶頸仍需關注,尤其是在複雜的正規表示式應用場景下。考量實際應用,開發者應根據資料規模和操作複雜度選擇合適的字串處理方法,並善用 Pandas 的向量化操作以提升效率。未來,預期 Pandas 將持續最佳化字串處理效能,並整合更多進階的自然語言處理功能,以滿足日益增長的資料分析需求。玄貓認為,熟練掌握 Pandas 的字串操作技巧,對於提升資料分析效率至關重要。