13 ETL过程之数据转换

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

数据转换的目的

数据转换的主要目的是:

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

数据转换的常见技术

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

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]
})

# 通过 UserID 合并数据
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
# 按 UserID 聚合总消费
total_spending = purchases.groupby('UserID')['Amount'].sum().reset_index()
total_spending.columns = ['UserID', 'TotalSpent']
print(total_spending)

小结

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

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

作者

IT教程网(郭震)

发布于

2024-08-11

更新于

2024-08-12

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论