Skip to main content

Python SDK and CLI (sfs) for StickForStats — statistical analysis with automatic assumption validation (Guardian) and manuscript statistical verification

Project description

StickForStats Python SDK

Python client for the StickForStats statistical analysis platform -- featuring the Guardian Statistical Protection System, Autonomous Intelligence Layer, and Manuscript Review Engine.

This is a thin client: it talks to a running StickForStats backend over its REST API; it does not perform the statistics locally.

Requirements

  • Python 3.10+
  • A reachable StickForStats backend — either a local deployment (the project's docker compose up) or a hosted instance — plus an API key for authenticated endpoints.

Installation

pip install stickforstats

With CLI support (adds the sfs command):

pip install stickforstats[cli]

Configuration

Point the client at your backend via arguments or environment variables:

export STICKFORSTATS_BASE_URL="http://localhost:8000/api/v1"
export STICKFORSTATS_API_KEY="your-api-key"

The client retries transient failures (connection errors, timeouts, HTTP 429/502/503/504) with exponential backoff, and raises typed exceptions (AuthenticationError, ValidationError, RateLimitError, ConnectionError, ...) all deriving from StickForStatsError.

Quick Start

from stickforstats import StickForStats

client = StickForStats(
    base_url="http://localhost:8000/api/v1",
    api_key="your-api-key",
)

# Run a t-test with Guardian protection
result = client.stats.ttest(
    data={"control": [23, 25, 28, 22, 27], "treatment": [30, 33, 29, 35, 31]},
    alpha=0.05,
)
print(f"t = {result.t_statistic}, p = {result.p_value}")
if result.guardian and not result.guardian.passed:
    print("Guardian violations:", result.guardian.violations)

Use as a context manager to ensure connections are cleaned up:

with StickForStats(api_key="tok_abc123") as sfs:
    desc = sfs.stats.descriptive(data=[10, 20, 30, 40, 50])
    print(f"Mean: {desc.mean}, SD: {desc.std_dev}")

Statistical Tests

t-Test

result = client.stats.ttest(
    data={"before": [5.1, 4.9, 5.3], "after": [6.2, 5.8, 6.5]},
    paired=True,
    alpha=0.05,
)

ANOVA

result = client.stats.anova(
    data={
        "group_a": [4.1, 3.9, 4.5, 4.2],
        "group_b": [5.2, 5.5, 5.1, 5.3],
        "group_c": [6.0, 6.3, 5.8, 6.1],
    },
    post_hoc="tukey",
)

Correlation

result = client.stats.correlation(
    x=[1, 2, 3, 4, 5],
    y=[2, 4, 5, 4, 5],
    method="pearson",
)
print(f"r = {result.correlation}, p = {result.p_value}")

Regression

result = client.stats.regression(
    data={"x1": [1, 2, 3], "x2": [4, 5, 6], "y": [7, 8, 9]},
    dependent="y",
    predictors=["x1", "x2"],
    regression_type="linear",
)
print(f"R-squared = {result.r_squared}")

Descriptive Statistics

result = client.stats.descriptive(data=[12, 15, 18, 22, 25, 30])
print(f"Mean: {result.mean}, Median: {result.median}, SD: {result.std_dev}")

Power Analysis

# Determine required sample size
result = client.power.ttest(effect_size=0.5, alpha=0.05, power=0.80)
print(f"Required n = {result.sample_size}")

# Comprehensive power report
report = client.power.report(
    data={"group1": [1, 2, 3], "group2": [4, 5, 6]},
    tests=["ttest", "anova"],
)

Nonparametric Tests

# Mann-Whitney U
result = client.nonparametric.mann_whitney(
    group1=[3.1, 2.5, 4.0, 3.8],
    group2=[5.2, 4.9, 6.1, 5.5],
)

# Kruskal-Wallis
result = client.nonparametric.kruskal_wallis(
    data={"a": [1, 2, 3], "b": [4, 5, 6], "c": [7, 8, 9]},
)

Categorical Tests

# Chi-square independence
result = client.categorical.chi_square_independence(
    observed=[[10, 20], [30, 40]],
)

# Fisher's exact test
result = client.categorical.fishers_exact(
    table=[[8, 2], [1, 5]],
)

Autonomous Intelligence

# Smart profiling
profile = client.autonomous.profile(
    data={"age": [25, 30, 35], "score": [80, 85, 90], "group": [1, 2, 1]},
)
print(profile.recommendations)

# Natural-language query
answer = client.autonomous.query(
    question="Is there a significant difference between groups?",
    data={"group1": [1, 2, 3], "group2": [4, 5, 6]},
)
print(answer.narrative)

# Guardian cascade (auto-fallback to nonparametric if assumptions violated)
cascade = client.autonomous.cascade(
    data={"control": [1, 1, 2], "treatment": [10, 50, 100]},
    test="ttest",
)
if cascade.fallback_used:
    print(f"Guardian redirected to: {cascade.executed_test}")

Manuscript Review

# Full manuscript analysis
report = client.manuscript.analyze(
    "paper.pdf",
    field="psychology",
    alpha=0.05,
)
print(f"Score: {report.overall_score}")
for claim in report.claims:
    status = "PASS" if claim.verified else "FAIL"
    print(f"  [{status}] {claim.text}")

# Check consistency
consistency = client.manuscript.check_consistency("paper.pdf")
if not consistency.consistent:
    for issue in consistency.inconsistencies:
        print(f"  Inconsistency: {issue}")

Platform Usage

# Check your quota
usage = client.platform.usage()
print(f"Tier: {usage.tier}, Remaining: {usage.remaining_quota}")

# List available tiers
tiers = client.platform.tiers()
for tier in tiers:
    print(f"{tier.name}: {tier.monthly_requests} requests/month")

CLI Usage

Configure your connection once:

sfs config --api-key YOUR_API_KEY --base-url http://localhost:8000/api/v1

Run analyses from the terminal:

# Run a t-test
sfs analyze --file data.csv --test ttest --alpha 0.05

# Descriptive statistics
sfs analyze --file data.csv --test descriptive

# Regression
sfs analyze --file data.csv --test regression --dependent y --predictors "x1,x2"

# Smart profiling
sfs profile --file data.csv

# Natural-language query
sfs query "compare groups" --file data.csv

# Manuscript review
sfs manuscript --file paper.pdf --field psychology

# Check usage
sfs usage

Authentication

The SDK supports two authentication methods:

User token (default):

client = StickForStats(api_key="tok_abc123")
# Sends: Authorization: Token tok_abc123

Platform key (for server-to-server integration):

client = StickForStats(api_key="pk_live_xyz", platform_key=True)
# Sends: X-API-Key: pk_live_xyz

Error Handling

from stickforstats import StickForStats, AuthenticationError, ValidationError, APIError

client = StickForStats(api_key="bad-key")

try:
    result = client.stats.ttest(data={"a": [1], "b": [2]})
except AuthenticationError:
    print("Invalid API key")
except ValidationError as e:
    print(f"Bad input: {e.field_errors}")
except APIError as e:
    print(f"Server error [{e.status_code}]: {e.message}")

Requirements

  • Python 3.8+
  • httpx >= 0.24
  • pydantic >= 2.0
  • click >= 8.0 and rich >= 13.0 (optional, for CLI)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stickforstats-0.3.0.tar.gz (25.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stickforstats-0.3.0-py3-none-any.whl (26.4 kB view details)

Uploaded Python 3

File details

Details for the file stickforstats-0.3.0.tar.gz.

File metadata

  • Download URL: stickforstats-0.3.0.tar.gz
  • Upload date:
  • Size: 25.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.16

File hashes

Hashes for stickforstats-0.3.0.tar.gz
Algorithm Hash digest
SHA256 43504c4474ef4ea497115ab88fed1237ab59eeb23c553abbde58314388a14206
MD5 bc2740ee502b6f0558c602e3e7b3b778
BLAKE2b-256 1f276f14ef09c5f05c76c7cf0e0149efa754fefa61c7779b3c1cb497bbb54d1d

See more details on using hashes here.

File details

Details for the file stickforstats-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: stickforstats-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 26.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.16

File hashes

Hashes for stickforstats-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e17d6b5e7f2068b2bdbabe9b87d7dfe33c6279261dd129c957b06d8997eb7f4c
MD5 49c75f52a24b0d24a5dd09bff03877f7
BLAKE2b-256 e94522513315d01218a36e6237e2f72161cd7085189d623d1ca216df5353df38

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page