您可以在這裡存取完整的管道
在我的上一篇文章中,我寫了一個使用 Python 和 Looker Studio 建立的儀表板,用於視覺化我的舉重訓練資料。在這篇文章中,我將使用相同的資料集逐步引導您完成 ETL(提取、轉換、載入)管道。
為了建立管道,我們將使用 Mage 來編排管道,並使用 Python 來轉換和載入數據,最後一步,我們將轉換後的資料匯出到 DuckDB 資料庫中。
要執行 Mage,我們需要使用官方 docker 映像:
docker pull mageai/mageai:latest
管道將如下圖所示:
提取很簡單,我們只需讀取 csv 檔案並用它來建立一個 pandas 資料框,這樣我們就可以進行下一步。使用資料載入器區塊,我們已經有了一個可以使用的模板,只需記住在 read_csv( ) 函數中設定「sep」參數,即可正確載入資料。
from mage_ai.io.file import FileIO import pandas as pd if 'data_loader' not in globals(): from mage_ai.data_preparation.decorators import data_loader if 'test' not in globals(): from mage_ai.data_preparation.decorators import test @data_loader def load_data_from_file(*args, **kwargs): filepath = 'default_repo/data_strong.csv' df = pd.read_csv(filepath, sep=';') return df @test def test_output(output, *args) -> None: assert output is not None, 'The output is undefined'`
在這一步驟中,使用 Transformer 區塊,有很多模板可供選擇,我們將選擇一個自訂模板。
我們要做的轉換基本上是運動名稱列的映射,這樣我們就可以識別哪個身體部位對應於特定的運動。
import pandas as pd if 'transformer' not in globals(): from mage_ai.data_preparation.decorators import transformer if 'test' not in globals(): from mage_ai.data_preparation.decorators import test body_part = {'Squat (Barbell)': 'Pernas', 'Bench Press (Barbell)': 'Peitoral', 'Deadlift (Barbell)': 'Costas', 'Triceps Pushdown (Cable - Straight Bar)': 'Bracos', 'Bent Over Row (Barbell)': 'Costas', 'Leg Press': 'Pernas', 'Overhead Press (Barbell)': 'Ombros', 'Romanian Deadlift (Barbell)': 'Costas', 'Lat Pulldown (Machine)': 'Costas', 'Bench Press (Dumbbell)': 'Peitoral', 'Skullcrusher (Dumbbell)': 'Bracos', 'Lying Leg Curl (Machine)': 'Pernas', 'Hammer Curl (Dumbbell)': 'Bracos', 'Overhead Press (Dumbbell)': 'Ombros', 'Lateral Raise (Dumbbell)': 'Ombros', 'Chest Press (Machine)': 'Peitoral', 'Incline Bench Press (Barbell)': 'Peitoral', 'Hip Thrust (Barbell)': 'Pernas', 'Agachamento Pausado ': 'Pernas', 'Larsen Press': 'Peitoral', 'Triceps Dip': 'Bracos', 'Farmers March ': 'Abdomen', 'Lat Pulldown (Cable)': 'Costas', 'Face Pull (Cable)': 'Ombros', 'Stiff Leg Deadlift (Barbell)': 'Pernas', 'Bulgarian Split Squat': 'Pernas', 'Front Squat (Barbell)': 'Pernas', 'Incline Bench Press (Dumbbell)': 'Peitoral', 'Reverse Fly (Dumbbell)': 'Ombros', 'Push Press': 'Ombros', 'Good Morning (Barbell)': 'Costas', 'Leg Extension (Machine)': 'Pernas', 'Standing Calf Raise (Smith Machine)': 'Pernas', 'Skullcrusher (Barbell)': 'Bracos', 'Strict Military Press (Barbell)': 'Ombros', 'Seated Leg Curl (Machine)': 'Pernas', 'Bench Press - Close Grip (Barbell)': 'Peitoral', 'Hip Adductor (Machine)': 'Pernas', 'Deficit Deadlift (Barbell)': 'Pernas', 'Sumo Deadlift (Barbell)': 'Costas', 'Box Squat (Barbell)': 'Pernas', 'Seated Row (Cable)': 'Costas', 'Bicep Curl (Dumbbell)': 'Bracos', 'Spotto Press': 'Peitoral', 'Incline Chest Fly (Dumbbell)': 'Peitoral', 'Incline Row (Dumbbell)': 'Costas'} @transformer def transform(data, *args, **kwargs): strong_data = data[['Date', 'Workout Name', 'Exercise Name', 'Weight', 'Reps', 'Workout Duration']] strong_data['Body part'] = strong_data['Exercise Name'].map(body_part) return strong_data @test def test_output(output, *args) -> None: assert output is not None, 'The output is undefined'
Mage 的一個有趣的功能是,我們可以使用「新增」圖表來視覺化我們在 Tranformer 區塊內所做的更改,選擇可以使用列 Body 部分產生圓餅圖。
現在是時候將資料載入到 DuckDB 了。在 docker 映像中,我們已經有了 DuckDB,因此我們只需在管道中包含另一個區塊即可。讓我們包含資料匯出器區塊和 SQL 模板,以便我們可以建立表格並插入資料。
CREATE OR REPLACE TABLE powerlifting ( _date DATE, workout_name STRING, exercise_name STRING, weight STRING, reps STRING, workout_duration STRING, body_part STRING ); INSERT INTO powerlifting SELECT * FROM {{ df_1 }};
Mage 是一個強大的工具,用於編排管道,提供一整套用於開發涉及 ETL 的特定任務的範本。在這篇文章中,我們對如何開始使用 Mage 建立資料管道進行了簡短的解釋。在以後的文章中,我們將進一步探討這個令人驚奇的框架。
以上是Magic and Muscle:使用 Magic 和 DuckDB 進行 ETL,其中包含我的舉重訓練數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!