Skip to main content

duckcdm

DuckCDM

DuckCDM — DuckDB-powered OMOP CDM engine. OMOP data. Simpler. Faster. Everywhere.

OHDSI SqlRender, Circe and Achilles plus an ATLAS 3.0-compatible WebAPI, in pure Python on DuckDB. No Java, no Postgres, no Docker.

OMOP CDM · OHDSI ATLAS 호환 도구를 DuckDB 위에서, 순수 파이썬으로.

pip install duckcdm
모듈 원본 (OHDSI, Apache 2.0) 상태
duckcdm.sqlrender SqlRender (Java) 이식 완료 — Java 판과 58,440 건 글자 단위 일치
duckcdm.circe circe-be (Java) 이식 완료 — Java 판과 32,937 건 비교, 결과가 다른 것 0 건(PhenotypeLibrary 1,104 코호트 포함)
duckcdm.webapi WebAPI 3.0 (Java) — ATLAS 3.0 화면이 부르는 API 어휘 검색·개념집합·코호트 정의·생성·포함규칙 보고서·데이터 소스 보고서. ATLAS 3.0 화면을 함께 담았다
duckcdm.achilles Achilles (R) 보고서용 분석 110개를 원본 SQL 그대로 DuckDB 에서 (Eunomia 2초)
from duckcdm.sqlrender import render, translate
sql = render("SELECT TOP 10 * FROM @cdm.person {@adult}?{WHERE year_of_birth < 2000};", cdm="main", adult=True)
translate(sql, "duckdb")   # SELECT  * FROM main.person WHERE year_of_birth < 2000 LIMIT 10;
from duckcdm.circe import build_cohort_query
sql = build_cohort_query(open("cohort.json").read(), cdm_schema="main", target_table="main.cohort", cohort_id=1)
duck = translate(render(sql), "duckdb")
pip install "duckcdm[server]"
duckcdm serve EUNOMIA=cdm.duckdb --achilles # http://127.0.0.1:8080/ 에 ATLAS 3.0, /WebAPI 에 API
duckcdm achilles cdm.duckdb                 # 데이터 소스 보고서용 Achilles 결과만 계산
duckcdm cohort cohort.json duckdb --cdm main --results main --cohort-id 1
duckcdm translate query.sql duckdb -p cdm=main
duckcdm dialects

서버 (duckcdm serve)

DuckDB 파일 하나가 WebAPI 의 소스 하나(CDM·어휘·결과 스키마). 결과 스키마(results)와 코호트 결과 테이블은 없으면 만든다. 개념집합·코호트 정의는 첫 DB 옆 duckcdm_store.duckdb 에 저장한다. 로그인은 없다(관리자 한 명). 데이터 소스 보고서는 --achilles(또는 duckcdm achilles)로 결과 스키마에 Achilles 결과를 만든 뒤 나온다. 아직 없는 것: 특성화·발생률·경로 분석, 버전 이력, 태그.

Java 판과의 동등성 검증

Circe: tests/equiv/circe_corpus.py(PhenotypeLibrary 코호트×옵션 3종, 개념집합, circe 테스트 JSON, 무작위 코호트) → tests/java_circe/CirceHarness.java(Jackson 2.11·commons-lang3·standardized-analysis-utils·semver4j jar 필요) 와 tests/equiv/py_circe_harness.py 결과를 tests/equiv/circe_diff.py 로 비교.

SqlRender:

tests/equiv/ — SqlRender R 테스트 문자열 2,009개, Circe·WebAPI SQL 763개(×16 방언·렌더·분할), 합성 조건식 3,000개를 Java 원본(tests/java, JDK 22+ 소스 실행)과 이 이식본에 넣어 결과를 비교한다.

python3 tests/equiv/build_corpus.py <클론 디렉터리> cases.tsv
python3 tests/equiv/run_java.py cases.tsv java.out 24
PYTHONPATH=src python3 tests/equiv/py_harness.py cases.tsv py.out 32
python3 tests/equiv/diff.py cases.tsv java.out py.out

알려진 차이: Java 내부 예외(EmptyStack, ArrayIndexOutOfBounds)의 메시지 문구만 다르다(예외가 나는 자리는 같다). BMP 밖 문자(이모지 등)는 Java 가 UTF-16 대리쌍 둘로 보므로 위치가 달라질 수 있다.

라이선스

Apache 2.0. src/duckcdm/sqlrender/csv/replacementPatterns.csv 와 ref/java, tests/java/org 는 OHDSI SqlRender 에서 가져왔다(third_party/, NOTICE).

Metadata

Release files for duckcdm 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for duckcdm 0.3.0
File Size Uploaded
duckcdm-0.3.0.tar.gz 3.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for duckcdm 0.3.0
File Interpreter ABI Platform
duckcdm-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 6.9 MB

Release files / duckcdm-0.3.0.tar.gz

Download URL duckcdm-0.3.0.tar.gz
Size 3.3 MB
Tags Source
SHA-256 checksum
How to use checksums
343dcc9a407ea91f9619e543cb035e850cd4a025b36fb6096fbf33f0bca3d203
BLAKE2b-256 checksum
How to use checksums
e5ce133e786f33d438126a3d9a590744d663925baad07fa40413331f0aeac4e0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / duckcdm-0.3.0-py3-none-any.whl

Download URL duckcdm-0.3.0-py3-none-any.whl
Size 3.6 MB
Tags Python 3
SHA-256 checksum
How to use checksums
b88c3274eb07e1e5bb945a03f9e0eb3e2c8948a16ba1ff58738ccc9c51c9c74a
BLAKE2b-256 checksum
How to use checksums
8d8a484dd5a23797a3ad9bf97c671f1b0f8a2e4978848ff0ff24e5a48427eb0b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

0.4.7

2 release files

0.4.6

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

This release

0.3.0 This release

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page