ntv-pandas


Namentv-pandas JSON
Version 2.0.1 PyPI version JSON
download
home_pagehttps://github.com/loco-philippe/ntv-pandas/blob/main/README.md
SummaryNTV-pandas : A tabular analyzer and a semantic, compact and reversible converter
upload_time2024-05-23 13:19:50
maintainerNone
docs_urlNone
authorPhilippe Thomy
requires_python<4,>=3.10
licenseNone
keywords pandas json-ntv semantic json development environmental data
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ### *NTV-pandas : A tabular analyzer and a semantic, compact and reversible converter*

<img src="https://loco-philippe.github.io/ES/ntv_pandas.png" alt="ntv-pandas" align="middle" style="height:80px;">

For more information, see the [user guide](https://loco-philippe.github.io/ntv-pandas/docs/user_guide.html) or the [github repository](https://github.com/loco-philippe/ntv-pandas).

NTV-pandas is referenced in the [pandas ecosystem](https://pandas.pydata.org/community/ecosystem.html).

# Why a NTV-pandas converter ?

pandas provide IO converters but limitations are present:

- the multidimensional structure is not taken into account,
- the converters are not always reversible (conversion round trip),
- the converters take into account few data types,
- external data types (e.g. TableSchema types) are not included.

pandas does not have a tool for analyzing tabular structures and detecting integrity errors

## main features

The converter integrates:

- interfaces with Xarray, scipp, JSON,
- all the pandas `dtype` and the data-type associated to a JSON representation,
- an always reversible conversion,
- an identification of tabular and multidimensional structure,
- a full compatibility with [Table Schema specification](http://dataprotocols.org/json-table-schema/#field-types-and-formats).

The NTV-pandas converter uses the [semantic NTV format](https://loco-philippe.github.io/ES/JSON%20semantic%20format%20(JSON-NTV).htm)
to include a large set of data types in a JSON representation.

The NTV-pandas analyzer uses the [TAB-analysis](https://github.com/loco-philippe/tab-analysis/blob/main/README.md) tool to analyze and measure the relationships between Fields in DataFrame and the [TAB-dataset](https://github.com/loco-philippe/tab-dataset/blob/main/README.md) to identify integrity errors ([example](https://github.com/loco-philippe/ntv-pandas/tree/main/example#readme)).

The multidimensional converter uses the [NTV-numpy](https://github.com/loco-philippe/ntv-numpy/blob/main/README.md) multidimensional format and interfaces.

NTV-pandas was developped originally in the [NTV project](https://github.com/loco-philippe/NTV)

## multidimensional converter example

In the example below, a Dataframe is converted to Xarray and scipp.

The DataFrame resulting from these conversions are identical to the initial DataFrame (reversibility).

```python
In [1]: import pandas as pd
        import ntv_pandas as npd

In [2]: fruits = {'plants':      ['fruit', 'fruit', 'fruit', 'fruit', 'vegetable', 'vegetable', 'vegetable', 'vegetable'],
                  'plts':        ['fr', 'fr', 'fr', 'fr', 've', 've', 've', 've'],
                  'quantity':    ['1 kg', '10 kg', '1 kg', '10 kg', '1 kg', '10 kg', '1 kg', '10 kg'],
                  'product':     ['apple', 'apple', 'orange', 'orange', 'peppers', 'peppers', 'carrot', 'carrot'],
                  'price':       [1, 10, 2, 20, 1.5, 15, 1.5, 20],
                  'price level': ['low', 'low', 'high', 'high', 'low', 'low', 'high', 'high'],
                  'group':       ['fruit 1', 'fruit 10', 'fruit 1', 'veget', 'veget', 'veget', 'veget', 'veget'],
                  'id':          [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008],
                  'supplier':    ["sup1", "sup1", "sup1", "sup2", "sup2", "sup2", "sup2", "sup1"],
                  'location':    ["fr", "gb", "es", "ch", "gb", "fr", "es", "ch"],
                  'valid':       ["ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok"]}
        df_fruits = pd.DataFrame(fruits)
        df_fruits.npd.analysis(distr=True).partitions()   # return the list of partitions (a partition is a list of dimensions)
Out[2]:
        [['plants', 'quantity', 'price level'],
         ['quantity', 'price level', 'supplier'],
         ['plants', 'location'],
         ['quantity', 'product'],
         ['supplier', 'location'],
         ['id']]

In [3]: kwargs = {'dims':['product', 'quantity'], 'datagroup': False, 'ntv_type': False, 'json_name': False}
        xd_fruits = df_fruits.npd.to_xarray(**kwargs)
        xd_fruits
Out[3]:
        <xarray.Dataset> Size: 976B
        Dimensions:      (product: 4, quantity: 2)
        Coordinates:
        * product      (product) <U7 112B 'apple' 'carrot' 'orange' 'peppers'
        * quantity     (quantity) <U5 40B '1 kg' '10 kg'
        plants       (product) <U9 144B 'fruit' 'vegetable' 'fruit' 'vegetable'
        plts         (product) <U2 32B 'fr' 've' 'fr' 've'
        price level  (product) <U4 64B 'low' 'high' 'high' 'low'
        valid        <U2 8B 'ok'
        Data variables:
        group        (product, quantity) <U8 256B 'fruit 1' 'fruit 10' ... 'veget'
        id           (product, quantity) int64 64B 1001 1002 1007 ... 1004 1005 1006
        location     (product, quantity) <U2 64B 'fr' 'gb' 'es' ... 'ch' 'gb' 'fr'
        price        (product, quantity) float64 64B 1.0 10.0 1.5 ... 20.0 1.5 15.0
        supplier     (product, quantity) <U4 128B 'sup1' 'sup1' ... 'sup2' 'sup2'

In [4]: sc_fruits = df_fruits.npd.to_scipp(**kwargs)
        sc_fruits
Out[4]:
        <scipp.Dataset>
        Dimensions: Sizes[product:4, quantity:2, ]
        Coordinates:
        * plants                     string  [dimensionless]  (product)  ["fruit", "vegetable", "fruit", "vegetable"]
        * plts                       string  [dimensionless]  (product)  ["fr", "ve", "fr", "ve"]
        * price level                string  [dimensionless]  (product)  ["low", "high", "high", "low"]
        * product                    string  [dimensionless]  (product)  ["apple", "carrot", "orange", "peppers"]
        * quantity                   string  [dimensionless]  (quantity) ["1 kg", "10 kg"]
        * valid                      string  [dimensionless]  ()  "ok"
        Data:
          group                      string  [dimensionless]  (product, quantity)  ["fruit 1", "fruit 10", ..., "veget", "veget"]
          id                          int64  [dimensionless]  (product, quantity)  [1001, 1002, ..., 1005, 1006]
          location                   string  [dimensionless]  (product, quantity)  ["fr", "gb", ..., "gb", "fr"]
          price                     float64  [dimensionless]  (product, quantity)  [1, 10, ..., 1.5, 15]
          supplier                   string  [dimensionless]  (product, quantity)  ["sup1", "sup1", ..., "sup2", "sup2"]
```

Reversibility:

```python
In [5]: df_fruits_xd = npd.from_xarray(xd_fruits, **kwargs)
        df_fruits_xd_sort = df_fruits_xd.reset_index()[list(df_fruits.columns)].sort_values(list(df_fruits.columns)).reset_index(drop=True)
        df_fruits_sort = df_fruits.sort_values(list(df_fruits.columns)).reset_index(drop=True)
        df_fruits_xd_sort.equals(df_fruits_sort)
Out[5]:
        True

In [6]: df_fruits_sc = npd.from_scipp(sc_fruits, **kwargs)
        df_fruits_sc_sort = df_fruits_sc.reset_index()[list(df_fruits.columns)].sort_values(list(df_fruits.columns)).reset_index(drop=True)
        df_fruits_sort = df_fruits.sort_values(list(df_fruits.columns)).reset_index(drop=True)
        df_fruits_sc_sort.equals(df_fruits_sort)
Out[6]:
        True
```

## JSON converter example

In the example below, a DataFrame with multiple data types is converted to JSON (first to NTV format and then to Table Schema format).

The DataFrame resulting from these JSON conversions are identical to the initial DataFrame (reversibility).

With the existing JSON interface, these conversions are not possible.

```python
In [1]: from shapely.geometry import Point
        from datetime import date
        import pandas as pd
        import ntv_pandas as npd

In [2]: data = {'index':        [100, 200, 300, 400, 500],
                'dates::date':  [date(1964,1,1), date(1985,2,5), date(2022,1,21), date(1964,1,1), date(1985,2,5)],
                'value':        [10, 10, 20, 20, 30],
                'value32':      pd.Series([12, 12, 22, 22, 32], dtype='int32'),
                'res':          [10, 20, 30, 10, 20],
                'coord::point': [Point(1,2), Point(3,4), Point(5,6), Point(7,8), Point(3,4)],
                'names':        pd.Series(['john', 'eric', 'judith', 'mila', 'hector'], dtype='string'),
                'unique':       True }

In [3]: df = pd.DataFrame(data).set_index('index')
        df.index.name = None

In [4]: df
Out[4]:       dates::date  value  value32  res coord::point   names  unique
        100    1964-01-01     10       12   10  POINT (1 2)    john    True
        200    1985-02-05     10       12   20  POINT (3 4)    eric    True
        300    2022-01-21     20       22   30  POINT (5 6)  judith    True
        400    1964-01-01     20       22   10  POINT (7 8)    mila    True
        500    1985-02-05     30       32   20  POINT (3 4)  hector    True
```

JSON-NTV representation:

```python
In [5]: df_to_json = df.npd.to_json()
        pprint(df_to_json, compact=True, width=120, sort_dicts=False)
Out[5]: {':tab': {'index': [100, 200, 300, 400, 500],
                  'dates::date': ['1964-01-01', '1985-02-05', '2022-01-21', '1964-01-01', '1985-02-05'],
                  'value': [10, 10, 20, 20, 30],
                  'value32::int32': [12, 12, 22, 22, 32],
                  'res': [10, 20, 30, 10, 20],
                  'coord::point': [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0], [3.0, 4.0]],
                  'names::string': ['john', 'eric', 'judith', 'mila', 'hector'],
                  'unique': True}}
```

Reversibility:

```python
In [6]: print(npd.read_json(df_to_json).equals(df))
Out[6]: True
```

Table Schema representation:

```python
In [7]: df_to_table = df.npd.to_json(table=True)
        pprint(df_to_table['data'][0], sort_dicts=False)
Out[7]: {'index': 100,
         'dates': '1964-01-01',
         'value': 10,
         'value32': 12,
         'res': 10,
         'coord': [1.0, 2.0],
         'names': 'john',
         'unique': True}

In [8]: pprint(df_to_table['schema'], sort_dicts=False)
Out[8]: {'fields': [{'name': 'index', 'type': 'integer'},
                    {'name': 'dates', 'type': 'date'},
                    {'name': 'value', 'type': 'integer'},
                    {'name': 'value32', 'type': 'integer', 'format': 'int32'},
                    {'name': 'res', 'type': 'integer'},
                    {'name': 'coord', 'type': 'geopoint', 'format': 'array'},
                    {'name': 'names', 'type': 'string'},
                    {'name': 'unique', 'type': 'boolean'}],
         'primaryKey': ['index'],
         'pandas_version': '1.4.0'}
```

Reversibility:

```python
In [9]: print(npd.read_json(df_to_table).equals(df))
Out[9]: True
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/loco-philippe/ntv-pandas/blob/main/README.md",
    "name": "ntv-pandas",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4,>=3.10",
    "maintainer_email": null,
    "keywords": "pandas, JSON-NTV, semantic JSON, development, environmental data",
    "author": "Philippe Thomy",
    "author_email": "philippe@loco-labs.io",
    "download_url": "https://files.pythonhosted.org/packages/ba/6e/46c7a7f0b113d1ccca4c510ac89425cf62add7defc9f6d703482083ab182/ntv_pandas-2.0.1.tar.gz",
    "platform": null,
    "description": "### *NTV-pandas : A tabular analyzer and a semantic, compact and reversible converter*\r\n\r\n<img src=\"https://loco-philippe.github.io/ES/ntv_pandas.png\" alt=\"ntv-pandas\" align=\"middle\" style=\"height:80px;\">\r\n\r\nFor more information, see the [user guide](https://loco-philippe.github.io/ntv-pandas/docs/user_guide.html) or the [github repository](https://github.com/loco-philippe/ntv-pandas).\r\n\r\nNTV-pandas is referenced in the [pandas ecosystem](https://pandas.pydata.org/community/ecosystem.html).\r\n\r\n# Why a NTV-pandas converter ?\r\n\r\npandas provide IO converters but limitations are present:\r\n\r\n- the multidimensional structure is not taken into account,\r\n- the converters are not always reversible (conversion round trip),\r\n- the converters take into account few data types,\r\n- external data types (e.g. TableSchema types) are not included.\r\n\r\npandas does not have a tool for analyzing tabular structures and detecting integrity errors\r\n\r\n## main features\r\n\r\nThe converter integrates:\r\n\r\n- interfaces with Xarray, scipp, JSON,\r\n- all the pandas `dtype` and the data-type associated to a JSON representation,\r\n- an always reversible conversion,\r\n- an identification of tabular and multidimensional structure,\r\n- a full compatibility with [Table Schema specification](http://dataprotocols.org/json-table-schema/#field-types-and-formats).\r\n\r\nThe NTV-pandas converter uses the [semantic NTV format](https://loco-philippe.github.io/ES/JSON%20semantic%20format%20(JSON-NTV).htm)\r\nto include a large set of data types in a JSON representation.\r\n\r\nThe NTV-pandas analyzer uses the [TAB-analysis](https://github.com/loco-philippe/tab-analysis/blob/main/README.md) tool to analyze and measure the relationships between Fields in DataFrame and the [TAB-dataset](https://github.com/loco-philippe/tab-dataset/blob/main/README.md) to identify integrity errors ([example](https://github.com/loco-philippe/ntv-pandas/tree/main/example#readme)).\r\n\r\nThe multidimensional converter uses the [NTV-numpy](https://github.com/loco-philippe/ntv-numpy/blob/main/README.md) multidimensional format and interfaces.\r\n\r\nNTV-pandas was developped originally in the [NTV project](https://github.com/loco-philippe/NTV)\r\n\r\n## multidimensional converter example\r\n\r\nIn the example below, a Dataframe is converted to Xarray and scipp.\r\n\r\nThe DataFrame resulting from these conversions are identical to the initial DataFrame (reversibility).\r\n\r\n```python\r\nIn [1]: import pandas as pd\r\n        import ntv_pandas as npd\r\n\r\nIn [2]: fruits = {'plants':      ['fruit', 'fruit', 'fruit', 'fruit', 'vegetable', 'vegetable', 'vegetable', 'vegetable'],\r\n                  'plts':        ['fr', 'fr', 'fr', 'fr', 've', 've', 've', 've'],\r\n                  'quantity':    ['1 kg', '10 kg', '1 kg', '10 kg', '1 kg', '10 kg', '1 kg', '10 kg'],\r\n                  'product':     ['apple', 'apple', 'orange', 'orange', 'peppers', 'peppers', 'carrot', 'carrot'],\r\n                  'price':       [1, 10, 2, 20, 1.5, 15, 1.5, 20],\r\n                  'price level': ['low', 'low', 'high', 'high', 'low', 'low', 'high', 'high'],\r\n                  'group':       ['fruit 1', 'fruit 10', 'fruit 1', 'veget', 'veget', 'veget', 'veget', 'veget'],\r\n                  'id':          [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008],\r\n                  'supplier':    [\"sup1\", \"sup1\", \"sup1\", \"sup2\", \"sup2\", \"sup2\", \"sup2\", \"sup1\"],\r\n                  'location':    [\"fr\", \"gb\", \"es\", \"ch\", \"gb\", \"fr\", \"es\", \"ch\"],\r\n                  'valid':       [\"ok\", \"ok\", \"ok\", \"ok\", \"ok\", \"ok\", \"ok\", \"ok\"]}\r\n        df_fruits = pd.DataFrame(fruits)\r\n        df_fruits.npd.analysis(distr=True).partitions()   # return the list of partitions (a partition is a list of dimensions)\r\nOut[2]:\r\n        [['plants', 'quantity', 'price level'],\r\n         ['quantity', 'price level', 'supplier'],\r\n         ['plants', 'location'],\r\n         ['quantity', 'product'],\r\n         ['supplier', 'location'],\r\n         ['id']]\r\n\r\nIn [3]: kwargs = {'dims':['product', 'quantity'], 'datagroup': False, 'ntv_type': False, 'json_name': False}\r\n        xd_fruits = df_fruits.npd.to_xarray(**kwargs)\r\n        xd_fruits\r\nOut[3]:\r\n        <xarray.Dataset> Size: 976B\r\n        Dimensions:      (product: 4, quantity: 2)\r\n        Coordinates:\r\n        * product      (product) <U7 112B 'apple' 'carrot' 'orange' 'peppers'\r\n        * quantity     (quantity) <U5 40B '1 kg' '10 kg'\r\n        plants       (product) <U9 144B 'fruit' 'vegetable' 'fruit' 'vegetable'\r\n        plts         (product) <U2 32B 'fr' 've' 'fr' 've'\r\n        price level  (product) <U4 64B 'low' 'high' 'high' 'low'\r\n        valid        <U2 8B 'ok'\r\n        Data variables:\r\n        group        (product, quantity) <U8 256B 'fruit 1' 'fruit 10' ... 'veget'\r\n        id           (product, quantity) int64 64B 1001 1002 1007 ... 1004 1005 1006\r\n        location     (product, quantity) <U2 64B 'fr' 'gb' 'es' ... 'ch' 'gb' 'fr'\r\n        price        (product, quantity) float64 64B 1.0 10.0 1.5 ... 20.0 1.5 15.0\r\n        supplier     (product, quantity) <U4 128B 'sup1' 'sup1' ... 'sup2' 'sup2'\r\n\r\nIn [4]: sc_fruits = df_fruits.npd.to_scipp(**kwargs)\r\n        sc_fruits\r\nOut[4]:\r\n        <scipp.Dataset>\r\n        Dimensions: Sizes[product:4, quantity:2, ]\r\n        Coordinates:\r\n        * plants                     string  [dimensionless]  (product)  [\"fruit\", \"vegetable\", \"fruit\", \"vegetable\"]\r\n        * plts                       string  [dimensionless]  (product)  [\"fr\", \"ve\", \"fr\", \"ve\"]\r\n        * price level                string  [dimensionless]  (product)  [\"low\", \"high\", \"high\", \"low\"]\r\n        * product                    string  [dimensionless]  (product)  [\"apple\", \"carrot\", \"orange\", \"peppers\"]\r\n        * quantity                   string  [dimensionless]  (quantity) [\"1 kg\", \"10 kg\"]\r\n        * valid                      string  [dimensionless]  ()  \"ok\"\r\n        Data:\r\n          group                      string  [dimensionless]  (product, quantity)  [\"fruit 1\", \"fruit 10\", ..., \"veget\", \"veget\"]\r\n          id                          int64  [dimensionless]  (product, quantity)  [1001, 1002, ..., 1005, 1006]\r\n          location                   string  [dimensionless]  (product, quantity)  [\"fr\", \"gb\", ..., \"gb\", \"fr\"]\r\n          price                     float64  [dimensionless]  (product, quantity)  [1, 10, ..., 1.5, 15]\r\n          supplier                   string  [dimensionless]  (product, quantity)  [\"sup1\", \"sup1\", ..., \"sup2\", \"sup2\"]\r\n```\r\n\r\nReversibility:\r\n\r\n```python\r\nIn [5]: df_fruits_xd = npd.from_xarray(xd_fruits, **kwargs)\r\n        df_fruits_xd_sort = df_fruits_xd.reset_index()[list(df_fruits.columns)].sort_values(list(df_fruits.columns)).reset_index(drop=True)\r\n        df_fruits_sort = df_fruits.sort_values(list(df_fruits.columns)).reset_index(drop=True)\r\n        df_fruits_xd_sort.equals(df_fruits_sort)\r\nOut[5]:\r\n        True\r\n\r\nIn [6]: df_fruits_sc = npd.from_scipp(sc_fruits, **kwargs)\r\n        df_fruits_sc_sort = df_fruits_sc.reset_index()[list(df_fruits.columns)].sort_values(list(df_fruits.columns)).reset_index(drop=True)\r\n        df_fruits_sort = df_fruits.sort_values(list(df_fruits.columns)).reset_index(drop=True)\r\n        df_fruits_sc_sort.equals(df_fruits_sort)\r\nOut[6]:\r\n        True\r\n```\r\n\r\n## JSON converter example\r\n\r\nIn the example below, a DataFrame with multiple data types is converted to JSON (first to NTV format and then to Table Schema format).\r\n\r\nThe DataFrame resulting from these JSON conversions are identical to the initial DataFrame (reversibility).\r\n\r\nWith the existing JSON interface, these conversions are not possible.\r\n\r\n```python\r\nIn [1]: from shapely.geometry import Point\r\n        from datetime import date\r\n        import pandas as pd\r\n        import ntv_pandas as npd\r\n\r\nIn [2]: data = {'index':        [100, 200, 300, 400, 500],\r\n                'dates::date':  [date(1964,1,1), date(1985,2,5), date(2022,1,21), date(1964,1,1), date(1985,2,5)],\r\n                'value':        [10, 10, 20, 20, 30],\r\n                'value32':      pd.Series([12, 12, 22, 22, 32], dtype='int32'),\r\n                'res':          [10, 20, 30, 10, 20],\r\n                'coord::point': [Point(1,2), Point(3,4), Point(5,6), Point(7,8), Point(3,4)],\r\n                'names':        pd.Series(['john', 'eric', 'judith', 'mila', 'hector'], dtype='string'),\r\n                'unique':       True }\r\n\r\nIn [3]: df = pd.DataFrame(data).set_index('index')\r\n        df.index.name = None\r\n\r\nIn [4]: df\r\nOut[4]:       dates::date  value  value32  res coord::point   names  unique\r\n        100    1964-01-01     10       12   10  POINT (1 2)    john    True\r\n        200    1985-02-05     10       12   20  POINT (3 4)    eric    True\r\n        300    2022-01-21     20       22   30  POINT (5 6)  judith    True\r\n        400    1964-01-01     20       22   10  POINT (7 8)    mila    True\r\n        500    1985-02-05     30       32   20  POINT (3 4)  hector    True\r\n```\r\n\r\nJSON-NTV representation:\r\n\r\n```python\r\nIn [5]: df_to_json = df.npd.to_json()\r\n        pprint(df_to_json, compact=True, width=120, sort_dicts=False)\r\nOut[5]: {':tab': {'index': [100, 200, 300, 400, 500],\r\n                  'dates::date': ['1964-01-01', '1985-02-05', '2022-01-21', '1964-01-01', '1985-02-05'],\r\n                  'value': [10, 10, 20, 20, 30],\r\n                  'value32::int32': [12, 12, 22, 22, 32],\r\n                  'res': [10, 20, 30, 10, 20],\r\n                  'coord::point': [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0], [3.0, 4.0]],\r\n                  'names::string': ['john', 'eric', 'judith', 'mila', 'hector'],\r\n                  'unique': True}}\r\n```\r\n\r\nReversibility:\r\n\r\n```python\r\nIn [6]: print(npd.read_json(df_to_json).equals(df))\r\nOut[6]: True\r\n```\r\n\r\nTable Schema representation:\r\n\r\n```python\r\nIn [7]: df_to_table = df.npd.to_json(table=True)\r\n        pprint(df_to_table['data'][0], sort_dicts=False)\r\nOut[7]: {'index': 100,\r\n         'dates': '1964-01-01',\r\n         'value': 10,\r\n         'value32': 12,\r\n         'res': 10,\r\n         'coord': [1.0, 2.0],\r\n         'names': 'john',\r\n         'unique': True}\r\n\r\nIn [8]: pprint(df_to_table['schema'], sort_dicts=False)\r\nOut[8]: {'fields': [{'name': 'index', 'type': 'integer'},\r\n                    {'name': 'dates', 'type': 'date'},\r\n                    {'name': 'value', 'type': 'integer'},\r\n                    {'name': 'value32', 'type': 'integer', 'format': 'int32'},\r\n                    {'name': 'res', 'type': 'integer'},\r\n                    {'name': 'coord', 'type': 'geopoint', 'format': 'array'},\r\n                    {'name': 'names', 'type': 'string'},\r\n                    {'name': 'unique', 'type': 'boolean'}],\r\n         'primaryKey': ['index'],\r\n         'pandas_version': '1.4.0'}\r\n```\r\n\r\nReversibility:\r\n\r\n```python\r\nIn [9]: print(npd.read_json(df_to_table).equals(df))\r\nOut[9]: True\r\n```\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "NTV-pandas : A tabular analyzer and a semantic, compact and reversible converter",
    "version": "2.0.1",
    "project_urls": {
        "Homepage": "https://github.com/loco-philippe/ntv-pandas/blob/main/README.md"
    },
    "split_keywords": [
        "pandas",
        " json-ntv",
        " semantic json",
        " development",
        " environmental data"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "365e610c5d2b794aa057eebe0aee9778d85256766c12f446214536faddc12974",
                "md5": "99e5ea6810d62b7dfc17ab6cca886b9e",
                "sha256": "2b2899474fdf29ace4b4203f51167475d2a33ff32dd9a9b0680930b069f51322"
            },
            "downloads": -1,
            "filename": "ntv_pandas-2.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "99e5ea6810d62b7dfc17ab6cca886b9e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4,>=3.10",
            "size": 15879,
            "upload_time": "2024-05-23T13:19:48",
            "upload_time_iso_8601": "2024-05-23T13:19:48.294816Z",
            "url": "https://files.pythonhosted.org/packages/36/5e/610c5d2b794aa057eebe0aee9778d85256766c12f446214536faddc12974/ntv_pandas-2.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ba6e46c7a7f0b113d1ccca4c510ac89425cf62add7defc9f6d703482083ab182",
                "md5": "a4c68b03859c1f5c2be5cb6b5c054594",
                "sha256": "ec788acefe7f6468ee93aa0473005d99eb0021a751967945b307003be4b57f50"
            },
            "downloads": -1,
            "filename": "ntv_pandas-2.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "a4c68b03859c1f5c2be5cb6b5c054594",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4,>=3.10",
            "size": 20722,
            "upload_time": "2024-05-23T13:19:50",
            "upload_time_iso_8601": "2024-05-23T13:19:50.091411Z",
            "url": "https://files.pythonhosted.org/packages/ba/6e/46c7a7f0b113d1ccca4c510ac89425cf62add7defc9f6d703482083ab182/ntv_pandas-2.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-23 13:19:50",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "loco-philippe",
    "github_project": "ntv-pandas",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "ntv-pandas"
}
        
Elapsed time: 0.24715s