Model metadata

Feature Store

28 models · 254 features
Sources: dbt YAML + Python
ML Features ml_nrl_team_form_features 7 columns Point-in-time team form features at match-team grain. Rolling values are...

Point-in-time team form features at match-team grain. Rolling values are calculated only from completed matches for the same team with kickoff timestamps strictly before the fixture kickoff.

Feature / Column Group Description Tests
match_id weather Canonical match identifier inherited from the draw match grain. not_null
season general Fixture season. not_null
round general Fixture round. not_null
kickoff_at_utc general Fixture kickoff timestamp used as the point-in-time cutoff. not_null
team_key general Lowercase team key for the team being featurized. not_null
is_home general True when this feature row belongs to the fixture home team. not_null
last_match_kickoff_at_utc form Most recent prior completed match kickoff used for rest days and form features.
ML Features ml_nrl_ladder_features 7 columns Point-in-time ladder features at match-team grain. The selected ladder row...

Point-in-time ladder features at match-team grain. The selected ladder row is the latest row in the same season with ladder round strictly less than the fixture round.

Feature / Column Group Description Tests
match_id weather Canonical match identifier inherited from the draw match grain. not_null
season general Fixture season. not_null
round general Fixture round. not_null
kickoff_at_utc general Fixture kickoff timestamp used as the point-in-time cutoff. not_null
team_key general Lowercase team key for the team being featurized. not_null
is_home general True when this feature row belongs to the fixture home team. not_null
ladder_round ladder Source ladder round used for this fixture-team row.
ML Features ml_nrl_match_training_examples 7 columns Model-ready historical match rows for training the home-margin predictor....

Model-ready historical match rows for training the home-margin predictor. One row represents one completed match and includes target `home_margin = home_score - away_score`.

Feature / Column Group Description Tests
match_id weather Canonical match identifier inherited from the draw match grain. not_null, unique
season general Fixture season. not_null
round general Fixture round. not_null
kickoff_at_utc general Completed fixture kickoff timestamp. not_null
home_margin weather Training target, calculated as home_score minus away_score. not_null
home_team general Fixture home team nickname. not_null
away_team general Fixture away team nickname. not_null
ML Features ml_nrl_match_weather_features 3 columns Model-ready per-match weather features joined to match grain. Missing...

Model-ready per-match weather features joined to match grain. Missing weather values are zero-filled so downstream model and app paths can run before weather backfill, while `weather_data_available` preserves whether an observed hourly row was present.

Feature / Column Group Description Tests
match_id weather Canonical match identifier inherited from draw match grain. not_null, unique
venue_key general Stable curated stadium key. not_null
weather_data_available weather True when observed weather exists at kickoff hour.
ML Features ml_nrl_upcoming_matches 6 columns Model-ready upcoming or unscored match rows for weekly prediction runs. The...

Model-ready upcoming or unscored match rows for weekly prediction runs. The schema mirrors training examples except the target is null.

Feature / Column Group Description Tests
match_id weather Canonical match identifier inherited from the draw match grain. not_null, unique
season general Fixture season. not_null
round general Fixture round. not_null
kickoff_at_utc general Upcoming fixture kickoff timestamp. not_null
home_team general Fixture home team nickname. not_null
away_team general Fixture away team nickname. not_null
ML Features ml_nrl_player_season_stats 5 columns Per-player, per-season aggregate stats pivoted to wide form from...

Per-player, per-season aggregate stats pivoted to wide form from gold_nrl_stats_latest. All _pg columns are per-game averages. Minimum 3 games played to exclude cameo appearances.

Feature / Column Group Description Tests
player lineup not_null
season general not_null
games_played general Games played in the season (used as denominator for per-game averages).
strength_index ladder Composite Z-score index; positive = above league average for position group.
tackle_efficiency general tackles / (tackles + missed_tackles); higher = better defender.
ML Features ml_nrl_player_strength 6 columns Per-lineup-appearance player strength index. For each player in...

Per-lineup-appearance player strength index. For each player in stg_team_lists, looks up prior-season stats and computes Z-score-based strength_index and playmaker_index. The prior-season join is by player name only (no team filter) so transferred players retain their stats. New players (no prior-year data) fall back to position_group average (strength_index = 0).

