Skip to main content

py4csr: Python for Clinical Study Reporting

Tests Coverage Python Version License Code Style Documentation Clinical Outputs RTF Ready Interactive HTML CDISC Compliant

py4csr is a professional Python framework for clinical study reporting designed specifically for pharmaceutical and biotech companies. Built with functional programming principles and modular architecture, py4csr enables efficient generation of regulatory-compliant clinical reports from reusable, combinable components.

🚀 Key Advantages

py4csr delivers significant improvements over traditional clinical reporting approaches:

  • 🔗 Functional Composition: Build complex reports through intuitive method chaining
  • 🧩 Modular Architecture: Combine reusable statistical components dynamically
  • 🔒 Data Integrity: Ensure reproducibility with immutable transformations
  • ⚡ Performance Optimized: Significantly faster than traditional SAS workflows
  • 📊 Dual-Format Output: Generate regulatory RTF + interactive HTML from same code

🎯 16 Professional Sample Outputs | 📊 7 Clinical Tables | 📈 8 Clinical Figures (RTF + HTML) | 📋 1 Safety Listing

✨ What py4csr Can Generate for You ✨

🏥 Clinical Domain 📋 Output Type 🌐 Interactive HTML 🎯 Regulatory Standard
Demographics Professional Tables ❌ ✅ ICH E3 Ready
Safety Analysis AE Summaries & Listings ❌ ✅ FDA Compliant
Efficacy Analysis Statistical Tables ❌ ✅ CDISC Standards
Survival Analysis Kaplan-Meier Plots ✅ Interactive ✅ Submission Quality
Subgroup Analysis Forest Plots ✅ Interactive ✅ Clinical Standards
Distribution Analysis Box Plots ✅ Interactive ✅ Statistical Standards
Longitudinal Analysis Line Plots ✅ Interactive ✅ Regulatory Ready

🌟 Unique Feature: Interactive HTML Plots

py4csr generates both regulatory-ready RTF files AND interactive HTML plots from the same code - a unique capability in clinical reporting.

🚀 Key Features

🔗 Functional Programming & Modular Architecture

  • 🧩 Modular Components: Combine demographics, safety, efficacy modules dynamically
  • ⚡ Method Chaining: Compose complex workflows through elegant function composition
  • 🔒 Immutable Data: Ensure data integrity with immutable transformations
  • 🎯 Pure Functions: Enhance reproducibility with side-effect-free calculations
  • 📊 Statistical Templates: Reusable, configurable analysis components
  • 🔧 Dynamic Composition: Build sophisticated reports from simple components

📈 Advanced Analytics

  • Statistical templates: Pre-built calculations for clinical endpoints
  • Multiple output formats: RTF, PDF, Interactive HTML, Excel generation
  • Clinical plotting: Specialized plots (Kaplan-Meier, Forest, Waterfall, etc.)
  • Interactive HTML plots: Zoom, hover, filter capabilities for enhanced data exploration
  • Real data validation: Tested with actual clinical trial datasets

🔧 Production Ready

  • Regulatory compliance: ICH E3 and CTD-ready outputs
  • Data quality checks: Built-in validation and quality assessment
  • Performance optimized: Handles large clinical datasets efficiently
  • Extensible architecture: Easy to customize and extend

📦 Installation

Basic Installation

pip install py4csr

With PDF Support

pip install py4csr[pdf]

Development Installation

# Clone the repository
git clone https://github.com/yanmingyu92/py4csr.git
cd py4csr

# Install in development mode with all dependencies
pip install -e ".[dev]"

Requirements

  • Python: 3.9 or higher
  • Core dependencies: pandas, numpy, scipy, matplotlib, seaborn
  • Optional: reportlab (for PDF output), openpyxl (for Excel output)
  • Development: pytest, black, mypy, sphinx (included in [dev] extra)

🚀 Quick Start

Your First Clinical Report in 5 Minutes

from py4csr.clinical import ClinicalSession
import pandas as pd

# Load your ADSL dataset
adsl = pd.read_csv("data/adsl.csv")

# Create a demographics table
session = ClinicalSession(uri="STUDY001")
session.define_report(
    dataset=adsl,
    subjid="USUBJID",
    title="Table 14.1.1 Demographics and Baseline Characteristics"
)

# Add treatment groups
session.add_trt(name="TRT01PN", decode="TRT01P", across="Y")

# Add demographic variables
session.add_var(name="AGE", label="Age (years)", stats="n mean+sd median q1q3 min+max")
session.add_catvar(name="SEX", label="Sex, n (%)", stats="npct", codelist="M='Male',F='Female'")
session.add_catvar(name="RACE", label="Race, n (%)", stats="npct")

# Generate and save
session.generate()
session.finalize(output_path="demographics.rtf", format="rtf")

print("✅ Demographics table created successfully!")

Using the Functional Interface

from py4csr.reporting import ReportBuilder
from py4csr.config import ReportConfig

