日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
數(shù)據(jù)工程中的單元測試完全指南

在數(shù)據(jù)工程領(lǐng)域中,經(jīng)常被忽視的一項(xiàng)實(shí)踐是單元測試。許多人可能認(rèn)為單元測試僅僅是一種軟件開發(fā)方法論,但事實(shí)遠(yuǎn)非如此。隨著我們努力構(gòu)建穩(wěn)健、無錯誤的數(shù)據(jù)流水線和SQL數(shù)據(jù)模型,單元測試在數(shù)據(jù)工程中的價值變得越來越清晰。

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、襄城ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的襄城網(wǎng)站制作公司

本文帶你深入探索如何將這些成熟的軟件工程實(shí)踐應(yīng)用到數(shù)據(jù)工程中。

1 單元測試的重要性

在數(shù)據(jù)工程的背景下,采用單元測試可以確保您的數(shù)據(jù)和業(yè)務(wù)邏輯的準(zhǔn)確性,進(jìn)而產(chǎn)出高質(zhì)量的數(shù)據(jù),獲得您的數(shù)據(jù)分析師、科學(xué)家和決策者對數(shù)據(jù)的信任。

2 單元測試數(shù)據(jù)流水線

數(shù)據(jù)流水線通常涉及復(fù)雜的數(shù)據(jù)抽取、轉(zhuǎn)換和加載(ETL)操作序列,出錯的可能性很大。為了對這些操作進(jìn)行單元測試,我們將流水線拆分為單個組件,并對每個組件進(jìn)行獨(dú)立驗(yàn)證。

以一個簡單的流水線為例,該流水線從CSV文件中提取數(shù)據(jù),通過清除空值來轉(zhuǎn)換數(shù)據(jù),然后將其加載到數(shù)據(jù)庫中。以下是使用pandas的基于Python的示例:

import pandas as pd
from sqlalchemy import create_engine

# 加載CSV文件的函數(shù)
def load_data(file_name):
    data = pd.read_csv(file_name)
    return data

# 清理數(shù)據(jù)的函數(shù)
def clean_data(data):
    data = data.dropna()
    return data

# 將數(shù)據(jù)保存到SQL數(shù)據(jù)庫的函數(shù)
def save_data(data, db_string, table_name):
    engine = create_engine(db_string)
    data.to_sql(table_name, engine, if_exists='replace')

# 運(yùn)行數(shù)據(jù)流水線
data = load_data('data.csv')
data = clean_data(data)
save_data(data, 'sqlite:///database.db', 'my_table')

為了對這個流水線進(jìn)行單元測試,我們使用像pytest這樣的庫為每個函數(shù)編寫單獨(dú)的測試。

在這個示例中,有三個主要的函數(shù):load_data、clean_data和save_data。我們會為每個函數(shù)編寫測試。對于load_data和save_data,需要設(shè)置一個臨時的CSV文件和SQLite數(shù)據(jù)庫,可以使用pytest庫的fixture功能來實(shí)現(xiàn)。

import os
import pandas as pd
import pytest
from sqlalchemy import create_engine, inspect

# 使用pytest fixture來設(shè)置臨時的CSV文件和SQLite數(shù)據(jù)庫
@pytest.fixture
def csv_file(tmp_path):
    data = pd.DataFrame({
        'name': ['John', 'Jane', 'Doe'],
        'age': [34, None, 56]  # Jane的年齡缺失
    })
    file_path = tmp_path / "data.csv"
    data.to_csv(file_path, index=False)
    return file_path


@pytest.fixture
def sqlite_db(tmp_path):
    file_path = tmp_path / "database.db"
    return 'sqlite:///' + str(file_path)


def test_load_data(csv_file):
    data = load_data(csv_file)
    
    assert 'name' in data.columns
    assert 'age' in data.columns
    assert len(data) == 3


def test_clean_data(csv_file):
    data = load_data(csv_file)
    data = clean_data(data)
    
    assert data['age'].isna().sum() == 0
    assert len(data) == 2  # Jane的記錄應(yīng)該被刪除


def test_save_data(csv_file, sqlite_db):
    data = load_data(csv_file)
    data = clean_data(data)
    save_data(data, sqlite_db, 'my_table')
    
    # 檢查數(shù)據(jù)是否保存正確
    engine = create_engine(sqlite_db)
    inspector = inspect(engine)
    tables = inspector.get_table_names()
    
    assert 'my_table' in tables
    
    loaded_data = pd.read_sql('my_table', engine)
    assert len(loaded_data) == 2  # 只應(yīng)該存在John和Doe的記錄

