一年前,我第一次去立陶宛在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”上阅读有关箭头的更多信息,并且被优化为快速燃烧。
关于Polars的有趣之处在于,它不会试图替换熊猫,例如Dask,cuDF或Modin,而是拥有自己的表现力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月),以下代码需要kedro
和kedro-datasets
的开发版本,您可以在requirements.txt
或pyproject.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文件,您可以将TemplatedConfigLoader
或the 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集成计划的未来计划
这一切看起来都很有前途,但这只是冰山一角。首先,这些变化需要以稳定版本的kedro
和kedro-datasets
降落。更重要的是,我们正在研究a generic Polars dataset,它将能够读取其他文件格式,例如Parquet,该格式更快,更紧凑且更易于使用。
Polars让我对Python的数据操纵的未来感到非常兴奋,我希望所有Kedro用户能够很快在其数据管道上利用这个惊人的项目!