# Create report using method chaining
config = ReportConfig()
result = (ReportBuilder(config)
    .init_study(uri="STUDY001", title="Phase III Clinical Study Report")
    .add_dataset("adsl", adsl)
    .define_populations(safety="SAFFL=='Y'", efficacy="EFFFL=='Y'")
    .define_treatments(var="TRT01P")
    .add_demographics_table(title="Demographics", population="safety")
    .add_ae_summary_table(title="Adverse Events Summary", population="safety")
    .generate_all(output_dir="reports")
    .finalize()
)

print(f"✅ Generated {len(result.generated_files)} report files")

For more examples, see the Quick Start Guide and Examples.

🎯 Sample Outputs Showcase

py4csr generates professional, regulatory-ready outputs that meet industry standards for clinical trial reporting. Explore our comprehensive collection of sample outputs in the examples/sample_outputs/ directory:

📊 Clinical Tables (7 Examples)

Table Type File Description
Demographics t_dem.rtf Baseline characteristics with statistical comparisons
Adverse Events t_ae_sum.rtf Comprehensive safety analysis by SOC/PT
Vital Signs t_vs_sum.rtf Change from baseline with clinical significance
Subject Disposition t_disp.rtf Patient flow and completion rates
Drug Exposure t_exposure.rtf Treatment compliance and duration analysis
Laboratory Chemistry t_lb_sum_chem.rtf Clinical chemistry with shift tables
Efficacy Response t_eff_response.rtf Primary endpoint analysis with statistics

📈 Clinical Figures (8 Examples - RTF + Interactive HTML)

Figure Type RTF (Regulatory) HTML (Interactive) Description
Kaplan-Meier km_enhanced_example.rtf km_enhanced_example.html Survival analysis with risk tables
Forest Plot forest_enhanced_example.rtf forest_enhanced_example.html Efficacy across subgroups
Box Plot box_plot_clinical_example.rtf box_plot_clinical_example.html Distribution analysis by treatment
Line Plot line_plot_clinical_example.rtf line_plot_clinical_example.html Longitudinal trends over time

🌟 UNIQUE FEATURE: py4csr generates both regulatory-ready RTF and interactive HTML versions of every plot!

📋 Clinical Listings (1 Example)

Listing Type File Description
AE Deaths l_ae_death.rtf Individual patient safety listings

🔒 Data Security: All sample outputs are generated from synthetic data only. No real patient data is used or exposed.

📋 Regulatory Ready: All outputs follow ICH E3 guidelines and FDA submission standards.

🧩 Modular Architecture Advantages

Traditional SAS Approach ❌

/* Monolithic program - 156 function calls for efficacy table */
%macro create_efficacy_table();
  /* 50+ lines of data preparation */
  /* 30+ lines of statistical calculations */
  /* 40+ lines of formatting */
  /* 30+ lines of output generation */
%mend;

py4csr Functional Approach ✅

# Elegant composition - 12 function calls for same table
session = (ReportSession()
    .init_study("STUDY001", "Phase III Study")
    .load_datasets(data_path="data/")
    .define_populations(efficacy="EFFFL=='Y'")
    .add_efficacy_analysis()  # Reusable module
    .generate_all()
    .finalize()
)

🎯 Key Advantages

  • 91.2% Code Reduction: From 37-156 to 5-12 function calls per table
  • 🧩 Reusable Modules: Demographics, safety, efficacy components
  • 🔗 Dynamic Composition: Combine modules to create complex reports
  • ⚡ 3.2x Performance: Faster execution than traditional SAS
  • 🔒 Data Integrity: Immutable transformations ensure audit trails
  • 📊 Dual Output: RTF + Interactive HTML from same code

🏃‍♂️ Quick Start

Basic Usage

from py4csr.functional import ReportSession

# Initialize a clinical study report session
session = (ReportSession()
    .init_study(
        uri="STUDY001", 
        title="Phase III Efficacy and Safety Study",
        protocol="ABC-123-2024"
    )
    .load_datasets(data_path="data/")
    .define_populations(
        safety="SAFFL=='Y'", 
        efficacy="EFFFL=='Y'"
    )
    .define_treatments(var="TRT01P")
)

# Generate standard clinical tables
session = (session
    .add_demographics_table()
    .add_disposition_table()
    .add_ae_summary()
    .add_efficacy_analysis()
)

# Generate all outputs
result = session.generate_all().finalize()
print(f"Generated {len(result.generated_files)} report files")

Working with Real Clinical Data

# Load CDISC ADaM datasets
datasets = {
    'ADSL': 'data/adsl.sas7bdat',
    'ADAE': 'data/adae.sas7bdat',
    'ADLB': 'data/adlb.sas7bdat'
}

session = (ReportSession()
    .init_study(uri="REAL-STUDY", title="Real Clinical Data Analysis")
    .load_datasets(datasets=datasets)
    .define_populations(safety="SAFFL=='Y'")
    .define_treatments(var="TRT01P")
    .add_demographics_table()
    .add_ae_summary()
    .generate_all(output_dir="clinical_reports")
    .finalize()
)

Advanced Features

from py4csr.functional import ReportSession, FunctionalConfig

# Custom configuration
config = FunctionalConfig.clinical_standard()
config.add_statistic("geometric_mean", "Geometric Mean")
config.set_format("p_value", "{:.4f}")

