![social card](https://raw.githubusercontent.com/rmnldwg/lydata/main/github-social-card.png)
## What is lyDATA?
lyDATA is a repository for datasets that report detailed patterns of lymphatic progression for head & neck squamous cell carcinoma (HNSCC).
## Motivation
HNSCC spreads though the lymphatic system of the neck and forms metastases in regional lymph nodes. Macroscopic metastases can be detected with imaging modalities like MRI, PET and CT scans. They are then consequently included in the target volume, when radiotherapy is chosen as part of the treatment. However, microscopic metastases are too small be diagnosed with current imaging techniques.
To account for this microscopic involvement, parts of the lymphatic system are often irradiated electively to increase tumor control. Which parts are included in this elective clinical target volume is currently decided based on guidelines like [[1]](#1), [[2]](#2), [[3]](#3) and [[4]](#4). These in turn are derived from reports of the prevalence of involvement per lymph node level (LNL), i.e. the portion of patients that were diagnosed with metastases in any given LNL, stratified by primary tumor location. It is recommended to include a LNL in the elective target volume if 10 - 15% of patients showed involvement in that particular level.
However, while the prevalence of involvement has been reported in the literature, e.g. in [[5]](#5) and [[6]](#6), and the general lymph drainage pathways are understood well, the detailed progression patterns of HNSCC remain poorly quantified. We believe that the risk for microscopic involvement in an LNL depends highly on the specific diagnose of a particular patient and their treatment can hence be personalized if the progression patterns were better quantified.
## Our Goal
In this repository we aim to provide data on the detailed lymphatic progression patterns extracted from patients of the University Hospital Zurich (USZ). The data can be used freely and we hope clinicians in the field find it useful as well. Ideally, we can motivate other researchers to share their data in similar detail and openness, so that large multi-centric datasets can be built.
## Available datasets
### đź“‚ [2021 USZ Oropharynx]
[![radonc badge](https://img.shields.io/badge/Rad%20Onc-j.radonc.2022.01.035-3e6e0e)](https://doi.org/10.1016/j.radonc.2022.01.035)
[![medRxiv badge](https://img.shields.io/badge/medR%CF%87iv-2021.12.01.21267001-0e4c92)](https://doi.org/10.1101/2021.12.01.21267001)
[![DiB badge](https://img.shields.io/badge/DiB-10.1016%2Fj.dib.2022.108345-orange)](https://doi.org/10.1016/j.dib.2022.108345)
[![zenodo badge](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.5833835-informational)](https://doi.org/10.5281/zenodo.5833835)
The first dataset we are able to share consists of 287 patients with a primary tumor in the oropharynx, treated at the University Hospital Zurich (USZ) between 2013 and 2019. It can be found in the folder `2021-usz-oropharynx` alongside a `jupyter` notebook that was used to create figures.
We have published a paper about it in *Radiotherapy & Oncology* [[9]](#9) (a preprint is also available on *medRxiv* [[10]](#10)). The dataset is described in detail and can be freely used and cited as a *Data in Brief* paper [[11]](#11).
[2021 USZ Oropharynx]: https://github.com/rmnldwg/lyDATA/tree/main/2021-usz-oropharynx
### đź“‚ [2021 CLB Oropharynx]
[![Green Journal](https://img.shields.io/badge/Rad%20Onc-j.radonc.2021.01.028-3e6e0e)](https://doi.org/10.1016/j.radonc.2021.01.028)
[![DiB badge](https://img.shields.io/badge/DiB-10.1016%2Fj.dib.2023.110020-orange)](https://doi.org/10.1016/j.dib.2023.110020)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10204085.svg)](https://doi.org/10.5281/zenodo.10204085)
We are glad and thankful that the research group around Prof. Vincent Grégoire from the [Centre Léon Bérard] in Lyon (France) have joined our effort to create a database of lymphatic patterns of progression by providing us with the data underlying their publication [[6]](#6). If you use this data, don't forget to cite either said publication or use the `CITATION.cff` file inside the `2021-clb-oropharynx` folder, where the `data.csv` also resides and a description of the data named `README.md`.
[2021 CLB Oropharynx]: https://github.com/rmnldwg/lyDATA/tree/main/2021-clb-oropharynx
[Centre LĂ©on BĂ©rard]: https://www.centreleonberard.fr/en
### đź“‚ [2023 ISB Multisite]
[![DiB badge](https://img.shields.io/badge/DiB-10.1016%2Fj.dib.2023.110020-orange)](https://doi.org/10.1016/j.dib.2023.110020)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10210423.svg)](https://doi.org/10.5281/zenodo.10210423)
As part of a collaboration with researchers from the [Inselspital Bern] (Switzerland) around Prof. Roland Giger, we are thankful and glad to be able to publish a large and exceptionally detailed dataset on lymphatic progression of HNSCC patients, assessed by pathology. In contrast to earlier datasets, this includes not only patients with oropharyngeal tumors, but also oral cavity, hypopharynx and larynx.
[2023 ISB Multisite]: https://github.com/rmnldwg/lyDATA/tree/main/2023-isb-multisite
[Inselspital Bern]: https://www.insel.ch/de/
### đź“‚ [2023 CLB Multisite]
[![DiB badge](https://img.shields.io/badge/DiB-10.1016%2Fj.dib.2023.110020-orange)](https://doi.org/10.1016/j.dib.2023.110020)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10210361.svg)](https://doi.org/10.5281/zenodo.10210361)
Completing the "2021 CLB Oropharynx" data table, these patient records detail lymphatic involvement patterns in HNSCC patients with primary tumors beyond the oropharynx. Again, they are thankfully provided by researchers in Prof. Vincent Grégoire's group and the data was extracted at the [Centre Léon Bérard].
[2023 CLB Multisite]: https://github.com/rmnldwg/lyDATA/tree/main/2023-clb-multisite
### stay tuned for more
We are in the process of collecting more data that we might publish soon. If you would like to contribute to our effort, feel free to contact us: [roman.ludwig@usz.ch]
[roman.ludwig@usz.ch]: mailto:roman.ludwig@usz.ch
## Attribution
Every folder that corresponds to a dataset also contains a `CITATION.cff` file which may be used to cite the respective dataset. To cite the entire repository with all datasets inside, use the `CITATION.cff` at the root of the repository (or just click the *Cite this repository* button on the right).
## Library
Besides the data, this repository provides a Python library for loading, manipulating, and validating the available datasets.
> [!WARNING]
> This Python library is still highly experimental!
[![Build](https://github.com/rmnldwg/lydata/actions/workflows/build.yml/badge.svg)](https://github.com/rmnldwg/lydata/actions/workflows/build.yml)
[![Tests](https://github.com/rmnldwg/lydata/actions/workflows/tests.yml/badge.svg)](https://github.com/rmnldwg/lydata/actions/workflows/tests.yml)
[![Documentation Status](https://readthedocs.org/projects/lydata/badge/?version=stable)](https://lydata.readthedocs.io/en/stable/?badge=stable)
If you want to install this library, clone the repo and install it. You can do so by executing these commands:
```bash
git clone https://github.com/rmnldwg/lydata
cd lydata
python -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install .
```
You may have noticed that there are also `requirements.*` files here. These are independent of this library and instead related to reproducing the output of the Python files in the `scripts/` folder. You may ignore this.
### Usage of Python Utilities
The first and most common use case would probably listing and loading the published datasets:
```python
import lydata
for dataset_spec in lydata.available_datasets(
year=2023, # show all datasets added in 2023
skip_disk=True, # do not search on disk, but rather on GitHub
ref="61a17e", # may be some specific hash/tag/branch
):
print(dataset_spec.name)
# output:
# 2023-clb-multisite
# 2023-isb-multisite
merged_data = lydata.join_datasets(
subsite="oropharynx", # merge data that include oropharyngeal tumor patients
skip_disk=True, # again, search GitHub, not on disk (which is the default)
)
print(merged_data.head())
# output:
# patient ... pathology
# # ... ipsi
# id institution sex age ... VI VIII IX X
# 0 P011 Centre LĂ©on BĂ©rard male 67 ... NaN NaN NaN NaN
# 1 P012 Centre LĂ©on BĂ©rard female 62 ... NaN NaN NaN NaN
# .. ... ... ... .. ... ... ... .. ..
# 548 286 University Hospital Zurich male 67 ... NaN NaN NaN NaN
# 549 287 University Hospital Zurich male 76 ... NaN NaN NaN NaN
#
# [550 rows x 242 columns]
```
And since the three-level header of the tables is a little unwieldy at times, we also provide some shortcodes via a custom pandas accessor. As soon as `lydata` is imported it can be used like this:
```python
print(merged_data.ly.age)
# output:
# 0 67
# 1 62
# ..
# 548 67
# 549 76
# Name: (patient, #, age), Length: 550, dtype: int64
```
And we have implemented `Q` and `C` objects inspired by Django that allow easier querying of the tables:
```python
from lydata import C
# select patients younger than 50 that are not HPV positive (includes NaNs)
query_result = merged_data.ly.query((C("age") < 50) & ~(C("hpv") == True))
print(query_result)
# output:
# patient ... pathology
# # ... ipsi
# id institution sex age ... VI VIII IX X
# 11 P030 Centre LĂ©on BĂ©rard male 49 ... NaN NaN NaN NaN
# 12 P031 Centre LĂ©on BĂ©rard male 46 ... NaN NaN NaN NaN
# .. ... ... ... .. ... ... ... ... ...
# 545 283 University Hospital Zurich male 49 ... NaN NaN NaN NaN
# 547 285 University Hospital Zurich male 44 ... NaN NaN NaN NaN
#
# [20 rows x 242 columns]
```
For more details and further examples or use-cases, have a look at the [official documentation](https://lydata.readthedocs.org/)
## See also
### LyProX Interface
The data in this repository can be explored interactively in our online interface [LyProX] ([GitHub repo]).
[LyProX]: https://lyprox.org
[GitHub repo]: https://github.com/rmnldwg/lyprox
### Probabilistic models
We have developed and implemented probabilistic models for lymphatic tumor progression ([[7]](#7), [[8]](#8)) that may allow for highly personalized risk predictions in the future. These models can be trained using the dataset(s) in this repository. For details on the implementation, check out the [lymph] package.
[lymph]: https://github.com/rmnldwg/lymph
## License
All patient data in this repository, e.g. all files whose names end with .xlsx or .csv, as well as figures depicting characteristics of that data, are licensed under [CC BY-SA 4.0]. Attribution must be given to the owner of the repository (see the `CITATION.cff` file at the root of the repository) and the collector(s) or curator(s) of the respective dataset (see the `CITATION.cff` file inside the corresponding dataset's folder).
The remaining material is licensed under the [MIT License]. This includes e.g. all Python files and the overall structure of the repository.
[CC BY-SA 4.0]: https://creativecommons.org/licenses/by-sa/4.0/
[MIT License]: https://mit-license.org/
## References
<a id="1">[1]</a>
Vincent Grégoire and Others,
**Selection and delineation of lymph node target volumes in head and neck conformal radiotherapy. Proposal for standardizing terminology and procedure based on the surgical experience**,
*Radiotherapy and Oncology*, vol. 56, pp. 135-150, 2000,
doi: <https://doi.org/10.1016/S0167-8140(00)00202-4>.
<a id="2">[2]</a>
Vincent Grégoire, A. Eisbruch, M. Hamoir, and P. Levendag,
**Proposal for the delineation of the nodal CTV in the node-positive and the post-operative neck**,
*Radiotherapy and Oncology*, vol. 79, no. 1, pp. 15-20, Apr. 2006,
doi: <https://doi.org/10.1016/j.radonc.2006.03.009>.
<a id="3">[3]</a>
Vincent Grégoire et al.,
**Delineation of the neck node levels for head and neck tumors: A 2013 update. DAHANCA, EORTC, HKNPCSG, NCIC CTG, NCRI, RTOG, TROG consensus guidelines**,
*Radiotherapy and Oncology*, vol. 110, no. 1, pp. 172-181, Jan. 2014,
doi: <https://doi.org/10.1016/j.radonc.2013.10.010>.
<a id="4">[4]</a>
Julian Biau et al.,
**Selection of lymph node target volumes for definitive head and neck radiation therapy: a 2019 Update**,
*Radiotherapy and Oncology*, vol. 134, pp. 1-9, May 2019,
doi: <https://doi.org/10.1016/j.radonc.2019.01.018>.
<a id="5">[5]</a>
Jatin. P. Shah, F. C. Candela, and A. K. Poddar,
**The patterns of cervical lymph node metastases from squamous carcinoma of the oral cavity**,
*Cancer*, vol. 66, no. 1, pp. 109-113, 1990,
doi: <https://doi.org/10.1002/1097-0142(19900701)66:1%3C109::AID-CNCR2820660120%3E3.0.CO;2-A>.
<a id="6">[6]</a>
Laurence Bauwens et al.,
**Prevalence and distribution of cervical lymph node metastases in HPV-positive and HPV-negative oropharyngeal squamous cell carcinoma**,
*Radiotherapy and Oncology*, vol. 157, pp. 122-129, Apr. 2021,
doi: <https://doi.org/10.1016/j.radonc.2021.01.028>.
<a id="7">[7]</a>
Bertrand Pouymayou, P. Balermpas, O. Riesterer, M. Guckenberger, and J. Unkelbach,
**A Bayesian network model of lymphatic tumor progression for personalized elective CTV definition in head and neck cancers**,
*Physics in Medicine & Biology*, vol. 64, no. 16, p. 165003, Aug. 2019,
doi: <https://doi.org/10.1088/1361-6560/ab2a18>.
<a id="8">[8]</a>
Roman Ludwig, B. Pouymayou, P. Balermpas, and J. Unkelbach,
**A hidden Markov model for lymphatic tumor progression in the head and neck**,
*Sci Rep*, vol. 11, no. 1, p. 12261, Dec. 2021,
doi: <https://doi.org/10.1038/s41598-021-91544-1>.
<a id="9">[9]</a>
Roman Ludwig et al.,
**Detailed patient-individual reporting of lymph node involvement in oropharyngeal squamous cell carcinoma with an online interface**,
*Radiotherapy and Oncology*, Feb. 2022,
doi: <https://doi.org/10.1016/j.radonc.2022.01.035>.
<a id="10">[10]</a>
Roman Ludwig, J.-M. Hoffmann, B. Pouymayou et al.,
**Detailed patient-individual reporting of lymph node involvement in oropharyngeal squamous cell carcinoma with an online interface**,
*medRxiv*, Dec. 2021.
doi: <https://doi.org/10.1101/2021.12.01.21267001>.
<a id="11">[11]</a>
Roman Ludwig, Jean-Marc Hoffmann, Bertrand Pouymayou et al.,
**A dataset on patient-individual lymph node involvement in oropharyngeal squamous cell carcinoma**,
*Data in Brief*, 2022, 108345,
doi: <https://doi.org/10.1016/j.dib.2022.108345>.
Raw data
{
"_id": null,
"home_page": null,
"name": "lydata",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "data, lymph, involvement",
"author": null,
"author_email": "Roman Ludwig <roman.ludwig@usz.ch>",
"download_url": "https://files.pythonhosted.org/packages/0c/bf/ea00932b81ab34338498e53e15bf158ef91db55eefbeb3c2bee4786fc879/lydata-0.2.2.tar.gz",
"platform": null,
"description": "![social card](https://raw.githubusercontent.com/rmnldwg/lydata/main/github-social-card.png)\n\n## What is lyDATA?\n\nlyDATA is a repository for datasets that report detailed patterns of lymphatic progression for head & neck squamous cell carcinoma (HNSCC).\n\n## Motivation\n\nHNSCC spreads though the lymphatic system of the neck and forms metastases in regional lymph nodes. Macroscopic metastases can be detected with imaging modalities like MRI, PET and CT scans. They are then consequently included in the target volume, when radiotherapy is chosen as part of the treatment. However, microscopic metastases are too small be diagnosed with current imaging techniques.\n\nTo account for this microscopic involvement, parts of the lymphatic system are often irradiated electively to increase tumor control. Which parts are included in this elective clinical target volume is currently decided based on guidelines like [[1]](#1), [[2]](#2), [[3]](#3) and [[4]](#4). These in turn are derived from reports of the prevalence of involvement per lymph node level (LNL), i.e. the portion of patients that were diagnosed with metastases in any given LNL, stratified by primary tumor location. It is recommended to include a LNL in the elective target volume if 10 - 15% of patients showed involvement in that particular level.\n\nHowever, while the prevalence of involvement has been reported in the literature, e.g. in [[5]](#5) and [[6]](#6), and the general lymph drainage pathways are understood well, the detailed progression patterns of HNSCC remain poorly quantified. We believe that the risk for microscopic involvement in an LNL depends highly on the specific diagnose of a particular patient and their treatment can hence be personalized if the progression patterns were better quantified.\n\n## Our Goal\n\nIn this repository we aim to provide data on the detailed lymphatic progression patterns extracted from patients of the University Hospital Zurich (USZ). The data can be used freely and we hope clinicians in the field find it useful as well. Ideally, we can motivate other researchers to share their data in similar detail and openness, so that large multi-centric datasets can be built.\n\n## Available datasets\n\n### \ud83d\udcc2 [2021 USZ Oropharynx]\n\n[![radonc badge](https://img.shields.io/badge/Rad%20Onc-j.radonc.2022.01.035-3e6e0e)](https://doi.org/10.1016/j.radonc.2022.01.035)\n[![medRxiv badge](https://img.shields.io/badge/medR%CF%87iv-2021.12.01.21267001-0e4c92)](https://doi.org/10.1101/2021.12.01.21267001)\n[![DiB badge](https://img.shields.io/badge/DiB-10.1016%2Fj.dib.2022.108345-orange)](https://doi.org/10.1016/j.dib.2022.108345)\n[![zenodo badge](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.5833835-informational)](https://doi.org/10.5281/zenodo.5833835)\n\nThe first dataset we are able to share consists of 287 patients with a primary tumor in the oropharynx, treated at the University Hospital Zurich (USZ) between 2013 and 2019. It can be found in the folder `2021-usz-oropharynx` alongside a `jupyter` notebook that was used to create figures.\n\nWe have published a paper about it in *Radiotherapy & Oncology* [[9]](#9) (a preprint is also available on *medRxiv* [[10]](#10)). The dataset is described in detail and can be freely used and cited as a *Data in Brief* paper [[11]](#11).\n\n[2021 USZ Oropharynx]: https://github.com/rmnldwg/lyDATA/tree/main/2021-usz-oropharynx\n\n### \ud83d\udcc2 [2021 CLB Oropharynx]\n\n[![Green Journal](https://img.shields.io/badge/Rad%20Onc-j.radonc.2021.01.028-3e6e0e)](https://doi.org/10.1016/j.radonc.2021.01.028)\n[![DiB badge](https://img.shields.io/badge/DiB-10.1016%2Fj.dib.2023.110020-orange)](https://doi.org/10.1016/j.dib.2023.110020)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10204085.svg)](https://doi.org/10.5281/zenodo.10204085)\n\nWe are glad and thankful that the research group around Prof. Vincent Gr\u00e9goire from the [Centre L\u00e9on B\u00e9rard] in Lyon (France) have joined our effort to create a database of lymphatic patterns of progression by providing us with the data underlying their publication [[6]](#6). If you use this data, don't forget to cite either said publication or use the `CITATION.cff` file inside the `2021-clb-oropharynx` folder, where the `data.csv` also resides and a description of the data named `README.md`.\n\n[2021 CLB Oropharynx]: https://github.com/rmnldwg/lyDATA/tree/main/2021-clb-oropharynx\n[Centre L\u00e9on B\u00e9rard]: https://www.centreleonberard.fr/en\n\n### \ud83d\udcc2 [2023 ISB Multisite]\n\n[![DiB badge](https://img.shields.io/badge/DiB-10.1016%2Fj.dib.2023.110020-orange)](https://doi.org/10.1016/j.dib.2023.110020)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10210423.svg)](https://doi.org/10.5281/zenodo.10210423)\n\nAs part of a collaboration with researchers from the [Inselspital Bern] (Switzerland) around Prof. Roland Giger, we are thankful and glad to be able to publish a large and exceptionally detailed dataset on lymphatic progression of HNSCC patients, assessed by pathology. In contrast to earlier datasets, this includes not only patients with oropharyngeal tumors, but also oral cavity, hypopharynx and larynx.\n\n[2023 ISB Multisite]: https://github.com/rmnldwg/lyDATA/tree/main/2023-isb-multisite\n[Inselspital Bern]: https://www.insel.ch/de/\n\n### \ud83d\udcc2 [2023 CLB Multisite]\n\n[![DiB badge](https://img.shields.io/badge/DiB-10.1016%2Fj.dib.2023.110020-orange)](https://doi.org/10.1016/j.dib.2023.110020)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10210361.svg)](https://doi.org/10.5281/zenodo.10210361)\n\nCompleting the \"2021 CLB Oropharynx\" data table, these patient records detail lymphatic involvement patterns in HNSCC patients with primary tumors beyond the oropharynx. Again, they are thankfully provided by researchers in Prof. Vincent Gr\u00e9goire's group and the data was extracted at the [Centre L\u00e9on B\u00e9rard].\n\n[2023 CLB Multisite]: https://github.com/rmnldwg/lyDATA/tree/main/2023-clb-multisite\n\n### stay tuned for more\n\nWe are in the process of collecting more data that we might publish soon. If you would like to contribute to our effort, feel free to contact us: [roman.ludwig@usz.ch]\n\n[roman.ludwig@usz.ch]: mailto:roman.ludwig@usz.ch\n\n## Attribution\n\nEvery folder that corresponds to a dataset also contains a `CITATION.cff` file which may be used to cite the respective dataset. To cite the entire repository with all datasets inside, use the `CITATION.cff` at the root of the repository (or just click the *Cite this repository* button on the right).\n\n## Library\n\nBesides the data, this repository provides a Python library for loading, manipulating, and validating the available datasets.\n\n> [!WARNING]\n> This Python library is still highly experimental!\n\n[![Build](https://github.com/rmnldwg/lydata/actions/workflows/build.yml/badge.svg)](https://github.com/rmnldwg/lydata/actions/workflows/build.yml)\n[![Tests](https://github.com/rmnldwg/lydata/actions/workflows/tests.yml/badge.svg)](https://github.com/rmnldwg/lydata/actions/workflows/tests.yml)\n[![Documentation Status](https://readthedocs.org/projects/lydata/badge/?version=stable)](https://lydata.readthedocs.io/en/stable/?badge=stable)\n\nIf you want to install this library, clone the repo and install it. You can do so by executing these commands:\n\n```bash\ngit clone https://github.com/rmnldwg/lydata\ncd lydata\npython -m venv .venv\nsource .venv/bin/activate\npip install -U pip\npip install .\n```\n\nYou may have noticed that there are also `requirements.*` files here. These are independent of this library and instead related to reproducing the output of the Python files in the `scripts/` folder. You may ignore this.\n\n### Usage of Python Utilities\n\nThe first and most common use case would probably listing and loading the published datasets:\n\n```python\nimport lydata\n\nfor dataset_spec in lydata.available_datasets(\n year=2023, # show all datasets added in 2023\n skip_disk=True, # do not search on disk, but rather on GitHub\n ref=\"61a17e\", # may be some specific hash/tag/branch\n):\n print(dataset_spec.name)\n\n# output:\n# 2023-clb-multisite\n# 2023-isb-multisite\n\nmerged_data = lydata.join_datasets(\n subsite=\"oropharynx\", # merge data that include oropharyngeal tumor patients\n skip_disk=True, # again, search GitHub, not on disk (which is the default)\n)\nprint(merged_data.head())\n\n# output:\n# patient ... pathology\n# # ... ipsi\n# id institution sex age ... VI VIII IX X\n# 0 P011 Centre L\u00e9on B\u00e9rard male 67 ... NaN NaN NaN NaN\n# 1 P012 Centre L\u00e9on B\u00e9rard female 62 ... NaN NaN NaN NaN\n# .. ... ... ... .. ... ... ... .. ..\n# 548 286 University Hospital Zurich male 67 ... NaN NaN NaN NaN\n# 549 287 University Hospital Zurich male 76 ... NaN NaN NaN NaN\n#\n# [550 rows x 242 columns]\n```\n\nAnd since the three-level header of the tables is a little unwieldy at times, we also provide some shortcodes via a custom pandas accessor. As soon as `lydata` is imported it can be used like this:\n\n```python\nprint(merged_data.ly.age)\n\n# output:\n# 0 67\n# 1 62\n# ..\n# 548 67\n# 549 76\n# Name: (patient, #, age), Length: 550, dtype: int64\n```\n\nAnd we have implemented `Q` and `C` objects inspired by Django that allow easier querying of the tables:\n\n```python\nfrom lydata import C\n\n# select patients younger than 50 that are not HPV positive (includes NaNs)\nquery_result = merged_data.ly.query((C(\"age\") < 50) & ~(C(\"hpv\") == True))\nprint(query_result)\n\n# output:\n# patient ... pathology\n# # ... ipsi\n# id institution sex age ... VI VIII IX X\n# 11 P030 Centre L\u00e9on B\u00e9rard male 49 ... NaN NaN NaN NaN\n# 12 P031 Centre L\u00e9on B\u00e9rard male 46 ... NaN NaN NaN NaN\n# .. ... ... ... .. ... ... ... ... ...\n# 545 283 University Hospital Zurich male 49 ... NaN NaN NaN NaN\n# 547 285 University Hospital Zurich male 44 ... NaN NaN NaN NaN\n#\n# [20 rows x 242 columns]\n```\n\nFor more details and further examples or use-cases, have a look at the [official documentation](https://lydata.readthedocs.org/)\n\n## See also\n\n### LyProX Interface\n\nThe data in this repository can be explored interactively in our online interface [LyProX] ([GitHub repo]).\n\n[LyProX]: https://lyprox.org\n[GitHub repo]: https://github.com/rmnldwg/lyprox\n\n### Probabilistic models\n\nWe have developed and implemented probabilistic models for lymphatic tumor progression ([[7]](#7), [[8]](#8)) that may allow for highly personalized risk predictions in the future. These models can be trained using the dataset(s) in this repository. For details on the implementation, check out the [lymph] package.\n\n[lymph]: https://github.com/rmnldwg/lymph\n\n## License\n\nAll patient data in this repository, e.g. all files whose names end with .xlsx or .csv, as well as figures depicting characteristics of that data, are licensed under [CC BY-SA 4.0]. Attribution must be given to the owner of the repository (see the `CITATION.cff` file at the root of the repository) and the collector(s) or curator(s) of the respective dataset (see the `CITATION.cff` file inside the corresponding dataset's folder).\n\nThe remaining material is licensed under the [MIT License]. This includes e.g. all Python files and the overall structure of the repository.\n\n[CC BY-SA 4.0]: https://creativecommons.org/licenses/by-sa/4.0/\n[MIT License]: https://mit-license.org/\n\n## References\n\n<a id=\"1\">[1]</a>\nVincent Gr\u00e9goire and Others,\n**Selection and delineation of lymph node target volumes in head and neck conformal radiotherapy. Proposal for standardizing terminology and procedure based on the surgical experience**,\n*Radiotherapy and Oncology*, vol. 56, pp. 135-150, 2000,\ndoi: <https://doi.org/10.1016/S0167-8140(00)00202-4>.\n\n<a id=\"2\">[2]</a>\nVincent Gr\u00e9goire, A. Eisbruch, M. Hamoir, and P. Levendag,\n**Proposal for the delineation of the nodal CTV in the node-positive and the post-operative neck**,\n*Radiotherapy and Oncology*, vol. 79, no. 1, pp. 15-20, Apr. 2006,\ndoi: <https://doi.org/10.1016/j.radonc.2006.03.009>.\n\n<a id=\"3\">[3]</a>\nVincent Gr\u00e9goire et al.,\n**Delineation of the neck node levels for head and neck tumors: A 2013 update. DAHANCA, EORTC, HKNPCSG, NCIC CTG, NCRI, RTOG, TROG consensus guidelines**,\n*Radiotherapy and Oncology*, vol. 110, no. 1, pp. 172-181, Jan. 2014,\ndoi: <https://doi.org/10.1016/j.radonc.2013.10.010>.\n\n<a id=\"4\">[4]</a>\nJulian Biau et al.,\n**Selection of lymph node target volumes for definitive head and neck radiation therapy: a 2019 Update**,\n*Radiotherapy and Oncology*, vol. 134, pp. 1-9, May 2019,\ndoi: <https://doi.org/10.1016/j.radonc.2019.01.018>.\n\n<a id=\"5\">[5]</a>\nJatin. P. Shah, F. C. Candela, and A. K. Poddar,\n**The patterns of cervical lymph node metastases from squamous carcinoma of the oral cavity**,\n*Cancer*, vol. 66, no. 1, pp. 109-113, 1990,\ndoi: <https://doi.org/10.1002/1097-0142(19900701)66:1%3C109::AID-CNCR2820660120%3E3.0.CO;2-A>.\n\n<a id=\"6\">[6]</a>\nLaurence Bauwens et al.,\n**Prevalence and distribution of cervical lymph node metastases in HPV-positive and HPV-negative oropharyngeal squamous cell carcinoma**,\n*Radiotherapy and Oncology*, vol. 157, pp. 122-129, Apr. 2021,\ndoi: <https://doi.org/10.1016/j.radonc.2021.01.028>.\n\n<a id=\"7\">[7]</a>\nBertrand Pouymayou, P. Balermpas, O. Riesterer, M. Guckenberger, and J. Unkelbach,\n**A Bayesian network model of lymphatic tumor progression for personalized elective CTV definition in head and neck cancers**,\n*Physics in Medicine & Biology*, vol. 64, no. 16, p. 165003, Aug. 2019,\ndoi: <https://doi.org/10.1088/1361-6560/ab2a18>.\n\n<a id=\"8\">[8]</a>\nRoman Ludwig, B. Pouymayou, P. Balermpas, and J. Unkelbach,\n**A hidden Markov model for lymphatic tumor progression in the head and neck**,\n*Sci Rep*, vol. 11, no. 1, p. 12261, Dec. 2021,\ndoi: <https://doi.org/10.1038/s41598-021-91544-1>.\n\n<a id=\"9\">[9]</a>\nRoman Ludwig et al.,\n**Detailed patient-individual reporting of lymph node involvement in oropharyngeal squamous cell carcinoma with an online interface**,\n*Radiotherapy and Oncology*, Feb. 2022,\ndoi: <https://doi.org/10.1016/j.radonc.2022.01.035>.\n\n<a id=\"10\">[10]</a>\nRoman Ludwig, J.-M. Hoffmann, B. Pouymayou et al.,\n**Detailed patient-individual reporting of lymph node involvement in oropharyngeal squamous cell carcinoma with an online interface**,\n*medRxiv*, Dec. 2021.\ndoi: <https://doi.org/10.1101/2021.12.01.21267001>.\n\n<a id=\"11\">[11]</a>\nRoman Ludwig, Jean-Marc Hoffmann, Bertrand Pouymayou et al.,\n**A dataset on patient-individual lymph node involvement in oropharyngeal squamous cell carcinoma**,\n*Data in Brief*, 2022, 108345,\ndoi: <https://doi.org/10.1016/j.dib.2022.108345>.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Library for handling lymphatic involvement data",
"version": "0.2.2",
"project_urls": {
"documentation": "https://lydata.readthedocs.io",
"source": "https://github.com/rmnldwg/lydata"
},
"split_keywords": [
"data",
" lymph",
" involvement"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "eb641bd64bda9da47a21857505af579cb9617ce37ceb63e408f51b96fabac025",
"md5": "4dc0a16588cd8ad2b8c2638f079abef2",
"sha256": "1191ab6269afa8dfe1a23e2c37d009dbb3fdbf6a777573898972539adab960a4"
},
"downloads": -1,
"filename": "lydata-0.2.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "4dc0a16588cd8ad2b8c2638f079abef2",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 112808,
"upload_time": "2024-12-03T14:02:13",
"upload_time_iso_8601": "2024-12-03T14:02:13.380091Z",
"url": "https://files.pythonhosted.org/packages/eb/64/1bd64bda9da47a21857505af579cb9617ce37ceb63e408f51b96fabac025/lydata-0.2.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0cbfea00932b81ab34338498e53e15bf158ef91db55eefbeb3c2bee4786fc879",
"md5": "bb4e5f5e050bd1a43bf6f62e68142bf2",
"sha256": "89e5950cb9604c76a569370062737d9cf86beeca01406a69b30cdeda76dac7d4"
},
"downloads": -1,
"filename": "lydata-0.2.2.tar.gz",
"has_sig": false,
"md5_digest": "bb4e5f5e050bd1a43bf6f62e68142bf2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 1503861,
"upload_time": "2024-12-03T14:02:15",
"upload_time_iso_8601": "2024-12-03T14:02:15.498103Z",
"url": "https://files.pythonhosted.org/packages/0c/bf/ea00932b81ab34338498e53e15bf158ef91db55eefbeb3c2bee4786fc879/lydata-0.2.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-03 14:02:15",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "rmnldwg",
"github_project": "lydata",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "aiohttp",
"specs": [
[
"==",
"3.9.5"
]
]
},
{
"name": "aiohttp-retry",
"specs": [
[
"==",
"2.8.3"
]
]
},
{
"name": "aiosignal",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "amqp",
"specs": [
[
"==",
"5.2.0"
]
]
},
{
"name": "annotated-types",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "antlr4-python3-runtime",
"specs": [
[
"==",
"4.9.3"
]
]
},
{
"name": "anyio",
"specs": [
[
"==",
"4.4.0"
]
]
},
{
"name": "appdirs",
"specs": [
[
"==",
"1.4.4"
]
]
},
{
"name": "argon2-cffi",
"specs": [
[
"==",
"23.1.0"
]
]
},
{
"name": "argon2-cffi-bindings",
"specs": [
[
"==",
"21.2.0"
]
]
},
{
"name": "arrow",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "asttokens",
"specs": [
[
"==",
"2.4.1"
]
]
},
{
"name": "async-lru",
"specs": [
[
"==",
"2.0.4"
]
]
},
{
"name": "async-timeout",
"specs": [
[
"==",
"4.0.3"
]
]
},
{
"name": "asyncssh",
"specs": [
[
"==",
"2.14.2"
]
]
},
{
"name": "atpublic",
"specs": [
[
"==",
"4.1.0"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"23.2.0"
]
]
},
{
"name": "babel",
"specs": [
[
"==",
"2.15.0"
]
]
},
{
"name": "beautifulsoup4",
"specs": [
[
"==",
"4.12.3"
]
]
},
{
"name": "billiard",
"specs": [
[
"==",
"4.2.0"
]
]
},
{
"name": "bleach",
"specs": [
[
"==",
"6.1.0"
]
]
},
{
"name": "blosc2",
"specs": [
[
"==",
"2.6.2"
]
]
},
{
"name": "celery",
"specs": [
[
"==",
"5.4.0"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2024.6.2"
]
]
},
{
"name": "cffi",
"specs": [
[
"==",
"1.16.0"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.3.2"
]
]
},
{
"name": "click",
"specs": [
[
"==",
"8.1.7"
]
]
},
{
"name": "click-didyoumean",
"specs": [
[
"==",
"0.3.1"
]
]
},
{
"name": "click-plugins",
"specs": [
[
"==",
"1.1.1"
]
]
},
{
"name": "click-repl",
"specs": [
[
"==",
"0.3.0"
]
]
},
{
"name": "colorama",
"specs": [
[
"==",
"0.4.6"
]
]
},
{
"name": "comm",
"specs": [
[
"==",
"0.2.2"
]
]
},
{
"name": "configobj",
"specs": [
[
"==",
"5.0.8"
]
]
},
{
"name": "contourpy",
"specs": [
[
"==",
"1.2.1"
]
]
},
{
"name": "corner",
"specs": [
[
"==",
"2.2.2"
]
]
},
{
"name": "cryptography",
"specs": [
[
"==",
"42.0.8"
]
]
},
{
"name": "cycler",
"specs": [
[
"==",
"0.12.1"
]
]
},
{
"name": "debugpy",
"specs": [
[
"==",
"1.8.1"
]
]
},
{
"name": "decorator",
"specs": [
[
"==",
"5.1.1"
]
]
},
{
"name": "defusedxml",
"specs": [
[
"==",
"0.7.1"
]
]
},
{
"name": "dictdiffer",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "diskcache",
"specs": [
[
"==",
"5.6.3"
]
]
},
{
"name": "distro",
"specs": [
[
"==",
"1.9.0"
]
]
},
{
"name": "dpath",
"specs": [
[
"==",
"2.1.6"
]
]
},
{
"name": "dulwich",
"specs": [
[
"==",
"0.22.1"
]
]
},
{
"name": "dvc",
"specs": [
[
"==",
"3.51.2"
]
]
},
{
"name": "dvc-data",
"specs": [
[
"==",
"3.15.1"
]
]
},
{
"name": "dvc-http",
"specs": [
[
"==",
"2.32.0"
]
]
},
{
"name": "dvc-objects",
"specs": [
[
"==",
"5.1.0"
]
]
},
{
"name": "dvc-render",
"specs": [
[
"==",
"1.0.2"
]
]
},
{
"name": "dvc-studio-client",
"specs": [
[
"==",
"0.20.0"
]
]
},
{
"name": "dvc-task",
"specs": [
[
"==",
"0.4.0"
]
]
},
{
"name": "emcee",
"specs": [
[
"==",
"3.1.6"
]
]
},
{
"name": "entrypoints",
"specs": [
[
"==",
"0.4"
]
]
},
{
"name": "exceptiongroup",
"specs": [
[
"==",
"1.2.1"
]
]
},
{
"name": "executing",
"specs": [
[
"==",
"2.0.1"
]
]
},
{
"name": "fastjsonschema",
"specs": [
[
"==",
"2.19.1"
]
]
},
{
"name": "filelock",
"specs": [
[
"==",
"3.14.0"
]
]
},
{
"name": "flatten-dict",
"specs": [
[
"==",
"0.4.2"
]
]
},
{
"name": "flufl-lock",
"specs": [
[
"==",
"7.1.1"
]
]
},
{
"name": "fonttools",
"specs": [
[
"==",
"4.53.0"
]
]
},
{
"name": "fqdn",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "frozenlist",
"specs": [
[
"==",
"1.4.1"
]
]
},
{
"name": "fsspec",
"specs": [
[
"==",
"2024.6.0"
]
]
},
{
"name": "funcy",
"specs": [
[
"==",
"2.0"
]
]
},
{
"name": "gitdb",
"specs": [
[
"==",
"4.0.11"
]
]
},
{
"name": "gitpython",
"specs": [
[
"==",
"3.1.43"
]
]
},
{
"name": "grandalf",
"specs": [
[
"==",
"0.8"
]
]
},
{
"name": "gto",
"specs": [
[
"==",
"1.7.1"
]
]
},
{
"name": "h11",
"specs": [
[
"==",
"0.14.0"
]
]
},
{
"name": "h5py",
"specs": [
[
"==",
"3.11.0"
]
]
},
{
"name": "httpcore",
"specs": [
[
"==",
"1.0.5"
]
]
},
{
"name": "httpx",
"specs": [
[
"==",
"0.27.0"
]
]
},
{
"name": "hydra-core",
"specs": [
[
"==",
"1.3.2"
]
]
},
{
"name": "icd10-cm",
"specs": [
[
"==",
"0.0.5"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.7"
]
]
},
{
"name": "ipykernel",
"specs": [
[
"==",
"6.29.4"
]
]
},
{
"name": "ipython",
"specs": [
[
"==",
"8.25.0"
]
]
},
{
"name": "ipython-genutils",
"specs": [
[
"==",
"0.2.0"
]
]
},
{
"name": "ipywidgets",
"specs": [
[
"==",
"8.1.3"
]
]
},
{
"name": "isoduration",
"specs": [
[
"==",
"20.11.0"
]
]
},
{
"name": "iterative-telemetry",
"specs": [
[
"==",
"0.0.8"
]
]
},
{
"name": "jedi",
"specs": [
[
"==",
"0.19.1"
]
]
},
{
"name": "jinja2",
"specs": [
[
"==",
"3.1.4"
]
]
},
{
"name": "json5",
"specs": [
[
"==",
"0.9.25"
]
]
},
{
"name": "jsonpointer",
"specs": [
[
"==",
"2.4"
]
]
},
{
"name": "jsonschema",
"specs": [
[
"==",
"4.22.0"
]
]
},
{
"name": "jsonschema-specifications",
"specs": [
[
"==",
"2023.12.1"
]
]
},
{
"name": "jupyter",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "jupyter-client",
"specs": [
[
"==",
"8.6.2"
]
]
},
{
"name": "jupyter-console",
"specs": [
[
"==",
"6.6.3"
]
]
},
{
"name": "jupyter-contrib-core",
"specs": [
[
"==",
"0.4.2"
]
]
},
{
"name": "jupyter-contrib-nbextensions",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "jupyter-core",
"specs": [
[
"==",
"5.7.2"
]
]
},
{
"name": "jupyter-events",
"specs": [
[
"==",
"0.10.0"
]
]
},
{
"name": "jupyter-highlight-selected-word",
"specs": [
[
"==",
"0.2.0"
]
]
},
{
"name": "jupyter-lsp",
"specs": [
[
"==",
"2.2.5"
]
]
},
{
"name": "jupyter-nbextensions-configurator",
"specs": [
[
"==",
"0.6.4"
]
]
},
{
"name": "jupyter-server",
"specs": [
[
"==",
"2.14.1"
]
]
},
{
"name": "jupyter-server-terminals",
"specs": [
[
"==",
"0.5.3"
]
]
},
{
"name": "jupyterlab",
"specs": [
[
"==",
"4.2.1"
]
]
},
{
"name": "jupyterlab-pygments",
"specs": [
[
"==",
"0.3.0"
]
]
},
{
"name": "jupyterlab-server",
"specs": [
[
"==",
"2.27.2"
]
]
},
{
"name": "jupyterlab-widgets",
"specs": [
[
"==",
"3.0.11"
]
]
},
{
"name": "kiwisolver",
"specs": [
[
"==",
"1.4.5"
]
]
},
{
"name": "kombu",
"specs": [
[
"==",
"5.3.7"
]
]
},
{
"name": "lazydocs",
"specs": [
[
"==",
"0.4.8"
]
]
},
{
"name": "lxml",
"specs": [
[
"==",
"5.2.2"
]
]
},
{
"name": "lymph-model",
"specs": [
[
"==",
"0.4.3"
]
]
},
{
"name": "lyscripts",
"specs": [
[
"==",
"0.7.2"
]
]
},
{
"name": "markdown-it-py",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "markupsafe",
"specs": [
[
"==",
"2.1.5"
]
]
},
{
"name": "matplotlib",
"specs": [
[
"==",
"3.9.0"
]
]
},
{
"name": "matplotlib-inline",
"specs": [
[
"==",
"0.1.7"
]
]
},
{
"name": "mdurl",
"specs": [
[
"==",
"0.1.2"
]
]
},
{
"name": "mistune",
"specs": [
[
"==",
"3.0.2"
]
]
},
{
"name": "msgpack",
"specs": [
[
"==",
"1.0.8"
]
]
},
{
"name": "multidict",
"specs": [
[
"==",
"6.0.5"
]
]
},
{
"name": "nbclient",
"specs": [
[
"==",
"0.10.0"
]
]
},
{
"name": "nbconvert",
"specs": [
[
"==",
"7.16.4"
]
]
},
{
"name": "nbformat",
"specs": [
[
"==",
"5.10.4"
]
]
},
{
"name": "ndindex",
"specs": [
[
"==",
"1.8"
]
]
},
{
"name": "nest-asyncio",
"specs": [
[
"==",
"1.6.0"
]
]
},
{
"name": "networkx",
"specs": [
[
"==",
"3.3"
]
]
},
{
"name": "notebook",
"specs": [
[
"==",
"7.2.1"
]
]
},
{
"name": "notebook-shim",
"specs": [
[
"==",
"0.2.4"
]
]
},
{
"name": "numexpr",
"specs": [
[
"==",
"2.10.0"
]
]
},
{
"name": "numpy",
"specs": [
[
"==",
"1.26.4"
]
]
},
{
"name": "omegaconf",
"specs": [
[
"==",
"2.3.0"
]
]
},
{
"name": "orjson",
"specs": [
[
"==",
"3.10.3"
]
]
},
{
"name": "overrides",
"specs": [
[
"==",
"7.7.0"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"24.1"
]
]
},
{
"name": "pandas",
"specs": [
[
"==",
"2.2.2"
]
]
},
{
"name": "pandocfilters",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "parso",
"specs": [
[
"==",
"0.8.4"
]
]
},
{
"name": "pathspec",
"specs": [
[
"==",
"0.12.1"
]
]
},
{
"name": "pexpect",
"specs": [
[
"==",
"4.9.0"
]
]
},
{
"name": "pillow",
"specs": [
[
"==",
"10.3.0"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"3.11.0"
]
]
},
{
"name": "prometheus-client",
"specs": [
[
"==",
"0.20.0"
]
]
},
{
"name": "prompt-toolkit",
"specs": [
[
"==",
"3.0.46"
]
]
},
{
"name": "psutil",
"specs": [
[
"==",
"5.9.8"
]
]
},
{
"name": "ptyprocess",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "pure-eval",
"specs": [
[
"==",
"0.2.2"
]
]
},
{
"name": "py-cpuinfo",
"specs": [
[
"==",
"9.0.0"
]
]
},
{
"name": "pycparser",
"specs": [
[
"==",
"2.22"
]
]
},
{
"name": "pydantic",
"specs": [
[
"==",
"2.7.3"
]
]
},
{
"name": "pydantic-core",
"specs": [
[
"==",
"2.18.4"
]
]
},
{
"name": "pydot",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "pygit2",
"specs": [
[
"==",
"1.15.0"
]
]
},
{
"name": "pygments",
"specs": [
[
"==",
"2.18.0"
]
]
},
{
"name": "pygtrie",
"specs": [
[
"==",
"2.5.0"
]
]
},
{
"name": "pyparsing",
"specs": [
[
"==",
"3.1.2"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.9.0.post0"
]
]
},
{
"name": "python-json-logger",
"specs": [
[
"==",
"2.0.7"
]
]
},
{
"name": "pytz",
"specs": [
[
"==",
"2024.1"
]
]
},
{
"name": "pyyaml",
"specs": [
[
"==",
"6.0.1"
]
]
},
{
"name": "pyzmq",
"specs": [
[
"==",
"26.0.3"
]
]
},
{
"name": "qtconsole",
"specs": [
[
"==",
"5.5.2"
]
]
},
{
"name": "qtpy",
"specs": [
[
"==",
"2.4.1"
]
]
},
{
"name": "referencing",
"specs": [
[
"==",
"0.35.1"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.3"
]
]
},
{
"name": "rfc3339-validator",
"specs": [
[
"==",
"0.1.4"
]
]
},
{
"name": "rfc3986-validator",
"specs": [
[
"==",
"0.1.1"
]
]
},
{
"name": "rich",
"specs": [
[
"==",
"13.7.1"
]
]
},
{
"name": "rich-argparse",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "rpds-py",
"specs": [
[
"==",
"0.18.1"
]
]
},
{
"name": "ruamel-yaml",
"specs": [
[
"==",
"0.18.6"
]
]
},
{
"name": "ruamel-yaml-clib",
"specs": [
[
"==",
"0.2.8"
]
]
},
{
"name": "scipy",
"specs": [
[
"==",
"1.13.1"
]
]
},
{
"name": "scmrepo",
"specs": [
[
"==",
"3.3.5"
]
]
},
{
"name": "semver",
"specs": [
[
"==",
"3.0.2"
]
]
},
{
"name": "send2trash",
"specs": [
[
"==",
"1.8.3"
]
]
},
{
"name": "setuptools",
"specs": [
[
"==",
"70.0.0"
]
]
},
{
"name": "shellingham",
"specs": [
[
"==",
"1.5.4"
]
]
},
{
"name": "shortuuid",
"specs": [
[
"==",
"1.0.13"
]
]
},
{
"name": "shtab",
"specs": [
[
"==",
"1.7.1"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.16.0"
]
]
},
{
"name": "smmap",
"specs": [
[
"==",
"5.0.1"
]
]
},
{
"name": "sniffio",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "soupsieve",
"specs": [
[
"==",
"2.5"
]
]
},
{
"name": "sqltrie",
"specs": [
[
"==",
"0.11.0"
]
]
},
{
"name": "stack-data",
"specs": [
[
"==",
"0.6.3"
]
]
},
{
"name": "tables",
"specs": [
[
"==",
"3.9.2"
]
]
},
{
"name": "tabulate",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "terminado",
"specs": [
[
"==",
"0.18.1"
]
]
},
{
"name": "tinycss2",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "tomli",
"specs": [
[
"==",
"2.0.1"
]
]
},
{
"name": "tomlkit",
"specs": [
[
"==",
"0.12.5"
]
]
},
{
"name": "tornado",
"specs": [
[
"==",
"6.4.1"
]
]
},
{
"name": "tqdm",
"specs": [
[
"==",
"4.66.4"
]
]
},
{
"name": "traitlets",
"specs": [
[
"==",
"5.14.3"
]
]
},
{
"name": "tueplots",
"specs": [
[
"==",
"0.0.14"
]
]
},
{
"name": "typer",
"specs": [
[
"==",
"0.12.3"
]
]
},
{
"name": "types-python-dateutil",
"specs": [
[
"==",
"2.9.0.20240316"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
"==",
"4.12.2"
]
]
},
{
"name": "tzdata",
"specs": [
[
"==",
"2024.1"
]
]
},
{
"name": "uri-template",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.2.1"
]
]
},
{
"name": "vine",
"specs": [
[
"==",
"5.1.0"
]
]
},
{
"name": "voluptuous",
"specs": [
[
"==",
"0.14.2"
]
]
},
{
"name": "wcwidth",
"specs": [
[
"==",
"0.2.13"
]
]
},
{
"name": "webcolors",
"specs": [
[
"==",
"24.6.0"
]
]
},
{
"name": "webencodings",
"specs": [
[
"==",
"0.5.1"
]
]
},
{
"name": "websocket-client",
"specs": [
[
"==",
"1.8.0"
]
]
},
{
"name": "widgetsnbextension",
"specs": [
[
"==",
"4.0.11"
]
]
},
{
"name": "xlrd",
"specs": [
[
"==",
"2.0.1"
]
]
},
{
"name": "yarl",
"specs": [
[
"==",
"1.9.4"
]
]
},
{
"name": "zc-lockfile",
"specs": [
[
"==",
"3.0.post1"
]
]
}
],
"lcname": "lydata"
}