REaLTabFormer


NameREaLTabFormer JSON
Version 0.1.7 PyPI version JSON
download
home_pageNone
SummaryA novel method for generating tabular and relational data using language models.
upload_time2024-04-28 18:00:11
maintainerNone
docs_urlNone
authorNone
requires_python>=3.7
licenseMIT License Copyright (c) 2022 Aivin V. Solatorio Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords realtabformer deep learning tabular data transformers data generation seq2seq model synthetic data pytorch language models synthetic data generation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <a href="https://colab.research.google.com/github/avsolatorio/RealTabFormer/blob/main/colab/REaLTabFormer_GeoValidator_Example.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a>

# REaLTabFormer

The REaLTabFormer (Realistic Relational and Tabular Data using Transformers) offers a unified framework for synthesizing tabular data of different types. A sequence-to-sequence (Seq2Seq) model is used for generating synthetic relational datasets. The REaLTabFormer model for a non-relational tabular data uses GPT-2, and can be used out-of-the-box to model any tabular data with independent observations.
<br>
<br>
<p align="center">
<img src="https://github.com/avsolatorio/RealTabFormer/raw/main/img/REalTabFormer_Final_EQ.png" style="width:75%"/>
</p>
<p align="center">
<strong>REaLTabFormer: Generating Realistic Relational and Tabular Data using Transformers</strong>
<br>
<a href="https://arxiv.org/abs/2302.02041">Paper on ArXiv</a>
</p>
<br>
<!---
Tabular data is a common form of organizing data. Multiple models are available to generate synthetic tabular datasets where observations are independent, but few have the ability to produce relational datasets. Modeling relational data is challenging as it requires modeling both a "parent" table and its relationships across tables. We introduce REaLTabFormer (Realistic Relational and Tabular Transformer), a tabular and relational synthetic data generation model. It first creates a parent table using an autoregressive GPT-2 model, then generates the relational dataset conditioned on the parent table using a sequence-to-sequence (Seq2Seq) model. We implement target masking to prevent data copying and propose the $Q_\delta$ statistic and statistical bootstrapping to detect overfitting. Experiments using real-world datasets show that REaLTabFormer captures the relational structure better than a baseline model. REaLTabFormer also achieves state-of-the-art results on prediction tasks, "out-of-the-box", for large non-relational datasets without needing fine-tuning. --->


## Installation

