# DmDSLab: библиотека инструментов для Data Science
**DmDSLab** — набор готовых решений для автоматизации рутинных задач в Data Science проектах.
---
## Модули
### Модуль структур данных (data)
Модуль предоставляет вспомогательные структуры данных для работы с наборами данных в ML-пайплайнах.
**Основные компоненты:**
- `ModelData` — именованный кортеж для хранения признаков (`features`) и целевого значения (`target`).
- `DataSplit` — именованный кортеж для разделения данных на обучающую (`train`), валидационную (`tuning`) и тестовую (`test`) выборки.
**Преимущества:**
- Упрощает организацию данных в проектах Data Science.
- Обеспечивает неизменяемость структур через `namedtuple`.
-
Пример использования:
```python
from dmdslab.data import ModelData, DataSplit
# Создание экземпляра ModelData
data = ModelData(features=X, target=y)
# Разделение данных
split = DataSplit(train=train_data, tuning=val_data, test=test_data)
```
## Модуль загрузки данных (download)
Модуль предоставляет инструменты для загрузки данных из различных источников, с акцентом на работу с SQL-базами данных.
**Основные компоненты:**
- `DataLoader` — абстрактный класс для загрузки данных, который определяет базовый интерфейс.
- `SQLLoader` — реализация `DataLoader` для работы с SQL-запросами, поддерживающая параметризованные запросы и разделение данных на партиции.
**Преимущества:**
- Абстракция процесса загрузки данных.
- Поддержка сложных запросов с возможностью разделения на партиции.
- Автоматическая конкатенация результатов из разных запросов.
- Гибкая настройка через параметры конструктора.
Пример использования:
```python
from dmdslab.download import SQLLoader
# Создание экземпляра SQLLoader
loader = SQLLoader(
connect=your_db_connection,
query="SELECT * FROM table WHERE {}",
template_field="date_column",
partitions=[(None, "2023-01-01"), ("2023-01-01", "2023-12-31")]
)
# Загрузка данных
data = loader.download()
```
## Модуль предобработки данных (cleaning)
Модуль предоставляет функции для предобработки данных, включая удаление почти пустых строк, почти константных столбцов и дубликатов.
**Основные компоненты:**
- `drop_almost_empty_rows` — удаляет строки, содержащие более определённого процента пустых значений.
- `drop_almost_const_columns` — удаляет столбцы, содержащие более определённого процента константных значений.
- `drop_duplicates` — удаляет дубликаты строк или столбцов в зависимости от заданного режима.
**Преимущества:**
- Упрощает предобработку данных.
- Повышает качество данных за счёт удаления ненужных строк и столбцов.
- Гибкая настройка через параметры функций.
Пример использования:
```python
from dmdslab.cleaning import drop_almost_empty_rows, drop_almost_const_columns, drop_duplicates
# Создание экземпляра SQLLoader
df = pd.DataFrame(...) # Ваша DataFrame
# Удаление почти пустых строк
df = drop_almost_empty_rows(df, threshold=0.8)
# Удаление почти константных столбцов
df = drop_almost_const_columns(df, threshold=0.9)
# Удаление дубликатов
df = drop_duplicates(df, mode='all')
```
**Лицензия**: Apache 2.0.
**Автор**: [Dmatryus Detry](https://github.com/Dmatryus).
Raw data
{
"_id": null,
"home_page": "https://github.com/Dmatryus/DmDSLab",
"name": "DmDSLab",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "data-science machine-learning preprocessing",
"author": "Dmatryus Detry",
"author_email": "dmatryus.sqrt49@yandex.ru",
"download_url": "https://files.pythonhosted.org/packages/62/d6/0b9b964abd4ad75d0294de857245df8f3b78ee04593e77d69f9a0fcb1044/dmdslab-0.0.0.tar.gz",
"platform": null,
"description": " # DmDSLab: \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f Data Science \r\n**DmDSLab** \u2014 \u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 Data Science \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \r\n\r\n---\r\n\r\n## \u041c\u043e\u0434\u0443\u043b\u0438\r\n### \u041c\u043e\u0434\u0443\u043b\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 (data)\r\n\u041c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0430\u0431\u043e\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 ML-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430\u0445.\r\n\r\n**\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:**\r\n- `ModelData` \u2014 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0440\u0442\u0435\u0436 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432 (`features`) \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (`target`).\r\n- `DataSplit` \u2014 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0440\u0442\u0435\u0436 \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0443\u044e (`train`), \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e (`tuning`) \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e (`test`) \u0432\u044b\u0431\u043e\u0440\u043a\u0438.\r\n\r\n**\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:**\r\n- \u0423\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 Data Science.\r\n- \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0447\u0435\u0440\u0435\u0437 `namedtuple`.\r\n- \r\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:\r\n```python\r\nfrom dmdslab.data import ModelData, DataSplit\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 ModelData\r\ndata = ModelData(features=X, target=y)\r\n\r\n# \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\r\nsplit = DataSplit(train=train_data, tuning=val_data, test=test_data)\r\n```\r\n\r\n\r\n## \u041c\u043e\u0434\u0443\u043b\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (download)\r\n\r\n\u041c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0441 \u0430\u043a\u0446\u0435\u043d\u0442\u043e\u043c \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 SQL-\u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.\r\n\r\n**\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:**\r\n- `DataLoader` \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.\r\n- `SQLLoader` \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f `DataLoader` \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438.\r\n\r\n**\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:**\r\n- \u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.\r\n- \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438.\r\n- \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\r\n- \u0413\u0438\u0431\u043a\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430.\r\n\r\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:\r\n```python\r\nfrom dmdslab.download import SQLLoader\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 SQLLoader\r\nloader = SQLLoader(\r\n connect=your_db_connection,\r\n query=\"SELECT * FROM table WHERE {}\",\r\n template_field=\"date_column\",\r\n partitions=[(None, \"2023-01-01\"), (\"2023-01-01\", \"2023-12-31\")]\r\n)\r\n\r\n# \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\r\ndata = loader.download()\r\n```\r\n\r\n## \u041c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (cleaning)\r\n\r\n\u041c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u0438 \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432.\r\n\r\n**\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:**\r\n- `drop_almost_empty_rows` \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430 \u043f\u0443\u0441\u0442\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.\r\n- `drop_almost_const_columns` \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.\r\n- `drop_duplicates` \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0441\u0442\u0440\u043e\u043a \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430.\r\n\r\n**\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:**\r\n- \u0423\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445.\r\n- \u041f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430 \u0441\u0447\u0451\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432.\r\n- \u0413\u0438\u0431\u043a\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439.\r\n\r\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:\r\n```python\r\nfrom dmdslab.cleaning import drop_almost_empty_rows, drop_almost_const_columns, drop_duplicates\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 SQLLoader\r\ndf = pd.DataFrame(...) # \u0412\u0430\u0448\u0430 DataFrame\r\n\r\n# \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u0438 \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\r\ndf = drop_almost_empty_rows(df, threshold=0.8)\r\n\r\n# \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432\r\ndf = drop_almost_const_columns(df, threshold=0.9)\r\n\r\n# \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432\r\ndf = drop_duplicates(df, mode='all')\r\n```\r\n\r\n**\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f**: Apache 2.0. \r\n**\u0410\u0432\u0442\u043e\u0440**: [Dmatryus Detry](https://github.com/Dmatryus). \r\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "Data Science Laboratory Toolkit",
"version": "0.0.0",
"project_urls": {
"Documentation": "https://github.com/Dmatryus/DmDSLab/wiki",
"Homepage": "https://github.com/Dmatryus/DmDSLab",
"Source": "https://github.com/Dmatryus/DmDSLab"
},
"split_keywords": [
"data-science",
"machine-learning",
"preprocessing"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7cb9118ad8c767e9336ab4c3457020eeb0038b2d1bb77bd8c4ac36f233439b9f",
"md5": "2863647cf817ed9400e6906627107bfb",
"sha256": "3d2d033fd8ca00dc916a74ecd9adc0f12d901f407d3bb0ccd62f28d4c9aac2fe"
},
"downloads": -1,
"filename": "dmdslab-0.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "2863647cf817ed9400e6906627107bfb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 9030,
"upload_time": "2025-07-12T21:53:45",
"upload_time_iso_8601": "2025-07-12T21:53:45.091742Z",
"url": "https://files.pythonhosted.org/packages/7c/b9/118ad8c767e9336ab4c3457020eeb0038b2d1bb77bd8c4ac36f233439b9f/dmdslab-0.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "62d60b9b964abd4ad75d0294de857245df8f3b78ee04593e77d69f9a0fcb1044",
"md5": "efe4a7e09319839de23ef2cf6d0d41bd",
"sha256": "004afd0b3a3a262bb2162242d953ffc99f61db33c3ba864a04d71af50674ac5b"
},
"downloads": -1,
"filename": "dmdslab-0.0.0.tar.gz",
"has_sig": false,
"md5_digest": "efe4a7e09319839de23ef2cf6d0d41bd",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 9190,
"upload_time": "2025-07-12T21:53:46",
"upload_time_iso_8601": "2025-07-12T21:53:46.120340Z",
"url": "https://files.pythonhosted.org/packages/62/d6/0b9b964abd4ad75d0294de857245df8f3b78ee04593e77d69f9a0fcb1044/dmdslab-0.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-12 21:53:46",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Dmatryus",
"github_project": "DmDSLab",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "dmdslab"
}