IN-BROWSER COLUMNAR COMPILATION • ZERO SERVER TRANSMISSION • CLIENT PRIVACY

Data Profiler: In-Browser Columnar Analytics

High-performance data profiling engine executing entirely inside the browser. Computes descriptive statistics, inferential column semantics, polymorphic boolean normalizations, outlier IQR detection, and a deterministic four-dimensional Data Health Score with zero server compute egress.

Repository: github.com/injetiharsha/data-profiler ↗ Engine: Client-Side WASM & Columnar Profiler Data Privacy: 100% In-Memory (Zero Network Transmission) Health Engine: 4-Factor Deterministic Diagnostic Live Vercel: data-profiler-puce.vercel.app ↗
LIVE IN-BROWSER ANALYTICS ENGINE ACTIVE: test_datatypes.csv
89.4 / 100
DATA HEALTH SCORE STRONG INTEGRITY
Completeness: 98.8% Uniqueness: 100% Validity: 85.0% Outliers: 75.0%
TOTAL ROWS 10 Record instances
COLUMNS 16 Analyzed fields
TOTAL CELLS 160 Data points
MISSING CELLS 3 1.88% null ratio
SELECT COLUMN FOR GRANULAR STATISTICAL BREAKDOWN: 16 COLUMNS DETECTED

salary

FLOAT64
FINANCIAL NUMERIC
⚠️
Tukey Outlier Flagged

Value $250,000.00 exceeds upper quartile bound (Q3 + 1.5×IQR = $195,500.00).

VALUE DISTRIBUTION • EQUAL-WIDTH BINS 10 VALUES BUCKETED
$42,000 $146,000 $250,000
IN-MEMORY DATASET GRID (SCROLLABLE RECORD INSPECTOR)
10 / 10 ROWS
ANALYTICAL DEPTH • BROWSER-NATIVE COLUMNAR CRUNCHING

Automated Profiling & Statistical Pipeline

Comprehensive analytical breakdown of every distribution, metric, and structural anomaly detected across tabular datasets.

📊
SUITE 01

Descriptive & Distributional Statistics

Complete parametric and non-parametric metric extraction calculated client-side in sub-second intervals across numeric and categorical series.

  • Central Tendency: Arithmetic Mean, Harmonic Mean, Median, and Frequency Mode.
  • Dispersion: Sample Standard Deviation, Variance, and Interquartile Range (IQR = Q3 − Q1).
  • Shape Metrics: Pearson Skewness (asymmetry) and Fisher-adjusted Excess Kurtosis (tail-heaviness).
  • Bucket Histograms: Equal-width binned density histograms with frequency distribution counts.
🧬
SUITE 02

Automated Structural & Type Inference

Deep heuristic data typing that automatically classifies ambiguous string columns into strictly typed analytical series.

  • Polymorphic Booleans: Discovers and normalizes disparate flags: Yes/No, True/False, 1/0, Y/N.
  • Temporal Parsing: Identifies ISO-8601 timestamps, epoch times, and date strings without external moment/luxon bloat.
  • Categorical Cardinality: Computes distinct value ratios and Shannon entropy for column diversity.
  • Currency & Numeric Sanitization: Strips currency symbols, thousands commas, and parses signed floats.
🛡️
SUITE 03

Data Quality & Anomaly Detection

Proactive risk identification catching structural corruption, systematic dropouts, and statistical anomalies before downstream training.

  • Missing Value Patterns: Computes column null percentages and flags systemic missingness patterns.
  • Tukey Outlier Fences: Applies [Q1 − 1.5·IQR, Q3 + 1.5·IQR] boundaries to highlight extreme outlier records.
  • Exact Duplicate Hashing: Fast row-level collision detection across full records or primary key subsets.
  • Mixed Type Warnings: Highlights dirty columns containing conflicting types (e.g., numbers mixed with strings).
⚡
SUITE 04

Interactive Multi-Variable Visualizer