REaLTabFormer is available on PyPi and can be easily installed with [pip](https://pypi.org/project/pip/) (Python version >= 3.7):

```bash
pip install realtabformer
```

## Usage

We show examples of using the REaLTabFormer for modeling and generating synthetic data from a trained model.

### REaLTabFormer for regular tabular data


```Python
# pip install realtabformer
import pandas as pd
from realtabformer import REaLTabFormer

df = pd.read_csv("foo.csv")

# NOTE: Remove any unique identifiers in the
# data that you don't want to be modeled.

# Non-relational or parent table.
rtf_model = REaLTabFormer(
    model_type="tabular",
    gradient_accumulation_steps=4,
    logging_steps=100)

# Fit the model on the dataset.
# Additional parameters can be
# passed to the `.fit` method.
rtf_model.fit(df)

# Save the model to the current directory.
# A new directory `rtf_model/` will be created.
# In it, a directory with the model's
# experiment id `idXXXX` will also be created
# where the artefacts of the model will be stored.
rtf_model.save("rtf_model/")

# Generate synthetic data with the same
# number of observations as the real dataset.
samples = rtf_model.sample(n_samples=len(df))

# Load the saved model. The directory to the
# experiment must be provided.
rtf_model2 = REaLTabFormer.load_from_dir(
    path="rtf_model/idXXXX")
```


### REaLTabFormer for relational data

```Python
# pip install realtabformer
import os
import pandas as pd
from pathlib import Path
from realtabformer import REaLTabFormer

parent_df = pd.read_csv("foo.csv")
child_df = pd.read_csv("bar.csv")
join_on = "unique_id"

# Make sure that the key columns in both the
# parent and the child table have the same name.
assert ((join_on in parent_df.columns) and
        (join_on in child_df.columns))

# Non-relational or parent table. Don't include the
# unique_id field.
parent_model = REaLTabFormer(model_type="tabular")
parent_model.fit(parent_df.drop(join_on, axis=1))

pdir = Path("rtf_parent/")
parent_model.save(pdir)

# # Get the most recently saved parent model,
# # or a specify some other saved model.
# parent_model_path = pdir / "idXXX"
parent_model_path = sorted([
    p for p in pdir.glob("id*") if p.is_dir()],
    key=os.path.getmtime)[-1]

child_model = REaLTabFormer(
    model_type="relational",
    parent_realtabformer_path=parent_model_path,
    output_max_length=None,
    train_size=0.8)

child_model.fit(
    df=child_df,
    in_df=parent_df,
    join_on=join_on)

# Generate parent samples.
parent_samples = parent_model.sample(len(parend_df))

# Create the unique ids based on the index.
parent_samples.index.name = join_on
parent_samples = parent_samples.reset_index()

# Generate the relational observations.
child_samples = child_model.sample(
    input_unique_ids=parent_samples[join_on],
    input_df=parent_samples.drop(join_on, axis=1),
    gen_batch=64)

```

## Validators for synthetic samples

The REaLTabFormer framework provides an interface to easily build observation validators for filtering invalid synthetic samples. We show an example of using the `GeoValidator` below. The chart on the left shows the distribution of the generated latitude and longitude without validation. The chart on the right shows the synthetic samples with observations that have been validated using the `GeoValidator` with the California boundary. Still, even when we did not optimally train the model for generating this, the invalid samples (falling outside of the boundary) are scarce from the generated data with no validator.

<div align=center>
    <img src="https://github.com/avsolatorio/RealTabFormer/raw/main/img/CA-housing-raw-samples.png" style="width:35%; padding-right:5%;"/>
    <img src="https://github.com/avsolatorio/RealTabFormer/raw/main/img/CA-housing-validated-samples.png" style="width:35%; padding-left:5%;"/>
</div>
<br>

```Python
# !pip install geopandas &> /dev/null
# !pip install realtabformer &> /dev/null
# !git clone https://github.com/joncutrer/geopandas-tutorial.git &> /dev/null
import geopandas
import seaborn as sns
import matplotlib.pyplot as plt
from realtabformer import REaLTabFormer
from realtabformer import rtf_validators as rtf_val
from shapely.geometry import Polygon, LineString, Point, MultiPolygon
from sklearn.datasets import fetch_california_housing


def plot_sf(data, samples, title=None):
    xlims = (-126, -113.5)
    ylims = (31, 43)
    bins = (50, 50)

    dd = samples.copy()
    pp = dd.loc[
        dd["Longitude"].between(data["Longitude"].min(), data["Longitude"].max()) &
        dd["Latitude"].between(data["Latitude"].min(), data["Latitude"].max())
    ]

    g = sns.JointGrid(data=pp, x="Longitude", y="Latitude", marginal_ticks=True)
    g.plot_joint(
        sns.histplot,
        bins=bins,
    )

    states[states['NAME'] == 'California'].boundary.plot(ax=g.ax_joint)
    g.ax_joint.set_xlim(*xlims)
    g.ax_joint.set_ylim(*ylims)

    g.plot_marginals(sns.histplot, element="step", color="#03012d")

    if title:
        g.ax_joint.set_title(title)

    plt.tight_layout()

# Get geographic files
states = geopandas.read_file('geopandas-tutorial/data/usa-states-census-2014.shp')
states = states.to_crs("EPSG:4326")  # GPS Projection

# Get the California housing dataset
data = fetch_california_housing(as_frame=True).frame

# We create a model with small epochs for the demo, default is 200.
rtf_model = REaLTabFormer(
    model_type="tabular",
    batch_size=64,
    epochs=10,
    gradient_accumulation_steps=4,
    logging_steps=100)

# Fit the specified model. We also reduce the num_bootstrap, default is 500.
rtf_model.fit(data, num_bootstrap=10)

# Save the trained model
rtf_model.save("rtf_model/")

# Sample raw data without validator
samples_raw = rtf_model.sample(n_samples=10240, gen_batch=512)

# Sample data with the geographic validator
obs_validator = rtf_val.ObservationValidator()
obs_validator.add_validator(
    "geo_validator",
    rtf_val.GeoValidator(
        MultiPolygon(states[states['NAME'] == 'California'].geometry[0])),
    ("Longitude", "Latitude")
)

samples_validated = rtf_model.sample(
    n_samples=10240, gen_batch=512,
    validator=obs_validator,
)

# Visualize the samples
plot_sf(data, samples_raw, title="Raw samples")
plot_sf(data, samples_validated, title="Validated samples")
```

## Citation

Please cite our work if you use the REaLTabFormer in your projects or research.

``` bibtex
@article{solatorio2023realtabformer,
  title={REaLTabFormer: Generating Realistic Relational and Tabular Data using Transformers},
  author={Solatorio, Aivin V. and Dupriez, Olivier},
  journal={arXiv preprint arXiv:2302.02041},
  year={2023}
}
```

## Acknowledgments

We thank the [World Bank-UNHCR Joint Data Center on Forced Displacement (JDC)](https://www.jointdatacenter.org/) for funding the project "Enhancing Responsible Microdata Access to Improve
Policy and Response in Forced Displacement Situations" (KP-P174174-GINP-TF0B5124). A part of the fund went into supporting the development of the REaLTabFormer framework which was used to generate the synthetic population for research on disclosure risk and the mosaic effect.

We also send :hugs: to the [HuggingFace](https://huggingface.co/) :hugs: for all the open-sourced software they release. And to all open-sourced projects, thank you!

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "REaLTabFormer",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "REaLTabFormer, deep learning, tabular data, transformers, data generation, seq2seq model, synthetic data, pytorch, language models, synthetic data generation",
    "author": null,
    "author_email": "\"Aivin V. Solatorio\" <asolatorio@worldbank.org>",
    "download_url": "https://files.pythonhosted.org/packages/39/ae/a0ba0056bbd57464d3d9aaa9372e25e73ee704d7987da7857837cd0f2ad6/REaLTabFormer-0.1.7.tar.gz",
    "platform": null,
    "description": "<a href=\"https://colab.research.google.com/github/avsolatorio/RealTabFormer/blob/main/colab/REaLTabFormer_GeoValidator_Example.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>\n\n# REaLTabFormer\n\nThe REaLTabFormer (Realistic Relational and Tabular Data using Transformers) offers a unified framework for synthesizing tabular data of different types. A sequence-to-sequence (Seq2Seq) model is used for generating synthetic relational datasets. The REaLTabFormer model for a non-relational tabular data uses GPT-2, and can be used out-of-the-box to model any tabular data with independent observations.\n<br>\n<br>\n<p align=\"center\">\n<img src=\"https://github.com/avsolatorio/RealTabFormer/raw/main/img/REalTabFormer_Final_EQ.png\" style=\"width:75%\"/>\n</p>\n<p align=\"center\">\n<strong>REaLTabFormer: Generating Realistic Relational and Tabular Data using Transformers</strong>\n<br>\n<a href=\"https://arxiv.org/abs/2302.02041\">Paper on ArXiv</a>\n</p>\n<br>\n<!---\nTabular data is a common form of organizing data. Multiple models are available to generate synthetic tabular datasets where observations are independent, but few have the ability to produce relational datasets. Modeling relational data is challenging as it requires modeling both a \"parent\" table and its relationships across tables. We introduce REaLTabFormer (Realistic Relational and Tabular Transformer), a tabular and relational synthetic data generation model. It first creates a parent table using an autoregressive GPT-2 model, then generates the relational dataset conditioned on the parent table using a sequence-to-sequence (Seq2Seq) model. We implement target masking to prevent data copying and propose the $Q_\\delta$ statistic and statistical bootstrapping to detect overfitting. Experiments using real-world datasets show that REaLTabFormer captures the relational structure better than a baseline model. REaLTabFormer also achieves state-of-the-art results on prediction tasks, \"out-of-the-box\", for large non-relational datasets without needing fine-tuning. --->\n\n\n## Installation\n\nREaLTabFormer is available on PyPi and can be easily installed with [pip](https://pypi.org/project/pip/) (Python version >= 3.7):\n\n```bash\npip install realtabformer\n```\n\n## Usage\n\nWe show examples of using the REaLTabFormer for modeling and generating synthetic data from a trained model.\n\n### REaLTabFormer for regular tabular data\n\n\n```Python\n# pip install realtabformer\nimport pandas as pd\nfrom realtabformer import REaLTabFormer\n\ndf = pd.read_csv(\"foo.csv\")\n\n# NOTE: Remove any unique identifiers in the\n# data that you don't want to be modeled.\n\n# Non-relational or parent table.\nrtf_model = REaLTabFormer(\n    model_type=\"tabular\",\n    gradient_accumulation_steps=4,\n    logging_steps=100)\n\n# Fit the model on the dataset.\n# Additional parameters can be\n# passed to the `.fit` method.\nrtf_model.fit(df)\n\n# Save the model to the current directory.\n# A new directory `rtf_model/` will be created.\n# In it, a directory with the model's\n# experiment id `idXXXX` will also be created\n# where the artefacts of the model will be stored.\nrtf_model.save(\"rtf_model/\")\n\n# Generate synthetic data with the same\n# number of observations as the real dataset.\nsamples = rtf_model.sample(n_samples=len(df))\n\n# Load the saved model. The directory to the\n# experiment must be provided.\nrtf_model2 = REaLTabFormer.load_from_dir(\n    path=\"rtf_model/idXXXX\")\n```\n\n\n### REaLTabFormer for relational data\n\n```Python\n# pip install realtabformer\nimport os\nimport pandas as pd\nfrom pathlib import Path\nfrom realtabformer import REaLTabFormer\n\nparent_df = pd.read_csv(\"foo.csv\")\nchild_df = pd.read_csv(\"bar.csv\")\njoin_on = \"unique_id\"\n\n# Make sure that the key columns in both the\n# parent and the child table have the same name.\nassert ((join_on in parent_df.columns) and\n        (join_on in child_df.columns))\n\n# Non-relational or parent table. Don't include the\n# unique_id field.\nparent_model = REaLTabFormer(model_type=\"tabular\")\nparent_model.fit(parent_df.drop(join_on, axis=1))\n\npdir = Path(\"rtf_parent/\")\nparent_model.save(pdir)\n\n# # Get the most recently saved parent model,\n# # or a specify some other saved model.\n# parent_model_path = pdir / \"idXXX\"\nparent_model_path = sorted([\n    p for p in pdir.glob(\"id*\") if p.is_dir()],\n    key=os.path.getmtime)[-1]\n\nchild_model = REaLTabFormer(\n    model_type=\"relational\",\n    parent_realtabformer_path=parent_model_path,\n    output_max_length=None,\n    train_size=0.8)\n\nchild_model.fit(\n    df=child_df,\n    in_df=parent_df,\n    join_on=join_on)\n\n# Generate parent samples.\nparent_samples = parent_model.sample(len(parend_df))\n\n# Create the unique ids based on the index.\nparent_samples.index.name = join_on\nparent_samples = parent_samples.reset_index()\n\n# Generate the relational observations.\nchild_samples = child_model.sample(\n    input_unique_ids=parent_samples[join_on],\n    input_df=parent_samples.drop(join_on, axis=1),\n    gen_batch=64)\n\n```\n\n## Validators for synthetic samples\n\nThe REaLTabFormer framework provides an interface to easily build observation validators for filtering invalid synthetic samples. We show an example of using the `GeoValidator` below. The chart on the left shows the distribution of the generated latitude and longitude without validation. The chart on the right shows the synthetic samples with observations that have been validated using the `GeoValidator` with the California boundary. Still, even when we did not optimally train the model for generating this, the invalid samples (falling outside of the boundary) are scarce from the generated data with no validator.\n\n<div align=center>\n    <img src=\"https://github.com/avsolatorio/RealTabFormer/raw/main/img/CA-housing-raw-samples.png\" style=\"width:35%; padding-right:5%;\"/>\n    <img src=\"https://github.com/avsolatorio/RealTabFormer/raw/main/img/CA-housing-validated-samples.png\" style=\"width:35%; padding-left:5%;\"/>\n</div>\n<br>\n\n```Python\n# !pip install geopandas &> /dev/null\n# !pip install realtabformer &> /dev/null\n# !git clone https://github.com/joncutrer/geopandas-tutorial.git &> /dev/null\nimport geopandas\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom realtabformer import REaLTabFormer\nfrom realtabformer import rtf_validators as rtf_val\nfrom shapely.geometry import Polygon, LineString, Point, MultiPolygon\nfrom sklearn.datasets import fetch_california_housing\n\n\ndef plot_sf(data, samples, title=None):\n    xlims = (-126, -113.5)\n    ylims = (31, 43)\n    bins = (50, 50)\n\n    dd = samples.copy()\n    pp = dd.loc[\n        dd[\"Longitude\"].between(data[\"Longitude\"].min(), data[\"Longitude\"].max()) &\n        dd[\"Latitude\"].between(data[\"Latitude\"].min(), data[\"Latitude\"].max())\n    ]\n\n    g = sns.JointGrid(data=pp, x=\"Longitude\", y=\"Latitude\", marginal_ticks=True)\n    g.plot_joint(\n        sns.histplot,\n        bins=bins,\n    )\n\n    states[states['NAME'] == 'California'].boundary.plot(ax=g.ax_joint)\n    g.ax_joint.set_xlim(*xlims)\n    g.ax_joint.set_ylim(*ylims)\n\n    g.plot_marginals(sns.histplot, element=\"step\", color=\"#03012d\")\n\n    if title:\n        g.ax_joint.set_title(title)\n\n    plt.tight_layout()\n\n# Get geographic files\nstates = geopandas.read_file('geopandas-tutorial/data/usa-states-census-2014.shp')\nstates = states.to_crs(\"EPSG:4326\")  # GPS Projection\n\n# Get the California housing dataset\ndata = fetch_california_housing(as_frame=True).frame\n\n# We create a model with small epochs for the demo, default is 200.\nrtf_model = REaLTabFormer(\n    model_type=\"tabular\",\n    batch_size=64,\n    epochs=10,\n    gradient_accumulation_steps=4,\n    logging_steps=100)\n\n# Fit the specified model. We also reduce the num_bootstrap, default is 500.\nrtf_model.fit(data, num_bootstrap=10)\n\n# Save the trained model\nrtf_model.save(\"rtf_model/\")\n\n# Sample raw data without validator\nsamples_raw = rtf_model.sample(n_samples=10240, gen_batch=512)\n\n# Sample data with the geographic validator\nobs_validator = rtf_val.ObservationValidator()\nobs_validator.add_validator(\n    \"geo_validator\",\n    rtf_val.GeoValidator(\n        MultiPolygon(states[states['NAME'] == 'California'].geometry[0])),\n    (\"Longitude\", \"Latitude\")\n)\n\nsamples_validated = rtf_model.sample(\n    n_samples=10240, gen_batch=512,\n    validator=obs_validator,\n)\n\n# Visualize the samples\nplot_sf(data, samples_raw, title=\"Raw samples\")\nplot_sf(data, samples_validated, title=\"Validated samples\")\n```\n\n## Citation\n\nPlease cite our work if you use the REaLTabFormer in your projects or research.\n\n``` bibtex\n@article{solatorio2023realtabformer,\n  title={REaLTabFormer: Generating Realistic Relational and Tabular Data using Transformers},\n  author={Solatorio, Aivin V. and Dupriez, Olivier},\n  journal={arXiv preprint arXiv:2302.02041},\n  year={2023}\n}\n```\n\n## Acknowledgments\n\nWe thank the [World Bank-UNHCR Joint Data Center on Forced Displacement (JDC)](https://www.jointdatacenter.org/) for funding the project \"Enhancing Responsible Microdata Access to Improve\nPolicy and Response in Forced Displacement Situations\" (KP-P174174-GINP-TF0B5124). A part of the fund went into supporting the development of the REaLTabFormer framework which was used to generate the synthetic population for research on disclosure risk and the mosaic effect.\n\nWe also send :hugs: to the [HuggingFace](https://huggingface.co/) :hugs: for all the open-sourced software they release. And to all open-sourced projects, thank you!\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2022 Aivin V. Solatorio  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
    "summary": "A novel method for generating tabular and relational data using language models.",
    "version": "0.1.7",
    "project_urls": {
        "Documentation": "https://avsolatorio.github.io/REaLTabFormer/",
        "Homepage": "https://github.com/avsolatorio/REaLTabFormer"
    },
    "split_keywords": [
        "realtabformer",
        " deep learning",
        " tabular data",
        " transformers",
        " data generation",
        " seq2seq model",
        " synthetic data",
        " pytorch",
        " language models",
        " synthetic data generation"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9607eec1e0667219d326b737dfabc206dbb92381f78f1e37263c24fd1af2eeca",
                "md5": "1334500b8c8fdafbc794dede0eabfbd7",
                "sha256": "11ef2380752942986e9fc6be0186eb60d56929c0920026f26ecf0ea0a2ce5f5f"
            },
            "downloads": -1,
            "filename": "REaLTabFormer-0.1.7-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "1334500b8c8fdafbc794dede0eabfbd7",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 49711,
            "upload_time": "2024-04-28T18:00:09",
            "upload_time_iso_8601": "2024-04-28T18:00:09.540280Z",
            "url": "https://files.pythonhosted.org/packages/96/07/eec1e0667219d326b737dfabc206dbb92381f78f1e37263c24fd1af2eeca/REaLTabFormer-0.1.7-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "39aea0ba0056bbd57464d3d9aaa9372e25e73ee704d7987da7857837cd0f2ad6",
                "md5": "e9ddc4d2bf56c2f7a7913d0bd99d9fc9",
                "sha256": "012414d725e96526b91893d3671de0a1f77c13e57af514452d713e579b35f336"
            },
            "downloads": -1,
            "filename": "REaLTabFormer-0.1.7.tar.gz",
            "has_sig": false,
            "md5_digest": "e9ddc4d2bf56c2f7a7913d0bd99d9fc9",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 815918,
            "upload_time": "2024-04-28T18:00:11",
            "upload_time_iso_8601": "2024-04-28T18:00:11.915903Z",
            "url": "https://files.pythonhosted.org/packages/39/ae/a0ba0056bbd57464d3d9aaa9372e25e73ee704d7987da7857837cd0f2ad6/REaLTabFormer-0.1.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-28 18:00:11",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "avsolatorio",
    "github_project": "REaLTabFormer",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "test_requirements": [
        {
            "name": "bandit",
            "specs": [
                [
                    "<",
                    "2.0"
                ],
                [
                    ">=",
                    "1.6.2"
                ]
            ]
        },
        {
            "name": "black",
            "specs": [
                [
                    "~=",
                    "22.0"
                ]
            ]
        },
        {
            "name": "build",
            "specs": [
                [
                    "~=",
                    "0.9.0"
                ]
            ]
        },
        {
            "name": "import-linter",
            "specs": [
                [
                    "==",
                    "1.2.6"
                ]
            ]
        },
        {
            "name": "openpyxl",
            "specs": [
                [
                    "~=",
                    "3.0.10"
                ]
            ]
        },
        {
            "name": "pre-commit",
            "specs": [
                [
                    "<",
                    "3.0"
                ],
                [
                    ">=",
                    "2.9.2"
                ]
            ]
        },
        {
            "name": "pylint",
            "specs": [
                [
                    "<",
                    "3.0"
                ],
                [
                    ">=",
                    "2.5.2"
                ]
            ]
        },
        {
            "name": "pytest-cov",
            "specs": [
                [
                    "~=",
                    "3.0"
                ]
            ]
        },
        {
            "name": "pytest-mock",
            "specs": [
                [
                    ">=",
                    "1.7.1"
                ],
                [
                    "<",
                    "2.0"
                ]
            ]
        },
        {
            "name": "pytest-xdist",
            "specs": [
                [
                    "~=",
                    "2.2.1"
                ]
            ]
        },
        {
            "name": "pytest",
            "specs": [
                [
                    "~=",
                    "6.2"
                ]
            ]
        },
        {
            "name": "trufflehog",
            "specs": [
                [
                    "~=",
                    "2.1"
                ]
            ]
        },
        {
            "name": "twine",
            "specs": [
                [
                    "~=",
                    "4.0.1"
                ]
            ]
        }
    ],
    "lcname": "realtabformer"
}
        
Elapsed time: 2.58892s