DataSafari is a Python library that simplifies complex data science tasks — compressing exploration, transformation, evaluation, and prediction into a single one-liner API. One import. One function call. One plain-English report.

George built DataSafari to solve a specific problem he watched play out at university: data science curricula built around Stata, R, and SPSS — tools with decades of academic inertia — while Python's better-maintained, faster, and more capable ecosystem went largely untaught. The researcher who understands their domain deeply but doesn't want to spend two hours reading Scipy docs to run a single test was the exact person the existing tooling failed. DataSafari is the attempt to fix that: one import, one function call, one plain-English report.

The library spans four subpackages — Explorer, Transformer, Evaluator, Predictor — mirroring the natural stages of any data workflow. Every function handles its stage end-to-end: automatic statistical method selection, dynamic assumption validation, composite-score model evaluation. Each call returns a plain-language report with findings and actionable recommendations — results that are interpretable, not just computed.

Role

Creator & Maintainer

Type

Data Science Python Library

Developed

2023-2025

Highlights

Architected 4-subpackage API from scratch: Explorer · Transformer · Evaluator · Predictor Unified 10 scientific libraries — NumPy, pandas, scikit-learn, scipy, statsmodels & more — into a single one-liner workflow Implemented automatic statistical test routing in predict_hypothesis() — detects variable types, checks assumptions, selects and runs the correct test Built composite-score ML model evaluation engine with automated hyperparameter tuning in predict_ml() Implemented statistical assumption checking across normality, variance, dtype, and contingency in Evaluator Designed multi-method outlier detection covering Z-score, IQR & Mahalanobis distance in Explorer Engineered 250+ pytest tests across 11 test files covering all 4 subpackages Built full GitHub Actions CI/CD pipeline: lint · test · security scan · build · docs deploy · publish Configured CI matrix to run across Python 3.9, 3.10, 3.11 & 3.12 in parallel Secured codebase with Bandit static scanning and SafetyCLI dependency auditing Tracked and closed 136 GitHub issues across the full development lifecycle Packaged and published to PyPI via an automated Poetry + Twine pipeline Automated Sphinx docs build and live-server deployment via rsync over SSH on every push Authored full Sphinx documentation site with custom Furo theme at datasafari.dev/docs Designed and launched dedicated product website at datasafari.dev
0 Functions shipped
0 Libraries unified into one API
0 Decisions automated per hypothesis test
0 Pipeline decisions automated per ML run
0 Commits pushed
0 Automated steps per CI run
0 Pytest tests written
0 Issues closed

Languages

Python HTML CSS Bash / Zsh

Python Libraries

pandas NumPy SciPy scikit-learn scikit-optimize category-encoders PyTorch HuggingFace Matplotlib seaborn Plotly statsmodels

Dev Toolchain

pytest tox Sphinx Read the Docs PyPI Poetry Setuptools GitHub Actions

Dev Tools & IDEs

VS Code Jupyter DataSpell Git GitHub

Platforms & Infra

cPanel Namecheap Cloudflare

Design & Creative

Adobe Illustrator Illustrator Adobe Photoshop Photoshop
Engineering Product Growth Data

Python Library Architecture

Designed the library from scratch as a four-subpackage system: Explorers, Transformers, Evaluators, and Predictors. The structure reflects the natural data science workflow. Built a consistent public API around a one-liner philosophy, making complex operations available through a single function with sensible defaults and room for deep customisation.

Package Architecture API Design Open-Source Engineering

OSS Release Engineering

Managed the full open-source release lifecycle, from project scaffolding with Poetry and Setuptools to versioned PyPI distribution. Configured pyproject.toml, package metadata, and dependencies to produce reproducible builds that users can install with a single pip command.

Release Management Dependency Management Distribution Engineering

Automated Test Suite Design

Built a test suite of more than 250 tests covering edge cases, input validation, and statistical output correctness across all subpackages. Configured tox to run the suite across multiple Python environments, helping datasafari work for as many users as possible.

