KDM (K-water Data Model) SDK for water resource data access
Project description
KDM SDK
๐ ๋ฒ ํ ์คํ - K-water Data Model (KDM) ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์กฐํํ ์ ์๋ Python SDK์ ๋๋ค.
K-water Data Model (KDM)์ water.or.kr/kdm ๊ธฐ๋ฐ์ ์์์ ๋ฐ์ดํฐ ์๋น์ค์ ๋๋ค. ์ด SDK๋ฅผ ํตํด ๋ ์๋ฌธ ๋ฐ์ดํฐ, ํ์ฒ ์์, ๊ฐ์ฐ๋ ๋ฑ์ ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐํธํ๊ฒ ์กฐํํ๊ณ ๋ถ์ํ ์ ์์ต๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ
- ์ง๊ด์ ์ธ Query API - ๋ฉ์๋ ์ฒด์ด๋์ผ๋ก ๊ฐ๋จํ ์ฟผ๋ฆฌ ์์ฑ
- ๋ฐฐ์น ์ฟผ๋ฆฌ - ์ฌ๋ฌ ์์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ฌ๋ก ์กฐํํ์ฌ ์ฑ๋ฅ ํฅ์
- ์ํ๋ฅ ์ฐ๊ด ๋ถ์ - ๋ ๋ฐฉ๋ฅ๋๊ณผ ํ๋ฅ ์์์ ์๊ด๊ด๊ณ ๋ถ์
- ๐ ๊ด์ธก์ ์๋ ํ์ - ๋์ ์ํ๋ฅ ๊ด์ธก์ ์๋ ๊ฒ์ (Basin ๋งค์นญ + ์ง๋ฆฌ ๊ธฐ๋ฐ ๊ฒ์)
- ๐ ์๋ณธ ์์ค์ฝ๋ ์ ๊ณต - K-water, ํ๊ฒฝ๋ถ ๋ฑ ์์ฒ ๊ธฐ๊ด์ ์์ค์ฝ๋๋ก ์ธ๋ถ ์์คํ ์ฐ๋
- ํ ํ๋ฆฟ ์์คํ - YAML ๋๋ Python์ผ๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฟผ๋ฆฌ ํ ํ๋ฆฟ ์์ฑ
- pandas ํตํฉ - ์กฐํ ๊ฒฐ๊ณผ๋ฅผ DataFrame์ผ๋ก ์ฆ์ ๋ณํ
- ๊ฐํธํ ๋ด๋ณด๋ด๊ธฐ - Excel, CSV, Parquet, JSON์ผ๋ก ํ ์ค์ ์ ์ฅ
- ์๋ ํด๋ฐฑ - ์๊ฐ ๋จ์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก ์ผ/์ ๋จ์ ์กฐํ
- ๋น๋๊ธฐ ์ง์ - async/await ํจํด์ผ๋ก ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์กฐํ
- ํ์ ํํธ - ์ ์ฒด ์ฝ๋์ ํ์ ์ด๋ ธํ ์ด์ ์ผ๋ก IDE ์ง์ ๊ฐํ
SDK์ ์ญํ
โ SDK๊ฐ ํ๋ ์ผ
- ๋ฐ์ดํฐ ์กฐํ: KDM ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์กฐํ
- ๋ฐ์ดํฐ ๋ณํ: pandas DataFrame์ผ๋ก ์๋ ๋ณํ
- ๋ฐ์ดํฐ ์ ์ฅ: Excel, CSV, Parquet, JSON์ผ๋ก ํ๊ธ ์ธ์ฝ๋ฉ ์ง์ํ์ฌ ์ ์ฅ
โ SDK๊ฐ ํ์ง ์๋ ์ผ
- ์๊ฐํ: matplotlib, seaborn, plotly ๋ฑ ์ฌ์ฉ
- ํต๊ณ ๋ถ์: pandas, scipy, numpy ๋ฑ ์ฌ์ฉ
- ๋ฐ์ดํฐ ์ ์ : pandas ๋ฉ์๋ ์ฌ์ฉ
์ฒ ํ: ์ด SDK๋ KDM ๋ฐ์ดํฐ๋ฅผ pandas๋ก ๊ฐ์ ธ์ค๋ ๊ฒ๊น์ง๋ง ๋ด๋นํฉ๋๋ค. ๊ทธ ์ดํ๋ ์ฌ๋ฌ๋ถ์ ๋ฐ์ดํฐ ๋ถ์ ๋ฅ๋ ฅ์ ํ์ฉํ์ธ์!
examples/analyst_reference.py์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ ํ ์ ์๋ ๋ถ์ ์์ ๋ฅผ ํ์ธํ์ธ์.
์ค์น
# PyPI์์ ์ค์น (๊ถ์ฅ) โญ
pip install kdm-sdk
# ๋ฐ์ดํฐ ๋ถ์๊ฐ์ฉ (๋ถ์ ๋๊ตฌ ํฌํจ)
pip install kdm-sdk[analyst]
# ๊ฐ๋ฐ์์ฉ (๊ฐ๋ฐ ๋๊ตฌ ํฌํจ)
pip install kdm-sdk[dev]
# ๋๋ GitHub์์ ์ต์ ๋ฒ์ ์ค์น
pip install git+https://github.com/kwatermywater/kdm-sdk.git
[analyst] ์ต์
์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค: pandas, jupyter, matplotlib, seaborn, plotly, openpyxl, pyarrow, scipy, statsmodels
์๊ตฌ์ฌํญ
- Python 3.10 ์ด์
- KDM MCP Server (์ด์ ์๋ฒ:
http://203.237.1.4:8080) - pandas 2.0+
์ฒ์ ์ฌ์ฉํ์๋์?
๐ ๋ฐ์ดํฐ ๊ฐ์ด๋ ๋ฐ๋ก๊ฐ๊ธฐ - ์์์ ๋ฐ์ดํฐ๊ฐ ์ฒ์์ด์ ๋ถ๋ค์ ์ํ ์น์ ํ ์ค๋ช ์
๊ฐ์ด๋ ๋ด์ฉ:
- ์์ค ์ ํ (๋, ์์๊ด์ธก์, ์ฐ๋๊ด์ธก์ ๋ฑ)
- ์๊ฐ ๋จ์ (์๊ฐ๋ณ, ์ผ๋ณ, ์๋ณ) ๋ฐ ์กฐํ ๊ธฐ๊ฐ ๐
- ์ธก์ ํญ๋ชฉ (์ ์์จ, ์ ์ ๋, ๋ฐฉ๋ฅ๋ ๋ฑ) ๐
- ์์ค ๊ฒ์ ๋ฐฉ๋ฒ
- ์ฉ์ด ์ค๋ช (์ ์์, CMS, TOC ๋ฑ)
- ์ด๋ณด์์ฉ ์์
๋น ๋ฅธ ํ:
# ๐ก ์ด๋ค ๋์ด ์๋์ง ๋ชจ๋ฅผ ๋
results = await client.search_facilities(query="๋", limit=10)
# ๐ก ์ธก์ ํญ๋ชฉ์ด ๋ญ๊ฐ ์๋์ง ๋ชจ๋ฅผ ๋
items = await client.list_measurements(site_name="์์๊ฐ๋")
# ๐ก ์๊ฐ ๋จ์๋ฅผ ๋ชจ๋ฅผ ๋ (์๋ ์ ํ)
result = await KDMQuery().site("์์๊ฐ๋").measurements(["์ ์์จ"]) \
.days(7).time_key("auto").execute()
๋น ๋ฅธ ์์
๊ธฐ๋ณธ ์ฟผ๋ฆฌ (Fluent API)
import asyncio
from kdm_sdk import KDMQuery
async def main():
# ๋ ์ ์์จ ๋ฐ์ดํฐ ์กฐํ
result = await KDMQuery() \
.site("์์๊ฐ๋", facility_type="dam") \
.measurements(["์ ์์จ", "์ ์
๋"]) \
.days(7) \
.execute()
# pandas DataFrame์ผ๋ก ๋ณํ
df = result.to_dataframe()
print(df.head())
asyncio.run(main())
๋ฐฐ์น ์ฟผ๋ฆฌ (์ฌ๋ฌ ์์ค ๋์ ์กฐํ)
from kdm_sdk import KDMQuery
async def batch_query():
query = KDMQuery()
# ์ฌ๋ฌ ๋ ์ถ๊ฐ
for dam in ["์์๊ฐ๋", "์ถฉ์ฃผ๋", "ํ๋น๋"]:
query.site(dam, facility_type="dam") \
.measurements(["์ ์์จ"]) \
.days(7) \
.add()
# ๋ณ๋ ฌ ์คํ
results = await query.execute_batch(parallel=True)
# ๋จ์ผ DataFrame์ผ๋ก ํตํฉ
combined_df = results.aggregate()
print(combined_df.groupby("site_name")["์ ์์จ"].mean())
asyncio.run(batch_query())
์ํ๋ฅ ์๊ด๊ด๊ณ ๋ถ์
from kdm_sdk import FacilityPair
async def correlation_analysis():
# ๋ ๋ฐฉ๋ฅ๊ฐ ํ๋ฅ ์์์ ๋ฏธ์น๋ ์ํฅ ๋ถ์
from kdm_sdk import KDMClient
import pandas as pd
async with KDMClient() as client:
# ์๋ฅ ๋ฐ์ดํฐ ์กฐํ (๋)
upstream_result = await client.get_water_data(
site_name="์์๊ฐ๋",
facility_type="dam",
measurement_items=["๋ฐฉ๋ฅ๋"],
days=30,
time_key="h_1"
)
# ํ๋ฅ ๋ฐ์ดํฐ ์กฐํ (์์๊ด์ธก์)
downstream_result = await client.get_water_data(
site_name="์ถ์ฒ์(์ถ์ฒ๋ํ๋ฅ)",
facility_type="water_level",
measurement_items=["์์"],
days=30,
time_key="h_1"
)
# DataFrame ๋ณํ
def to_df(data):
records = []
for item in data:
record = {"datetime": item.get("datetime")}
if "values" in item:
for key, val in item["values"].items():
record[key] = val.get("value")
records.append(record)
df = pd.DataFrame(records)
if "datetime" in df.columns:
df["datetime"] = pd.to_datetime(df["datetime"])
df.set_index("datetime", inplace=True)
return df
upstream_df = to_df(upstream_result.get("data", []))
downstream_df = to_df(downstream_result.get("data", []))
# FacilityPair ์์ฑ
pair = FacilityPair(
upstream_name="์์๊ฐ๋",
downstream_name="์ถ์ฒ์(์ถ์ฒ๋ํ๋ฅ)",
upstream_type="dam",
downstream_type="water_level",
upstream_data=upstream_df,
downstream_data=downstream_df
)
# ์ต์ ์๊ฐ์ฐจ ์ฐพ๊ธฐ
correlation = pair.find_optimal_lag(max_lag_hours=12)
print(f"์ต์ ์๊ฐ์ฐจ: {correlation.lag_hours:.1f}์๊ฐ")
print(f"์๊ด๊ณ์: {correlation.correlation:.3f}")
asyncio.run(correlation_analysis())
ํ ํ๋ฆฟ ๊ธฐ๋ฐ ์ฟผ๋ฆฌ
from kdm_sdk.templates import TemplateBuilder
async def template_query():
# ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ
ํ๋ฆฟ ์์ฑ
template = TemplateBuilder("์ฃผ๊ฐ ๋ ๋ชจ๋ํฐ๋ง") \
.site("์์๊ฐ๋", facility_type="dam") \
.measurements(["์ ์์จ", "์ ์
๋", "๋ฐฉ๋ฅ๋"]) \
.days(7) \
.time_key("h_1") \
.build()
# ํ
ํ๋ฆฟ ์คํ
result = await template.execute()
df = result.to_dataframe()
# ํ
ํ๋ฆฟ ์ ์ฅํ์ฌ ์ฌ์ฌ์ฉ
template.save_yaml("templates/weekly_monitoring.yaml")
asyncio.run(template_query())
๊ด์ธก์ ์๋ ํ์ (์ ๊ท ๊ธฐ๋ฅ)
from kdm_sdk import KDMClient
async def find_stations():
async with KDMClient() as client:
# ๋์ ํ๋ฅ ์์๊ด์ธก์ ์๋ ๊ฒ์
result = await client.find_related_stations(
dam_name="์์๊ฐ๋",
direction="downstream",
station_type="water_level"
)
# ๋ ์ ๋ณด (์๋ณธ ์์ค์ฝ๋ ํฌํจ)
dam = result['dam']
print(f"๋: {dam['site_name']}")
print(f"์๋ณธ์ฝ๋: {dam['original_facility_code']}") # K-water ์ฝ๋
# ๊ด๋ จ ๊ด์ธก์ ๋ชฉ๋ก
for station in result['stations']:
print(f"- {station['site_name']}: {station['original_facility_code']}")
print(f" ๋งค์นญ๋ฐฉ์: {station['match_type']}") # basin or geographic
print(f" ๊ฑฐ๋ฆฌ: {station['distance_km']:.1f} km")
asyncio.run(find_stations())
โ ๏ธ ์๋ ค์ง ์ ํ์ฌํญ
- ํ๋ฅ(downstream) ๊ฒ์: โ ์ ๋์ (์ ์ญ ๋งค์นญ)
- ์๋ฅ(upstream) ๊ฒ์: โ ๏ธ ์ ์ญ ๋ฐ์ดํฐ ๋ถ์กฑ โ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ fallback (์ ํ๋ ๋ฎ์)
- ๋๋ณ๋ก ์ฐ๊ฒฐ๋ ๊ด์ธก์ ์๊ฐ ๋ค๋ฆ (์: ์์๊ฐ๋ 3๊ฐ, ํ๋น๋ 1๊ฐ)
- MCP ์๋ฒ์ ๋ฑ๋ก๋ ์์ค๋ง ๊ฒ์ ๊ฐ๋ฅ
๋ฌธ์
- ๐ ๋ฐ์ดํฐ ๊ฐ์ด๋ โญ ํ๋ - ์์ค ์ ํ, ์ธก์ ํญ๋ชฉ, ์ฉ์ด ์ค๋ช , ์ด๋ณด์ ํ์
- ์์ ๋ชจ์ - ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก ์์ ์ฝ๋
ํ๋ก์ ํธ ๊ตฌ์กฐ
kdm-sdk/
โโโ src/
โ โโโ kdm_sdk/
โ โโโ __init__.py # ํจํค์ง exports
โ โโโ client.py # MCP ํด๋ผ์ด์ธํธ
โ โโโ query.py # Fluent query API
โ โโโ results.py # ๊ฒฐ๊ณผ ๋ํผ
โ โโโ facilities.py # FacilityPair
โ โโโ templates/ # ํ
ํ๋ฆฟ ์์คํ
โ โโโ builder.py # TemplateBuilder
โ โโโ base.py # Template ๊ธฐ๋ณธ ํด๋์ค
โ โโโ loaders.py # YAML/Python ๋ก๋
โโโ tests/ # ํ
์คํธ ์ค์ํธ
โโโ examples/ # ์ฌ์ฉ ์์
โ โโโ basic_usage.py # KDMClient ์์
โ โโโ query_usage.py # Query API ์์
โ โโโ facility_pair_usage.py # FacilityPair ์์
โ โโโ templates/ # ํ
ํ๋ฆฟ ์์
โโโ docs/ # ๋ฌธ์
โโโ README.md # ์ด ํ์ผ
์์
examples/ ๋๋ ํ ๋ฆฌ์์ ์ ์ฒด ์์ ๋ฅผ ํ์ธํ์ธ์:
- basic_usage.py - KDMClient ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
- query_usage.py - Fluent Query API ์์
- facility_pair_usage.py - ์ํ๋ฅ ๋ถ์
- templates/ - ํ ํ๋ฆฟ ์์ (YAML ๋ฐ Python)
ํ ์คํธ
# ์ ์ฒด ํ
์คํธ ์คํ
pytest
# ํน์ ํ
์คํธ ์ค์ํธ ์คํ
pytest tests/test_query.py -v
# ์ปค๋ฒ๋ฆฌ์ง ์ธก์
pytest --cov=kdm_sdk --cov-report=html
# ๋จ์ ํ
์คํธ๋ง ์คํ
pytest -m unit
# ํตํฉ ํ
์คํธ ์คํ (MCP ์๋ฒ ํ์)
pytest -m integration
์ฃผ์ ์ฌ์ฉ ์ฌ๋ก
1. ์ฌ๋ฌ ๋ ๋ชจ๋ํฐ๋ง
query = KDMQuery()
for dam in ["์์๊ฐ๋", "์ถฉ์ฃผ๋", "ํ๋น๋", "๋์ฒญ๋"]:
query.site(dam).measurements(["์ ์์จ"]).days(30).add()
results = await query.execute_batch(parallel=True)
df = results.aggregate()
2. ์ ๋ ๋๋น ๋น๊ต
result = await KDMQuery() \
.site("์ฅํฅ๋") \
.measurements(["์ ์์จ"]) \
.date_range("2024-06-01", "2024-06-30") \
.compare_with_previous_year() \
.execute()
3. ํ๋ฅ ์์ ์์ธก
from kdm_sdk import KDMClient, FacilityPair
import pandas as pd
async with KDMClient() as client:
# ์๋ฅ ๋ฐ์ดํฐ (๋)
upstream_result = await client.get_water_data(
site_name="์์๊ฐ๋",
facility_type="dam",
measurement_items=["๋ฐฉ๋ฅ๋"],
days=365,
time_key="h_1"
)
# ํ๋ฅ ๋ฐ์ดํฐ (๋)
downstream_result = await client.get_water_data(
site_name="์์๋",
facility_type="dam",
measurement_items=["์์"],
days=365,
time_key="h_1"
)
# DataFrame ๋ณํ
def to_df(data):
records = []
for item in data:
record = {"datetime": item.get("datetime")}
if "values" in item:
for key, val in item["values"].items():
record[key] = val.get("value")
records.append(record)
df = pd.DataFrame(records)
if "datetime" in df.columns:
df["datetime"] = pd.to_datetime(df["datetime"])
df.set_index("datetime", inplace=True)
return df
upstream_df = to_df(upstream_result.get("data", []))
downstream_df = to_df(downstream_result.get("data", []))
# FacilityPair ์์ฑ
pair = FacilityPair(
upstream_name="์์๊ฐ๋",
downstream_name="์์๋",
upstream_data=upstream_df,
downstream_data=downstream_df
)
# ์๊ฐ์ฐจ๋ฅผ ๊ณ ๋ คํ์ฌ DataFrame ์์ฑ (๋ฌผ์ด ์ด๋ํ๋๋ฐ 5.5์๊ฐ ์์)
df = pair.to_dataframe(lag_hours=5.5)
# ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํ์ต์ ์ฌ์ฉ
X = df[["์์๊ฐ๋_๋ฐฉ๋ฅ๋"]]
y = df["์์๋_์์"]
๊ฐ๋ฐ
ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ (TDD)
์ด ํ๋ก์ ํธ๋ TDD ๋ฐฉ๋ฒ๋ก ์ผ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค:
- Red - ์คํจํ๋ ํ ์คํธ ๋จผ์ ์์ฑ
- Green - ํ ์คํธ๋ฅผ ํต๊ณผํ๋ ์ต์ํ์ ์ฝ๋ ๊ตฌํ
- Refactor - ์ฝ๋ ํ์ง ๊ฐ์
ํ ์คํธ ์คํ
# ๊ฐ๋ฐ ์์กด์ฑ ์ค์น
pip install -r requirements-dev.txt
# ํ
์คํธ ์คํ
pytest -v
# ์ฝ๋ ํฌ๋งทํ
black src tests
# ํ์
์ฒดํฌ
mypy src
๊ธฐ์ฌํ๊ธฐ
๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค! PR ์ ์ถ ์ ๋ชจ๋ ํ ์คํธ๊ฐ ํต๊ณผํ๋์ง ํ์ธํด์ฃผ์ธ์.
- ์ ์ฅ์ ํฌํฌ
- ๊ธฐ๋ฅ ๋ธ๋์น ์์ฑ
- ์ ๊ธฐ๋ฅ์ ๋ํ ํ ์คํธ ์ถ๊ฐ
- ๋ชจ๋ ํ
์คํธ ํต๊ณผ ํ์ธ:
pytest - ์ฝ๋ ํฌ๋งทํ
:
black src tests - Pull Request ์ ์ถ
๋ผ์ด์ ์ค
MIT License - ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
์ง์
๋ฌธ์์ฌํญ ๋ฐ ์ด์:
- ์ ์ฅ์์ ์ด์ ์์ฑ
- ๋ฐ์ดํฐ ๊ฐ์ด๋๋ DATA_GUIDE.md ์ฐธ์กฐ
- ์ฌ์ฉ ํจํด์ ์์ ํ์ธ
๋ณ๊ฒฝ ์ด๋ ฅ
๋ฒ์ ํ์คํ ๋ฆฌ๋ CHANGELOG.md๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ฐ์ฌ์ ๊ธ
- K-water์ ํ๊ตญ ๋ ๊ด๋ฆฌ ์์คํ ์ ์ํด ๊ฐ๋ฐ๋์์ต๋๋ค
- ๋ฐ์ดํฐ ์ ๊ทผ์ ์ํด MCP (Model Context Protocol) ์ฌ์ฉ
- ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD) ๋ฐฉ๋ฒ๋ก ์ผ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค
๋ฒ ํ ์คํ ์๋ด
โ ๏ธ ํ์ฌ ๋ฒ ํ ๋ฒ์ ์ ๋๋ค.
์ด SDK๋ ๋ฒ ํ ํ ์คํธ ๋จ๊ณ์ ์์ต๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ถฉ๋ถํ ํ ์คํธ๋ฅผ ์งํํด์ฃผ์ธ์.
์๋ ค์ง ์ ํ์ฌํญ:
- ์ผ๋ถ ์ธก์ ํญ๋ชฉ์ ๋ฐ์ดํฐ ๊ฐ์ฉ์ฑ์ ๋ฐ๋ผ ์กฐํ๋์ง ์์ ์ ์์ต๋๋ค
- MCP ์๋ฒ ์๋ต ์๊ฐ์ ๋คํธ์ํฌ ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค
ํผ๋๋ฐฑ:
- GitHub Issues๋ฅผ ํตํด ๋ฒ๊ทธ ๋ฆฌํฌํธ ๋ฐ ๊ธฐ๋ฅ ์ ์์ ๋ถํ๋๋ฆฝ๋๋ค
- ๋ฒ ํ ํ ์คํฐ๋ถ๋ค์ ํผ๋๋ฐฑ์ด SDK ๊ฐ์ ์ ํฐ ๋์์ด ๋ฉ๋๋ค
๋ฌธ์: GitHub Issues ๋๋ K-water ๋ด๋น์์๊ฒ ์ฐ๋ฝํด์ฃผ์ธ์.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kdm_sdk-0.2.1.tar.gz.
File metadata
- Download URL: kdm_sdk-0.2.1.tar.gz
- Upload date:
- Size: 88.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d8c89ca44a138066f95edd6983d6b8cdec924da60d6fdd62a10abd8d5da31464
|
|
| MD5 |
707beda4b077918af251f9eaa8e6628e
|
|
| BLAKE2b-256 |
165bc863449b0908a22be8f8526c0f3ab9f579150f57c2c46e693e1c019dcafc
|
File details
Details for the file kdm_sdk-0.2.1-py3-none-any.whl.
File metadata
- Download URL: kdm_sdk-0.2.1-py3-none-any.whl
- Upload date:
- Size: 32.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6eeba6d805246be9356ead1d6708c3e6eb494115d34066107b963230ac120336
|
|
| MD5 |
a8d1a7fed9a091a30667ec37dff80b35
|
|
| BLAKE2b-256 |
c4a1b72f6726b154a4741ccecc782823b4b188bae27ac83211f9a214674042f1
|