Feature / Column Group Description Tests
current_team lineup Team the player is named in for the current season (from stg_team_lists).
prior_team lineup Team the player played for in the prior season, or NULL if no prior stats found.
strength_index ladder Composite of 8 Z-score components (run metres, tries, linebreaks, tackle breaks, offloads, tackles, tackle defence, discipline) / 8. 0 = position-group average. Positive = above average.
playmaker_index general Kick-weighted composite for spine quality assessment. Weights kick_metres 2×. Higher = better playmaker.
true_new_player_flag lineup 1 when no prior-season stats exist for this player; 0 when prior stats found (even if from a different team).
transferred_team_flag lineup 1 when player has prior-season stats from a different team (inter-club transfer); 0 otherwise.
ML Features ml_nrl_lineup_features 17 columns Pre-kickoff lineup features at (season, round, team) grain. All values are...

Pre-kickoff lineup features at (season, round, team) grain. All values are derivable from the named 17 announced before the match. Includes strength aggregates, spine continuity, rest context, origin week flag, and travel burden.

Feature / Column Group Description Tests
spine_continuity ladder Count of spine positions (1,6,7,9) unchanged from prior round. 0-4.
squad_strength_delta lineup Current squad strength minus prior round squad strength. Positive = stronger lineup.
origin_week_flag general 1 if this round is in nrl_round_exceptions as origin_impacted.
is_interstate general 1 if venue_city != team home city (travel burden proxy).
long_travel_flag general 1 for Auckland/Melbourne/Townsville trips (significant travel).
core_spine_strength lineup Average strength_index for players in jerseys 1, 6, 7, 9.
spine_continuity_count lineup Count of spine jersey slots (1,6,7,9) that have a named player.
spine_continuity_rate general spine_continuity_count / 4.0. 1.0 = all four spine slots filled.
halves_playmaker_index general Average playmaker_index for jerseys 6 (five-eighth) and 7 (halfback).
hooker_defence_service_index general For jersey 9: composite of tackle efficiency (0.5 weight) and error rate (0.5 weight). Falls back to hooker strength_index when tackle stats unavailable.
top3_forward_strength general Average strength_index of the top 3 forwards (by strength) among jerseys 8-13.
middle_forward_power general Average strength_index for middle forwards: jerseys 8, 10, 13.
edge_forward_attack_defence odds Average strength_index for edge forwards: jerseys 11, 12.
centre_defence_index general Average strength_index for centres: jerseys 3 and 4.
outside_back_finish_index general Average strength_index for outside backs: jerseys 1-5.
new_player_count lineup Count of players in this lineup with true_new_player_flag = 1 (no prior-season stats).
transferred_player_count lineup Count of players in this lineup with transferred_team_flag = 1 (inter-club transfer).
ML Features ml_nrl_match_lineup_features 18 columns Model-ready per-match feature table combining both teams' lineup features....

Model-ready per-match feature table combining both teams' lineup features. One row per match. All features are knowable before kickoff. Prefixes: home_ / away_ / delta_ (home minus away). Outcome columns (home_win, margin) are null for future matches.

Feature / Column Group Description Tests
match_grain weather Canonical match identifier.
home_win general 1 = home team won, 0 = away team won. Null for unplayed matches.
margin target home_score - away_score. Null for unplayed matches.
delta_squad_strength general home_squad_strength_avg - away_squad_strength_avg.
delta_spine_strength general home_spine_strength_avg - away_spine_strength_avg.
delta_core_spine_strength general home_core_spine_strength - away_core_spine_strength.
delta_spine_continuity_rate general home_spine_continuity_rate - away_spine_continuity_rate.
delta_halves_playmaker_index general home_halves_playmaker_index - away_halves_playmaker_index.
delta_hooker_defence_service_index general home_hooker_defence_service_index - away_hooker_defence_service_index.
delta_top3_forward_strength general home_top3_forward_strength - away_top3_forward_strength.
delta_middle_forward_power general home_middle_forward_power - away_middle_forward_power.
delta_edge_forward_attack_defence odds home_edge_forward_attack_defence - away_edge_forward_attack_defence.
delta_centre_defence_index general home_centre_defence_index - away_centre_defence_index.
delta_outside_back_finish_index general home_outside_back_finish_index - away_outside_back_finish_index.
home_new_player_count lineup Count of true_new_player_flag = 1 players in the home lineup.
away_new_player_count lineup Count of true_new_player_flag = 1 players in the away lineup.
home_transferred_player_count lineup Count of transferred_team_flag = 1 players in the home lineup.
away_transferred_player_count lineup Count of transferred_team_flag = 1 players in the away lineup.
Silver (Staged) silver_nrl_draw 8 columns Normalized copy of the staged NRL draw Parquet files. This model preserves...