Test Engineering Quality Assurance Multi-Environment Testing

CI/CD Pipeline Construction

Designed and built a 12-step GitHub Actions pipeline that runs automatically on every push. It performs lint checks, runs the full tox test matrix, and publishes to PyPI when a release is tagged. Closed 136 issues over the life of the project, validating every fix through the pipeline before merge.

Continuous Integration Automated Deployment Pipeline Design

Technical Documentation Engineering

Built the complete datasafari documentation system, including Sphinx source authoring, an automated build pipeline, and a custom public site at datasafari.dev. Wrote every page of the documentation: installation guides, function references, usage examples, and conceptual explanations for all 11 modules.

Documentation Systems Technical Writing Developer Experience

Defensive Python & Input Validation

Implemented rigorous input validation and error handling across all 11 public functions. Each accepts DataFrames, column names, and optional parameter combinations that can fail silently in naive code. I built runtime branching logic to detect data types, sample sizes, and edge cases, then route execution to the correct algorithm path. Every error message is written for the caller, not the developer. In an API, the message is the UI & UX together.

Defensive Programming Runtime Type Handling Error Design

Exploratory Data Analysis Systems

Designed and implemented the full Explorers subpackage. explore_df() profiles datasets, explore_num() performs numerical analysis including outlier detection via Z-score, IQR, and Mahalanobis distance, and explore_cat() profiles categorical data, including Shannon entropy to quantify diversity.

Exploratory Analysis Outlier Detection Statistical Profiling

Statistical Assumption Verification

Built the Evaluators subpackage to automate the assumption checks that data scientists typically perform before analysis. evaluate_normality() selects an appropriate test, such as Shapiro-Wilk or Anderson-Darling, based on the sample; evaluate_variance() dynamically applies Levene's, Bartlett's, or Fligner's test; and evaluate_contingency_table() checks whether Chi-square conditions are met.

Assumption Testing Statistical Inference Dynamic Test Selection

Automated Hypothesis Testing

predict_hypothesis() takes a DataFrame, a grouping variable, and a target variable — and autonomously selects and executes the correct statistical test. The function detects variable types, verifies normality and variance homogeneity, chooses between Chi-square, Fisher's exact, t-test, ANOVA, Mann-Whitney, Kruskal-Wallis, and others, then outputs test statistics, p-values, and a plain-language interpretation.

Hypothesis Testing Automated Inference Statistical Interpretation

End-to-End ML Pipeline Automation

predict_ml() orchestrates the complete machine learning workflow in one call — automatic preprocessing (scaling, encoding, vectorisation), multi-model evaluation using a user-configurable composite score weighted across multiple metrics, and automated hyperparameter tuning via grid search, random search, or Bayesian optimisation. Returns ranked, tuned models with full performance breakdowns.

ML Pipeline Design Hyperparameter Optimisation Model Selection

Data Transformation Engineering

Implemented the Transformers subpackage to handle the full data preparation stage. transform_num() covers standardisation, min-max scaling, log and power transforms, winsorisation, and interaction term creation. transform_cat() handles label encoding, one-hot encoding, target encoding, and ML-based category cleaning — all chainable and parameterised for reproducible pipelines.

Feature Engineering Data Cleaning Preprocessing Pipeline Design

Developer API & UX Design

Built datasafari around a deliberate developer experience philosophy — consistent naming across all 11 functions, predictable argument patterns, and sensible defaults that make the library immediately usable without reading the docs. Complex workflows like full ML pipelines and hypothesis testing are exposed as single function calls, hiding implementation complexity behind a clean interface.

Interface Design Developer Experience Abstraction Design

Documentation Site Development

Designed and hand-coded datasafari.dev — the public documentation and landing site for the library. Built with custom HTML, CSS, and JavaScript, the site presents the library's philosophy, quick-start guides, and full API reference in a clean, readable format. Integrated with Sphinx and Read the Docs for automated doc generation, while the landing experience was crafted entirely from scratch.