這里是另一個例子:假設(shè)您有一個從CSV文件中加載數(shù)據(jù)并將其中的“日期”列從字符串轉(zhuǎn)換為日期時間的流水線:

def convert_date(data, date_column):
    data[date_column] = pd.to_datetime(data[date_column])
    return data

為上述函數(shù)編寫的單元測試將傳入具有已知日期字符串格式的DataFrame。然后,它將驗(yàn)證函數(shù)是否正確將日期轉(zhuǎn)換為日期時間對象,并且它是否適當(dāng)處理無效格式。

我們?yōu)樯鲜鰣鼍熬帉懸粋€單元測試。該測試首先使用有效日期檢查函數(shù),斷言輸出DataFrame中的“date”列確實(shí)是datetime類型,并且值與預(yù)期相符。然后,它檢查在給出無效日期時,函數(shù)是否正確引發(fā)了ValueError。

import pandas as pd
import pytest

def test_convert_date():
    # 使用有效日期進(jìn)行測試
    test_data = pd.DataFrame({
        'date': ['2021-01-01', '2021-01-02']
    })
    
    converted_data = convert_date(test_data.copy(), 'date')
    
    assert pd.api.types.is_datetime64_any_dtype(converted_data['date'])
    assert converted_data.loc[0, 'date'] == pd.Timestamp('2021-01-01')
    assert converted_data.loc[1, 'date'] == pd.Timestamp('2021-01-02')

    # 使用無效日期進(jìn)行測試
    test_data = pd.DataFrame({
        'date': ['2021-13-01']  # 這個日期是無效的,因?yàn)闆]有第13個月
    })
    
    with pytest.raises(ValueError):
        convert_date(test_data, 'date')

以下是最后一個例子:假設(shè)您有一個加載數(shù)據(jù)并進(jìn)行聚合的流水線,計(jì)算每個地區(qū)的總銷售額:

def aggregate_sales(data):
    aggregated = data.groupby('region').sales.sum().reset_index()
    return aggregated

為該函數(shù)編寫的單元測試將向其傳遞具有各個地區(qū)銷售數(shù)據(jù)的DataFrame。測試將驗(yàn)證函數(shù)是否正確計(jì)算每個地區(qū)的總銷售額。

我們?yōu)樵摵瘮?shù)編寫一個單元測試。在這個測試中,我們首先向aggregate_sales函數(shù)傳遞一個具有已知銷售數(shù)據(jù)的DataFrame,并檢查它是否正確聚合了銷售額。然后,向其傳遞一個沒有銷售數(shù)據(jù)的DataFrame,并檢查它是否正確將這些銷售額聚合為0。這樣可以確保函數(shù)正確處理典型情況和邊緣情況。

以下是使用pytest庫為aggregate_sales函數(shù)編寫單元測試的示例:

import pandas as pd
import pytest

def test_aggregate_sales():
    # 各個地區(qū)的銷售數(shù)據(jù)
    test_data = pd.DataFrame({
        'region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West'],
        'sales': [100, 200, 300, 400, 500, 600, 700, 800]
    })
    
    aggregated = aggregate_sales(test_data)
    
    assert aggregated.loc[aggregated['region'] == 'North', 'sales'].values[0] == 300
    assert aggregated.loc[aggregated['region'] == 'South', 'sales'].values[0] == 700
    assert aggregated.loc[aggregated['region'] == 'East', 'sales'].values[0] == 1100
    assert aggregated.loc[aggregated['region'] == 'West', 'sales'].values[0] == 1500

    # 沒有銷售數(shù)據(jù)的測試
    test_data = pd.DataFrame({
        'region': ['North', 'South', 'East', 'West'],
        'sales': [0, 0, 0, 0]
    })
    
    aggregated = aggregate_sales(test_data)
    
    assert aggregated.loc[aggregated['region'] == 'North', 'sales'].values[0] == 0
    assert aggregated.loc[aggregated['region'] == 'South', 'sales'].values[0] == 0
    assert aggregated.loc[aggregated['region'] == 'East', 'sales'].values[0] == 0
    assert aggregated.loc[aggregated['region'] == 'West', 'sales'].values[0] == 0

本文轉(zhuǎn)載自微信公眾號「Java學(xué)研大本營」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系公眾號。


分享文章:數(shù)據(jù)工程中的單元測試完全指南
文章起源:http://www.5511xx.com/article/cddopoe.html