Pipecuter为luigi提供了一些工具,以便它能够更好地与数据科学库和环境(如pandas、scikitlearn和Jupyter笔记本)配合使用。

pipecutter的Python项目详细描述


切管器

PyPI versionPython versionsbuild statuscoverage

Pipecuter为luigi提供了一些工具,以便它能够更好地与数据科学库和环境(如pandas、scikit learn和Jupyter笔记本)配合使用。在

目录

安装

pip install pipecutter

Python3.6+是必需的。切管器跟随semantic versioning。在

使用

Pipecuter目前提供

  • 一种在交互式环境(如Jupyter笔记本)中运行和调试luigi任务的更方便的方法
  • 一些luigi的目标是将pandas数据帧保存到parquet,scikit使用joblib学习模型。。。在

在交互式环境中调试

使用luigi,您已经可以在Python脚本/Jupyter notebook/Python控制台中运行任务,方法是使用luigi.build函数(可能使用local_scheduler=True作为arugment)。但是,如果任务抛出异常,这将被luigi捕获,并且您无法进入事后调试会话。pipecutter.run是{}周围的轻型包装器,它禁用此异常处理。在

^{pr2}$

这将减少在开发模型时已经使用luigi任务的障碍,从而使以后更容易投入生产。在

此外,您可以用pipecutter.print_tree(包装luigi.tools.deps_tree.print_tree)打印任务的依赖关系,或者用pipecutter.build_graph构建一个graphviz图,可以将其另存为.png、.pdf等,或者直接在Jupyter笔记本中查看。请参阅完整的示例,以获取此外观的屏幕截图。build_graph函数要求您有{a11}。在

目标

pipecutter.targets中,您可以找到一些基于luigi的LocalTarget的目标,但是另外还有一个load和一个dump方法。命名目标的一种方便的方法是在名称中使用task_id,这对于任务名称及其传入参数是唯一的。在

importluigiimportpipecutterfrompipecutter.targetsimportJoblibTargetfromsklearn.ensembleimportRandomForestClassifierclassTrainModel(luigi.Task):n_estimators=luigi.IntParameter()defoutput(self):returnJoblibTarget(self.task_id+".joblib")defrun(self):model=RandomForestClassifier(n_estimators=self.n_estimators)self.output().dump(model)pipecutter.run(TrainModel(n_estimators=100))# -> Produces a file called TrainModel_100_0b0ec0cdea.joblib

如果在文件名中使用task_id,则可以使用添加了output方法的pipecutter.targets.outputs修饰符来编写更简洁的任务。默认情况下,它将文件放在一个名为data的文件夹中。这可以通过可选的folder参数进行调整。在

frompipeline.targetsimportoutputs@outputs(JoblibTarget)classTrainModel(luigi.Task):n_estimators=luigi.IntParameter()defrun(self):model=RandomForestClassifier(n_estimators=self.n_estimators)self.output().dump(model)

完整的例子

importluigiimportpandasaspdimportnumpyasnpimportpipecutterfromluigi.utilimportrequiresfrompipecutter.targetsimportoutputs,JoblibTarget,ParquetTargetfromsklearn.ensembleimportRandomForestClassifier@outputs(ParquetTarget)classPrepareData(luigi.Task):drop_missings=luigi.BoolParameter()defrun(self):train_df=pd.DataFrame.from_dict({"A":[0,1,np.nan],"B":[5,1,2],"label":[0,1,1]})ifself.drop_missings:train_df=train_df.dropna()self.output().dump(train_df)@requires(PrepareData)@outputs(JoblibTarget)classTrainModel(luigi.Task):n_estimators=luigi.IntParameter()defrun(self):train_df=self.input().load()X,y=train_df.drop("label",axis=1),train_df["label"]model=RandomForestClassifier(n_estimators=self.n_estimators)model.fit(X,y)self.output().dump(model)train_model=TrainModel(n_estimators=100,drop_missings=True)pipecutter.build_graph(train_model)

最后一个命令可用于可视化依赖关系树,如果管道更复杂,这一点尤其有用。它返回一个graphviz.Digraph对象,该对象将在Jupyter笔记本中呈现为

build graph example

最后,使用以下命令运行任务:

pipecutter.run(train_model)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
具有泛型的对象的oop Java数组   爪哇丑陋的数字找到第1500名UVA在线评委   SpringJava。lang.IllegalStateException:自动连线批注至少需要一个参数   java为什么我的系统找不到我的属性文件?   java有没有办法让Maven同时构建1.5和1.6字节码JAR?   java通过Sailfin中的header进行操作   使用向量、距离和图形   如果提供的登录信息是错误的,为什么java控件不进入else部分和Toast?   java如何为电子商务安卓应用程序存储产品列表   java保存声音首选项Libgdx Android   java无法在测试单元中调用JpaRepository   java使用批处理更新Cassandra表中的选定列,而不将其他列值设为null   java如何在log4j2中的手动代码配置中向appender添加级别?   从ImageIO返回的java Null。读取(新的ByteArrayInputStream(bs));   java不确定如何防止此Arraylist处于可编辑状态   netbeans中的java更改清单(TrustedLibrary=true属性)   java无法使用RestTemplate和Spring数据REST发布具有关系的新实体