在上一篇《ETL过程之数据提取》中,我们讨论了如何从各种源系统中提取数据。在这一节中,我们将专注于“数据转换”阶段。这是ETL(抽取、转换、加载)过程中至关重要的一步,数据转换用于清洗、整合和最终以期望的格式为后续分析做好准备。
数据转换的目的
数据转换的主要目的是:
- 清洗数据:去除错误或无效的数据。
- 数据标准化:将数据转换为一致的格式,例如日期格式的统一。
- 合并数据:在多个数据集之间进行合并,创建新的数据集。
- 派生数据:从现有数据中创建新的数据列。
- 聚合数据:对数据进行汇总,以支持更高层次的分析。
数据转换的常见技术
以下是一些常见的转换技术及其示例:
1. 数据清洗
在数据转换的初始阶段,首先需要对提取的数据进行清洗。例如,我们可能需要删除重复的记录或填补缺失的值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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. 数据标准化
有时候,数据来自不同的源,格式可能不一致。例如,日期可能以不同的字符串格式存储。我们需要将其标准化为一致的格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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. 合并数据
有时我们需要将来自不同表的数据合并到一起,例如,将用户信息和其购买记录合并:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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] })
merged_data = pd.merge(users, purchases, on='UserID', how='left') print(merged_data)
|
4. 派生数据
在数据集上,我们可能需要基于现有列计算新的列。例如,我们可以计算用户的年龄范围:
1 2 3 4 5 6 7 8 9 10 11
| 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. 聚合数据
最后,我们可能需要对数据进行聚合,以便进行进一步的分析。例如,我们可以计算每个用户的总消费金额:
1 2 3 4
| total_spending = purchases.groupby('UserID')['Amount'].sum().reset_index() total_spending.columns = ['UserID', 'TotalSpent'] print(total_spending)
|
小结
在本篇教程中,我们详细探讨了ETL过程中“数据转换”环节的重要性和实现方法。从数据清洗到数据标准化、合并、派生以及聚合,我们通过案例和代码示例展示了每种技术的应用。
在下一篇文章《ETL过程之数据加载》中,我们将探讨如何将转换后的数据有效地加载到数据仓库中,准备进行更深入的分析和可视化。请继续关注我们的系列教程!