Chapter 57: The Python Ecosystem Map
You've learned the language. Now it's time to see the territory.
Python's ecosystem is enormous. There's a mature, well-maintained library for almost everything — web servers, machine learning, game development, financial modelling, microcontrollers, DevOps automation, computer vision, and more.
This chapter is your map. You won't master all of these. Nobody does. But knowing what exists — and roughly what each tool does — means you can pick the right one when a project demands it.
Web Development
Frameworks
| Library |
Use case |
Why it's popular |
| FastAPI |
REST APIs, async |
Auto docs, Pydantic validation, modern |
| Flask |
APIs + server-rendered web |
Simple, flexible, huge ecosystem |
| Django |
Full-stack web apps |
Batteries included (ORM, admin, auth) |
| Starlette |
ASGI foundation |
Lightweight; FastAPI is built on it |
| Litestar |
REST APIs |
Type-first, opinionated FastAPI alternative |
| Tornado |
Long-polling, WebSockets |
Mature async framework |
django-admin startproject mysite
python manage.py startapp blog
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
HTTP Clients
| Library |
Use case |
| requests |
Simple synchronous HTTP — the standard |
| httpx |
Like requests but async-capable |
| aiohttp |
Async HTTP client + server |
| urllib3 |
Low-level; used by requests internally |
import requests
r = requests.get("https://api.github.com/users/python")
data = r.json()
import httpx
async with httpx.AsyncClient() as client:
r = await client.get("https://api.github.com")
Web Scraping
| Library |
Use case |
| BeautifulSoup4 |
Parse HTML/XML |
| Scrapy |
Full scraping framework (crawls, pipelines) |
| Playwright |
Control a real browser (JS-rendered pages) |
| Selenium |
Classic browser automation |
| mechanize |
Stateful browser — fill forms, follow links |
Data Science and Analytics
The Core Stack
| Library |
Use case |
| NumPy |
N-dimensional arrays, vectorised math |
| pandas |
DataFrames, data cleaning, tabular analysis |
| matplotlib |
Publication-quality plots |
| seaborn |
Statistical visualisation, beautiful defaults |
| plotly |
Interactive charts (web-ready) |
| scipy |
Scientific algorithms (stats, signal, optimisation) |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
Databases from Python
| Library |
Use case |
| SQLAlchemy |
ORM + SQL toolkit (any SQL DB) |
| sqlite3 |
Built-in; zero-config SQLite |
| psycopg2 / psycopg3 |
PostgreSQL driver |
| pymysql |
MySQL driver |
| motor |
Async MongoDB driver |
| redis-py |
Redis client |
| pymongo |
MongoDB client |
Machine Learning and AI
Classical ML
| Library |
Use case |
| scikit-learn |
Classification, regression, clustering, pipelines |
| XGBoost |
Gradient boosting — wins Kaggle competitions |
| LightGBM |
Faster gradient boosting (Microsoft) |
| CatBoost |
Gradient boosting for categorical data (Yandex) |
| statsmodels |
Statistical models, hypothesis testing |
from sklearn.ensemble import GradientBoostingClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
model = XGBClassifier(n_estimators=500, learning_rate=0.05)
model.fit(X_train, y_train)
Deep Learning
| Library |
Use case |
| PyTorch |
Research + production DL (dominant in research) |
| TensorFlow / Keras |
Production DL, mobile deployment |
| JAX |
Accelerated NumPy with autograd (Google) |
| Hugging Face Transformers |
Pre-trained models (BERT, GPT, Llama) |
| fastai |
High-level PyTorch API |
import torch
import torch.nn as nn
class SimpleNet(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = torch.relu(self.fc1(x))
return self.fc2(x)
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
result = classifier("Python is an amazing language!")
print(result)
| Library |
Use case |
| openai |
Official OpenAI API client |
| anthropic |
Official Anthropic (Claude) client |
| LangChain |
LLM application framework (chains, agents) |
| LlamaIndex |
RAG (Retrieval-Augmented Generation) |
| sentence-transformers |
Embed text as vectors |
| chromadb |
Local vector database |
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Explain Python's GIL in one sentence."}],
)
print(response.choices[0].message.content)
Computer Vision
| Library |
Use case |
| OpenCV |
Image processing, video, real-time CV |
| Pillow |
Image manipulation |
| scikit-image |
Scientific image processing |
| torchvision |
CV datasets and models for PyTorch |
| ultralytics |
YOLOv8 — state-of-the-art object detection |
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("Webcam", gray)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
Automation and Scripting
| Library |
Use case |
| pathlib |
Built-in file system operations |
| shutil |
Built-in file copying/moving |
| schedule |
Run Python functions on a schedule |
| APScheduler |
Advanced scheduler (cron, interval, date) |
| watchdog |
Watch the file system for changes |
| Playwright |
Browser automation |
| pyautogui |
Mouse/keyboard automation |
| pynput |
Monitor/control keyboard and mouse |
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
@scheduler.scheduled_job("cron", hour=8, minute=0)
def morning_report():
print("Sending morning report...")
scheduler.start()
Office Automation
| Library |
Use case |
| openpyxl |
Read/write Excel (.xlsx) |
| xlrd |
Read legacy Excel (.xls) |
| python-docx |
Read/write Word documents |
| python-pptx |
Read/write PowerPoint |
| pypdf |
Read, merge, split PDFs |
| reportlab |
Generate PDFs from scratch |
| weasyprint |
HTML -> PDF |
| Library |
Use case |
| argparse |
Built-in CLI argument parsing |
| click |
Decorator-based CLI (Flask author) |
| typer |
Type-hint-based CLI (FastAPI author) |
| rich |
Beautiful terminal output (tables, progress, colour) |
| textual |
Full TUI (Terminal UI) apps |
| tqdm |
Progress bars |
import typer
app = typer.Typer()
@app.command()
def greet(name: str, count: int = 1, upper: bool = False):
for _ in range(count):
msg = f"Hello, {name}!"
typer.echo(msg.upper() if upper else msg)
if __name__ == "__main__":
app()
$ python hello.py Alice --count 3 --upper
HELLO, ALICE!
HELLO, ALICE!
HELLO, ALICE!
from rich.console import Console
from rich.table import Table
console = Console()
table = Table(title="Python Libraries")
table.add_column("Name", style="cyan", no_wrap=True)
table.add_column("Purpose", style="green")
table.add_row("FastAPI", "Web APIs")
table.add_row("pandas", "Data analysis")
table.add_row("PyTorch", "Deep learning")
console.print(table)
Testing and Code Quality
| Library |
Use case |
| pytest |
Test runner — the standard |
| hypothesis |
Property-based testing (generates test cases) |
| factory_boy |
Test fixtures / data factories |
| faker |
Generate fake data (names, emails, etc.) |
| ruff |
Linter + formatter (replaces flake8 + black + isort) |
| mypy |
Static type checker |
| pyright |
Microsoft's type checker (used in Pylance) |
| coverage.py |
Code coverage measurement |
| pre-commit |
Run checks before every git commit |
from hypothesis import given, strategies as st
@given(st.lists(st.integers()))
def test_sorted_is_sorted(lst):
result = sorted(lst)
assert result == sorted(result)
assert len(result) == len(lst)
assert set(result) == set(lst)
DevOps and Infrastructure
| Library |
Use case |
| ansible |
IT automation, server configuration |
| fabric |
SSH automation / remote task runner |
| boto3 |
AWS SDK for Python |
| google-cloud |
Google Cloud SDK |
| azure-sdk |
Microsoft Azure SDK |
| docker |
Docker SDK — manage containers from Python |
| kubernetes |
Kubernetes Python client |
| paramiko |
SSH client |
import boto3
s3 = boto3.client("s3")
s3.upload_file("report.pdf", "my-bucket", "reports/report.pdf")
ec2 = boto3.resource("ec2")
for instance in ec2.instances.all():
print(instance.id, instance.state["Name"])
Finance and Quantitative Analysis
| Library |
Use case |
| yfinance |
Download stock data from Yahoo Finance |
| pandas-datareader |
Financial data from multiple sources |
| ta |
Technical analysis indicators |
| backtrader |
Backtesting trading strategies |
| zipline |
Algorithmic trading backtester |
| pyfolio |
Portfolio performance analysis |
| quantlib |
Quantitative finance library |
import yfinance as yf
import matplotlib.pyplot as plt
aapl = yf.download("AAPL", period="1y")
aapl["Close"].plot(figsize=(10, 4), title="AAPL Closing Price")
plt.tight_layout()
plt.show()
Game Development
| Library |
Use case |
| pygame |
2D games — the classic choice |
| arcade |
Modern 2D games, better API than pygame |
| Panda3D |
3D game engine |
| pyglet |
OpenGL-based windowing and multimedia |
| pygame-ce |
Community fork of pygame, actively maintained |
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((30, 30, 30))
pygame.draw.circle(screen, (0, 120, 255), (400, 300), 50)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Embedded and IoT
| Library |
Use case |
| MicroPython |
Python on microcontrollers (ESP32, Pico) |
| CircuitPython |
Adafruit's beginner-friendly MicroPython fork |
| RPi.GPIO |
Raspberry Pi GPIO control |
| gpiozero |
Higher-level Raspberry Pi GPIO |
| pyserial |
Serial port communication |
| paho-mqtt |
MQTT protocol (IoT messaging) |
from machine import Pin
import time
led = Pin(25, Pin.OUT)
while True:
led.toggle()
time.sleep(0.5)
Scientific and Academic
| Library |
Use case |
| sympy |
Symbolic mathematics (algebra, calculus) |
| scipy |
Scientific algorithms |
| astropy |
Astronomy tools |
| biopython |
Bioinformatics |
| networkx |
Graph theory and network analysis |
| nltk |
Natural language processing (classic) |
| spacy |
Industrial-strength NLP |
import sympy as sp
x = sp.Symbol("x")
expr = sp.sin(x**2) + sp.cos(x)
print(sp.diff(expr, x))
print(sp.solve(x**2 - 4, x))
print(sp.integrate(x**2, x))
Async and Concurrency
| Library |
Use case |
| asyncio |
Built-in async event loop |
| aiohttp |
Async HTTP client + server |
| aiofiles |
Async file I/O |
| aiomysql / asyncpg |
Async database drivers |
| celery |
Distributed task queue |
| rq |
Simple Redis-backed job queue |
| dramatiq |
Message processing middleware |
from celery import Celery
app = Celery("tasks", broker="redis://localhost:6379/0")
@app.task
def send_email(to: str, subject: str, body: str):
...
send_email.delay("alice@example.com", "Welcome!", "Hello!")
How to Choose a Library
When you need a library for something new:
- Search PyPI:
pip search is deprecated; use pypi.org directly
- Check stars and activity: GitHub stars + recent commits = active project
- Check downloads: pypistats.org shows weekly download counts
- Read the README: Is it well-documented? Does it have examples?
- Check issues: Are bugs being fixed? Is there a responsive maintainer?
- Try it in a sandbox:
pip install in a fresh venv and experiment
Signs a library is safe to depend on:
- 1000+ GitHub stars (for non-niche libraries)
- Updated in the last 6-12 months
- Comprehensive test suite
- Semantic versioning
- Published to PyPI (not just GitHub)
- Used by well-known projects
The 20 Libraries Every Python Developer Should Know
If you master nothing else from this ecosystem map, master these:
| # |
Library |
Why |
| 1 |
requests |
HTTP in 2 lines |
| 2 |
pandas |
Data manipulation |
| 3 |
NumPy |
Numerical computing |
| 4 |
matplotlib |
Visualisation |
| 5 |
SQLAlchemy |
Databases |
| 6 |
FastAPI |
Modern APIs |
| 7 |
Flask |
Simple web apps |
| 8 |
pytest |
Testing |
| 9 |
pydantic |
Data validation |
| 10 |
ruff |
Linting + formatting |
| 11 |
mypy |
Type checking |
| 12 |
Pillow |
Image processing |
| 13 |
rich |
Beautiful terminal output |
| 14 |
click / typer |
CLI tools |
| 15 |
boto3 |
AWS (if you use cloud) |
| 16 |
scikit-learn |
Machine learning |
| 17 |
PyTorch |
Deep learning |
| 18 |
httpx |
Async HTTP |
| 19 |
aiohttp |
Async HTTP server/client |
| 20 |
celery |
Background jobs |
What You Learned in This Chapter
- Python's ecosystem has mature, well-maintained libraries for nearly every domain.
- Web: FastAPI (modern APIs), Flask (simple web), Django (full-stack), requests/httpx (HTTP clients), Playwright (browser automation).
- Data science: NumPy + pandas + matplotlib + seaborn + scipy form the core stack.
- ML/AI: scikit-learn for classical ML; XGBoost/LightGBM for boosting; PyTorch/TensorFlow for deep learning; Hugging Face for pre-trained models; OpenAI/Anthropic for LLMs.
- Automation: pathlib + shutil (files), schedule/APScheduler (scheduling), openpyxl/python-docx/pypdf (office), pyautogui (GUI automation).
- CLI: argparse (built-in), click, typer (type-hint-based), rich (beautiful output), tqdm (progress bars).
- DevOps: boto3 (AWS), fabric (SSH), docker (containers), ansible (infrastructure).
- Finance: yfinance (stock data), backtrader (backtesting), quantlib (quant finance).
- Games: pygame/arcade (2D), Panda3D (3D).
- Embedded: MicroPython/CircuitPython (microcontrollers), gpiozero (Raspberry Pi).
- When evaluating a library: check stars, recent commits, downloads, documentation, and whether it's used by known projects.
What's Next?
Chapter 58 covers Building Your Portfolio and Getting Hired — what Python projects to build, how to present them on GitHub, how to write a Python-focused resume, and how to answer the most common Python interview questions.