Web Development Information Architecture Content Strategy

Open-Source Product Lifecycle Management

Managed datasafari as a solo product owner, from its initial concept and roadmap through versioned releases, issue tracking, and ongoing maintenance. Closed 136 issues while balancing engineering quality, user-facing documentation, and public discoverability. Built systems that kept the project sustainable and reproducible beyond any single release.

Product Ownership Roadmap Execution Solo Founding

Brand Identity & Visual Systems

Created the complete visual identity for datasafari, including the logo, banner artwork, icon set, and graphic assets used across GitHub, PyPI, and the documentation site. Designed every visual touchpoint a user encounters when discovering the library, giving an independent open-source project a coherent, professional brand from day one.

Brand Design Visual Identity Graphic Asset Production
GitHub Actions showing full CI/CD pipeline overview
GitHub Actions showing build process steps
Engineering

CI/CD Pipeline Architecture

  • Built a 12-step GitHub Actions pipeline covering linting, the test matrix, security scanning, and conditional PyPI publishing on tagged releases
  • Configured tox to run the full pytest suite in parallel across Python 3.9, 3.10, 3.11, and 3.12 on every push
  • Automated Sphinx docs build and live deployment to datasafari.dev via rsync over SSH, triggered on every merge to main
  • Closed 136 GitHub issues over the development lifecycle, each fix validated through the pipeline before merge
DataSafari GitHub issues list showing 136 issues with labels, milestones, and status tags across the development lifecycle
DataSafari GitHub milestones page showing structured development phases with issue counts and completion progress
DataSafari GitHub issue showing detailed problem description with context, expected behaviour, and reproduction steps
DataSafari GitHub issue showing solution description with implementation notes and closing commit reference
DataSafari GitHub labels page showing full tagging taxonomy: bug, enhancement, documentation, and domain labels
DataSafari GitHub showing issue linked to milestone and pull request with full traceability
Engineering

Issue Tracking & Milestone System

  • Filed and closed 136 GitHub issues across the full development lifecycle — each with a structured problem description, reproduction context, and a written solution note on close
  • Organised work into versioned milestones mapping issues to release targets, giving every fix a traceable path from report to merged commit
  • Built a full label taxonomy — bug type, domain, priority, and status — so the issue board reads as a professional engineering backlog, not a personal to-do list
Terminal output showing pytest run: 250+ tests passed
Engineering

Test Suite & Quality Gates

  • Wrote 250+ pytest tests across 11 test files, covering edge cases, input validation, and statistical output correctness for all four subpackages
  • Integrated Bandit for static security scanning and SafetyCLI for dependency vulnerability auditing — both run automatically on every push
  • Configured tox to enforce test-passing across all supported Python versions before any release is tagged
DataSafari library structure showing four subpackages: explorer, transformer, evaluator, predictor
Engineering

4-Subpackage Library Architecture

  • Designed the full package structure from scratch: explorer/, transformer/, evaluator/, predictor/ — each a self-contained module with its own public API surface
  • Every public function follows a consistent interface contract: DataFrame in, structured report out — one-liner by design, full depth available via parameters
  • Configured Poetry, Setuptools, and pyproject.toml for reproducible builds and one-command PyPI distribution
explore_num output showing structured report with outlier detection, normality testing, and multicollinearity analysis
Data

Automated EDA — explore_num()

  • Single function call produces full numerical profiling: outlier detection via Z-score, IQR, and Mahalanobis distance, normality testing, skewness, kurtosis, and multicollinearity
  • Output is a structured plain-English report with findings and actionable recommendations — not raw numbers
  • Automatically selects the correct statistical method based on sample size and data characteristics at runtime
predict_ml output showing ranked model comparison table with composite scores
Data

