Introduction
Basketball prediction starts with simple models. If we know recent production and expected minutes, we can estimate what might happen next game.
In this project, you will build a lightweight prediction model and flag breakout-watch games.
What we're building
By the end of this project, you will:
- Store player data in dictionaries
- Detect trends in recent scoring
- Predict next-game points from recent rates
- Classify breakout potential with clear rules
Why this matters
Most advanced models start with a simple baseline. If you can build and explain a baseline model, you are thinking like an analyst.
Part 1: Quick Start
Set up your project in Cursor
For this project, you will create your files from scratch (no starter pack download).
Before you start: quick vocabulary
- A folder is a container that holds files.
- A file is one item inside a folder.
- A file extension is the ending in the file name:
.pymeans Python code..csvmeans table-style data.
- Pick an easy location for your project folder:
- Mac:
Desktopin Finder - Windows:
Desktopin File Explorer - Chromebook:
My filesin the Files app
- Mac:
- Create a folder called
basketball-performance-predictor. - In Cursor, go to
File > Open Folderand openbasketball-performance-predictor. - In Cursor's left file explorer:
- click New Folder and create
data - click New File and create
performance_predictor.py - open
data, click New File, and createrecent_games.csv
- click New Folder and create
- If you do not see file extensions on your computer, that is okay. Type the full names exactly, including
.pyand.csv.
Writing the code
Type this into performance_predictor.py:
recent_points = [18, 22, 25, 21, 27]
recent_minutes = [30, 32, 35, 31, 34]
projected_minutes = 33
points_per_minute = sum(recent_points) / sum(recent_minutes)
predicted_points = points_per_minute * projected_minutes
print(f"Predicted points next game: {predicted_points:.1f}")
You just built a simple model:
prediction = scoring rate x projected minutes
Running the code
Save the file (Cmd + S on Mac, Ctrl + S on Windows/Chromebook).
Run the file with Cursor's built-in Run Python File play button in the top-right.
If the play button is missing, install/enable the Python extension in Cursor and reopen performance_predictor.py.
Expected output:
Predicted points next game: 23.7
If your output matches, your project setup is working.
Part 2: Project Milestones
Milestone 1: Store player data in a dictionary
Dictionaries let you give each value a name ("season_average", "recent_points") instead of remembering index positions.
Add this below your existing code:
player = {
"name": "Jalen Carter",
"team": "Greenville Comets",
"season_average": 20.8,
"recent_points": [18, 22, 25, 21, 27],
"recent_minutes": [30, 32, 35, 31, 34]
}
print(player["name"])
print(player["recent_points"])
Expected output:
Jalen Carter
[18, 22, 25, 21, 27]
Milestone 2: Build reusable prediction functions
Now wrap your logic into reusable functions. This makes your code easier to test and reuse for other players.
Add this below Milestone 1:
def average(values):
return sum(values) / len(values)
def predict_points(recent_points, recent_minutes, projected_minutes):
points_per_minute = sum(recent_points) / sum(recent_minutes)
return points_per_minute * projected_minutes
projected_minutes = 33
prediction = predict_points(
player["recent_points"],
player["recent_minutes"],
projected_minutes
)
print(f"{player['name']} predicted points: {prediction:.1f}")
Expected output:
Jalen Carter predicted points: 23.7
Milestone 3: Detect trend direction
Prediction is not just one number. Analysts also ask: "Is this player trending up or down?"
Add this below your current code:
recent = player["recent_points"]
first_half_avg = average(recent[:2])
second_half_avg = average(recent[-2:])
if second_half_avg > first_half_avg:
trend = "up"
elif second_half_avg < first_half_avg:
trend = "down"
else:
trend = "flat"
print(f"Trend: {trend}")
Expected output:
Trend: up
Milestone 4: Add breakout watch logic
Now turn prediction + season average into a category label.
Add this below your current code:
def breakout_label(predicted_points, season_average, breakout_margin):
if predicted_points >= season_average + breakout_margin:
return "Breakout watch"
if predicted_points >= season_average:
return "On pace"
return "Below season pace"
tag = breakout_label(prediction, player["season_average"], 3.0)
print(f"Tag: {tag}")
Expected output:
Tag: Breakout watch
Milestone 5: Load recent game logs from CSV
Now you will keep game data in a CSV so you can update predictions without editing Python logic.
- Open
data/recent_games.csv. - Paste the data below.
- Save the file.
- Make sure the file name is exactly
recent_games.csv(notrecent_games.csv.txt).
Paste this into data/recent_games.csv:
date,points,minutes
2026-02-01,18,30
2026-02-03,22,32
2026-02-06,25,35
2026-02-08,21,31
2026-02-10,27,34
Now load that CSV in Python and re-run the prediction using file data. Add this below your existing code:
import csv
recent_points = []
recent_minutes = []
with open("data/recent_games.csv", "r") as file:
reader = csv.DictReader(file)
for row in reader:
recent_points.append(float(row["points"]))
recent_minutes.append(float(row["minutes"]))
player["recent_points"] = recent_points
player["recent_minutes"] = recent_minutes
prediction = predict_points(recent_points, recent_minutes, projected_minutes)
first_half_avg = average(recent_points[:2])
second_half_avg = average(recent_points[-2:])
if second_half_avg > first_half_avg:
trend = "up"
elif second_half_avg < first_half_avg:
trend = "down"
else:
trend = "flat"
print(f"CSV-based prediction: {prediction:.1f}")
Click Run Python File again and verify your CSV-based prediction prints.
Expected output (your exact decimal may vary slightly):
CSV-based prediction: 23.7
Milestone 6: Build a final prediction card
Now combine prediction, trend, and tag in one clean report block.
Add this below Milestone 5:
tag = breakout_label(prediction, player["season_average"], 3.0)
print("=" * 46)
print(f"PREDICTION CARD: {player['name']}")
print("=" * 46)
print(f"Projected minutes: {projected_minutes}")
print(f"Predicted points: {prediction:.1f}")
print(f"Season average: {player['season_average']:.1f}")
print(f"Trend: {trend}")
print(f"Tag: {tag}")
print("=" * 46)
Expected result:
- A final prediction card with projected minutes, prediction, season average, trend, and breakout tag.
If you made it this far, you built a complete basketball prediction workflow from scratch.
Common Fixes
FileNotFoundError: confirm the path is exactlydata/recent_games.csv.ValueError: check the CSVpointsandminutescolumns are numeric.- No play button: install/enable Python extension in Cursor and reopen
performance_predictor.py.
Bonus Exercises: Push It Further with Your Agent
Use this short prompt structure for better AI help:
- Goal: what you want to build
- Context: file name + what code already exists
- Constraints: keep beginner-friendly, minimal changes
- Output format: ask for exact code + where to paste + expected output
Bonus 1: Predict Multiple Players
Try this prompt:
You are my Python tutor and coding assistant.
Goal:
Predict points for 3 players and print one prediction card per player.
Context:
I am editing performance_predictor.py.
I already have predict_points(...), breakout_label(...), and a final prediction card format.
Constraints:
- Keep my current single-player flow working.
- Add only what is needed for multi-player support.
- Use beginner-friendly Python.
Output format:
1) Plan (3 bullets)
2) CSV format I should use
3) Exact code changes
4) Where to paste each code block
5) Example output for 2 players
Bonus 2: Add a Prediction Range
Try this prompt:
You are my Python tutor and coding assistant.
Goal:
Show low / medium / high prediction ranges instead of only one predicted value.
Context:
Current code calculates one prediction from recent points and minutes.
Constraints:
- Keep formulas simple (no advanced libraries).
- Explain the math in one short paragraph.
- Keep my current print card and add range lines.
Output format:
1) Range formula and reason
2) Code changes only
3) Expected output block
4) One way to tune the range width
Bonus 3: Compare Prediction vs Actual
Try this prompt:
You are my Python tutor and coding assistant.
Goal:
Compare predicted points to actual points and calculate prediction error.
Context:
I already compute prediction in performance_predictor.py.
I want to add this after the final prediction card.
Constraints:
- Keep this beginner-level.
- Show both signed error and absolute error.
- Do not remove existing outputs.
Output format:
1) Code block to add
2) Where to paste it
3) Expected output with sample numbers
4) One sentence explaining how to interpret error