Normalized copy of the staged NRL draw Parquet files. This model preserves staged run history and keeps one row per scraped fixture record per run.

Feature / Column Group Description Tests
season general NRL season from the staged partition.
round general NRL round from the staged partition.
match_grain weather Business grain key built from season, round, home team, and away team.
home_team general Home team nickname from the NRL draw payload.
away_team general Away team nickname from the NRL draw payload.
kickoff_at_utc general Fixture kickoff timestamp in UTC when present in the source payload.
run_id general Raw scrape run identifier that produced the staged record.
snapshot_date general Local staging snapshot date written by the staging script.
Silver (Staged) silver_nrl_ladder 8 columns Normalized copy of the staged NRL ladder Parquet files. This model preserves...

Normalized copy of the staged NRL ladder Parquet files. This model preserves staged run history and keeps one row per team ladder position per run.

Feature / Column Group Description Tests
season general NRL season from the staged partition.
round general NRL round from the staged partition.
team ladder Team nickname from the NRL ladder payload.
team_key ladder Lowercase normalized team key used for ladder deduplication.
ladder_position ladder Team position on the ladder at the scraped round.
points ladder Competition points at the scraped round.
run_id general Raw scrape run identifier that produced the staged record.
snapshot_date general Local staging snapshot date written by the staging script.
Silver (Staged) silver_nrl_players 8 columns Normalized copy of the staged NRL players Parquet files. This model...

Normalized copy of the staged NRL players Parquet files. This model preserves staged run history and keeps one row per scraped player profile record per run.

Feature / Column Group Description Tests
season general NRL season from the staged partition.
player_key lineup Canonical player key, preferring person id, then profile slug, then player name.
player_name lineup Player display name built from first and last name.
team lineup Team nickname from the player profile listing.
position ladder Player position from the profile listing.
player_url_slug lineup NRL profile URL slug when available.
run_id general Raw scrape run identifier that produced the staged record.
snapshot_date general Local staging snapshot date written by the staging script.
Silver (Staged) silver_nrl_stats 12 columns Normalized copy of the staged NRL stats Parquet files. This model preserves...

Normalized copy of the staged NRL stats Parquet files. This model preserves staged run history and collapses the source wide metric columns into `stat_value_raw` and numeric `stat_value` fields.

Feature / Column Group Description Tests
season general NRL season from the staged partition or source year.
stat_category general Human-readable stat category from the NRL stats payload.
stat_category_key general Lowercase normalized stat category key.
metric_key general Canonical metric key, preferring stat id and falling back to stat category.
player weather Player name when the stat row is player-grain.
team general Team nickname for the stat row.
business_entity_key lineup Canonical player-or-team key used for required-field checks.
stat_value_raw general Raw metric value extracted from the matching source metric column.
stat_value general Numeric metric value parsed from `stat_value_raw` where possible.
stats_grain weather Business grain key used by gold stats duplicate tests.
run_id general Raw scrape run identifier that produced the staged record.
snapshot_date general Local staging snapshot date written by the staging script.
Silver (Staged) silver_nrl_venue_normalized 5 columns Distinct draw venue/city labels mapped to curated `stadium_locations` venue...

Distinct draw venue/city labels mapped to curated `stadium_locations` venue keys. Naming-rights aliases are expanded from the seed, with city used as a tie-breaker when an alias could map to more than one venue.

