Jupyter AI

13 数据仓库系列教程:ETL过程之数据转换

📅发表日期: 2024-08-11

🏷️分类: 数据仓库

👁️阅读次数: 0

在上一篇《ETL过程之数据提取》中,我们讨论了如何从各种源系统中提取数据。在这一节中,我们将专注于“数据转换”阶段。这是ETL(抽取、转换、加载)过程中至关重要的一步,数据转换用于清洗、整合和最终以期望的格式为后续分析做好准备。

数据转换的目的

数据转换的主要目的是:

  1. 清洗数据:去除错误或无效的数据。
  2. 数据标准化:将数据转换为一致的格式,例如日期格式的统一。
  3. 合并数据:在多个数据集之间进行合并,创建新的数据集。
  4. 派生数据:从现有数据中创建新的数据列。
  5. 聚合数据:对数据进行汇总,以支持更高层次的分析。

数据转换的常见技术

以下是一些常见的转换技术及其示例:

1. 数据清洗

在数据转换的初始阶段,首先需要对提取的数据进行清洗。例如,我们可能需要删除重复的记录或填补缺失的值:

import pandas as pd

# 示例数据
data = {
    'ID': [1, 2, 2, 3, 4, None],
    'Name': ['Alice', 'Bob', 'Bob', 'Charlie', None, 'Eve'],
    'Age': [25, 30, 30, None, 22, 28]
}

df = pd.DataFrame(data)

# 去重
df = df.drop_duplicates()

# 填充缺失值
df['Name'].fillna('Unknown', inplace=True)
df['Age'].fillna(df['Age'].mean(), inplace=True)

print(df)

2. 数据标准化

有时候,数据来自不同的源,格式可能不一致。例如,日期可能以不同的字符串格式存储。我们需要将其标准化为一致的格式:

from datetime import datetime

# 示例日期字符串
date_strs = ['2023-10-01', '10/05/2023', 'October 12, 2023']

# 标准化日期格式
def standardize_date(date_str):
    for fmt in ("%Y-%m-%d", "%m/%d/%Y", "%B %d, %Y"):
        try:
            return datetime.strptime(date_str, fmt).date()
        except ValueError:
            continue
    return None

standardized_dates = [standardize_date(date) for date in date_strs]
print(standardized_dates)

3. 合并数据

有时我们需要将来自不同表的数据合并到一起,例如,将用户信息和其购买记录合并:

# 用户信息
users = pd.DataFrame({
    'UserID': [1, 2, 3],
    'Name': ['Alice', 'Bob', 'Charlie']
})

# 购买记录
purchases = pd.DataFrame({
    'PurchaseID': [101, 102, 103],
    'UserID': [1, 2, 1],
    'Amount': [250.00, 150.00, 75.50]
})

# 通过 UserID 合并数据
merged_data = pd.merge(users, purchases, on='UserID', how='left')
print(merged_data)

4. 派生数据

在数据集上,我们可能需要基于现有列计算新的列。例如,我们可以计算用户的年龄范围:

# 添加年龄范围列
def age_range(age):
    if age < 25:
        return '18-24'
    elif age < 40:
        return '25-39'
    else:
        return '40+'

df['AgeRange'] = df['Age'].apply(age_range)
print(df)

5. 聚合数据

最后,我们可能需要对数据进行聚合,以便进行进一步的分析。例如,我们可以计算每个用户的总消费金额:

# 按 UserID 聚合总消费
total_spending = purchases.groupby('UserID')['Amount'].sum().reset_index()
total_spending.columns = ['UserID', 'TotalSpent']
print(total_spending)

小结

在本篇教程中,我们详细探讨了ETL过程中“数据转换”环节的重要性和实现方法。从数据清洗到数据标准化、合并、派生以及聚合,我们通过案例和代码示例展示了每种技术的应用。

在下一篇文章《ETL过程之数据加载》中,我们将探讨如何将转换后的数据有效地加载到数据仓库中,准备进行更深入的分析和可视化。请继续关注我们的系列教程!

💬 评论

暂无评论