简洁明了地创建大型、参数化、映射的作业规范

parameterize-jobs的Python项目详细描述


参数化作业

https://img.shields.io/pypi/v/parameterize_jobs.svghttps://img.shields.io/travis/ClimateImpactLab/parameterize_jobs.svgDocumentation StatusUpdates

parameterize_jobs是一个轻量级的纯python工具包,用于简洁明了地创建大型的、参数化的、映射的作业规范。

功能

  • 通过乘以ComponentSetConstantParallelComponentSet对象来展开作业的维度
  • 通过添加ComponentSetConstantParallelComponentSet对象来扩展作业数
  • 作业作为参数字典提供给函数
  • helper decorator@expand_kwargs将这些Kwarg字典转换为 命名参数调用
  • 与许多运行任务的框架无缝地工作,包括dask的client.map和分析工具

待办事项

查看并提交issues page上的问题。

快速启动

ComponentSetobjects是基本对象,可以用任意数量的命名iterable来定义:

>>>importparameterize_jobsaspjs>>>a=pjs.ComponentSet(a=range(5))>>>a<ComponentSet{'a':5}>

这些对象具有定义的长度(如果提供的iterable具有定义的长度),并且可以对其进行索引和迭代:

>>>len(a)5>>>a[0]{'a':0}>>>list(a)[{'a':0},{'a':1},{'a':2},{'a':3},{'a':4}]

添加两个ComponentSet对象将延长作业的总长度

>>>a2=pjs.ComponentSet(a=range(3))>>>a+a2<MultiComponentSet[{'a':5},{'a':3}]>>>>len(a+a2)8>>>list(a+a2)[{'a':0},{'a':1},{'a':2},{'a':3},{'a':4},{'a':0},{'a':1},{'a':2}]

两个ComponentSet对象相乘会扩展它们的维度:

>>>b=pjs.ComponentSet(b=range(3))>>>a*b<ComponentSet{'a':5,'b':3}>>>>len(a*b)15>>>(a*b)[-1]{'a':4,'b':2}>>>list(a*b)[{'a':0,'b':0},{'a':0,'b':1},{'a':0,'b':2},{'a':1,'b':0},{'a':1,'b':1},{'a':1,'b':2},{'a':2,'b':0},{'a':2,'b':1},{'a':2,'b':2},{'a':3,'b':0},{'a':3,'b':1},{'a':3,'b':2},{'a':4,'b':0},{'a':4,'b':1},{'a':4,'b':2}]

这些参数化作业规范可用于可映射作业。helper decoratorexpand_kwargs修改函数以接受字典并将其扩展为关键字参数:

>>>@pjs.expand_kwargs...defmy_simple_func(a,b,c=1):...returna*b*c>>>list(map(my_simple_func,a*b))[0,0,0,0,0,0,1,2,3,4,0,2,4,6,8,0,3,6,9,12]

作业不一定是所有组件的组合产品:

>>>ab1=pjs.ComponentSet(a=[0,1],b=[0,1])>>>ab2=pjs.ComponentSet(a=[10,11],b=[-1,1])>>>list(map(my_simple_func,ab1+ab2))[0,0,0,1,-10,-11,10,11]

一个Constant对象只是一个ComponentSet对象,它定义了作为关键字参数传递的单个值,而不是作为关键字参数传递的可访问项:

>>>c=pjs.Constant(c=5)>>>list(map(my_simple_func,(ab1+ab2)*c))[0,0,0,5,-50,-55,50,55]

ParallelComponentSet对象只是一个MultiComponentSet对象,其中每个Component都是一个Constant对象。

>>>pcs=pjs.ParallelComponentSet(a=[1,2],b=[10,20])>>>list(map(my_simple_func,pcs))[10,40]

可以创建任意复杂的组件集组合:

>>>c1=pjs.Constant(c=1)>>>c2=pjs.Constant(c=2)>>>list(map(my_simple_func,(ab1+ab2)*c1+(ab1+ab2)*c2))[0,0,0,1,-10,-11,10,11,0,0,0,2,-20,-22,20,22]

任何东西都可以在ComponentSetiterable中,包括数据、函数或其他对象:

>>>transforms=(...pjs.Constant(transform=lambdax:x,transform_name='linear')...+pjs.Constant(transform=lambdax:x**2,transform_name='quadratic'))...>>>fps=pjs.Constant(...read_pattern='source/my-fun-data_{year}.csv',...write_pattern='transformed/my-fun-data_{transform_name}_{year}.csv')>>>years=pjs.ComponentSet(year=range(1980,2018))>>>@pjs.expand_kwargs...defprocess_data(read_pattern,write_pattern,transform,transform_name,year):......df=pd.read_csv(read_pattern.format(year=year))......transformed=transform(df)......transformed.to_csv(...write_pattern.format(...transform_name=transform_name,...year=year))...>>>_=list(map(process_data,transforms*fps*years))

这与dask的client.map无缝工作,以提供直观的作业参数化:

>>>importdask.distributedasdd>>>client=dd.LocalClient()>>>futures=client.map(my_simple_func,(ab1+ab2)*c1+(ab1+ab2)*c2)>>>dd.progress(futures)

历史记录

0.1.0(2018-11-30)

  • pypi上的第一个版本。

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

推荐PyPI第三方库


热门话题
如何获得@sign,以便在Java代码中键入@override?   java Facebook登录不起作用,我忘了什么?   json如何在java中从MongoDB Atlas获取特定字段?   java如何在Android上的JNI中实现委托/协议(在iOS上)?   java为什么这个循环多次的程序在循环后有一个“println”时需要花费时间?   java无法使组合框正常工作   JavaCQ5。如何为作者显示列表发布者?版本5.5   java我可以要求泛型参数具有泛型参数吗?   JavaOKHTTP无法获取整个JSON   数组Java:用字符减去字符意味着什么?   java为什么Eclipse content assist无法从部分方法名生成方法存根?   java使用线程在Android Studio中一次加载一个多位图   java遍历二叉树并返回一个值