Coursera 笔记

Module 01 · Extract, Transform, Load (ETL)提取、转换与加载(ETL)

Extract, Transform, Load (ETL)提取、转换与加载(ETL)

Coursera ↗

学习目标

观看本视频后,您将能够:

  • 定义提取、转换、加载(ETL)流程。
  • 解释 ETL 功能的正确执行顺序。
  • 编写一个简单的 ETL 程序。

什么是 ETL?

您是否曾想过数据是如何从多个来源收集并组合成单一信息源的?

这种类型的数据收集称为批量处理 (Batch Processing),而我们今天要探讨的是一种特殊的批量处理类型——提取、转换和加载 (Extract, Transform and Load, 或 ETL)。

ETL 顾名思义:它是从多个来源和格式中提取大量数据,转换成一种特定格式,然后将其加载到数据库或目标文件的过程。

ETL 流程示例

假设您是一家初创公司的所有者,该公司构建了一个 AI,使用身高和体重来预测某人患糖尿病的风险。

  • 数据来源: 部分数据为 CSV 格式,另一部分为 JSON 文件。
  • 需求: AI 只能读取一个大的 CSV 文件,且使用公制单位。
步骤 动作 目标/要求
提取 (Extract) 收集所有 CSV 和 JSON 数据。 将所有数据汇集到一个文件中,供 AI 读取。
转换 (Transform) 将英制单位转换为公制单位。 将数据从英制单位(如英寸、磅)转换为公制单位(如米、千克)。
加载 (Load) 将转换后的数据保存为 CSV 文件。 将数据加载为 AI 可读取的单一 CSV 文件。

使用 Python 实现 ETL

接下来,我们将使用 Python 来实现上述 ETL 流程。

1. 提取 (Extract)

提取步骤会批量地从多个来源提取大量数据。

提取前的准备glob函数

在讨论提取函数之前,先了解其构成函数:来自 glob 模块的 glob 函数。

  • 输入: 文件扩展名(例如,"*.csv")。
  • 输出: 具有该特定扩展名的文件列表。

例如,对于 .json 和 .csv 文件的列表:

  • 输入 glob("*.csv"),输出是 .csv 文件列表。
  • 输入 glob("*.json"),输出是 .json 文件列表。

数据提取函数实现

我们可以编写函数来分别提取 CSV 和 JSON 文件中的姓名、身高和体重:

  • CSV 提取: 输入是 .csv 文件名,结果是 DataFrame。
  • JSON 提取: 输入是 .json 文件名,输出是 DataFrame。

extract函数主体逻辑

  1. 创建空 DataFrame: 首先创建一个名为 extracted_data 的空 DataFrame 并分配列名。
  2. 提取 CSV 文件:
    • 添加一个循环和 glob 函数来查找所有 CSV 文件。
    • 在每次循环迭代中,CSV 文件被附加到 DataFrame 中,从而形成一个已提取数据的列表。
  3. 提取 JSON 文件: 类似的代码段将 JSON 文件附加到 DataFrame 中。

ignore_index参数解释

我们将深入探讨参数 ignore_index="True" 的作用:

参数设置 结果 目的
ignore_index 不设置为 True extracted_data 的索引将与原始文件的行号相同,可能导致索引重复。 默认行为。
ignore_index 设置为 True 每行的顺序将与该行被附加到 DataFrame 的顺序相同,从而创建新的、连续的索引。 确保所有附加行具有唯一的索引。

2. 转换 (Transform)

数据收集完成后,下一步是转换。

这个函数负责将 DataFrame 中的数据进行单位转换:

  • 将身高 (height) 列(单位:英尺/英寸)转换为米。
  • 将体重 (weight) 列(单位:磅)转换为千克。
  • 返回转换后的数据。

具体操作:

  1. 输入 DataFrame 中,身高列(单位:英尺/英寸)应用特定操作,将其转换为米,并四舍五入到小数点后两位。
  2. 转换后的 DataFrame 中,身高列现在以米为单位。
  3. 对体重列执行类似的操作,将其转换为千克。

3. 加载与日志记录 (Load and Logging)

加载 (Load)

数据收集和定义(转换)完成后,是时候将其加载到目标文件了。

  • 在此案例中,我们直接将 Pandas DataFrame 保存为 CSV 文件。

日志记录 (Logging)

在完成任务之前,我们需要创建一个日志条目。

日志记录函数的创建步骤:

  1. 创建一个变量 timestamp_format,用于确定时间和日期的格式。
  2. 创建 now 变量,通过调用 datetime 来捕获当前时间。
    • 注意:需要导入 datetime 模块才能使其正常工作。
  3. 通过打开一个文件并使用 "a"(追加模式)写入信息,将这些信息整合在一起。
    • 使用 "a" 模式意味着所有写入的数据都将附加到现有信息之后。

通过创建这种类型的条目,我们能够为流程的每个部分的开始和完成附加一个时间戳。


调用 ETL 流程

我们已经定义了运行 ETL 流程所需的所有代码。最后一步是调用所有函数:

  1. 首先调用 extract_data 函数。
  2. 此步骤接收到的数据被传输到第二步——数据转换。
  3. 完成转换后,数据被加载到目标文件。

‼️ 注意: 在每个步骤之前和之后都添加了开始和完成的时间和日期(通过日志记录函数)。

总结回顾

在本视频中,您学习了如何编写:

  • 一个简单的提取 (Extract) 函数。
  • 一个简单的转换 (Transform) 函数。
  • 一个简单的加载 (Load) 函数。
  • 一个简单的日志记录 (Logging) 函数。

请查看实验部分获取更多示例。