{ "info": { "author": "Stefan Codrescu", "author_email": "stefan.codrescu@noaa.gov", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6" ], "description": "NetCDF Aggregation (ncagg)\n==========================\n\nSo... you want to aggregate time series NetCDF files?\n\nTL;DR\n-----\n\nInstall the utility with with pip:\n\n::\n\n pip install ncagg\n\nOn the command line, use ``ncagg``:\n\n::\n\n Usage: ncagg [OPTIONS] DST [SRC]...\n\n Options:\n -v, --version Show the version and exit.\n --generate_template PATH Print the default template generated for\n PATH and exit.\n -u TEXT Give an Unlimited Dimension Configuration as\n udim:ivar[:hz[:hz]]\n -b TEXT If -u given, specify bounds for ivar as\n min:max or Tstart[:[T]stop]. min and max are\n numerical, otherwise T indicates start and\n stop are times.start and stop are of the\n form YYYY[MM[DD[HH[MM]]]] and of stop is\n omitted,it will be inferred to be the least\n significantly specified date + 1.\n -l [DEBUG|INFO|WARNING|ERROR|CRITICAL]\n log level\n -t FILENAME Specify a configuration template\n --help Show this message and exit.\n\nNotes:\n\n- DST is the filename for the NetCDF output and should not already\n exist, or will be overwritten.\n- SRC is a list of input NetCDF files to aggregate, can be passed on\n the command line or piped to ncagg.\n- -u should specify an Unlimited Dimension Configuration. See below for\n details.\n- Taking tens of minutes for a day is normal, a progress bar will\n indicate time remaining.\n- For fine grained control over the output, specify a configuration\n template (-t). See below for details.\n\nExamples:\n\n::\n\n # explicitly list files to aggregate\n ncagg output_filename.nc file_0.nc file_02.nc #...\n\n # aggregate by globbing all files in some directory\n ncagg output_filename.nc path_to_files/*.nc\n\n # sort the unlimited dimension record_number, according to the variable time\n ncagg -u record_number:time output_filename.nc path_to_files/*.nc\n\n # sort the unlimited dimension record_number, according to the variable time, and insert\n # or remove fill values to ensure time occurrs at 10hz.\n ncagg -u record_number:time:10 output_filename.nc path_to_files/*.nc\n\n # only include time values between 2017-06-01 to 2017-06-02 (bounds), including\n # sorting and filling, as above\n ncagg -u record_number:time:10 -b T20170601:T20170602 output_filename.nc path_to_files/*.nc\n # or equivalently, if only one bound is specified, the end is inferred to be most significant + 1\n ncagg -u record_number:time:10 -b T20170601 output_filename.nc path_to_files/*.nc\n\n # aggregate more files than fit on the command line... (in case of: Argument list too long)\n find /path/to/files -type f -name \"*.nc\" | ncagg output.nc\n\nFor more information, see the Unlimited Dimension Configuration below.\nThe ``ncagg`` Command Line Interface (CLI) builds a Config based on the\narguments specified.\n\nHigh level overview\n-------------------\n\nAggregation works in two stages:\n\n1. Create a Aggregation List describing steps and order of aggregation.\n2. Evaluate the Aggregation List.\n\nThe Aggregation List object is just a list that describes the order in\nwhich to combine components of an aggregation. The objects within the\nlist represent source files, or segments of fill values. Source files\nare associated with sorting and filling instructions within the file.\nFill values indicate where, and how many fill values to create.\n\nDuring stage 1, the Aggregation List is generated. The level of\nconfiguration given determines how much is done here. At most, each file\nis inspected according to it's unlimited dimension and the variable that\nindexes it to determine sorting and filling. No data except for\nindex\\_by variables are read and none written to disk during this stage.\nIf an expected cadence is not provided, filling is not done. If bounds\nare provided, the unlimited dimension is clipped to ensure data is\nincluded only within the bounds. For the minimum configuration given,\nfiles are simply assembed in order of sorted filename.\n\nDuring stage 2, the Aggregation List is evaluated. Evaluating the\nAggregation List means simply iterating over the components contained\nand copying data from these into the output aggregation file, while\nkeeping track of global attributes.\n\nReasons for using this approach:\n\n- Possible to aggregate more data than fits in memory.\n- Sort once per unlimited dimension.\n- Modular code, easier to maintain, extend, and debug.\n\nConfiguration\n-------------\n\nThe sophistication of the aggregation is determine by how much\nconfiguration information is given on generation of the Aggregation\nList.\n\n- No Config -> agg files along unlimited dims, sorted by filename.\n- Config with index\\_by -> agg such that index\\_by is in ascending\n order.\n- Config with index\\_by and bounds -> agg such that index\\_by is in\n ascending order within bounds.\n- Config with index\\_by and expected\\_cadences -> agg and regularize,\n removing duplicates/inserting fills if needed.\n\nThe Config contains information that a NetCDF CDL specification would,\nbut in json format, extended with aggregation configuration information.\nIf not provided, a default version will be created using the first file\nin the list to aggregate.\n\nThe Config contains three properties (keys):\n\n- dimensions\n- variables\n- attributes\n\nEach property is associated with a list of objects so to preserve\nordering. The order in the objects corresponds to the order of\nappearence in the output. Objects of all sections have a \"name\"\nproperty.\n\nDimensions specify the dimensions of the file and has at minimum a\n\"name\", and a \"size\" which can be null for an unlimited dimension.\nUnlimited dimensions may also have an Unlimited Dimension Configuration\nwhich will be described in a dedicated section below.\n\nVariable objects contain a \"name\", \"dimensions\", \"datatype\",\n\"attributes\", and \"chunksizes\". The dimensions property is a list of\ndimension names on which the variable depends, each must be configured\nin the dimensions section. datatype is something like int8, float32,\nstring, etc. Finally, attributes is another property containing key and\nvalues corresponding to variable attributes commonly including \"units\",\n\"valid\\_min\", \"\\_FillValue\", etc.\n\nAttributes objects contain \"name\", \"strategy\", and optionally \"value\"\nfor NetCDF Global Attributes. The strategies are described below.\n\nUnlimited Dimension Configuration\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe Unlimited Dimension Configuration associates a particular unlimited\ndimension with a variable by which it can be indexed. Commonly, a\ndimension named time is associated with a variable also named time which\nindicates some epoch value for all data associated with that index of\nthe dimension.\n\nFor example, a file may have a dimension \"record\\_number\" which is\nindexed by a variable \"time\". Using the Unlimited Dimension\nConfiguration, we can specify to aggregate record\\_number such that the\nvariable \"time\" forms a monotonic sequence increasing at some expected\nfrequency.\n\nHere is what a typical GOES-R L1b product aggregation output looks like:\n\n.. code:: json\n\n {\n \"name\": \"report_number\",\n \"size\": null,\n \"index_by\": \"time\",\n \"expected_cadence\": {\"report_number\": 1},\n }\n\nIn English, the configuration above says \"Order the dimension\nreport\\_number by the values in the variable time, where time values are\nexpected to increase along the dimension report\\_number incrementing at\n1hz.\" This would be specified to the ncagg CLI using\n``ncagg -u report_number:time:1 output.nc in1.nc in2.nc``.\n\nThe configuration allows to even index by multidimensional time (ehem,\nmag with 10 samples per report). On the command line specified as\n``-u report_number:OB_time:1:10``, or as json:\n\n.. code:: json\n\n {\n \"name\": \"report_number\",\n \"size\": null,\n \"index_by\": \"OB_time\",\n \"other_dim_indicies\": {\"samples_per_record\": 0},\n \"expected_cadence\": {\"report_number\": 1, \"number_samples_per_report\": 10},\n }\n\nOne design constraint was to not reshape the data, so above, we order\nthe data by looking at index 0 of samples\\_per\\_record for every value\nalong the report\\_number dimension. We assume that the other timestamps\nalong samples\\_per\\_record are correct. Also, given the configuration\nabove, we only insert fill records of OB\\_time if a full report\\_number\nrecord is missing (all 10 values along the number\\_samples\\_per\\_report\ndimension missing).\n\n--------------\n\nIndexing an unlimited dimension was described above. In addition to\nsimply indexing by a variable, in the case that the variable represents\ntime, a common operation would be to restrict value to some range, to,\nfor example, create a day file. The Unlimited Dimension Configuration\nwould look like:\n\n.. code:: json\n\n {\n \"name\": \"report_number\",\n \"size\": null,\n \"index_by\": \"time\",\n \"min\": 14000000, # in units of the variable \"time\", expected\n \"max\": 14000060, # something like \"seconds since 2000-01-01 12:00:00\"\n \"expected_cadence\": {\"report_number\": 1}\n }\n\nWhich would be specified on the command line as\n``... -u report_number:time:1 -b1400000:14000060 ...`` where the ``-b``\noption stands for \"bounds\".\n\nAs min and max almost exclusively indicate datetime values, for\nconvenience, they are accepted as types: numerical, string, or python\ndatetime. In string representation, they must start with \"T\" and can be\nof the form \"TYYYY[MM[DD[HH[MM]]]]\" where brackets indicate optional and\nif omitted, will be inferred to be minimum valid value, ie: 01 for MM\n(month). A units attribute must available for the index\\_by variable in\nthe form of \" since \". On the command line, string time can be given as\n``... -u report_number:time:1 -bT20170101:T20170102 ...`` or\nequivalently the end bound can be omitted and will be inferred to be the\nrightmost specified of the beginning YYYY[MM[DD[HH[MM]]]] incremented by\none: ie: ``... -u report_number:time:1 -bT20170101 ...``.\n\n--------------\n\nConsider the suvi-l2-flloc (flare location) product which has two\nunlimited dimensions, time and feature\\_number. At any time record,\nthere can exist an arbitrary number of features. Consider a variable\nreporting the flux from each feature at each time:\n``flux(time, feature_number)``. Although feature\\_number is unlimited,\nit is unique to each time and thus needs to be \"flattened\":\n\n::\n\n flux([0], [0]) -> [[3.2e-6]]\n flux([0], [0, 1]) -> [[3.3e-6, 5.4e-7]]\n\n undesired_aggregated_flux(time, feature_number):\n [[3.2e-6, _, _],\n [ _, 3.3e-6, 5.4e-7]]\n\n desired_aggregated_flux(time, feature_number):\n [[3.2e-6, _],\n [3.3e-6, 5.4e-7]]\n\nThe ``desired_aggregated_flux`` is achieved by setting {\"flatten\": true}\nwithin an the unlimited dimension configuration for feature\\_number.\n\n.. code:: json\n\n [{\n \"name\": \"time\",\n \"size\": null,\n \"index_by\": \"time\",\n }, {\n \"name\": \"feature_number\",\n \"size\": null,\n \"flatten\": true,\n }]\n\nSpecify Global Attribute Aggregation Strategies\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe aggregated netcdf file contains global attributes formed from the\nconstituent granules. A number of strategies exist to aggregate Global\nAttributes across the granules. Most are quite self explanatory:\n\n- \"static\": use the configured \"value\" in the template, ignoring any\n values that may be in the file.\n- \"first\": first value seen will be taken as the output value for this\n global attribute\n- \"last\": the last value seen will be taken as global attribute\n- \"unique\\_list\": compile values into a unique list \"first, second,\n etc\"\n- \"int\\_sum\": resulting in integer sum of the inputs\n- \"float\\_sum\": StratFloatSum\n- \"constant\": StratAssertConst, similar to first, but raises an error\n if value changes among input files.\n- \"date\\_created\": simply yeilds the current date when finalized,\n standard dt fmt\n- \"time\\_coverage\\_start\": start bound, if specified, standard dt fmt\n- \"time\\_coverage\\_end\": end bound, if specified, standard dt fmt\n- \"filename\": StratOutputFilename, set attribute to name of output file\n- \"remove\": remove/do not include this global attribute\n- \"first\\_input\": Filename of first file included in aggregate\n- \"last\\_input\": Filename of last file included in aggregate\n- \"input\\_count\": Number of files included in aggregate\n- \"ncagg\\_version\": Version number for the ncagg software running\n\nThe configuration format expects a key \"global attributes\" associated\nwith a list of objects each containing a global attribute name,\nstrategy, and possible value (for static). A list is used to preserve\norder, as the order in the configuration will be the resulting order in\nthe output NetCDF.\n\n.. code:: json\n\n {\n \"global attributes\": [\n {\n \"name\": \"production_site\", \n \"strategy\": \"unique_list\"\n }, {\n \"name\": \"creator\",\n \"strategy\": \"static\",\n \"value\": \"Stefan Codrescu\"\n }, {\n\n ...\n }\n ]\n }\n\nSpecify Dimension Indecies to Extract and Flatten\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nNOT IMPLEMENTED. IN PROGRESS. SUBJECT TO CHANGE.\n\nConsider SEIS SGPS files which contain the data from two sensor units,\n+X and -X. Most variables are of the form var[record\\_number,\nsensor\\_unit, channel, ...]. It is possible to create an aggregate file\nfor the +X and -X sensor units individually using the\ntake\\_dim\\_indicies configuration key.\n\n.. code:: json\n\n {\n \"take_dim_indicies\": {\n \"sensor_unit\": 0\n }\n }\n\nWith the above configuration, sensor\\_unit must be removed from the\ndimensions configuration. Please also ensure that variables do not list\nsensor\\_unit as a dimension, and also update chunk sizes accordingly.\nChunk sizes must be a list of values of the same length as dimensions.\n\nConfiguration Template\n~~~~~~~~~~~~~~~~~~~~~~\n\n``ncagg`` can be configured to output files into a format specified by a\nconfiguration template file. It is expected that this is a json format\nfile. A generic template can be created using the\n``ncagg --generate_template [SAMPLE_NC]`` command. The output of the\ntemplate command is the default template that is used internally if no\ntemplate is specified.\n\nExample usage\n^^^^^^^^^^^^^\n\nUse ``ncagg --generate_template example_netcdf.nc > my_template.json``\nto save the default template for an example\\_netcdf.nc file into\nmy\\_template.nc. Edit my\\_template.json to your liking, then run\naggregation using ``ncagg -t my_template.json [...]``.\n\nTemplate syntax\n^^^^^^^^^^^^^^^\n\nThe template syntax is verbose, but hopefully straightforward and clear.\nThe incoming template will be validated upon initiating an aggregation,\nbut some issues may only be found at runtime.\n\nAttributes\n''''''''''\n\nThe attributes section is a list of objects contianing global\nattributes:\n\n- name: name of global attribute\n- strategy: `aggregation\n strategy <#Specify-Global-Attribute-Aggregation-Strategies>`__ to use\n for attribute.\n- value: value used by strategy, if required. Eg. constant, where the\n value is \"test\".\n\nDimensions\n''''''''''\n\nThe dimensions section is a list of objects containing the dimensions of\nthe file. Most configuration options are covered in `Unlimited Dimension\nConfiguration <#Unlimited-Dimension-Configuration>`__ section, but to\nclarify:\n\n- size: integer if dimension has a fixed size. null if it's unlimited.\n\nVariables\n'''''''''\n\nSimilarly, variables section is a list of objects configuring output\nvariables. Remove the object corresponding to some variable to remove it\nfrom the output.\n\nImportant notes:\n\n- The dimensions referenced must exist.\n- chunksizes must be the same number of elements as dimensions.\n\nTake care that everything is consistent when doing heavy modifications.\n\nUse from code\n-------------\n\nIn addition to the CLI, ``ncagg`` exposes an API which makes it possible\nto call from Python code:\n\n::\n\n from ncagg import aggregate\n aggregate([\"file1.nc\", \"file2.nc\"], \"output.nc\")\n\n``aggregate`` optionally accepts as a third argument a configuration\ntemplate. If none is given, the default template created from the first\ninput file is used. Thus code above is equivalent to:\n\n::\n\n from ncagg import aggregate, Config\n config = Config.from_nc(\"file1.nc\")\n aggregate([\"file1.nc\", \"file2.nc\"], \"output.nc\", config)\n\nThis allows for the possibility of programatically manipulating the\nconfiguration at runtime before performing aggregation.\n\nLimitations\n-----------\n\n- Does not support netCDF4 enum types.\n\nTechnical and Implementation details\n------------------------------------\n\nAn Aggregation List is composed of two types of objects, InputFileNode\nand FillNode objects. These inherit in common from an AbstractNode and\nmust implement the ``get_size_along(unlimited_dim)`` and\n``data_for(var, dim)`` methods. Evaluating an aggregation list is simply\ngoing though the Aggregation List and calling something like:\n\n::\n\n nc_out.variable[var][write_slice] = node.data_for(var)\n\nThe ``data_for`` must return data consistent with the shape promised\nfrom ``node.get_size_along(dim)``.\n\nThe complixity of aggregation comes in handling the dimensions and\nbuilding the aggregation list. In addition to the interface exposed by\nan AbstractNode, each InputFileNode and FillNode implement their own\nspecific functionality.\n\nA FillNode is simpler, and needs to be told how many fills to insert\nalong a certain unlimited dimension and optionally, can be configured to\nreturn values from ``data_for`` that are increasing along multiple\ndimensions according to configured ``expected_cadence`` values from a\ncertain start value.\n\nAn InputFileNode is more complicated and exposes methods to find the\ntime bounds of the file, and additionally, is internally capable of\nsorting itself and inserting fill values into itself. Of course, it\ndoesn't modify the actual input file, this is all done on the fly as\ndata is being read out through ``data_for``. Implementation wise, an\nInputFileNode may contain within itself a mini aggregation list\ncontaining two types of objects: slice and FillNode objects. Similarly\nto the large scale process of aggregating, an InputFileNode returns data\nthat has been assembled according to it's internal aggregation list and\ninternal sorting.\n\nTesting\n-------\n\nThis software is written for aggregation of GOES-R series Space Weather\ndata products (L1b and L2+). As such, it contains extensive tests\nagainst real GOES-16 satellite data. Many \"features\" in this code are\nintended to address \"quirks\" in the ground processing (implemented by a\ncertain contractor...).\n\nTests are in the ``test`` subdirectory. Run all tests with\n\n.. code:: bash\n\n python -m unittest discover \n\nThe code is compatible with Python2 (2.7) and Python3, so unittests\nshould be run with both. One interesting thing I've noticed is the test\nsuite appears to be about 20% faster in Python3 than in Python2.\n\nNote: currently it is expected that 1 test(s) fail. -\ntest.seis.SEISL1bSGPSEAST\\_5min.test\\_SEISL1bSGPS fails because\ndimension subsetting has not been reimplemented after a refactor that\nremoved the feature.\n\nDevelopment\n-----------\n\nSetting up a virtualenv is recommended for development.\n\n::\n\n virtualenv venv\n . venv/bin/activate\n pip install --editable .\n\n--------------\n\nDeploy to pip, after running unittest with both with python2 and\npython3. The ``git stash`` is important so that the build is from a\nclean repo! We don't want any dev or debug changes that are sitting\nunstaged to be included.\n\n.. code:: bash\n\n git stash\n rm -r dist/\n python setup.py bdist_wheel --universal\n twine upload dist/*\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/5tefan/ncagg", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "ncagg", "package_url": "https://pypi.org/project/ncagg/", "platform": "", "project_url": "https://pypi.org/project/ncagg/", "project_urls": { "Documentation": "http://ncagg.readthedocs.io/en/latest/", "Homepage": "https://github.com/5tefan/ncagg" }, "release_url": "https://pypi.org/project/ncagg/0.8.10/", "requires_dist": [ "cerberus", "Click", "numpy", "netCDF4" ], "requires_python": "", "summary": "Utility for aggregation of NetCDF data.", "version": "0.8.10" }, "last_serial": 5157579, "releases": { "0.3.3": [ { "comment_text": "", "digests": { "md5": "eb221ebefa454df8a33f719068b51c30", "sha256": "63fa1c3bbfbd968e235e5ed768ae8208fee7e0ca16cb4433e9440cc0c69fa3a7" }, "downloads": -1, "filename": "ncagg-0.3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "eb221ebefa454df8a33f719068b51c30", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37005, "upload_time": "2017-11-09T00:23:35", "url": "https://files.pythonhosted.org/packages/80/c0/f4177d9201cd29454a284bc457a48c0fae4524e32eafbadee39969fd62b0/ncagg-0.3.3-py2.py3-none-any.whl" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "041224e56c64fab9ac4096561735e212", "sha256": "dc39f439d1765b7ec93652540d9eb10d6fa1fd1f5ce02e9aae3ec80514165e51" }, "downloads": -1, "filename": "ncagg-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "041224e56c64fab9ac4096561735e212", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37627, "upload_time": "2017-11-13T17:39:37", "url": "https://files.pythonhosted.org/packages/d0/e4/3f12f8393dd9c4fccc31bf5e63bd93cbe2c1421fc733a12a26779b41af1d/ncagg-0.4.0-py2.py3-none-any.whl" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "90e542011cb6fb2ae8635e5b70e78853", "sha256": "d95da0dd331d7e75a36dc8791ebf9d4afc326837882a7b8ac5c243d2997b0000" }, "downloads": -1, "filename": "ncagg-0.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "90e542011cb6fb2ae8635e5b70e78853", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 38264, "upload_time": "2017-11-28T21:44:04", "url": "https://files.pythonhosted.org/packages/c7/f5/27c577156289eec718fdc369b5ebe698c9efda0ceb45dcc76628c4ddd67d/ncagg-0.4.1-py2.py3-none-any.whl" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "9a680110c9be90a53640d422e9f6a9b6", "sha256": "7b003e255539b4828df51f301918db7c1b42c09aee8817e09e82b26cac4bea2f" }, "downloads": -1, "filename": "ncagg-0.4.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9a680110c9be90a53640d422e9f6a9b6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 38290, "upload_time": "2017-11-28T21:51:15", "url": "https://files.pythonhosted.org/packages/86/e2/b0db80176340149ebc7c6bdaee7ed69f1ad9d9403cd9e99b638208fe67e7/ncagg-0.4.2-py2.py3-none-any.whl" } ], "0.4.5": [ { "comment_text": "", "digests": { "md5": "832f6504472ce6ca3f31e0a6ce018766", "sha256": "e3ad00fb3725b7f2c5228486aa5cc0d6adedc336f0e9ec277bff3a7b97a7a238" }, "downloads": -1, "filename": "ncagg-0.4.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "832f6504472ce6ca3f31e0a6ce018766", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37265, "upload_time": "2017-12-19T20:57:59", "url": "https://files.pythonhosted.org/packages/93/af/f857aabca37d7bb86e62b28474269c6434f3d9f04676ae739cf9cb901a0c/ncagg-0.4.5-py2.py3-none-any.whl" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "c9d6cc4057179e25d4e920c437762444", "sha256": "f0fd7942c57b68ab613dda463fc4bfb2e78f77d84d87bdb132ace65b52bf94ed" }, "downloads": -1, "filename": "ncagg-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c9d6cc4057179e25d4e920c437762444", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37635, "upload_time": "2018-01-16T23:34:50", "url": "https://files.pythonhosted.org/packages/f5/46/6f7df5b6cb3437af27f795a987e53aeed2314843e96b6810dbc0f57381e0/ncagg-0.5.0-py2.py3-none-any.whl" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "e79daf793da3153d1e73bcaaeaafa5b5", "sha256": "71a80518081e79592805beeee7f541563dae706b68bd8eeeaaee228a05d2d5d5" }, "downloads": -1, "filename": "ncagg-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e79daf793da3153d1e73bcaaeaafa5b5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 36768, "upload_time": "2018-01-24T23:28:23", "url": "https://files.pythonhosted.org/packages/cc/ad/fe671920f511f5bbde27f08671d03015c2534bd3dc047437ef5fd45ba258/ncagg-0.6.0-py2.py3-none-any.whl" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "d046a4cbdc9c152aab7eac11b88200b6", "sha256": "1446d1bda3690361dd678fae9b7f04722ac42d0512f30aa64d746a728269c38c" }, "downloads": -1, "filename": "ncagg-0.6.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d046a4cbdc9c152aab7eac11b88200b6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37027, "upload_time": "2018-02-26T23:48:41", "url": "https://files.pythonhosted.org/packages/4f/a8/646ba8e51f20579dc63945a37ab749f6b5d389360b43071981b168189ff4/ncagg-0.6.1-py2.py3-none-any.whl" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "909b1af46a896ac8d9491d681bb3109a", "sha256": "7ecedfbb1a69891112cea78d6f6be876324cb0b94d4dfd710ea8b991c2497a7f" }, "downloads": -1, "filename": "ncagg-0.6.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "909b1af46a896ac8d9491d681bb3109a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37473, "upload_time": "2018-02-27T23:35:48", "url": "https://files.pythonhosted.org/packages/23/ed/d5aaba8e186a047337830d7b356392342e47f8cd2c2e2273832fcf8a0989/ncagg-0.6.2-py2.py3-none-any.whl" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "e89f5de078817c720922ffe136a2d6ef", "sha256": "b9d464b7a6c44f32a407a79043e1ded8bec0b51a33d8c4e0a1834c7c7e89a911" }, "downloads": -1, "filename": "ncagg-0.6.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e89f5de078817c720922ffe136a2d6ef", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37512, "upload_time": "2018-03-30T18:12:22", "url": "https://files.pythonhosted.org/packages/8d/f2/7397c78971c96d7894a07e40ac1979516f3dd456e7315402873506804aba/ncagg-0.6.3-py2.py3-none-any.whl" } ], "0.6.4": [ { "comment_text": "", "digests": { "md5": "14b1d9f322bdb85447363cf188f70de4", "sha256": "f19ae3d028fb961c9a0b718f69437fb29eb834297a884636e158645266657bf3" }, "downloads": -1, "filename": "ncagg-0.6.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "14b1d9f322bdb85447363cf188f70de4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37871, "upload_time": "2018-05-10T17:13:36", "url": "https://files.pythonhosted.org/packages/3d/ed/9ab3c509fe755b5d66d416fa2851ad64d26cd9c8b1f2f8b7ea955bd7899a/ncagg-0.6.4-py2.py3-none-any.whl" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "7720e3daba15d9006c9f10741f47e319", "sha256": "ec925a20b4ca042fd19aa4b5849810a26fa2d3a9b69c75a1fbd55bf8f8cfd493" }, "downloads": -1, "filename": "ncagg-0.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7720e3daba15d9006c9f10741f47e319", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 38339, "upload_time": "2018-05-25T18:00:28", "url": "https://files.pythonhosted.org/packages/2c/c7/bf3b9949810ea4a8584f92b882c726eb59feffb452f1aa0e199ce4caa48a/ncagg-0.7.0-py2.py3-none-any.whl" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "35de9f67333070dfd30aa73d9fb873eb", "sha256": "4600684e5229cf40cd028ebe4c52f764146587fc629990393038ae9712e7e69b" }, "downloads": -1, "filename": "ncagg-0.7.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "35de9f67333070dfd30aa73d9fb873eb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 38398, "upload_time": "2018-06-07T19:30:05", "url": "https://files.pythonhosted.org/packages/0c/f2/784392665b454df634c55034744a5055a184af65d9261f00c42fb7f52460/ncagg-0.7.1-py2.py3-none-any.whl" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "4367e38aa8e830afb379ab91aebd6e78", "sha256": "b01ef67ae07b4ef7bfa8a6064f9d64ab3fec9007c9efe2df63229aae0faf7447" }, "downloads": -1, "filename": "ncagg-0.8.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4367e38aa8e830afb379ab91aebd6e78", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 38434, "upload_time": "2018-06-29T22:46:32", "url": "https://files.pythonhosted.org/packages/b3/d8/3bd2b1d9503346b511729936c2a25f869acab6a12ea07567e728288f06c1/ncagg-0.8.0-py2.py3-none-any.whl" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "f07cbe91781a98077f647dcc8ee816a4", "sha256": "1bead6475f0b5d0362f06934ce5f169405053b2908aa88172d4211c81f2c54a2" }, "downloads": -1, "filename": "ncagg-0.8.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f07cbe91781a98077f647dcc8ee816a4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 38731, "upload_time": "2018-07-02T19:39:49", "url": "https://files.pythonhosted.org/packages/d7/28/596bfdca8f542688d85fe15eab5d9e9c872743bd9ae46c6a2f6258edf373/ncagg-0.8.1-py2.py3-none-any.whl" } ], "0.8.10": [ { "comment_text": "", "digests": { "md5": "71d3d4f9c8aeefec0b86e8ece73e7e23", "sha256": "1c21b01c007abe32ea043c7c04363adb53eac9b9bf29a01f6daa199cd6506f5b" }, "downloads": -1, "filename": "ncagg-0.8.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "71d3d4f9c8aeefec0b86e8ece73e7e23", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 33987, "upload_time": "2019-04-17T23:27:07", "url": "https://files.pythonhosted.org/packages/1d/82/2f747d77e9aa7b4ff7bf1ce1826f1ad2802b11b0e98ebd29d33e29c07aab/ncagg-0.8.10-py2.py3-none-any.whl" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "d3bbf26af8c0d86d583a4245154b5d65", "sha256": "bc1f499f30d2f2381fb8948469b685ca0c550f6771580867db5410221251023e" }, "downloads": -1, "filename": "ncagg-0.8.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d3bbf26af8c0d86d583a4245154b5d65", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 39520, "upload_time": "2018-07-05T20:19:30", "url": "https://files.pythonhosted.org/packages/ef/be/c8859affd1b9b05355acde4b7f2c72d1b388f443ba8eef20c212ddf2064e/ncagg-0.8.2-py2.py3-none-any.whl" } ], "0.8.3": [ { "comment_text": "", "digests": { "md5": "a87e47a50d8ee9e1d60cb1f31394ba95", "sha256": "7b80fea612af961f66f70a430421d780432ca622994abeff35d0bc9acb8b68ee" }, "downloads": -1, "filename": "ncagg-0.8.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a87e47a50d8ee9e1d60cb1f31394ba95", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 39758, "upload_time": "2018-07-09T18:51:17", "url": "https://files.pythonhosted.org/packages/45/56/61a5c494acb9fc4da797671415eb3fcce6d0f1a7d1e3eb8f8477e09498a3/ncagg-0.8.3-py2.py3-none-any.whl" } ], "0.8.4": [ { "comment_text": "", "digests": { "md5": "bf15cbfe4d02302dce81273d7e24c007", "sha256": "0e98fe4ceca1c6201c4cdcc8a307376e0328c37dc773fbadfc80d011e28f1c38" }, "downloads": -1, "filename": "ncagg-0.8.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bf15cbfe4d02302dce81273d7e24c007", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 39689, "upload_time": "2018-07-18T21:37:37", "url": "https://files.pythonhosted.org/packages/49/64/2e12d3444122d9b77f000f19d3a1f39fe158862b844d6a90bb240c8c0346/ncagg-0.8.4-py2.py3-none-any.whl" } ], "0.8.5": [ { "comment_text": "", "digests": { "md5": "df56543a1e55e5e41210a7dee5e2defb", "sha256": "e2a57ee8ce23015acf8b4af8f9ba332b62574ebe29a734243dc83aeb959fa94a" }, "downloads": -1, "filename": "ncagg-0.8.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "df56543a1e55e5e41210a7dee5e2defb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 32175, "upload_time": "2018-12-28T03:37:16", "url": "https://files.pythonhosted.org/packages/94/a5/0ccaa946dda82b801c173a1ae4443f73a62d413296304ccb6554bd2cb199/ncagg-0.8.5-py2.py3-none-any.whl" } ], "0.8.6": [ { "comment_text": "", "digests": { "md5": "22f2e23767313b46c24891bd6a03c39e", "sha256": "712211aa95f694a1bc4870c7173da3e926ff7c6d396c3e8ad56f92206b040ae6" }, "downloads": -1, "filename": "ncagg-0.8.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "22f2e23767313b46c24891bd6a03c39e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 33693, "upload_time": "2019-02-12T19:40:37", "url": "https://files.pythonhosted.org/packages/88/4c/a69ff148cec3e0c3661c5dbbe4a7a14870da75834c7e7996134a632019e8/ncagg-0.8.6-py2.py3-none-any.whl" } ], "0.8.7": [ { "comment_text": "", "digests": { "md5": "bfecff46bc152ec5d30bfe357177ff07", "sha256": "b0143744a574447af728064bc1078bba99b877d01a48bdad700494cbbd398ef3" }, "downloads": -1, "filename": "ncagg-0.8.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bfecff46bc152ec5d30bfe357177ff07", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 33685, "upload_time": "2019-02-15T21:09:14", "url": "https://files.pythonhosted.org/packages/17/90/bb01be78ee3461171dd99b81f7b69d7fee7977f841ab07f8ff82e165937e/ncagg-0.8.7-py2.py3-none-any.whl" } ], "0.8.8": [ { "comment_text": "", "digests": { "md5": "1b3bd9e95b443db3e1aef4e20dbd1392", "sha256": "520d42d9c5bfda1341da3ee8fcfa45784db580538b623d3e2ff2f3146f8c7f49" }, "downloads": -1, "filename": "ncagg-0.8.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1b3bd9e95b443db3e1aef4e20dbd1392", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 33684, "upload_time": "2019-02-16T00:24:20", "url": "https://files.pythonhosted.org/packages/ff/16/a9d4a9908c35c0403d8cdf1e3cb9e1233810d9cac28a93e87b5aff509bae/ncagg-0.8.8-py2.py3-none-any.whl" } ], "0.8.9": [ { "comment_text": "", "digests": { "md5": "1420c5317bbc8de31decfe3e81166287", "sha256": "c5de24d727987e1a697a6d9f690ff4f7e94e212b8e51e7fd446c57c3183abe66" }, "downloads": -1, "filename": "ncagg-0.8.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1420c5317bbc8de31decfe3e81166287", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 33797, "upload_time": "2019-02-21T01:07:11", "url": "https://files.pythonhosted.org/packages/7e/28/822e8c3d2bd71e2a75a3bd11d19c10a43c4580515aa821c5ea7ac8dc00ae/ncagg-0.8.9-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "71d3d4f9c8aeefec0b86e8ece73e7e23", "sha256": "1c21b01c007abe32ea043c7c04363adb53eac9b9bf29a01f6daa199cd6506f5b" }, "downloads": -1, "filename": "ncagg-0.8.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "71d3d4f9c8aeefec0b86e8ece73e7e23", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 33987, "upload_time": "2019-04-17T23:27:07", "url": "https://files.pythonhosted.org/packages/1d/82/2f747d77e9aa7b4ff7bf1ce1826f1ad2802b11b0e98ebd29d33e29c07aab/ncagg-0.8.10-py2.py3-none-any.whl" } ] }