OPEN-SOURCE SCORING INFRASTRUCTURE
Make raw data
easier to understand.
Data takes a lot of inference to understand.
We make it easier.
Reusable adapters. Configurable profiles. Explainable results. One scoring engine, wherever you need it.
Read the docsGoatedRahim
Houston Hornets
Built from competition. Built to go further.
THERE'S MORE THAN ONE WAY IN
One scorer.
Three ways to use it.
Whether you want a tool, a library, or a service, you're working with the same StatLine scoring model.
YOUR MACHINE. YOUR WORKFLOW.
Local
Run StatLine yourself.
A CLI when you want a command. StatLine OS when you want to stay in the flow. Your files, on your terms.
statline score --adapter eba.playersExplore LocalYOUR APPLICATION. SAME ENGINE.
DevKit
Build it into yours.
A Python library for the bots, dashboards, notebooks, and services you're already building.
score("eba.players", rows, mode="batch")Explore DevKitYOUR DATA. OVER HTTP.
API
Send the workload to us.
Call the Gateway from any language. Run it yourself or request access to the hosted service.
POST /v4/scoreExplore APIINFRASTRUCTURE, NOT A CEILING
The scorer is the product.
The rest is up to you.
Turn a scoring model into something people can use. Your interface. Your context. Your next idea.
LESS READING. MORE EXPLORING.
Don't take our word for it.
Inspect engine-verified examples, or connect your key and send a real request to the StatLine API.
01 / RAW INPUT
{
"PLAYER": "GoatedRahim",
"TEAM": "Houston Hornets",
"CONFERENCE": "Western",
"POSITION": "N/A",
"LEAGUE": "EBA",
"GP": 11,
"PPG": 31.909,
"RPG": 2.273,
"APG": 14.909,
"SPG": 3.545,
"BPG": 0,
"TPG": 3.273,
"PA": 0,
"PF": 1.182,
"3PMPG": 5.182,
"3PAPG": 8.727,
"FGMPG": 13.364,
"FGAPG": 20.182,
"WIN": 7,
"LOSS": 4
}This record was scored in the full 103-row batch. Switching records inspects saved output; it doesn't recalculate the cohort.
Download the input CSV02 / SAVED ENGINE OUTPUT
GoatedRahim
Houston Hornets
Why 99?
Helped: Helios Score, Vers Score, Scoreless Impact
Limited: Handle Load, Bpg Sig, Net Pos Ppp
Compared with every normalized metric at its midpoint (0.5). These are influences on the raw sum. Affine scaling of the clipped raw aggregate, followed by rounding.
Trace inputs, weights & calculation
Normalization: batch_extrema. Effective weights include the run’s penalties and overrides. Bucket bars are means, not additive score points.
| Metric | Mapped | Normalized | Weight | Contribution | Relative influence |
|---|---|---|---|---|---|
| Helios Score | 1.158366 | 0.94324 | 0.118182 | 0.111474 | 0.052383 |
| Vers Score | 0.614774 | 0.926023 | 0.081818 | 0.075765 | 0.034856 |
| Scoreless Impact | 0.643079 | 0.91847 | 0.054545 | 0.050098 | 0.022826 |
| Two Way Score | 1.034098 | 1 | 0.045455 | 0.045455 | 0.022727 |
| Eff Usage | 1.450455 | 0.753785 | 0.084848 | 0.063958 | 0.021533 |
| Stocks Boost | 1.107812 | 0.885144 | 0.045455 | 0.040234 | 0.017507 |
| Tov Scaled | 0.866379 | 0.866379 | 0.036364 | 0.031505 | 0.013323 |
| Scoring Gravity | 0.83015 | 0.595891 | 0.127273 | 0.075841 | 0.012204 |
| Gp Share | 1 | 1 | 0.022727 | 0.022727 | 0.011364 |
| Handle Load | 0.969237 | 0.232649 | 0.036364 | 0.00846 | -0.009722 |
| Bpg Sig | 0 | 0 | 0.018182 | 0 | -0.009091 |
| Vol Gap | 0 | 1 | 0.015152 | 0.015152 | 0.007576 |
| Shot Diet Gap | 0 | 1 | 0.015152 | 0.015152 | 0.007576 |
| Spg Sig | 2.954167 | 0.908974 | 0.018182 | 0.016527 | 0.007436 |
| Net Pos Ppp | 1.024323 | 0.415189 | 0.084848 | 0.035228 | -0.007196 |
| Pps Gap | 0.115556 | 0.859932 | 0.015152 | 0.013029 | 0.005454 |
| Ast To Bonus | 0.425858 | 0.378404 | 0.036364 | 0.01376 | -0.004422 |
| Wl Share | 0.636364 | 0.636364 | 0.022727 | 0.014463 | 0.003099 |
| Pps Fg | 1.581112 | 0.527037 | 0.084848 | 0.044718 | 0.002294 |
| Ast To Credit | 4.555148 | 0.520443 | 0.036364 | 0.018925 | 0.000743 |
| Gp | 11 | 1 | 0 | 0 | 0 |
| Real Gp | 11 | 1 | 0 | 0 | 0 |
| Real Gp1 | 1 | 0 | 0 | 0 | -0 |
| No Real | 0 | 0 | 0 | 0 | -0 |
| Rel Gp | 1 | 1 | 0 | 0 | 0 |
| Ppg | 31.909 | 0.747861 | 0 | 0 | 0 |
| Rpg | 2.273 | 0.219975 | 0 | 0 | -0 |
| Apg | 14.909 | 0.84389 | 0 | 0 | 0 |
| Spg | 3.545 | 0.908974 | 0 | 0 | 0 |
| Bpg | 0 | 0 | 0 | 0 | -0 |
| Tov | 3.273 | 0.595091 | 0 | 0 | 0 |
| Fgm | 13.364 | 0.742444 | 0 | 0 | 0 |
| Fga | 20.182 | 0.738375 | 0 | 0 | 0 |
| Tpm | 5.182 | 0.618746 | 0 | 0 | 0 |
| Tpa | 8.727 | 0.692619 | 0 | 0 | 0 |
| Win | 7 | 0.777778 | 0 | 0 | 0 |
| Loss | 4 | 0.8 | 0 | 0 | 0 |
| Orpg | 0.79555 | 0.219975 | 0 | 0 | -0 |
| Drpg | 1.47745 | 0.219975 | 0 | 0 | -0 |
| Stat Total | 103.364 | 0.920157 | 0 | 0 | 0 |
| Stat Active | 1 | 1 | 0 | 0 | 0 |
| Scoreable | 1 | 1 | 0 | 0 | 0 |
| No Score | 0 | 0 | 0 | 0 | -0 |
Weighted sum 0.71247 → raw aggregate 0.71247 → 99.135007 → 99.
Python round: nearest integer, ties to even. A model-based evaluation under this adapter, weights and cohort.
Raw inputs & adapter transforms
{
"input": {
"PLAYER": "GoatedRahim",
"TEAM": "Houston Hornets",
"CONFERENCE": "Western",
"POSITION": "N/A",
"LEAGUE": "EBA",
"GP": 11,
"PPG": 31.909,
"RPG": 2.273,
"APG": 14.909,
"SPG": 3.545,
"BPG": 0,
"TPG": 3.273,
"PA": 0,
"PF": 1.182,
"3PMPG": 5.182,
"3PAPG": 8.727,
"FGMPG": 13.364,
"FGAPG": 20.182,
"WIN": 7,
"LOSS": 4
},
"metrics": {
"gp": {
"key": "gp",
"source": {
"kind": "field",
"field": "GP",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
16
],
"bucket": "telem",
"invert": false,
"label": "Gp",
"bucket_label": "Telemetry"
},
"real_gp": {
"key": "real_gp",
"source": {
"kind": "expr",
"field": null,
"expr": "gp",
"const": null
},
"transform": null,
"clamp": [
0,
16
],
"bucket": "telem",
"invert": false,
"label": "Real Gp",
"bucket_label": "Telemetry"
},
"real_gp1": {
"key": "real_gp1",
"source": {
"kind": "expr",
"field": null,
"expr": "min(1.0, real_gp)",
"const": null
},
"transform": null,
"clamp": [
0,
1
],
"bucket": "telem",
"invert": false,
"label": "Real Gp1",
"bucket_label": "Telemetry"
},
"no_real": {
"key": "no_real",
"source": {
"kind": "expr",
"field": null,
"expr": "1.0 - real_gp1",
"const": null
},
"transform": null,
"clamp": [
0,
1
],
"bucket": "telem",
"invert": false,
"label": "No Real",
"bucket_label": "Telemetry"
},
"rel_gp": {
"key": "rel_gp",
"source": {
"kind": "expr",
"field": null,
"expr": "min(1.0, real_gp / max(1.0, dataset_max(\"GP\") * 0.65))",
"const": null
},
"transform": null,
"clamp": [
0,
1
],
"bucket": "telem",
"invert": false,
"label": "Rel Gp",
"bucket_label": "Telemetry"
},
"ppg": {
"key": "ppg",
"source": {
"kind": "field",
"field": "PPG",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
32
],
"bucket": "telem",
"invert": false,
"label": "Ppg",
"bucket_label": "Telemetry"
},
"rpg": {
"key": "rpg",
"source": {
"kind": "field",
"field": "RPG",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
14
],
"bucket": "telem",
"invert": false,
"label": "Rpg",
"bucket_label": "Telemetry"
},
"apg": {
"key": "apg",
"source": {
"kind": "field",
"field": "APG",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
9
],
"bucket": "telem",
"invert": false,
"label": "Apg",
"bucket_label": "Telemetry"
},
"spg": {
"key": "spg",
"source": {
"kind": "field",
"field": "SPG",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
2.2
],
"bucket": "telem",
"invert": false,
"label": "Spg",
"bucket_label": "Telemetry"
},
"bpg": {
"key": "bpg",
"source": {
"kind": "field",
"field": "BPG",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
3
],
"bucket": "telem",
"invert": false,
"label": "Bpg",
"bucket_label": "Telemetry"
},
"tov": {
"key": "tov",
"source": {
"kind": "field",
"field": "TPG",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
3.5
],
"bucket": "telem",
"invert": false,
"label": "Tov",
"bucket_label": "Telemetry"
},
"fgm": {
"key": "fgm",
"source": {
"kind": "field",
"field": "FGMPG",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
15
],
"bucket": "telem",
"invert": false,
"label": "Fgm",
"bucket_label": "Telemetry"
},
"fga": {
"key": "fga",
"source": {
"kind": "field",
"field": "FGAPG",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
25
],
"bucket": "telem",
"invert": false,
"label": "Fga",
"bucket_label": "Telemetry"
},
"tpm": {
"key": "tpm",
"source": {
"kind": "field",
"field": "3PMPG",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
8
],
"bucket": "telem",
"invert": false,
"label": "Tpm",
"bucket_label": "Telemetry"
},
"tpa": {
"key": "tpa",
"source": {
"kind": "field",
"field": "3PAPG",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
14
],
"bucket": "telem",
"invert": false,
"label": "Tpa",
"bucket_label": "Telemetry"
},
"win": {
"key": "win",
"source": {
"kind": "field",
"field": "WIN",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
16
],
"bucket": "telem",
"invert": false,
"label": "Win",
"bucket_label": "Telemetry"
},
"loss": {
"key": "loss",
"source": {
"kind": "field",
"field": "LOSS",
"expr": null,
"const": null
},
"transform": null,
"clamp": [
0,
16
],
"bucket": "telem",
"invert": false,
"label": "Loss",
"bucket_label": "Telemetry"
},
"orpg": {
"key": "orpg",
"source": {
"kind": "expr",
"field": null,
"expr": "0.35 * rpg",
"const": null
},
"transform": null,
"clamp": [
0,
5
],
"bucket": "telem",
"invert": false,
"label": "Orpg",
"bucket_label": "Telemetry"
},
"drpg": {
"key": "drpg",
"source": {
"kind": "expr",
"field": null,
"expr": "0.65 * rpg",
"const": null
},
"transform": null,
"clamp": [
0,
10
],
"bucket": "telem",
"invert": false,
"label": "Drpg",
"bucket_label": "Telemetry"
},
"stat_total": {
"key": "stat_total",
"source": {
"kind": "expr",
"field": null,
"expr": "ppg + rpg + apg + spg + bpg + tov + fgm + fga + tpm + tpa",
"const": null
},
"transform": null,
"clamp": [
0,
999
],
"bucket": "telem",
"invert": false,
"label": "Stat Total",
"bucket_label": "Telemetry"
},
"stat_active": {
"key": "stat_active",
"source": {
"kind": "expr",
"field": null,
"expr": "min(1.0, stat_total)",
"const": null
},
"transform": null,
"clamp": [
0,
1
],
"bucket": "telem",
"invert": false,
"label": "Stat Active",
"bucket_label": "Telemetry"
},
"scoreable": {
"key": "scoreable",
"source": {
"kind": "expr",
"field": null,
"expr": "min(real_gp1, stat_active)",
"const": null
},
"transform": null,
"clamp": [
0,
1
],
"bucket": "telem",
"invert": false,
"label": "Scoreable",
"bucket_label": "Telemetry"
},
"no_score": {
"key": "no_score",
"source": {
"kind": "expr",
"field": null,
"expr": "1.0 - scoreable",
"const": null
},
"transform": null,
"clamp": [
0,
1
],
"bucket": "telem",
"invert": false,
"label": "No Score",
"bucket_label": "Telemetry"
},
"gp_share": {
"key": "gp_share",
"make": "scoreable * rel_gp",
"attempt": "1",
"bucket": "gp",
"min_den": 1,
"clamp": [
0,
1
],
"invert": false,
"transform": null,
"label": "Gp Share",
"bucket_label": "Games Played"
},
"pps_fg": {
"key": "pps_fg",
"make": "scoreable * (2.0 * (fgm + 0.5*tpm))",
"attempt": "max(1.0, fga)",
"bucket": "aefg",
"min_den": 1,
"clamp": [
0,
1.45
],
"invert": false,
"transform": null,
"label": "Pps Fg",
"bucket_label": "Shooting Efficiency"
},
"scoring_gravity": {
"key": "scoring_gravity",
"make": "scoreable * min(1.20, ppg / 36.0) * min(1.15, pps_fg / 1.35) * min(1.10, fga / 22.0) * (1 - 0.12 * min(1, tov / 3.5))",
"attempt": "1",
"bucket": "scoring_gravity",
"min_den": 1,
"clamp": [
0,
1.25
],
"invert": false,
"transform": null,
"label": "Scoring Gravity",
"bucket_label": "Scoring Gravity"
},
"spg_sig": {
"key": "spg_sig",
"make": "scoreable * spg",
"attempt": "1.2",
"bucket": "spg_sig",
"min_den": 1,
"clamp": [
0,
1.8
],
"invert": false,
"transform": null,
"label": "Spg Sig",
"bucket_label": "Steal Signature"
},
"bpg_sig": {
"key": "bpg_sig",
"make": "scoreable * ((min(bpg, 2.0) + 0.25*max(0, bpg-2.0)) / max(0.85, 1.0 + 0.06*drpg))",
"attempt": "2.2",
"bucket": "bpg_sig",
"min_den": 1,
"clamp": [
0,
1.1
],
"invert": false,
"transform": null,
"label": "Bpg Sig",
"bucket_label": "Block Signature"
},
"eff_usage": {
"key": "eff_usage",
"make": "scoreable * pps_fg * fga",
"attempt": "22",
"bucket": "aefg",
"min_den": 1,
"clamp": [
0,
1.55
],
"invert": false,
"transform": null,
"label": "Eff Usage",
"bucket_label": "Shooting Efficiency"
},
"net_pos_ppp": {
"key": "net_pos_ppp",
"make": "scoreable * (ppg - 1.1*tov)",
"attempt": "max(1.0, fga + 0.5*apg)",
"bucket": "aefg",
"min_den": 1,
"clamp": [
0,
1.25
],
"invert": false,
"transform": null,
"label": "Net Pos Ppp",
"bucket_label": "Shooting Efficiency"
},
"pps_gap": {
"key": "pps_gap",
"make": "no_score * 0.60 + scoreable * (\n max(0, 1.08 - pps_fg)\n + 0.50*max(0, pps_fg - 1.35)\n)",
"attempt": "1",
"bucket": "effloor",
"min_den": 1,
"clamp": [
0,
0.6
],
"invert": true,
"transform": null,
"label": "Pps Gap",
"bucket_label": "Efficiency Floor"
},
"vol_gap": {
"key": "vol_gap",
"make": "no_score * 2.0 + scoreable * max(0, 14 - ppg)",
"attempt": "1",
"bucket": "effloor",
"min_den": 1,
"clamp": [
0,
2
],
"invert": true,
"transform": null,
"label": "Vol Gap",
"bucket_label": "Efficiency Floor"
},
"shot_diet_gap": {
"key": "shot_diet_gap",
"make": "no_score * 0.60 + scoreable * max(0, (tpa/max(1e-6,fga)) - 0.70) * max(0, 1.28 - ((fga - tpa))) / 1.28 * max(0, pps_fg - 1.22) * min(1, 10/max(1e-6,fga))",
"attempt": "1",
"bucket": "effloor",
"min_den": 1,
"clamp": [
0,
0.6
],
"invert": true,
"transform": null,
"label": "Shot Diet Gap",
"bucket_label": "Efficiency Floor"
},
"stocks_boost": {
"key": "stocks_boost",
"make": "scoreable * (spg + 1.05*min(bpg, 2.0) + 0.35*max(0, bpg - 2.0))",
"attempt": "3.2",
"bucket": "stocks",
"min_den": 1,
"clamp": [
0,
1.5
],
"invert": false,
"transform": null,
"label": "Stocks Boost",
"bucket_label": "Stocks"
},
"scoreless_impact": {
"key": "scoreless_impact",
"make": "scoreable * (0.55*min(1, apg/10) + 0.45*min(1, (1.3*orpg+0.7*drpg)/10))",
"attempt": "1.0",
"bucket": "offball",
"min_den": 1,
"clamp": [
0,
1
],
"invert": false,
"transform": null,
"label": "Scoreless Impact",
"bucket_label": "Off-Ball Impact"
},
"vers_score": {
"key": "vers_score",
"make": "scoreable * ((0.65*((min(1, ppg/24) + min(1, (1.6*orpg+drpg)/10) + min(1, apg/10))/3)) + (0.45*((min(1, ppg/24)*min(1, (1.6*orpg+drpg)/10) + min(1, ppg/24)*min(1, apg/10) + min(1, (1.6*orpg+drpg)/10)*min(1, apg/10))/3)))",
"attempt": "1.18",
"bucket": "vers",
"min_den": 1,
"clamp": [
0,
1
],
"invert": false,
"transform": null,
"label": "Vers Score",
"bucket_label": "Versatility"
},
"handle_load": {
"key": "handle_load",
"make": "scoreable * (apg / max(1.0, 0.6*fga + tov))",
"attempt": "1",
"bucket": "handle",
"min_den": 1,
"clamp": [
0,
1.1
],
"invert": false,
"transform": null,
"label": "Handle Load",
"bucket_label": "Handle"
},
"helios_score": {
"key": "helios_score",
"make": "scoreable * (ppg + 0.9*apg - 0.4*tov)",
"attempt": "38",
"bucket": "helios",
"min_den": 1,
"clamp": [
0,
0.9
],
"invert": false,
"transform": null,
"label": "Helios Score",
"bucket_label": "Helios"
},
"tov_scaled": {
"key": "tov_scaled",
"make": "scoreable * (1 - (tov / max(3, 0.80*(fga + 0.7*apg))))",
"attempt": "1",
"bucket": "tov_eff",
"min_den": 1,
"clamp": [
0,
0.95
],
"invert": false,
"transform": null,
"label": "Tov Scaled",
"bucket_label": "Turnovers"
},
"ast_to_credit": {
"key": "ast_to_credit",
"make": "scoreable * apg",
"attempt": "max(1.0, tov)",
"bucket": "tov_eff",
"min_den": 1,
"clamp": [
0,
2.5
],
"invert": false,
"transform": null,
"label": "Ast To Credit",
"bucket_label": "Turnovers"
},
"ast_to_bonus": {
"key": "ast_to_bonus",
"make": "scoreable * max(0, (apg / max(1.0, tov)) - 2.0)",
"attempt": "6.0",
"bucket": "tov_eff",
"min_den": 1,
"clamp": [
0,
0.08
],
"invert": false,
"transform": null,
"label": "Ast To Bonus",
"bucket_label": "Turnovers"
},
"two_way_score": {
"key": "two_way_score",
"make": "scoreable * min(2, (2 * ((ppg+0.9*apg)/42) * ((0.7*spg+0.4*bpg)/2.5)) / max(0.0001, ((ppg+0.9*apg)/42) + ((0.7*spg+0.4*bpg)/2.5)))",
"attempt": "1",
"bucket": "two_way",
"min_den": 1,
"clamp": [
0,
0.8
],
"invert": false,
"transform": null,
"label": "Two Way Score",
"bucket_label": "Two-Way"
},
"wl_share": {
"key": "wl_share",
"make": "scoreable * win",
"attempt": "max(1.0, win + loss)",
"bucket": "wl",
"min_den": 0.5,
"clamp": [
0,
1
],
"invert": false,
"transform": null,
"label": "Wl Share",
"bucket_label": "Win-Loss"
}
},
"normalization": {
"gp": {
"leader": 11,
"floor": 3
},
"real_gp": {
"leader": 11,
"floor": 3
},
"real_gp1": {
"leader": 1,
"floor": 1
},
"no_real": {
"leader": 0,
"floor": 0
},
"rel_gp": {
"leader": 1,
"floor": 0.4195804195804196
},
"ppg": {
"leader": 42.667,
"floor": 0
},
"rpg": {
"leader": 10.333,
"floor": 0
},
"apg": {
"leader": 17.667,
"floor": 0
},
"spg": {
"leader": 3.9,
"floor": 0
},
"bpg": {
"leader": 4.5,
"floor": 0
},
"tov": {
"leader": 5.5,
"floor": 0
},
"fgm": {
"leader": 18,
"floor": 0
},
"fga": {
"leader": 27.333,
"floor": 0
},
"tpm": {
"leader": 8.375,
"floor": 0
},
"tpa": {
"leader": 12.6,
"floor": 0
},
"win": {
"leader": 9,
"floor": 0
},
"loss": {
"leader": 5,
"floor": 0
},
"orpg": {
"leader": 3.6165499999999997,
"floor": 0
},
"drpg": {
"leader": 6.71645,
"floor": 0
},
"stat_total": {
"leader": 112.333,
"floor": 0
},
"stat_active": {
"leader": 1,
"floor": 0
},
"scoreable": {
"leader": 1,
"floor": 0
},
"no_score": {
"leader": 1,
"floor": 0
},
"gp_share": {
"leader": 1,
"floor": 0
},
"pps_fg": {
"leader": 3,
"floor": 0
},
"scoring_gravity": {
"leader": 1.3931241622975015,
"floor": 0
},
"spg_sig": {
"leader": 3.25,
"floor": 0
},
"bpg_sig": {
"leader": 1.015041955067476,
"floor": 0
},
"eff_usage": {
"leader": 1.9242272727272727,
"floor": 0
},
"net_pos_ppp": {
"leader": 2.4671238748392623,
"floor": 0
},
"pps_gap": {
"leader": 0,
"floor": 0.825
},
"vol_gap": {
"leader": 0,
"floor": 12.667
},
"shot_diet_gap": {
"leader": 0,
"floor": 0.6
},
"stocks_boost": {
"leader": 1.2515625,
"floor": 0
},
"scoreless_impact": {
"leader": 0.70016365,
"floor": 0
},
"vers_score": {
"leader": 0.6638870056497176,
"floor": 0
},
"handle_load": {
"leader": 4.166083391660834,
"floor": 0
},
"helios_score": {
"leader": 1.228071052631579,
"floor": 0
},
"tov_scaled": {
"leader": 1,
"floor": 0
},
"ast_to_credit": {
"leader": 8.752438109527382,
"floor": 0
},
"ast_to_bonus": {
"leader": 1.1254063515878971,
"floor": 0
},
"two_way_score": {
"leader": 1.034097737090637,
"floor": 0
},
"wl_share": {
"leader": 1,
"floor": 0
}
},
"profile": {
"kind": "affine",
"weights_profile": "pri",
"model": null,
"value": null,
"lo": 40,
"hi": 123,
"out_lo": null,
"out_hi": null,
"pct_lo": null,
"pct_hi": null
},
"baseline": {
"kind": "normalized_midpoint",
"normalized_value": 0.5,
"description": "Each normalized metric at 0.5; a reference, not the cohort average."
}
}4 profiles · 18 required input fields · v4.0.0rc6
ADAPTERS
Your data doesn't
have to look like ours.
Different names. Different exports. Different definitions of a good result. Adapters describe how your data becomes something the scorer understands.
Make your schema understoodPPG · APG · RPGgoals · assists · savesyour_schemaSTATPACKS
Take the rules
with you.
A scoring configuration should travel as easily as the data. StatPacks bundle metadata, adapter sections, datasets, and a runner into a package you can inspect and share.
Unpack StatPacksYOU'RE INCLUDED, TOO
Don't write Python?
That's fine.
StatLine is built for developers, but the outcome isn't. If your organization has data and a scoring problem, let's figure out where it fits.
Let's get your organization set upBUILT IN PUBLIC
Inspect it yourself.
The source, the package, and the contract are all there. Start small. Understand what you're running.
python -m pip install "statline==4.0.0rc6"from statline import load_dataset, score
rows = load_dataset('EBA_Elevate302/eba_players_gp3_plus.csv')
results = score('eba.players', rows, mode='batch', weights='pri')SCORING YOU CAN INSPECT, REPRODUCE, AND TEST
HOSTED STATLINE API
Run the Gateway yourself.
Or let us handle it.
Hosted access is invite-only while we work with early organizations on capacity and pricing. Self-hosting is available today.