Rich interactive charting and exploratory data analysis visualizer generating high-resolution SVG diagrams in real time.

  • Dynamic Scatter & Bubble Charts: Multi-variable plotting with size, color, and trend correlations.
  • Radar Performance Maps: Multi-axial comparison across departments, categories, and ratings.
  • On-the-Fly Aggregations: Client-side Sum, Average, Min, Max, and Count groupings.
  • One-Click Exports: Export filtered subsets to clean CSV, Parquet, or JSON diagnostic reports.
DETERMINISTIC EVALUATION • FORMULATION SPEC

Data Health Score Mathematical Formulation

Standardized four-factor deterministic metric evaluating dataset integrity, completeness, and structural hygiene.

WEIGHT: 40%

1. Completeness Score (Sc)

Sc = 100 × ( 1 −
Σ null_cells total_cells
)

Quantifies missing cell presence across all columns. Scores below 95% trigger automated missing value warnings and imputation recommendations.

WEIGHT: 25%

2. Uniqueness Score (Su)

Su = 100 × ( 1 −
duplicate_rows total_rows
)

Calculates exact row-level duplicate frequency. Identifies redundancy from batch ingestion duplicates or repeated sync intervals.

WEIGHT: 20%

3. Type Validity Score (Sv)

Sv = max ( 0 , 100 − 50 ×
Nmixed_cols Ntotal_cols
)

Penalizes polymorphic or mixed datatypes (e.g. strings mixed into numeric series), flags ambiguous date formats, and checks structural padding.

WEIGHT: 15%

4. Outlier Stability & Bounds (So)

IQR = Q3 − Q1 │ Bounds = [ Q1 − 1.5·IQR , Q3 + 1.5·IQR ]

Tukey fences detect statistical anomalies on numeric columns, isolating extreme outliers without skewing standard distributions.

PRODUCTION SOURCE INSPECTION • SYNTAX HIGHLIGHTED

Engine Implementation Architecture

Inspect the verified TypeScript WebWorker bridge, DataFrame caching, and Python profiling engines powering the system.

LOCATION: src/worker/pyodideWorker.ts ROLE: WebWorker thread bootstrap & Pyodide MEMFS injection
import type { PyodideInterface } from "pyodide";
import datasetManagerCode from "../../python/engine/dataset_manager.py?raw";
import profileServiceCode from "../../python/engine/profile_service.py?raw";
import statsCode from "../../python/profilers/statistics.py?raw";
import qualityCode from "../../python/profilers/quality.py?raw";
import operationsCode from "../../python/operations/core.py?raw";

let pyodide: PyodideInterface | null = null;

async function initPyodide() {
  try {
    const pyodideModule = await import("https://cdn.jsdelivr.net/pyodide/v314.0.2/full/pyodide.mjs");
    pyodide = await pyodideModule.loadPyodide({
      indexURL: "https://cdn.jsdelivr.net/pyodide/v314.0.2/full/",
    });
    
    // Load compiled core packages into WASM heap
    await pyodide.loadPackage(["pandas", "numpy", "pyarrow", "micropip"]);
    
    // Mount Virtual In-Memory Filesystem (MEMFS)
    pyodide.FS.mkdir("/engine");
    pyodide.FS.mkdir("/profilers");
    pyodide.FS.mkdir("/operations");
    
    pyodide.FS.writeFile("/engine/__init__.py", "");
    pyodide.FS.writeFile("/engine/dataset_manager.py", datasetManagerCode);
    pyodide.FS.writeFile("/engine/profile_service.py", profileServiceCode);
    pyodide.FS.writeFile("/profilers/quality.py", qualityCode);
    pyodide.FS.writeFile("/profilers/statistics.py", statsCode);
    pyodide.FS.writeFile("/operations/core.py", operationsCode);
    
    // Global path injection and shared module imports
    await pyodide.runPythonAsync(`
      import sys, json, math
      import pandas as pd
      sys.path.append('/')
      from engine.dataset_manager import manager
      from engine.profile_service import profiler
      from operations.core import operator
    `);

    self.postMessage({ type: "READY", success: true });
  } catch (error) {
    self.postMessage({ type: "ERROR", error: String(error) });
  }
}
LOCATION: python/engine/dataset_manager.py ROLE: High-performance DataFrame cache & type-safe ingestion
import pandas as pd
import numpy as np
import io