End-to-End ML Pipeline — predict_ml()

  • One call handles preprocessing, multi-model training, composite-score-based evaluation weighted across user-configurable metrics, and ranked output
  • Automated hyperparameter tuning via grid search, random search, or Bayesian optimisation — user selects strategy, library handles execution
  • 10 pipeline decisions automated per ML run: encoding, scaling, model selection, tuning strategy, evaluation weighting, and recommendation generation
DataSafari website landing page at datasafari.dev showing slogan, code animation and branding artwork
DataSafari website showing package philosophy with clear parallel between data science workflow and library subpackage structure
DataSafari website showing installation instructions
DataSafari website showing simple usage example and documentation prompt for further exploration
DataSafari documentation welcome page at datasafari.dev/docs in light mode, showing quick-start guide and function reference links
DataSafari documentation welcome page at datasafari.dev/docs in dark mode, showing quick-start guide and function reference links
DataSafari documentation showing installation instructions and pip install command
DataSafari documentation quick start guide showing explorers subpackage overview and example usage
DataSafari documentation quick start guide showing transformers subpackage overview and example usage
DataSafari documentation quick start guide showing evaluators subpackage overview and example usage
DataSafari documentation quick start guide showing predictors subpackage overview and example usage
DataSafari quick start guide showing example usage of one-line hypothesis testing function with automatic test selection and output interpretation
DataSafari quick start guide showing example usage of one-line predict_ml function with automatic preprocessing, model selection, and hyperparameter tuning
Product

Website & Documentation

  • Hand-coded the full landing site at datasafari.dev — custom HTML, CSS, and JavaScript, designed from scratch to communicate the library's philosophy and quick-start path
  • Authored every page of the Sphinx-generated API docs: installation guides, function references, usage examples, and conceptual explanations for all 11 modules
  • Integrated automated docs build and live-server deployment into the CI/CD pipeline — docs update on every push to main without manual intervention
DataSafari github repository banner showing logo and tagline 'Complex Workflows, Simple Solutions.' on a desert landscape background
DataSafari light and dark mode logo variations on clean backgrounds
DataSafari mini logo used for favicon and library icon, on coding background
Growth

Brand Identity & Open-Source Presence

  • Created the complete DataSafari visual identity from scratch: logo, banner artwork, icon set, and all graphic assets across GitHub, PyPI, and the documentation site
  • Published to PyPI with automated versioning and structured release notes, making the library publicly installable via pip install datasafari
  • Maintained a professional open-source presence: README, changelog, issue labels, and a coherent brand that makes a solo-built library read as a production-grade tool

At RUG, the standard data science curriculum ran on Stata, R, and SPSS. These tools have decades of academic inertia behind them, not necessarily because they are better, but because professors mastered them before Python became a serious data science platform and have not had time to switch. As a result, students graduate knowing tools that industry has largely moved beyond, while Python's better-maintained, faster, free, and more capable ecosystem goes untaught. Professors and other departmental staff have too much on their hands for a full curriculum redesign.

DataSafari started as a direct response to that gap. The hypothesis was simple: bring Python's best statistical and ML libraries together under a single interface that requires no configuration and produces plain-English output. That removes the adoption barrier for the person who most needs it: a researcher who knows their field, understands what a normality test is, but doesn't want to spend two hours reading scipy.stats documentation to run one. One import, one function call, and one readable report.

The iPhone analogy is imperfect but directionally useful. R is like Android: powerful, flexible, and beloved by people willing to configure it. DataSafari aims to provide an iOS-like layer on top of Python's underlying ecosystem.

That philosophy drove every product decision. It's why method='all' is the default rather than a required argument. It's why output is printed in plain English with interpretive tips instead of being returned as a raw matrix. It's why the function names are verbs such as explore, transform, evaluate, and predict. They describe what the user wants to do, not what the statistics are called. The target user was never a Python expert. It was someone who needed to do real data science work without letting the tooling become the hardest part of the day.