Airflow DAG Patterns
Main DAG Location
dags/multi_sport_betting_workflow.py - Unified workflow for all sports.
Task Naming Convention
Format: {action}_{sport}
Examples:
- •
download_games_nba - •
update_elo_nhl - •
identify_bets_mlb - •
place_bets_nfl
Sports Configuration
Add/modify sports in SPORTS_CONFIG:
python
SPORTS_CONFIG = {
"nba": {
"elo_module": "nba_elo_rating",
"games_module": "nba_games",
"kalshi_function": "fetch_nba_markets",
"elo_threshold": 0.73,
},
# Add new sport here following same pattern
}
Task Flow Pattern
code
download_games → load_to_db → update_elo → fetch_markets → identify_bets → place_bets
Each sport runs independently in parallel.
Critical Rules
- •
NEVER trigger manual DAG runs - Clear tasks and let Airflow schedule
- •
Use PythonOperator for all tasks:
pythonfrom airflow.providers.standard.operators.python import PythonOperator task = PythonOperator( task_id="update_elo_nba", python_callable=update_elo_ratings, op_kwargs={"sport": "nba"}, ) - •
Handle failures gracefully - Don't let one sport block others:
pythontask = PythonOperator( task_id="download_games_nba", python_callable=download_games, retries=3, retry_delay=timedelta(minutes=5), )
Adding a New Task
- •Define function in DAG file or import from plugins
- •Create PythonOperator with task_id following naming convention
- •Set dependencies with
>>operator - •Test DAG parsing:
python dags/multi_sport_betting_workflow.py
Common Imports
python
from airflow import DAG from airflow.providers.standard.operators.python import PythonOperator from datetime import datetime, timedelta
Default Args Pattern
python
default_args = {
"owner": "airflow",
"depends_on_past": False,
"email_on_failure": False,
"retries": 1,
"retry_delay": timedelta(minutes=5),
}
with DAG(
"multi_sport_betting_workflow",
default_args=default_args,
schedule="0 10 * * *", # 10 AM daily
start_date=datetime(2024, 1, 1),
catchup=False,
) as dag:
...
Files to Reference
- •
dags/multi_sport_betting_workflow.py- Main DAG - •
dags/portfolio_hourly_snapshot.py- Simpler DAG example