对Kedro进行的极点探索
#python #datascience #kedro #polars

一年前,我第一次去立陶宛在Pycon/Pydata Lithuania出席,在那里度过了愉快的时光。我的演讲主题是对一些替代数据框架库的评估,其中包括Polars,我最终最喜欢的数据库。

我非常喜欢它,以至于本周我再次在维尔纽斯(Vilnius),我将在Pycon Lithuania 2023举行的名为“Analyze your data at the speed of light with Polars and Kedro”的车间。

在这篇博客文章中,您将学习如何在Kedro中使用Polars,可以使您的数据管道更快,Kedro的Porars的当前状态以及在不久的将来可以预期的。如果您第一次听说过Polars,我在一开始就进行了简短的介绍。

让我们潜水!

什么是Polars库?

Polars是一个用于Python,Rust和Nodejs的开源库,可提供内存数据框架,核心外处理功能等。它基于Apache Arrow柱状数据格式的生锈实现(您可以在我较早的博客文章“Demystifying Apache Arrow”上阅读有关箭头的更多信息,并且被优化为快速燃烧。

Snippet of Polars code

关于Polars的有趣之处在于,它不会试图替换熊猫,例如DaskcuDFModin,而是拥有自己的表现力API。尽管是一个年轻的项目,但由于其简单的安装过程和闪电的快速性能,它很快就流行了。

我一年前开始尝试Porars,现在已成为我的数据操纵库。我进行了几次谈论,例如at PyData NYC,房间已经满了。

Polars和Kedro如何一起使用?

如果您想了解有关Kedro的更多信息,则可以在our YouTube channel上观看视频介绍:

传统上,Kedro由于其无处不在和受欢迎程度而偏爱pandas作为数据帧库。这意味着,例如,要读取CSV文件,您将为the catalog添加相应的条目:

openrepair-0_3-categories:
  type: pandas.CSVDataSet
  filepath: data/01_raw/OpenRepairData_v0.3_Product_Categories.csv

然后,您将使用该数据集作为your node functions的输入,后者将接收Pandas DataFrame对象:

def join_events_categories(
    events: pd.DataFrame,
    categories: pd.DataFrame,
) -> pd.DataFrame:
        ...

(这只是Kedro数据集支持的格式之一!您还可以加载木木木,Geojson,Imagesâ€请查看the koude1 reference,以获取由核心团队维护的数据集列表,或者the koude2 topic on GitHub供某些贡献由社区!)

此博客文章的想法是教您如何使用Polars而不是PANDAS进行目录条目,这又使您可以使用Polars DataFrames编写所有数据转换管道。为此,我制作了一些使用the Open Repair Alliance dataset的示例,其中包含欧洲的80000多个维修事件记录。

如果您准备开始,请走!

开始使用Kedro的Polars

首先,您需要将kedro-datasets[polars.CSVDataSet]添加到您的要求中。在撰写本文时(2023年5月),以下代码需要kedrokedro-datasets的开发版本,您可以在requirements.txtpyproject.toml上声明,如下所示:

# requirements.txt

kedro @ git+https://github.com/kedro-org/kedro@3ea7231
kedro-datasets[pandas.CSVDataSet,polars.CSVDataSet] @ git+https://github.com/kedro-org/kedro-plugins@3b42fae#subdirectory=kedro-datasets
# pyproject.toml

[project]
dependencies = [
    "kedro @ git+https://github.com/kedro-org/kedro@3ea7231",
    "kedro-datasets[pandas.CSVDataSet,polars.CSVDataSet] @ git+https://github.com/kedro-org/kedro-plugins@3b42fae#subdirectory=kedro-datasets",
]

如果您使用的是Legacy setup.py文件,则语法非常相似:

setup(
    requires=[
        "kedro @ git+https://github.com/kedro-org/kedro@3ea7231",
        "kedro-datasets[pandas.CSVDataSet,polars.CSVDataSet] @ git+https://github.com/kedro-org/kedro-plugins@3b42fae#subdirectory=kedro-datasets",
    ]
)

安装这些依赖项后,您可以通过在目录条目中使用适当的type开始使用polars.CSVDataSet

openrepair-0_3-categories:
  type: polars.CSVDataSet
  filepath: data/01_raw/OpenRepairData_v0.3_Product_Categories.csv

就是这样!

使用polars.CSVDataSet读取现实世界的CSV文件

事实证明,读取CSV文件并不总是那么容易。好消息是,您可以使用目录条目的load_args参数将额外选项传递给polars.CSVDataSet,该选项反映了polars.read_csv的函数参数。例如,如果要尝试在CSV中解析日期列,则可以将try_parse_dates选项设置为true

openrepair-0_3-categories:
  type: polars.CSVDataSet
  filepath: data/01_raw/OpenRepairData_v0.3_Product_Categories.csv
  load_args:
    # Doesn't make much sense in this case,
    # but serves for demonstration purposes
    try_parse_dates: true

其中一些参数必须为Python对象:例如,polars.read_csv采用可选的dtypes参数,可用于指定列的DTYPES,如下:

pl.read_csv(
    "data/01_raw/OpenRepairData_v0.3_aggregate_202210.csv",
    dtypes={
        "product_age": pl.Float64,
        "group_identifier": pl.Utf8,
    }
)

Kedro目录文件仅支持原始类型。但是不要害怕!您可以在Kedro中使用更复杂的配置加载程序,以使您可以调整此类文件的解析和加载。

要传递适当的dtypes来读取此CSV文件,您可以将TemplatedConfigLoaderthe shiny new koude21与自定义omegaconf解析器一起使用。这样的解析器将负责解析YAML目录中的字符串,并将其转换为Polars需求的物体。将此代码放在您的settings.py中:

# settings.py

import polars as pl
from omegaconf import OmegaConf
from kedro.config import OmegaConfigLoader

if not OmegaConf.has_resolver("polars"):
    OmegaConf.register_new_resolver("polars", lambda attr: getattr(pl, attr))

CONFIG_LOADER_CLASS = OmegaConfigLoader

现在您可以在目录中使用特殊的omegaconf语法:

openrepair-0_3-events-raw:
  type: polars.CSVDataSet
  filepath: data/01_raw/OpenRepairData_v0.3_aggregate_202210.csv
  load_args:
    dtypes:
      # Notice the OmegaConf resolver syntax!
      product_age: ${polars:Float64}
      group_identifier: ${polars:Utf8}
    try_parse_dates: true

现在您可以轻松地从目录!

轻松访问Polars数据类型

Kedro的Polars集成计划的未来计划

这一切看起来都很有前途,但这只是冰山一角。首先,这些变化需要以稳定版本的kedrokedro-datasets降落。更重要的是,我们正在研究a generic Polars dataset,它将能够读取其他文件格式,例如Parquet,该格式更快,更紧凑且更易于使用。

Polars让我对Python的数据操纵的未来感到非常兴奋,我希望所有Kedro用户能够很快在其数据管道上利用这个惊人的项目!