Feature / Column Group Description Tests
venue general Venue label from `gold_nrl_draw_latest`. not_null, unique
venue_city general Venue city label from `gold_nrl_draw_latest`.
venue_key general Stable curated stadium key.
matched_venue_count general Number of distinct venue keys matched after best-score tie-breaking.
match_strategy general Mapping strategy: venue_alias_city, venue_alias, unmapped, or ambiguous.
Silver (Staged) stg_nrl_weather_hourly 4 columns Hourly Open-Meteo weather rows staged from the local raw weather table. The...

Hourly Open-Meteo weather rows staged from the local raw weather table. The model compiles as an empty table before ingestion has created `stg_nrl_weather_hourly_raw`, allowing the dbt graph and app defaults to remain runnable before weather backfill.

Feature / Column Group Description Tests
weather_grain weather Unique weather row key, `venue_key + weather_timestamp_utc`. not_null, unique
venue_key general Stable stadium key from `stadium_locations`.
weather_timestamp_utc weather Hourly weather timestamp in UTC.
weather_timestamp_local weather Hourly weather timestamp in the venue timezone.
Gold (Modelled) gold_nrl_draw_latest 9 columns Canonical latest NRL draw table. The model selects the latest staged run for...

Canonical latest NRL draw table. The model selects the latest staged run for each season and round, then deduplicates to one row per match grain.

Feature / Column Group Description Tests
season general NRL season.
round general NRL round.
match_grain weather Canonical match grain key for duplicate checks.
home_team general Home team nickname.
away_team general Away team nickname.
home_score target Home team score when available.
away_score target Away team score when available.
kickoff_at_utc general Fixture kickoff timestamp in UTC when available.
run_id general Latest raw scrape run selected for the season and round.
Gold (Modelled) gold_nrl_ladder_latest 8 columns Canonical latest NRL ladder table. The model selects the latest staged run...

Canonical latest NRL ladder table. The model selects the latest staged run for each season and round, then deduplicates to one row per season, round, and team.

Feature / Column Group Description Tests
season general NRL season.
round general NRL round.
team general Team nickname.
team_key general Canonical team key for duplicate checks.
ladder_position ladder Team ladder position.
played general Matches played at the scraped round.
points ladder Competition points at the scraped round.
run_id general Latest raw scrape run selected for the season and round.
Gold (Modelled) gold_nrl_ladder_current 9 columns Dashboard-ready current NRL ladder table. The model keeps only the latest...

Dashboard-ready current NRL ladder table. The model keeps only the latest ladder round for each season from `gold_nrl_ladder_latest`, then enforces one canonical row per season and team.

Feature / Column Group Description Tests
season general NRL season.
round ladder Latest ladder round selected for the season.
team general Team nickname.
team_key general Canonical team key for duplicate checks.
ladder_position ladder Team ladder position in the latest selected round.
played general Matches played at the latest selected round.
points ladder Competition points at the latest selected round.
scraped_at_utc ladder Timestamp when the selected ladder round was scraped.
run_id ladder Raw scrape run selected for the latest ladder round.
Gold (Modelled) gold_nrl_players_latest 8 columns Canonical latest NRL players table. The model preserves silver history and...

Canonical latest NRL players table. The model preserves silver history and deduplicates to one profile row per season and player key using scraped timestamp, run id, team key, and profile slug as deterministic ordering fields.

Feature / Column Group Description Tests
season general NRL season.
player_key lineup Canonical player key used for player deduplication.
player_name lineup Player display name.
team lineup Team nickname from the latest player profile snapshot.
position ladder Player position from the latest player profile snapshot.
player_url_slug lineup NRL profile URL slug.
scraped_at_utc general Timestamp when the source record was scraped.
run_id general Latest raw scrape run selected for the season.
Gold (Modelled) gold_nrl_stats_latest 14 columns Canonical latest NRL stats table. The model preserves silver history and...

Canonical latest NRL stats table. The model preserves silver history and deduplicates to one row per season, stat category, player/team key, and metric using scraped timestamp, run id, and published rank as deterministic ordering fields.

