Self-paced course · Beginner · 66 lessons
PYTHON FROM PUCK DROP
The on-ramp to Python for analytics, core syntax, data wrangling, plotting, and best practices, so you're ready for machine learning and the job.
An agent can write the first script. This course is about being able to read it, change it and trust it.
Who it is for. Complete beginners who want a real Python foundation for analytics before moving into machine learning.

Python syntax and data structures, from scratch
Data cleaning and analysis with Pandas
Clear visualizations with Matplotlib and Plotly
The chart on this page, drawn by code you can edit. R runs on webR and Python on Pyodide; nothing loads until you press Run, and nothing you type leaves the page.
Edit me: Add a column for hard-hit balls (launch_speed of 95 or more) and run again.
Data: Spray chart (spray.csv). Simulated for practice by AthlyticZ (agents/sim_data.py, seed 20261109). License CC BY 4.0.
The code runs in your browser on Pyodide; nothing you type leaves the page.

Teaches the course the way the work is done in the role above. The team page lists everything they teach here.
The artifact. A cleaned season of data, the charts that answer a question about it, and a project you can rerun from scratch.
# Five hundred batted balls: exit velocity against distance, and the straight line a first Python analysis fits through them.
import sys, pathlib, csv
sys.path.insert(0, str(pathlib.Path(__file__).parent))
from _palette import plt, emit, GOLD, AQUA, MUTE
import numpy as np
rows = list(csv.DictReader(open("site/18-practice/batted-balls/files/batted_balls_2026.csv")))
x = np.array([float(r["launch_speed"]) for r in rows]); y = np.array([float(r["hit_distance"]) for r in rows])
b, a = np.polyfit(x, y, 1)
fig, ax = plt.subplots(figsize=(7.2, 4.2))
ax.scatter(x, y, s=12, color=AQUA, alpha=.65, edgecolors="none", rasterized=True) # 500 points as one raster layer keeps the SVG small
xs = np.linspace(x.min(), x.max(), 50); ax.plot(xs, a + b * xs, color=GOLD, lw=2)
ax.set_xlabel("exit velocity, mph"); ax.set_ylabel("distance, feet")
ax.set_title(f"One more mile per hour buys about {b:.1f} feet (least squares, n = {len(rows)})")
emit(fig)Data: Batted balls. Simulated for practice by AthlyticZ (agents/sim_data.py, seed 20261109). License CC BY 4.0.
From the academy course record, in the order it is taught. The first section is open; the rest fold out.
66 lessons in 9 sections, 7 quizzes. Every lesson is yours to keep.
Refunds. If you enrolled and it is the wrong course for you, write to michael@athlyticz.com and a person will answer.
Yes. Membership includes this and the entire course catalog, plus the live Masterclass. If you plan to take more than a couple of courses, Membership is the better math.
Complete beginners who want a real Python foundation for analytics before moving into machine learning. If the "not for you" list above reads like you, start elsewhere; if the outcome at the top reads like something you could use next week, it is pitched right.
9 sections · 66 lessons. Every lesson, the project files and code, and all future updates. Lifetime access: it is yours to keep.
Yes. Start today and go at your own pace, with lifetime access to every lesson and all future updates.
9 sections · 66 lessons, the project files, and every future update.
Enroll nowThis course, the whole catalog, and the Masterclass: every live session and every recording.
Get Membership