Skip to content

Fantasy Integration

This example demonstrates how to use NFL data for fantasy football applications.

Fantasy Scoring Calculator

"""
Fantasy football scoring calculator using Griddy SDK.
"""

from griddy.nfl import GriddyNFL
from dataclasses import dataclass
from typing import Dict, List, Optional

@dataclass
class FantasyScoring:
    """Standard fantasy scoring rules."""
    passing_yard: float = 0.04      # 1 point per 25 yards
    passing_td: float = 4.0
    interception: float = -2.0
    rushing_yard: float = 0.1       # 1 point per 10 yards
    rushing_td: float = 6.0
    reception: float = 1.0          # PPR
    receiving_yard: float = 0.1     # 1 point per 10 yards
    receiving_td: float = 6.0
    fumble_lost: float = -2.0
    two_pt_conversion: float = 2.0

class FantasyCalculator:
    def __init__(self, scoring: FantasyScoring = None):
        self.scoring = scoring or FantasyScoring()

    def calculate_qb_points(self, stats) -> float:
        """Calculate fantasy points for a quarterback."""
        points = 0.0

        # Passing
        points += getattr(stats, 'passing_yards', 0) * self.scoring.passing_yard
        points += getattr(stats, 'passing_touchdowns', 0) * self.scoring.passing_td
        points += getattr(stats, 'interceptions', 0) * self.scoring.interception

        # Rushing (for mobile QBs)
        points += getattr(stats, 'rushing_yards', 0) * self.scoring.rushing_yard
        points += getattr(stats, 'rushing_touchdowns', 0) * self.scoring.rushing_td

        # Fumbles
        points += getattr(stats, 'fumbles_lost', 0) * self.scoring.fumble_lost

        return points

    def calculate_rb_points(self, stats) -> float:
        """Calculate fantasy points for a running back."""
        points = 0.0

        # Rushing
        points += getattr(stats, 'rushing_yards', 0) * self.scoring.rushing_yard
        points += getattr(stats, 'rushing_touchdowns', 0) * self.scoring.rushing_td

        # Receiving
        points += getattr(stats, 'receptions', 0) * self.scoring.reception
        points += getattr(stats, 'receiving_yards', 0) * self.scoring.receiving_yard
        points += getattr(stats, 'receiving_touchdowns', 0) * self.scoring.receiving_td

        # Fumbles
        points += getattr(stats, 'fumbles_lost', 0) * self.scoring.fumble_lost

        return points

    def calculate_wr_te_points(self, stats) -> float:
        """Calculate fantasy points for WR/TE."""
        points = 0.0

        # Receiving
        points += getattr(stats, 'receptions', 0) * self.scoring.reception
        points += getattr(stats, 'receiving_yards', 0) * self.scoring.receiving_yard
        points += getattr(stats, 'receiving_touchdowns', 0) * self.scoring.receiving_td

        # Rushing (rare)
        points += getattr(stats, 'rushing_yards', 0) * self.scoring.rushing_yard
        points += getattr(stats, 'rushing_touchdowns', 0) * self.scoring.rushing_td

        # Fumbles
        points += getattr(stats, 'fumbles_lost', 0) * self.scoring.fumble_lost

        return points

def main():
    nfl = GriddyNFL(nfl_auth={"accessToken": "your_token"})
    calculator = FantasyCalculator()

    # Get stats
    passing = nfl.stats.passing.get_passing_stats_by_season(season=2024)
    rushing = nfl.stats.rushing.get_rushing_stats_by_season(season=2024)
    receiving = nfl.stats.receiving.get_receiving_stats_by_season(season=2024)

    # Calculate QB fantasy points
    print("=== TOP 10 FANTASY QBs ===")
    qb_points = []
    for player in passing.players:
        points = calculator.calculate_qb_points(player)
        qb_points.append((player.player_name, player.team_abbreviation, points))

    qb_points.sort(key=lambda x: x[2], reverse=True)
    for i, (name, team, pts) in enumerate(qb_points[:10], 1):
        print(f"{i:2}. {name} ({team}): {pts:.1f} pts")

    # Calculate RB fantasy points
    print("\n=== TOP 10 FANTASY RBs ===")
    rb_points = []
    for player in rushing.players:
        points = calculator.calculate_rb_points(player)
        rb_points.append((player.player_name, player.team_abbreviation, points))

    rb_points.sort(key=lambda x: x[2], reverse=True)
    for i, (name, team, pts) in enumerate(rb_points[:10], 1):
        print(f"{i:2}. {name} ({team}): {pts:.1f} pts")

    # Calculate WR/TE fantasy points
    print("\n=== TOP 10 FANTASY WR/TEs ===")
    wr_points = []
    for player in receiving.players:
        points = calculator.calculate_wr_te_points(player)
        wr_points.append((player.player_name, player.team_abbreviation, points))

    wr_points.sort(key=lambda x: x[2], reverse=True)
    for i, (name, team, pts) in enumerate(wr_points[:10], 1):
        print(f"{i:2}. {name} ({team}): {pts:.1f} pts")

