Python: от данных до своей сводки
Пятьдесят пять уроков: от первых чисел до сводки, которая сама забирает открытые данные, считает и обновляется по расписанию. Курс выходит урок за уроком. Все уроки открыты: бесплатно и без регистрации.
·
Все уроки открыты: регистрация для чтения не нужна.
-
Второй бесплатный курс: Python для данных и ИИ
Второй бесплатный курс площадки — 55 уроков: от данных до сводки, которая обновляется сама. Почему Python, почему уклон в данные и ИИ, а не в веб, и что читатель будет считать: цены выросли в 3,48 раза, и то, что стоило тысячу тенге, стоит 3481. Без регистрации и без оплаты, на трёх языках.
-
Зачем считать самому: цены, тенге и один вопрос
Первый урок курса по Python. Библиотеки ставить не нужно: готовая программа сама берёт официальные числа и считает по ним. Цены в Казахстане выросли в 3,48 раза с 2010 года: то, что стоило тысячу тенге, стоит 3481. А в других странах региона после того же шока инфляция втрое ниже, и это первый повод считать самому.
-
Рабочее место: Python, окружение проекта и первый запуск
Второй урок курса по Python. Ставим язык, заводим окружение проекта и переносим в него вчерашнюю программу. Измерено: пакет, поставленный в окружение, снаружи не виден — `ModuleNotFoundError`, — и это ровно то, ради чего окружение заводят. Папка `.venv` весит 17 МБ и в репозиторий не едет.
-
Первая программа: числа, строки и вывод
Третий урок курса по Python. Считаем на магазинном чеке: два деления вместо одного, остаток, степень, а потом строки — обрезать, заменить, разрезать, склеить. И f-строки, которые кладут число внутрь текста: 52 751 740 084 727 ₸ с разрядами и 11,4% с одним знаком после запятой.
-
Переменные и типы: почему «260» и 260 — разные вещи
Четвёртый урок курса по Python. Данные из чужого файла приходят текстом, и пока текст не стал числом, складывать его бессмысленно: «260» + «260» даёт 260260. Измерено и главное денежное правило: 0.1 + 0.2 не равно 0.3, а Decimal — равно. Плюс None, истинность строки «0» и разница между == и is.
-
Список и кортеж: чек, который умеет считать себя сам
Пятый урок курса по Python. Цены в списке: индексы, срезы, изменение, сумма и максимум — без единого цикла. Измерена разница, на которой спотыкаются все: sorted() возвращает новый список, .sort() меняет исходный и отдаёт None. И кортеж, который меняться отказывается: TypeError.
-
Словарь: связь вместо надежды на порядок
Шестой урок курса по Python. Цены по названию: get вместо ошибки, in вместо перебора, items() как готовая таблица. Измерено: обращение к несуществующему ключу — это KeyError, а не пустота; Counter считает корзину одной строкой, а defaultdict сам подставляет ноль там, где обычный словарь падает.
-
Условия: if, elif, else — и число, которого нет
Седьмой урок курса по Python. Число само по себе не говорит ничего: 11,4% — это много или мало? Условие сравнивает и выбирает путь. Измерено на инфляции: Казахстан в 2025 году — 11,4%, мир — 3,0%. Плюс главное правило работы с данными: пропуск в ряду — это не ноль, и проверяют его через `is None`.
-
Циклы: for, range и то, что zip делает молча
Восьмой урок курса по Python. Одно сравнение вместо тридцати: цикл проходит ряд сам, `continue` пропускает год без данных, накопитель считает среднее — 11,52% за пять лет. Плюс два подвоха: `zip` молча обрезает ряд по короткому, а `while` без выхода уходит за край и падает.
-
Функции: имя для расчёта и assert, который ловит неверное число
Девятый урок курса по Python. Проход по ряду получает имя и считает любой ряд: Казахстан — 11,52%, мир — 4,68%. Плюс `assert`, который останавливает расчёт на пустом ряде, `lambda` в `sorted(key=)` и измеренная ловушка: `into=[]` в заголовке копит значения между вызовами.
-
Ошибки и исключения: нет файла или мусор в файле
Десятый урок курса по Python. Из пяти строк чужой выгрузки разобрались три: запятая — это точка, а «нет данных» и пустая строка — не числа. `try/except/else/finally`, своё имя ошибки в одну строку и главное умение — читать traceback снизу вверх, начиная с последней строки.
-
Файлы и pathlib: путь, который не ломается на чужой машине
Одиннадцатый урок курса по Python. Программа пишет данные, читает их построчно и кладёт отчёт рядом. Путь строит `Path`, а не склейка строк: в Windows тот же путь пишется через обратную косую. И кодировку указывают всегда — без неё её выбирает система, а не вы.
-
CSV: запятая внутри поля и метка, которую ставит Excel
Двенадцатый урок курса по Python. `split(",")` на строке `2022,15.0,"шок, война, логистика"` даёт пять кусков вместо трёх — измерено. Модуль `csv` даёт три. Плюс `DictReader`, обязательный `newline=""` и метка из Excel, из-за которой `row["year"]` отвечает `KeyError`, хотя колонка на месте.
-
JSON: ответ API, который в первом уроке мы разобрали на веру
Тринадцатый урок курса по Python. Ответ Всемирного банка — список из двух элементов: служебная часть и записи. Разбираем его руками и находим то, что портит расчёты молча: `null` становится `None`, а ключи-числа после круга через JSON возвращаются строками — `2025` уходит, `"2025"` приходит.
-
Даты и время: 45 дней, часовой пояс и формат, который читается двумя способами
Четырнадцатый урок курса по Python. Между 15 января и 1 марта — 45 дней, и считает их `timedelta`, а не вы. Плюс два подвоха: `01.02.2026` разбирается двумя форматами без единой ошибки — январём и февралём, — а наивное время нельзя вычесть из осознанного, и Python говорит об этом прямо.
-
Множества: `&`, `-`, `|` и то, чего нет во второй выгрузке
Пятнадцатый урок курса по Python. Из пяти названий в списке разных — четыре: множество съедает повтор молча. Зато три вопроса к двум выгрузкам решаются тремя знаками: `&` — что в обеих, `-` — чего не стало, `|` — всё вместе. Плюс `{}` — это пустой словарь, а не пустое множество.
-
Итераторы и генераторы: 800 984 байта против 208
Шестнадцатый урок курса по Python. Сто тысяч квадратов списком занимают почти четыре мегабайта, генератором — 376 байт: измерено, вместе со всеми числами. Разница не в том, как считать, а в том, когда появляются значения. Плюс главная ошибка: генератор одноразовый, и второй проход по нему тихо даёт пустоту.
-
Свой модуль и пакет: `import`, `__name__` и файл, который подменил стандартный
Семнадцатый урок курса по Python. Сводка выросла до одного длинного файла, и пора разложить её по именам. `import` выполняет чужой файл целиком, `__name__` отличает модуль от запущенного, а свой `csv.py` рядом с программой молча заменяет стандартный.
-
HTTP из Python: статус, байты и два разных «не получилось»
Восемнадцатый урок курса по Python. Запрос к Нацбанку: 200, `text/xml`, 11 407 байт — и это `bytes`, а не строка. Плюс разница, из-за которой рушится обработка ошибок: `HTTPError` — сервер ответил «нет», `URLError` — ответа не было вовсе.
-
Разбор XML: дерево вместо строки, `None` вместо тега и адрес перед именем
Девятнадцатый урок курса по Python. Тот же ответ Нацбанка, но читает его разборщик: 39 валют, курс по имени тега, а не по кускам строки. Плюс два подвоха: `find` для отсутствующего тега возвращает `None`, а тег с пространством имён по короткому имени не находится вовсе.
-
Вежливость к чужому серверу: таймаут, повтор с отступом и кеш
Двадцатый урок курса по Python. Три вещи, из которых состоит вежливость к чужому серверу: таймаут — не ждать вечно, повтор с удвоением паузы — не бить лежачего, кеш — не спрашивать дважды. Измерено на своём сервере: четыре чтения, один запрос.
-
SQLite: история вместо перезаписанного файла, `?` вместо склейки
Двадцать первый урок курса по Python. База вместо файла: строку добавляют, вчерашние остаются, а повторный запуск дня не плодит дубли. Плюс два измеренных подвоха: склейка значения в запрос вернула всю таблицу вместо одной валюты, а закрытие без `commit` потеряло запись.
-
SQL из Python: `GROUP BY`, `JOIN` и пустой ответ, который не ноль
Двадцать второй урок курса по Python. База считает сама: `GROUP BY` даёт по строке на валюту, `JOIN` подставляет названия из второй таблицы, а месяц — это группа из первых семи символов даты. Плюс подвох: `avg` по пустому ответу возвращает не ноль, а `None`.
-
Расписание: аргументы, журнал, замок и код возврата
Двадцать третий урок курса по Python. Программа, которая работает ночью без вас: аргументы вместо правки кода, журнал с уровнями вместо `print`, замок против двух одновременных запусков и код возврата, который единственный и читает планировщик. Плюс cron, launchd и systemd — строкой каждый.
-
Зачем pandas, если есть списки: что показал замер
Двадцать четвёртый урок курса по Python. Модуль про pandas начинается с вопроса, с которого и должен: стоит ли он того. Отвечает замер, а не вера. Где pandas быстрее в сорок раз, где всего вдвое, где он медленнее обычного цикла, сколько стоит памяти — и правило, когда таблица уже нужна.
-
Словарь модуля: восемь слов, которыми говорит таблица
Не урок, а справочная страница перед плотной частью модуля про pandas. Восемь слов — таблица, столбец, подпись и позиция, маска, пропуск, ключ, тип и форма — на одной таблице из трёх строк. Прочитайте один раз сейчас и возвращайтесь, когда слово встретится: рядом сказано, в каком уроке оно объясняется.
-
DataFrame и Series: подписи вместо номеров
Двадцать пятый урок курса по Python. Таблица, у которой есть подписи строк, отвечает не так, как список: `loc` берёт по подписи, `iloc` — по номеру, а сложение двух рядов идёт по годам, а не по порядку. Разбираем `DataFrame` и `Series`, индекс, срезы и `NaN`, который появляется сам.
-
Чтение и запись: CSV, JSON и SQL одной строкой
Двадцать шестой урок курса по Python. Чужой файл — это разделитель, запятая в дробях, BOM и своя метка пропуска; в цикле про каждую мелочь надо помнить самому, в `read_csv` это аргументы. Разбираем `read_csv`, `to_csv`, `read_sql` и `to_sql`, а заодно то, чего файл про таблицу не помнит.
-
Выборка и фильтры: оставить только нужное
Двадцать седьмой урок курса по Python. Маска — это столбец из «да» и «нет», и ею таблица фильтруется целиком. Разбираем `df[маска]`, `.loc[маска, столбцы]`, `&`, `|`, `~` и обязательные скобки, `isin`, `between`, `str`, а также подписи, которые после фильтра остаются прежними.
-
Группировки и агрегаты: посчитать по категориям и по месяцам
Двадцать восьмой урок курса по Python. `groupby` — это цикл, написанный вопросом: разрезать таблицу по ключу, посчитать каждый кусок, собрать обратно. Разбираем `agg` со своими именами столбцов, два ключа, ключ, которого нет в таблице, `transform` для доли и группы, которые теряются молча.
-
Соединение таблиц: склеить два источника по ключу
Двадцать девятый урок курса по Python. `merge` соединяет две таблицы по ключу — и по умолчанию молча выбрасывает строки, которым пары не нашлось. Разбираем `inner` и `left`, `indicator`, ключи с разными именами, `join` по подписям и дубликат в ключе, который размножает строки вместе с суммами.
-
Грязные данные: пропуски, дубли и типы
Тридцатый урок курса по Python. Данные приходят сломанными: числа строками, город в трёх написаниях, строка-близнец и пустая ячейка. Разбираем `isna`, `to_numeric` с `errors="coerce"`, `astype`, `drop_duplicates` — и главный вопрос урока: выбросить пропуск или заполнить, и чем за это платят.
-
Время в таблице: ресемплинг, скользящее среднее и честность
Тридцать первый урок курса по Python. Индекс из дат умеет то, чего не умеет список: `asfreq` показывает дни, которых нет, `resample` складывает дни в недели, `rolling` сглаживает. И измеренная цена сглаживания: размах падает вдвое, а день настоящего пика исчезает из ряда.
-
matplotlib: первый график и файл, а не окно
Тридцать второй урок курса по Python. Рисуем ряд из прошлого урока: лист и оси, линия, подписи, сетка, легенда — и сохранение в файл без единого окна на экране. Плюс три вещи, которые ломают график у всех: `Agg`, порядок «сначала рисуем, потом сохраняем» и незакрытая фигура.
-
Как не соврать графиком: шкала, ноль и подписи
Тридцать третий урок курса по Python. Те же два числа: от нуля столбик выше в 1.31 раза, с осью от восьми — в 4.86. Тот же отрезок линии: 14° на широком листе и 73° на узком. Проценты против процентных пунктов, выбор куска ряда — и график, который проверяет сам себя.
-
Отчёт-страница: таблица, картинка и источник в одном файле
Тридцать четвёртый урок курса по Python. Собираем HTML из данных: шаблон вместо склейки строк, `html.escape` для всего, что пришло из таблицы, картинка внутри файла — и страница, которая проверяет саму себя. Один файл, который открывается везде и печатается в PDF.
-
Числа в отчёте: форматы, округление и единицы
Тридцать пятый урок курса по Python. `1234567.891` и `1 234 567,89` — одно число и два разных отчёта. Разбираем формат-строки, разделители по-нашему, `round`, который округляет к чётному, `Decimal` для денег и сумму округлённых, которая не равна округлённой сумме.
-
Сводка, которая обновляется сама: конвейер целиком
Тридцать шестой урок курса по Python и конец модуля про отчёт. Четыре шага в одном `main()`, запись через временный файл, повтор без последствий и код возврата; `--dry-run` добавляется в задании. И правило, ради которого всё: упавший источник оставляет вчерашний отчёт, а не стирает его.
-
Среднее, медиана, разброс: когда среднее врёт
Тридцать седьмой урок курса по Python и начало модуля про деньги. Десять стран, один год: среднее 20.48 %, медиана 13.88 % — и среднее выше, чем было у восьми стран из десяти. `mean`, `median`, `std`, четверти и правило, по которому меру выбирают до того, как увидят результат.
-
Инфляция как множитель: сколько стоил тенге
Тридцать восьмой урок курса по Python. Десять годовых ставок, сложенные в сумму, дают 92.98 % — и это неверный ответ: цены выросли на 141.98 %, потому что проценты перемножаются. Индекс через `cumprod`, множитель, среднегодовая ставка и тысяча 2014 года, от которой к 2024-му осталось 413 тенге.
-
Своя инфляция: ваша корзина против официальной
Тридцать девятый урок курса по Python. «Инфляция 8 %, а у меня всё подорожало вдвое» — обе фразы бывают правдой одновременно, и разводят их веса. Корзина, доля каждой позиции в расходах, вклад в рост — и почему простое среднее по позициям обещает 84.6 % там, где корзина выросла на 69.8 %.
-
Откуда берутся деньги: наличные, депозиты, кредит
Сороковой урок курса по Python. В 2025 году наличные вне депозитных организаций составляли девять процентов широкой денежной массы; остальные средства были банковскими депозитами, значительная часть которых создаётся при кредитовании и других балансовых операциях. Агрегаты как матрёшка, деньги на тенге ВВП, денежный множитель — и что обо всём этом сказано в законе.
-
Как читать официальную статистику
Сорок первый урок курса по Python. В одной строке официальной таблицы — пять чисел об одних и тех же ценах, и все пять верные. На какой вопрос отвечает каждое, как достать веса официальной корзины, которых в публикации нет, и почему у Всемирного банка выходит не то число, что в новостях.
-
Внешнее и своё: один шок — разные цены
Сорок второй урок курса по Python. В 2022 году мировая еда подорожала на 14.9 % — одинаково для всех. Инфляция у десяти соседей вышла от 8.6 до 72.3 %, разница в восемь раз. Две привычные причины — курс и деньги — проверяются связью, и одна страна двигает ответ, а у денег ещё и переворачивает знак.
-
Первая модель: линейная регрессия
Сорок третий урок курса по Python. Прямая, проведённая через шестнадцать лет цен, даёт R² 0.927 и проигрывает правилу «как в прошлом году» — на сотую долю пункта. Ошибка у неё не случайная, а с формой: плюс, минус, плюс. Прямая по логарифму ошибается вдвое меньше, потому что цены умножаются.
-
Обучение и проверка: почему нельзя мерить на своём
Сорок четвёртый урок курса по Python. Та же модель на тех же данных: 2.48 пункта ошибки на годах, которым её учили, и 35.99 на тех, которых она не видела. Случайный разрез вместо разреза по времени показывает 5.37 и врёт. Многочлен пятой степени учится почти идеально и ошибается втрое хуже прямой.
-
Классификация и матрица ошибок
Сорок пятый урок курса по Python. Модель отвечает «да» или «нет»: будет ли в следующем году инфляция выше десяти процентов. Точность 0.75 против 0.675 у модели, которая всегда говорит «нет», — и матрица ошибок показывает, что при этом пропущено двадцать высоких лет из двадцати шести.
-
Где кончается модель
Сорок шестой урок курса по Python и конец модуля про модели. Та же прямая обещает индекс 146 206 на 2100 год и минус тысячу на 1800-й — и ни один ответ не помечает как сомнительный. Границу модели приходится дописывать руками: чему училась, где проверена, за каким годом не применима.
-
Языковая модель у себя на машине: Ollama и первый локальный запрос
Сорок седьмой урок курса по Python. Ставим Ollama, получаем первый ответ без API-ключа и разбираем путь запроса целиком: программа отправляет JSON на localhost, проверяет HTTP-ответ и только потом берёт текст модели. Данные остаются на вашем компьютере — если вы сами не открыли локальный порт наружу.
-
Промпт как код: параметры и воспроизводимость
Сорок восьмой урок курса по Python. Перестаём набирать запрос к модели одной случайной строкой: отделяем роль, задачу, данные и ограничения, фиксируем temperature, seed и предел ответа, а затем сохраняем весь запрос рядом с результатом. Одинаковый запрос становится проверяемым опытом — но не обещанием побитно одинакового текста.
-
Структурированный ответ: JSON от модели и его проверка
Сорок девятый урок курса по Python. Просим модель вернуть не свободный текст, а JSON по заданной схеме, разбираем его стандартным модулем `json` и проверяем библиотекой `jsonschema`. Три отдельные границы — синтаксис, структура и факты — не дают красивой строке незаметно попасть в отчёт.
-
Модель на наших данных: число проходит сверку
Пятидесятый урок курса по Python. Даём модели только небольшую таблицу с идентификаторами источников, принимаем структурированные утверждения и сверяем каждое число с исходной записью. Модель предлагает формулировку, но число, единицу и год в итоговый текст подставляет наш код.
-
Чего нельзя доверять модели: факт, вывод и причина
Пятьдесят первый урок курса по Python. Разделяем наблюдение, вычисленный вывод и объяснение причины. Код может подтвердить число и воспроизвести расчёт, но правдоподобная причинная история остаётся гипотезой, пока у неё нет отдельного источника и человеческой проверки.
-
Тесты pytest: проверяем обещания конвейера
Пятьдесят второй урок курса по Python. Превращаем правила проекта в автоматические тесты: отделяем подготовку данных от файлов, проверяем обычный случай, границы и ожидаемые ошибки, а затем запускаем весь набор одной командой.
-
Аннотации типов и mypy: ошибка до запуска
Пятьдесят третий урок курса по Python. Описываем форму данных в сигнатурах, сужаем `None` проверкой и запускаем `mypy`, чтобы несовместимые значения находились до выполнения программы.
-
Зависимости: повторяемое окружение вместо «у меня работает»
Пятьдесят четвёртый урок курса по Python. Отделяем прямые зависимости от полного lock-файла, фиксируем версию Python и собираем чистое окружение, которое можно воспроизвести через год.
-
Финал: проверить, опубликовать и уметь повторить
Пятьдесят пятый урок и завершение начального курса Python. Собираем проверки в один шлюз, создаём неизменяемый каталог отчёта, публикуем его только после успеха и оставляем читателю проверяемые сведения об источнике и времени сборки.