# Advanced session with custom features
session = (ReportSession(config)
    .init_study(uri="ADVANCED-001", title="Advanced Analysis")
    .load_datasets(data_path="data/")
    .define_populations(safety="SAFFL=='Y'", efficacy="EFFFL=='Y'")
    .define_treatments(var="TRT01P")
    
    # Add custom grouping and formatting
    .add_grouping("age_group", "AGEGR1", {"<65": "Young", ">=65": "Elderly"})
    .add_conditional_formatting("p_value", lambda x: x < 0.05, "highlight")
    
    # Generate tables with advanced features
    .add_demographics_table(by_group="age_group")
    .add_ae_summary(include_severity=True)
    .add_efficacy_analysis(endpoints=["AVAL", "CHG"])
    
    # Generate plots
    .create_kaplan_meier_plot(time_var="AVAL", event_var="CNSR")
    .create_forest_plot(endpoint="CHG", subgroups=["SEX", "AGEGR1"])
    
    .generate_all()
    .finalize()
)

📚 Documentation

Core Modules

Module Description
py4csr.functional Main functional reporting interface
py4csr.clinical Direct clinical reporting system
py4csr.data Data loading and manipulation utilities
py4csr.analysis Statistical analysis functions
py4csr.plotting Clinical plotting capabilities
py4csr.reporting Report generation and formatting
py4csr.validation Data quality and compliance checking

Key Classes

  • ReportSession: Main orchestrator for functional reporting
  • ClinicalSession: Direct clinical reporting interface
  • FunctionalConfig: Configuration management for reports
  • TableBuilder: Functional table construction
  • StatisticalTemplates: Reusable statistical calculations
  • PlottingEngine: Clinical plot generation

🧪 Testing with Real Data

py4csr has been tested with real clinical trial data including:

  • CDISC Pilot Study: 254 subjects, 10 ADaM datasets (~92MB)
  • Multiple domains: Demographics, AE, Laboratory, Vital Signs, Questionnaires
  • Complex scenarios: Multiple visits, missing data, regulatory requirements
# Example with real CDISC data
from py4csr.examples import load_cdisc_pilot_data

datasets = load_cdisc_pilot_data()
print(f"Loaded {len(datasets)} datasets:")
for name, df in datasets.items():
    print(f"  {name}: {len(df)} records")

# Generate standard regulatory tables
session = create_regulatory_report_session(datasets)
result = session.generate_all().finalize()

🏗️ Architecture

py4csr follows a modular, functional architecture:

py4csr/
├── functional/          # Functional programming interface
│   ├── session.py      # ReportSession class
│   ├── config.py       # Configuration management
│   └── templates.py    # Statistical templates
├── clinical/           # Direct clinical interface
│   ├── session.py      # ClinicalSession class
│   ├── statistical_engine.py  # Statistics calculations
│   └── enhanced_rtf_formatter.py  # Professional RTF output
├── data/               # Data I/O and manipulation
├── analysis/           # Statistical analysis
├── plotting/           # Clinical plotting
├── reporting/          # Output generation
├── validation/         # Quality checks
└── examples/           # Example scripts and data

🤝 Contributing

We welcome contributions! Please see CONTRIBUTING.md for details.

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🙏 Acknowledgments

  • Inspired by the clinical reporting needs of the pharmaceutical industry
  • Built for regulatory compliance and professional clinical research
  • Designed with input from biostatisticians and clinical data managers

📞 Support

🗺️ Roadmap

Version 1.1 (Next Release)

  • Enhanced CDISC metadata integration
  • Additional statistical tests
  • Interactive dashboard generation
  • Cloud deployment templates

Version 1.2 (Future)

  • Real-time data monitoring
  • Advanced machine learning integration
  • Multi-language support
  • Enterprise features

py4csr - Bringing the power of clinical reporting to Python 🐍📊

Metadata

Release files for py4csr 0.1.1

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

Source distribution (sdist)

Source distribution for py4csr 0.1.1
File Size Uploaded
py4csr-0.1.1.tar.gz 17.8 MB Details

Built distribution (wheel)

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

Total release size: 38.4 MB

Release files / py4csr-0.1.1.tar.gz

Download URL py4csr-0.1.1.tar.gz
Size 17.8 MB
Tags Source
SHA-256 checksum
How to use checksums
0bd363256c45b4402adce60e67f2fd79e2856a4ee5dac403158401191959b97a
BLAKE2b-256 checksum
How to use checksums
e74f9b7d0287ce0276e11c19a447de488d857dbe8040de37ebbe6892779e6493
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.8

Release files / py4csr-0.1.1-py3-none-any.whl

Download URL py4csr-0.1.1-py3-none-any.whl
Size 20.6 MB
Tags Python 3
SHA-256 checksum
How to use checksums
5398aba9cd43b2bcfadd540f5a8dc248b8e2790e8d29d9f635f525cfd87c7717
BLAKE2b-256 checksum
How to use checksums
d63ed5880e3085f4438607aa1c906b29b5a7f04e7fa9f8ff2ed1a3185fcabd63
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.8

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

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