if __name__ == "__main__":
    main()

Weekly Projections

from griddy.nfl import GriddyNFL
from statistics import mean

def calculate_weekly_average(nfl, player_name: str, position: str, season: int):
    """Calculate weekly average fantasy points."""
    weekly_points = []

    for week in range(1, 18):
        try:
            if position == "QB":
                stats = nfl.stats.passing.get_passing_stats_by_week(
                    season=season, week=week
                )
                player_stats = next(
                    (p for p in stats.players if p.player_name == player_name),
                    None
                )
                if player_stats:
                    points = calculate_qb_points(player_stats)
                    weekly_points.append(points)

            elif position in ["RB", "WR", "TE"]:
                rushing = nfl.stats.rushing.get_rushing_stats_by_week(
                    season=season, week=week
                )
                receiving = nfl.stats.receiving.get_receiving_stats_by_week(
                    season=season, week=week
                )

                # Combine stats
                # (simplified - in practice you'd merge by player ID)

        except Exception:
            continue

    if weekly_points:
        return {
            'average': mean(weekly_points),
            'high': max(weekly_points),
            'low': min(weekly_points),
            'games': len(weekly_points)
        }

    return None

Matchup Analysis

def analyze_matchup(nfl, team: str, opponent: str, season: int):
    """Analyze fantasy matchup against specific opponent."""

    # Get opponent's defensive stats
    team_defense = nfl.stats.team_defense.get_team_defense_stats_by_season(
        season=season
    )

    opp_defense = next(
        (t for t in team_defense.teams if t.team_abbreviation == opponent),
        None
    )

    if not opp_defense:
        return None

    # Analyze defensive weaknesses
    analysis = {
        'opponent': opponent,
        'passing_yards_allowed': opp_defense.passing_yards_allowed,
        'rushing_yards_allowed': opp_defense.rushing_yards_allowed,
        'points_allowed': opp_defense.points_allowed,
    }

    # Rank against league
    passing_rank = sum(
        1 for t in team_defense.teams
        if t.passing_yards_allowed < opp_defense.passing_yards_allowed
    ) + 1

    rushing_rank = sum(
        1 for t in team_defense.teams
        if t.rushing_yards_allowed < opp_defense.rushing_yards_allowed
    ) + 1

    analysis['passing_defense_rank'] = passing_rank
    analysis['rushing_defense_rank'] = rushing_rank

    return analysis

# Usage
nfl = GriddyNFL(nfl_auth={"accessToken": "token"})
matchup = analyze_matchup(nfl, "KC", "LV", 2024)

print(f"Matchup vs {matchup['opponent']}:")
print(f"  Passing yards allowed: {matchup['passing_yards_allowed']}")
print(f"  Passing D rank: #{matchup['passing_defense_rank']}")
print(f"  Rushing yards allowed: {matchup['rushing_yards_allowed']}")
print(f"  Rushing D rank: #{matchup['rushing_defense_rank']}")

Start/Sit Recommendations

from dataclasses import dataclass
from typing import List

@dataclass
class PlayerRecommendation:
    name: str
    team: str
    position: str
    projected_points: float
    matchup_grade: str  # A, B, C, D, F
    recommendation: str  # START, SIT, FLEX

