首頁 > 後端開發 > Python教學 > Magic and Muscle:使用 Magic 和 DuckDB 進行 ETL,其中包含我的舉重訓練數據

Magic and Muscle:使用 Magic 和 DuckDB 進行 ETL,其中包含我的舉重訓練數據

王林
發布: 2024-07-17 12:39:01
原創
406 人瀏覽過

您可以在這裡存取完整的管道

法師

在我的上一篇文章中,我寫了一個使用 Python 和 Looker Studio 建立的儀表板,用於視覺化我的舉重訓練資料。在這篇文章中,我將使用相同的資料集逐步引導您完成 ETL(提取、轉換、載入)管道。

為了建立管道,我們將使用 Mage 來編排管道,並使用 Python 來轉換和載入數據,最後一步,我們將轉換後的資料匯出到 DuckDB 資料庫中。

要執行 Mage,我們需要使用官方 docker 映像:

docker pull mageai/mageai:latest
登入後複製

管道將如下圖所示:

Image description

提煉

提取很簡單,我們只需讀取 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 部分產生圓餅圖。

Image description

載入

現在是時候將資料載入到 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板