Feature / Column Group Description Tests
season general NRL season.
stat_category general Human-readable stat category from the NRL stats payload.
stat_category_key general Lowercase normalized stat category key.
metric_key general Canonical metric key used for stats deduplication.
player weather Player name when the row is player-grain.
team general Team nickname for the stat row.
business_entity_key lineup Canonical player-or-team key used in required-field checks.
stat_value_raw general Raw metric value extracted from the staged wide metric columns.
stat_value general Numeric metric value parsed from `stat_value_raw` where possible.
stats_grain weather Canonical stats business grain key.
rank_position ladder Published leaderboard rank for the stat row.
played general Games played value published with the stat row.
scraped_at_utc general Timestamp when the source record was scraped.
run_id general Latest raw scrape run selected for the season and round label.
Gold (Modelled) gold_nrl_match_weather 5 columns One row per mapped draw match with hourly stadium weather at kickoff and...

One row per mapped draw match with hourly stadium weather at kickoff and derived rain, wind, heat, humidity, and severity features. Rows are present before weather ingestion, with `weather_data_available = false` when no hourly weather is loaded yet.

Feature / Column Group Description Tests
match_id weather Canonical match identifier inherited from draw match grain. not_null, unique
match_grain weather Canonical match grain.
venue_key general Stable curated stadium key.
weather_timestamp_utc weather Hourly weather timestamp joined at kickoff hour.
weather_data_available weather True when observed hourly weather exists at the kickoff hour.
Gold (Modelled) gold_nrl_player_name_map 4 columns Player identity resolution table. One row per normalized name variant...

Player identity resolution table. One row per normalized name variant (full_name and nickname_last forms) mapping to a canonical NRL person_id. Used by RAPM to resolve stg_team_lists player names across season/source variants without hardcoded diminutive maps. Players absent from this table (historical players not covered by the monthly players spider) fall back to their normalized name string in the RAPM player index.

Feature / Column Group Description Tests
name_norm general Normalized name variant (lowercase, whitespace-collapsed). not_null, unique
canonical_player_id lineup NRL person_id to use as the stable player key. not_null
variant_type general full_name or nickname_last — how this variant was derived.
ambiguity_count odds Number of distinct person_ids that share this normalized name. Values > 1 flag ambiguous names for review; the lexicographically smallest person_id is retained.
Gold (Modelled) gold_nrl_player_round_stats 29 columns Per-player per-match statistics sourced from the NRL match-centre /data API...

Per-player per-match statistics sourced from the NRL match-centre /data API via stg_match_stats. One row per (season, round, match_id, player_id). Enriched with canonical_player_id from gold_nrl_player_name_map and match context (home/away, final scores) from gold_nrl_draw_latest. Deduplicated: latest scraped_at_utc wins when the same match is re-scraped.

Feature / Column Group Description Tests
season general NRL season.
round general NRL round.
match_id general NRL match-centre match identifier.
player_id lineup NRL player ID from the match-centre API.
player_name lineup Player display name as reported in the match-centre payload.
canonical_player_id lineup Stable player key from gold_nrl_player_name_map. Falls back to 'name:<normalized_name>' for players absent from the map.
team lineup Team nickname the player represented in this match.
opponent general Opposing team nickname.
position ladder Playing position.
jersey_number general Jersey number; 1-13 = starters, 14+ = bench.
starter_flag general 1 if jersey_number is 1–13, else 0.
is_home lineup 1 if the player's team is the home team in the draw, else 0.
home_team general Home team nickname (from draw).
away_team general Away team nickname (from draw).
home_score target Final home-team score (from draw).
away_score target Final away-team score (from draw).
kickoff_at_utc general Match kickoff timestamp UTC (from draw).
all_run_metres general Total run metres.
all_runs general Total runs.
post_contact_metres general Post-contact metres.
tries general Tries scored.
try_assists general Try assists.
line_breaks general Line breaks.
tackle_breaks general Tackle breaks.
tackles_made general Tackles made.
missed_tackles general Missed tackles.
errors general Errors.
fantasy_points ladder NRL fantasy points total.
scraped_at_utc general Timestamp when the match-centre data was scraped.
Gold (Modelled) gold_nrl_card_market_movements 13 columns Card-ready odds movement snapshots for H2H, line, and total markets. This...