def get_start_sit_recommendations(
    nfl,
    players: List[dict],  # [{name, team, position}]
    week: int,
    season: int = 2024
) -> List[PlayerRecommendation]:
    """Generate start/sit recommendations."""

    recommendations = []

    # Get schedule to find matchups
    games = nfl.games.get_games(
        season=season,
        season_type="REG",
        week=week
    )

    # Map teams to opponents
    matchups = {}
    for game in games.games:
        matchups[game.home_team.abbreviation] = game.away_team.abbreviation
        matchups[game.away_team.abbreviation] = game.home_team.abbreviation

    for player in players:
        opponent = matchups.get(player['team'])

        if not opponent:
            continue

        # Analyze matchup
        matchup_analysis = analyze_matchup(
            nfl, player['team'], opponent, season
        )

        # Calculate projected points (simplified)
        projected = estimate_projection(nfl, player, matchup_analysis, season)

        # Grade matchup
        if player['position'] in ['QB', 'WR', 'TE']:
            rank = matchup_analysis['passing_defense_rank']
        else:
            rank = matchup_analysis['rushing_defense_rank']

        if rank <= 6:
            grade = 'A'
        elif rank <= 12:
            grade = 'B'
        elif rank <= 20:
            grade = 'C'
        elif rank <= 26:
            grade = 'D'
        else:
            grade = 'F'

        # Make recommendation
        if projected >= 15 and grade in ['A', 'B']:
            rec = 'START'
        elif projected <= 8 or grade == 'F':
            rec = 'SIT'
        else:
            rec = 'FLEX'

        recommendations.append(PlayerRecommendation(
            name=player['name'],
            team=player['team'],
            position=player['position'],
            projected_points=projected,
            matchup_grade=grade,
            recommendation=rec
        ))

    return recommendations

def estimate_projection(nfl, player: dict, matchup, season: int) -> float:
    """Estimate fantasy points projection."""
    # Get player's season average
    # (In practice, calculate from weekly stats)

    # Apply matchup adjustment
    # (Simplified: better matchup = higher projection)

    base_projection = 12.0  # Default

    matchup_adjustments = {'A': 1.2, 'B': 1.1, 'C': 1.0, 'D': 0.9, 'F': 0.8}

    # Determine grade from matchup
    if player['position'] in ['QB', 'WR', 'TE']:
        rank = matchup['passing_defense_rank']
    else:
        rank = matchup['rushing_defense_rank']

    if rank <= 6:
        grade = 'A'
    elif rank <= 12:
        grade = 'B'
    elif rank <= 20:
        grade = 'C'
    elif rank <= 26:
        grade = 'D'
    else:
        grade = 'F'

    return base_projection * matchup_adjustments[grade]

Waiver Wire Analysis

def find_waiver_targets(
    nfl,
    rostered_players: List[str],  # Names already rostered
    season: int = 2024,
    min_games: int = 3
) -> List[dict]:
    """Find waiver wire targets based on recent performance."""

    # Get recent stats (last 3 weeks)
    recent_weeks = range(max(1, 18 - 3), 18)

    player_recent_stats = {}

    for week in recent_weeks:
        # Get all stats for the week
        passing = nfl.stats.passing.get_passing_stats_by_week(
            season=season, week=week
        )
        rushing = nfl.stats.rushing.get_rushing_stats_by_week(
            season=season, week=week
        )
        receiving = nfl.stats.receiving.get_receiving_stats_by_week(
            season=season, week=week
        )

        # Aggregate by player
        # (simplified - would need proper player ID matching)

    # Filter to unrostered players with good recent performance
    targets = []
    for name, stats in player_recent_stats.items():
        if name in rostered_players:
            continue

        if stats['games'] < min_games:
            continue

        avg_points = stats['total_points'] / stats['games']

        if avg_points >= 10:  # Threshold for consideration
            targets.append({
                'name': name,
                'position': stats['position'],
                'team': stats['team'],
                'recent_avg': avg_points,
                'trend': stats.get('trend', 'stable')
            })

    # Sort by recent average
    targets.sort(key=lambda x: x['recent_avg'], reverse=True)

    return targets[:10]