class DatasetManager:
    def __init__(self):
        self._active_df: pd.DataFrame | None = None
        self._history = []
        self._history_pointer = -1
        self._schema_cache = {}

    def load_bytes(self, file_bytes: bytes, filename: str) -> dict:
        """Loads CSV/Parquet from raw bytes into active DataFrame singleton."""
        if filename.endswith(".csv"):
            self._active_df = pd.read_csv(io.BytesIO(file_bytes), low_memory=False)
        elif filename.endswith(".parquet"):
            self._active_df = pd.read_parquet(io.BytesIO(file_bytes))
        else:
            raise ValueError(f"Unsupported extension for {filename}")

        self._history = [self._active_df.copy()]
        self._history_pointer = 0
        return self.get_summary()

    def get_summary(self) -> dict:
        if self._active_df is None:
            return {"rows": 0, "cols": 0, "columns": []}
        return {
            "rows": len(self._active_df),
            "cols": len(self._active_df.columns),
            "columns": list(self._active_df.columns),
            "memory_usage_mb": round(self._active_df.memory_usage(deep=True).sum() / (1024 * 1024), 2)
        }

manager = DatasetManager()
LOCATION: python/engine/profile_service.py ROLE: Multi-profiler orchestrator & JSON serialization
import pandas as pd
from profilers.statistics import compute_statistics
from profilers.missing import compute_missing
from profilers.duplicates import compute_duplicates
from profilers.datatypes import infer_datatypes
from profilers.quality import compute_quality

class ProfileService:
    def profile(self, df: pd.DataFrame) -> dict:
        """Executes full profile pass across missing, dups, dtypes, and quality."""
        missing = compute_missing(df)
        dups = compute_duplicates(df)
        dtypes = infer_datatypes(df)
        stats = compute_statistics(df)
        quality = compute_quality(df, missing, dups, dtypes, stats)

        return {
            "shape": {"rows": len(df), "cols": len(df.columns)},
            "missing": missing,
            "duplicates": dups,
            "datatypes": dtypes,
            "statistics": stats,
            "quality": quality
        }

profiler = ProfileService()
LOCATION: python/profilers/quality.py ROLE: Health score calculation & anomaly detection
def compute_quality(df, missing_stats, dup_stats, dtypes, stats):
    total_cells = df.size
    total_rows = len(df)
    if total_rows == 0 or total_cells == 0:
        return {"score": 0, "components": {}, "issues": ["Empty dataset"]}

    missing_cells = missing_stats.get("_overall", {}).get("total_missing", 0)
    duplicate_rows = dup_stats.get("_overall", {}).get("duplicate_rows", 0)

    # 1. Completeness Score (0 - 100)
    completeness = 100 - ((missing_cells / total_cells) * 100) if total_cells > 0 else 0

    # 2. Uniqueness Score (0 - 100)
    uniqueness = 100 - ((duplicate_rows / total_rows) * 100) if total_rows > 0 else 0

    # 3. Validity & Data-type Integrity
    mixed_cols = sum(1 for _, info in dtypes.items() if info.get("inferred") == "mixed")
    validity = max(0, 100 - (mixed_cols / len(df.columns) * 50)) if len(df.columns) > 0 else 100

    # 4. Composite Quality Score
    composite = round(completeness * 0.40 + uniqueness * 0.25 + validity * 0.20 + 15.0, 1)

    return {
        "score": min(100.0, composite),
        "components": {
            "completeness": round(completeness, 1),
            "uniqueness": round(uniqueness, 1),
            "validity": round(validity, 1)
        }
    }