{ "info": { "author": "Michael Delgado", "author_email": "delgado.michaelt@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "=================\nParameterize Jobs\n=================\n\n.. image:: https://img.shields.io/pypi/v/parameterize_jobs.svg\n :target: https://pypi.python.org/pypi/parameterize_jobs\n\n.. image:: https://img.shields.io/travis/ClimateImpactLab/parameterize_jobs.svg\n :target: https://travis-ci.org/ClimateImpactLab/parameterize_jobs\n\n.. image:: https://readthedocs.org/projects/parameterize-jobs/badge/?version=latest\n :target: https://parameterize-jobs.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. image:: https://pyup.io/repos/github/ClimateImpactLab/parameterize_jobs/shield.svg\n :target: https://pyup.io/repos/github/ClimateImpactLab/parameterize_jobs/\n :alt: Updates\n\n``parameterize_jobs`` is a lightweight, pure-python toolkit for concisely and clearly creating large, parameterized, mapped job specifications.\n\n\n* Free software: MIT license\n* Documentation: https://parameterize-jobs.readthedocs.io\n\nFeatures\n--------\n\n* Expand a job's dimensionality by multiplying ``ComponentSet``, ``Constant``, or ``ParallelComponentSet`` objects\n* Extend the number of jobs by adding ``ComponentSet``, ``Constant``, or ``ParallelComponentSet`` objects\n* Jobs are provided to functions as dictionaries of parameters\n* The helper decorator ``@expand_kwargs`` turns these kwarg dictionaries into\n named argument calls\n* Works seamlessly with many task running frameworks, including dask's `client.map` and profiling tools\n\nTODOs\n-----\n\nView and submit issues on the `issues page `_.\n\nQuickstart\n----------\n\n``ComponentSet`` objects are the base objects, and can be defined with any number of named iterables:\n\n.. code-block:: python\n\n >>> import parameterize_jobs as pjs\n\n >>> a = pjs.ComponentSet(a=range(5))\n >>> a\n \n\nThese objects have defined lengths (if the provided iterable has a defined length), and can be indexed and iterated over:\n\n.. code-block:: python\n\n >>> len(a)\n 5\n\n >>> a[0]\n {'a': 0}\n\n >>> list(a)\n [{'a': 0},\n {'a': 1},\n {'a': 2},\n {'a': 3},\n {'a': 4}]\n\nAdding two ``ComponentSet`` objects extends the total job length\n\n.. code-block:: python\n\n >>> a2 = pjs.ComponentSet(a=range(3))\n\n >>> a+a2\n \n\n >>> len(a+a2)\n 8\n\n >>> list(a+a2)\n\n [{'a': 0},\n {'a': 1},\n {'a': 2},\n {'a': 3},\n {'a': 4},\n {'a': 0},\n {'a': 1},\n {'a': 2}]\n\nMultiplying two ``ComponentSet`` objects expands their dimensionality:\n\n.. code-block:: python\n\n >>> b = pjs.ComponentSet(b=range(3))\n\n >>> a*b\n \n\n >>> len(a*b)\n 15\n\n >>> (a*b)[-1]\n {'a': 4, 'b': 2}\n\n >>> list(a*b)\n [{'a': 0, 'b': 0},\n {'a': 0, 'b': 1},\n {'a': 0, 'b': 2},\n {'a': 1, 'b': 0},\n {'a': 1, 'b': 1},\n {'a': 1, 'b': 2},\n {'a': 2, 'b': 0},\n {'a': 2, 'b': 1},\n {'a': 2, 'b': 2},\n {'a': 3, 'b': 0},\n {'a': 3, 'b': 1},\n {'a': 3, 'b': 2},\n {'a': 4, 'b': 0},\n {'a': 4, 'b': 1},\n {'a': 4, 'b': 2}]\n\nThese parameterized job specifications can be used in mappable jobs. The helper decorator ``expand_kwargs`` modifies a function to accept a dictionary and expands them into keyword arguments:\n\n.. code-block:: python\n\n >>> @pjs.expand_kwargs\n ... def my_simple_func(a, b, c=1):\n ... return a * b * c\n\n >>> list(map(my_simple_func, a*b))\n [0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 2, 4, 6, 8, 0, 3, 6, 9, 12]\n\nJobs do not have to be the combinatorial product of all components:\n\n.. code-block:: python\n\n >>> ab1 = pjs.ComponentSet(a=[0, 1], b=[0, 1])\n >>> ab2 = pjs.ComponentSet(a=[10, 11], b=[-1, 1])\n\n >>> list(map(my_simple_func, ab1 + ab2))\n [0, 0, 0, 1, -10, -11, 10, 11]\n\nA ``Constant`` object is simply a ``ComponentSet`` object defined with single values passed as keyword arguments rather than iterables passed as keyword arguments:\n\n.. code-block:: python\n\n >>> c = pjs.Constant(c=5)\n\n >>> list(map(my_simple_func, (ab1 + ab2) * c))\n [0, 0, 0, 5, -50, -55, 50, 55]\n\nA ``ParallelComponentSet`` object is simply a ``MultiComponentSet`` object where each ``Component`` is a ``Constant`` object.\n\n.. code-block:: python\n\n >>> pcs = pjs.ParallelComponentSet(a = [1, 2],\n b = [10, 20])\n\n >>> list(map(my_simple_func, pcs))\n [10, 40]\n\nArbitrarily complex combinations of ComponentSets can be created:\n\n.. code-block:: python\n\n >>> c1 = pjs.Constant(c=1)\n >>> c2 = pjs.Constant(c=2)\n\n >>> list(map(my_simple_func, (ab1 + ab2) * c1 + (ab1 + ab2) * c2))\n [0, 0, 0, 1, -10, -11, 10, 11, 0, 0, 0, 2, -20, -22, 20, 22]\n\nAnything can be inside a ``ComponentSet`` iterable, including data, functions, or other objects:\n\n.. code-block:: python\n\n >>> transforms = (\n ... pjs.Constant(transform=lambda x: x, transform_name='linear')\n ... + pjs.Constant(transform=lambda x: x**2, transform_name='quadratic'))\n ...\n\n >>> fps = pjs.Constant(\n ... read_pattern='source/my-fun-data_{year}.csv',\n ... write_pattern='transformed/my-fun-data_{transform_name}_{year}.csv')\n\n >>> years = pjs.ComponentSet(year=range(1980, 2018))\n\n >>> @pjs.expand_kwargs\n ... def process_data(read_pattern, write_pattern, transform, transform_name, year):\n ...\n ... df = pd.read_csv(read_pattern.format(year=year))\n ...\n ... transformed = transform(df)\n ...\n ... transformed.to_csv(\n ... write_pattern.format(\n ... transform_name=transform_name,\n ... year=year))\n ...\n\n >>> _ = list(map(process_data, transforms * fps * years))\n\nThis works seamlessly with dask's `client.map `_ to provide intuitive job parameterization:\n\n.. code-block:: python\n\n >>> import dask.distributed as dd\n >>> client = dd.LocalClient()\n >>> futures = client.map(my_simple_func, (ab1 + ab2) * c1 + (ab1 + ab2) * c2)\n >>> dd.progress(futures)\n\n\n=======\nHistory\n=======\n\n0.1.0 (2018-11-30)\n------------------\n\n* First release on PyPI.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://pypi.org", "keywords": "parameterize_jobs", "license": "MIT license", "maintainer": "", "maintainer_email": "", "name": "parameterize-jobs", "package_url": "https://pypi.org/project/parameterize-jobs/", "platform": "", "project_url": "https://pypi.org/project/parameterize-jobs/", "project_urls": { "Homepage": "https://pypi.org" }, "release_url": "https://pypi.org/project/parameterize-jobs/0.1.1/", "requires_dist": null, "requires_python": "", "summary": "concisely and clearly create large, parameterized, mapped job specifications", "version": "0.1.1" }, "last_serial": 5635272, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "9765da8218537b41aedda252abfa9186", "sha256": "0f2f732e43301516e2e3036d94a38cede565f7472893e40e46f2580719ab07fd" }, "downloads": -1, "filename": "parameterize_jobs-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9765da8218537b41aedda252abfa9186", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 6775, "upload_time": "2018-11-30T19:28:03", "url": "https://files.pythonhosted.org/packages/ea/ee/9f0165341ba23d794a418f54a13090dd94c32902839b46ef435b17cb82d8/parameterize_jobs-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9049cc154c0fe45a353cf68ec462ec26", "sha256": "76967e7ab4761a092cffb30b1178746cbf72d2864fdf3c3a359d9b5e2045ec80" }, "downloads": -1, "filename": "parameterize_jobs-0.1.0.tar.gz", "has_sig": false, "md5_digest": "9049cc154c0fe45a353cf68ec462ec26", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20130, "upload_time": "2018-11-30T19:28:05", "url": "https://files.pythonhosted.org/packages/f8/28/10cf08b54a398cdba0a2949d470e6bd09a89bd0a0094d2ca9cd2c602287b/parameterize_jobs-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "e161cbd7e031c3eaf5adc14db6f5c7c5", "sha256": "c11fc61a676bdb8d83e4c749352e713f9839e01a56ddff78a53a1149d79baa09" }, "downloads": -1, "filename": "parameterize_jobs-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e161cbd7e031c3eaf5adc14db6f5c7c5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7096, "upload_time": "2019-08-05T16:43:13", "url": "https://files.pythonhosted.org/packages/20/be/ae0f76e847e1329fbf51c60c80469f9ee2167a7817c47864e2702c68ca0c/parameterize_jobs-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8aa55cf8186e58589ca953e20670d4d7", "sha256": "4556f1390d264723ac926ff69edf7d8a94a141c9e44f4880dfc334dfbc9ad819" }, "downloads": -1, "filename": "parameterize_jobs-0.1.1.tar.gz", "has_sig": false, "md5_digest": "8aa55cf8186e58589ca953e20670d4d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22306, "upload_time": "2019-08-05T16:43:15", "url": "https://files.pythonhosted.org/packages/11/fc/3ecb4382ccffbce845034317b9123e6c87db8489649e65e7e4fc2e3443f0/parameterize_jobs-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e161cbd7e031c3eaf5adc14db6f5c7c5", "sha256": "c11fc61a676bdb8d83e4c749352e713f9839e01a56ddff78a53a1149d79baa09" }, "downloads": -1, "filename": "parameterize_jobs-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e161cbd7e031c3eaf5adc14db6f5c7c5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7096, "upload_time": "2019-08-05T16:43:13", "url": "https://files.pythonhosted.org/packages/20/be/ae0f76e847e1329fbf51c60c80469f9ee2167a7817c47864e2702c68ca0c/parameterize_jobs-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8aa55cf8186e58589ca953e20670d4d7", "sha256": "4556f1390d264723ac926ff69edf7d8a94a141c9e44f4880dfc334dfbc9ad819" }, "downloads": -1, "filename": "parameterize_jobs-0.1.1.tar.gz", "has_sig": false, "md5_digest": "8aa55cf8186e58589ca953e20670d4d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22306, "upload_time": "2019-08-05T16:43:15", "url": "https://files.pythonhosted.org/packages/11/fc/3ecb4382ccffbce845034317b9123e6c87db8489649e65e7e4fc2e3443f0/parameterize_jobs-0.1.1.tar.gz" } ] }