Card-ready odds movement snapshots for H2H, line, and total markets. This read model exposes the append-only movement snapshot table for UI sparklines and post-hoc CLV display only; it is not an actionable model feature source.

Feature / Column Group Description Tests
season general NRL season.
round general NRL round.
match_id odds Odds provider event identifier for the fixture.
home_team general Fixture home team nickname.
away_team general Fixture away team nickname.
market_type odds h2h, line, or total.
selection odds Market side, such as home, away, over, or under.
snapshot_at_utc general Timestamp when the movement snapshot was captured.
price odds Decimal price at the snapshot.
line general Spread or total line at the snapshot when applicable.
snapshot_label general open, refresh, or close.
bookmaker odds Bookmaker name for the snapshot row.
is_recommended_market odds Placeholder flag; the UI marks the recommended market after joining predictions.
Python (Runtime) backtest.py → CORE_FEATURES 9 columns Core Elo + form features

Core Elo + form features

Feature / Column Group Description Tests
elo_home_prob odds
elo_rating_diff general
rolling_margin_diff_l5 form
rolling_win_rate_diff_l5 form
rest_days_diff general
playoff_flag general
neutral_venue_flag general
weather_data_available weather
weather_impact_flag weather
Python (Runtime) backtest.py → MARKET_FEATURES 3 columns Market odds features

Market odds features

Feature / Column Group Description Tests
close_home_implied_prob odds
open_home_implied_prob odds
market_move odds
Python (Runtime) backtest.py → LINEUP_FEATURES 5 columns Team list / lineup delta features

Team list / lineup delta features

Feature / Column Group Description Tests
lineup_overall_delta lineup
lineup_halves_delta lineup
lineup_edge_delta lineup
lineup_available lineup
lineup_nonzero_rate lineup
Python (Runtime) prediction.py → ROLE_LINEUP_FEATURES 17 columns Role-based lineup features

Role-based lineup features

Feature / Column Group Description Tests
delta_true_new_player_rate lineup
delta_transferred_player_rate lineup
delta_core_spine_strength general
delta_halves_playmaker_index general
delta_hooker_defence_service_index general
delta_top3_forward_strength general
delta_middle_forward_power general
delta_edge_forward_attack_defence odds
delta_centre_defence_index general
delta_outside_back_finish_index general
delta_replacement_strength general
delta_spine_continuity_rate general
delta_spine_strength_from_prior_round general
delta_starter_strength_from_prior_round general
delta_top3_forward_strength_from_prior_round general
lineup_available lineup
lineup_nonzero_rate lineup

Feature value review

FamilyStatusLatest evidenceMetric / CLVRecommendation
Generic H2H team-level expansionfrozenpooled signals hid side-specific behaviourCLA / not establishedfreeze unless a new data source arrives
RAPM lineup deltacandidatetiming hypothesis under paper observationCLV / pending 100 settled tradescollect team-list timing evidence
Weather / ground contextcandidateavailable as model inputcalibration / pendingtest in totals and line models
Divergence signalkilledanti-signal in recent erasCLA / negativedo not revive without new data

Model roadmap

Feature Groups

form Team Form 3
last_match_kickoff_at_utc rolling_margin_diff_l5 rolling_win_rate_diff_l5
ladder Ladder 20
ladder_round strength_index strength_index spine_continuity team team_key ladder_position points +12 more
weather Weather 23
match_id match_id match_id home_margin match_id weather_data_available match_id match_grain +15 more
lineup Lineup / Player 39
player current_team prior_team true_new_player_flag transferred_team_flag squad_strength_delta core_spine_strength spine_continuity_count +31 more
odds Odds / Market 14
edge_forward_attack_defence delta_edge_forward_attack_defence ambiguity_count match_id market_type selection price bookmaker +6 more
target Target / Result 5
margin home_score away_score home_score away_score
general General 150
season round kickoff_at_utc team_key is_home season round kickoff_at_utc +142 more