Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions notebooks/01_load_data.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"cells": [
{
"cell_type": "markdown",
"id": "7fb27b941602401d91542211134fc71a",
"metadata": {},
"source": [
"# 01 — Load data\n",
Expand All @@ -14,23 +15,26 @@
{
"cell_type": "code",
"execution_count": null,
"id": "acae54e37e7d407bbb7b55eff062a284",
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"from pathlib import Path\n",
"\n",
"sys.path.insert(0, str(Path.cwd().parent))\n",
"\n",
"from src.utils import load_csv\n",
"\n",
"df = load_csv('../data/raw/population_africa_sample.csv')\n",
"df = load_csv(\"../data/raw/population_africa_sample.csv\")\n",
"print(df.shape)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9a63283cbaf04dbcab1f6479b197f3a8",
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -40,6 +44,7 @@
{
"cell_type": "code",
"execution_count": null,
"id": "8dd0d8092fe74a7c96281538738b07e2",
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -48,8 +53,15 @@
}
],
"metadata": {
"kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" },
"language_info": { "name": "python", "version": "3.12" }
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
Expand Down
34 changes: 24 additions & 10 deletions notebooks/02_basic_analysis.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"cells": [
{
"cell_type": "markdown",
"id": "7fb27b941602401d91542211134fc71a",
"metadata": {},
"source": [
"# 02 — Basic analysis\n",
Expand All @@ -14,64 +15,77 @@
{
"cell_type": "code",
"execution_count": null,
"id": "acae54e37e7d407bbb7b55eff062a284",
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"from pathlib import Path\n",
"\n",
"sys.path.insert(0, str(Path.cwd().parent))\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"from src.utils import load_csv, summary_stats, top_n\n",
"\n",
"df = load_csv('../data/raw/population_africa_sample.csv')\n",
"df = load_csv(\"../data/raw/population_africa_sample.csv\")\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9a63283cbaf04dbcab1f6479b197f3a8",
"metadata": {},
"outputs": [],
"source": [
"by_region = summary_stats(df, 'region', 'population_millions')\n",
"by_region = summary_stats(df, \"region\", \"population_millions\")\n",
"by_region"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8dd0d8092fe74a7c96281538738b07e2",
"metadata": {},
"outputs": [],
"source": [
"top = top_n(df, 'population_millions', n=5)\n",
"top = top_n(df, \"population_millions\", n=5)\n",
"\n",
"sns.set_theme(style='darkgrid')\n",
"sns.set_theme(style=\"darkgrid\")\n",
"fig, ax = plt.subplots(figsize=(8, 4))\n",
"sns.barplot(data=top, x='country', y='population_millions', ax=ax)\n",
"ax.set_title('Top 5 by population — sample data')\n",
"sns.barplot(data=top, x=\"country\", y=\"population_millions\", ax=ax)\n",
"ax.set_title(\"Top 5 by population — sample data\")\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "72eea5119410473aa328ad9291626812",
"metadata": {},
"outputs": [],
"source": [
"fig, ax = plt.subplots(figsize=(6, 4))\n",
"sns.scatterplot(data=df, x='population_millions', y='gdp_per_capita_usd', hue='region', ax=ax)\n",
"ax.set_title('Population vs GDP per capita')\n",
"sns.scatterplot(data=df, x=\"population_millions\", y=\"gdp_per_capita_usd\", hue=\"region\", ax=ax)\n",
"ax.set_title(\"Population vs GDP per capita\")\n",
"plt.tight_layout()\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" },
"language_info": { "name": "python", "version": "3.12" }
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
Expand Down
30 changes: 21 additions & 9 deletions notebooks/03_duckdb_queries.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"cells": [
{
"cell_type": "markdown",
"id": "7fb27b941602401d91542211134fc71a",
"metadata": {},
"source": [
"# 03 — DuckDB queries\n",
Expand All @@ -14,52 +15,63 @@
{
"cell_type": "code",
"execution_count": null,
"id": "acae54e37e7d407bbb7b55eff062a284",
"metadata": {},
"outputs": [],
"source": [
"import duckdb\n",
"\n",
"con = duckdb.connect()\n",
"con.execute(\"CREATE OR REPLACE VIEW pop AS SELECT * FROM read_csv_auto('../data/raw/population_africa_sample.csv')\")\n",
"con.sql('SELECT * FROM pop LIMIT 5').df()"
"csv_path = \"../data/raw/population_africa_sample.csv\"\n",
"con.execute(f\"CREATE OR REPLACE VIEW pop AS SELECT * FROM read_csv_auto('{csv_path}')\")\n",
"con.sql(\"SELECT * FROM pop LIMIT 5\").df()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9a63283cbaf04dbcab1f6479b197f3a8",
"metadata": {},
"outputs": [],
"source": [
"con.sql('''\n",
"con.sql(\"\"\"\n",
" SELECT region,\n",
" COUNT(*) AS n_countries,\n",
" SUM(population_millions) AS total_pop_m,\n",
" ROUND(AVG(gdp_per_capita_usd), 0) AS avg_gdp_per_capita\n",
" FROM pop\n",
" GROUP BY region\n",
" ORDER BY total_pop_m DESC\n",
"''').df()"
"\"\"\").df()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8dd0d8092fe74a7c96281538738b07e2",
"metadata": {},
"outputs": [],
"source": [
"con.sql('''\n",
"con.sql(\"\"\"\n",
" SELECT country, population_millions, gdp_per_capita_usd\n",
" FROM pop\n",
" WHERE gdp_per_capita_usd > 2000\n",
" ORDER BY gdp_per_capita_usd DESC\n",
"''').df()"
"\"\"\").df()"
]
}
],
"metadata": {
"kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" },
"language_info": { "name": "python", "version": "3.12" }
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
}
32 changes: 22 additions & 10 deletions notebooks/04_ml_intro.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"cells": [
{
"cell_type": "markdown",
"id": "7fb27b941602401d91542211134fc71a",
"metadata": {},
"source": [
"# 04 — ML intro\n",
Expand All @@ -14,41 +15,45 @@
{
"cell_type": "code",
"execution_count": null,
"id": "acae54e37e7d407bbb7b55eff062a284",
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"from pathlib import Path\n",
"\n",
"sys.path.insert(0, str(Path.cwd().parent))\n",
"\n",
"import numpy as np\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import mean_absolute_error, r2_score\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"from src.utils import load_csv\n",
"\n",
"df = load_csv('../data/raw/population_africa_sample.csv')\n",
"X = df[['population_millions']].to_numpy()\n",
"y = df['gdp_per_capita_usd'].to_numpy()\n",
"df = load_csv(\"../data/raw/population_africa_sample.csv\")\n",
"X = df[[\"population_millions\"]].to_numpy()\n",
"y = df[\"gdp_per_capita_usd\"].to_numpy()\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9a63283cbaf04dbcab1f6479b197f3a8",
"metadata": {},
"outputs": [],
"source": [
"model = LinearRegression().fit(X_train, y_train)\n",
"y_pred = model.predict(X_test)\n",
"print('MAE:', mean_absolute_error(y_test, y_pred))\n",
"print('R2:', r2_score(y_test, y_pred))\n",
"print('coef:', model.coef_, 'intercept:', model.intercept_)"
"print(\"MAE:\", mean_absolute_error(y_test, y_pred))\n",
"print(\"R2:\", r2_score(y_test, y_pred))\n",
"print(\"coef:\", model.coef_, \"intercept:\", model.intercept_)"
]
},
{
"cell_type": "markdown",
"id": "8dd0d8092fe74a7c96281538738b07e2",
"metadata": {},
"source": [
"> With a 17-row toy dataset this model is essentially meaningless — the point is to show the sklearn API, not to draw conclusions.\n",
Expand All @@ -58,8 +63,15 @@
}
],
"metadata": {
"kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" },
"language_info": { "name": "python", "version": "3.12" }
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
Expand Down
1 change: 1 addition & 0 deletions src/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

Keep functions here pure and tested — notebooks should only orchestrate them.
"""

from __future__ import annotations

from pathlib import Path
Expand Down
Loading
Loading