Shanraq.org Shanraq.org

Python: от данных до своей сводки

Пятьдесят пять уроков: от первых чисел до сводки, которая сама забирает открытые данные, считает и обновляется по расписанию. Курс выходит урок за уроком. Все уроки открыты: бесплатно и без регистрации.

Уроков: 56 · 546 мин на чтение · 2145 мин на практику

Все уроки открыты: регистрация для чтения не нужна.

Начать с первого урока →

  1. Второй бесплатный курс: Python для данных и ИИ

    Второй бесплатный курс площадки — 55 уроков: от данных до сводки, которая обновляется сама. Почему Python, почему уклон в данные и ИИ, а не в веб, и что читатель будет считать: цены выросли в 3,48 раза, и то, что стоило тысячу тенге, стоит 3481. Без регистрации и без оплаты, на трёх языках.

    8 мин на чтение

  2. Зачем считать самому: цены, тенге и один вопрос

    Первый урок курса по Python. Библиотеки ставить не нужно: готовая программа сама берёт официальные числа и считает по ним. Цены в Казахстане выросли в 3,48 раза с 2010 года: то, что стоило тысячу тенге, стоит 3481. А в других странах региона после того же шока инфляция втрое ниже, и это первый повод считать самому.

    8 мин на чтение · 35 мин на практику

  3. Рабочее место: Python, окружение проекта и первый запуск

    Второй урок курса по Python. Ставим язык, заводим окружение проекта и переносим в него вчерашнюю программу. Измерено: пакет, поставленный в окружение, снаружи не виден — `ModuleNotFoundError`, — и это ровно то, ради чего окружение заводят. Папка `.venv` весит 17 МБ и в репозиторий не едет.

    10 мин на чтение · 20 мин на практику

  4. Первая программа: числа, строки и вывод

    Третий урок курса по Python. Считаем на магазинном чеке: два деления вместо одного, остаток, степень, а потом строки — обрезать, заменить, разрезать, склеить. И f-строки, которые кладут число внутрь текста: 52 751 740 084 727 ₸ с разрядами и 11,4% с одним знаком после запятой.

    9 мин на чтение · 40 мин на практику

  5. Переменные и типы: почему «260» и 260 — разные вещи

    Четвёртый урок курса по Python. Данные из чужого файла приходят текстом, и пока текст не стал числом, складывать его бессмысленно: «260» + «260» даёт 260260. Измерено и главное денежное правило: 0.1 + 0.2 не равно 0.3, а Decimal — равно. Плюс None, истинность строки «0» и разница между == и is.

    10 мин на чтение · 40 мин на практику

  6. Список и кортеж: чек, который умеет считать себя сам

    Пятый урок курса по Python. Цены в списке: индексы, срезы, изменение, сумма и максимум — без единого цикла. Измерена разница, на которой спотыкаются все: sorted() возвращает новый список, .sort() меняет исходный и отдаёт None. И кортеж, который меняться отказывается: TypeError.

    11 мин на чтение · 40 мин на практику

  7. Словарь: связь вместо надежды на порядок

    Шестой урок курса по Python. Цены по названию: get вместо ошибки, in вместо перебора, items() как готовая таблица. Измерено: обращение к несуществующему ключу — это KeyError, а не пустота; Counter считает корзину одной строкой, а defaultdict сам подставляет ноль там, где обычный словарь падает.

    10 мин на чтение · 40 мин на практику

  8. Условия: if, elif, else — и число, которого нет

    Седьмой урок курса по Python. Число само по себе не говорит ничего: 11,4% — это много или мало? Условие сравнивает и выбирает путь. Измерено на инфляции: Казахстан в 2025 году — 11,4%, мир — 3,0%. Плюс главное правило работы с данными: пропуск в ряду — это не ноль, и проверяют его через `is None`.

    8 мин на чтение · 40 мин на практику

  9. Циклы: for, range и то, что zip делает молча

    Восьмой урок курса по Python. Одно сравнение вместо тридцати: цикл проходит ряд сам, `continue` пропускает год без данных, накопитель считает среднее — 11,52% за пять лет. Плюс два подвоха: `zip` молча обрезает ряд по короткому, а `while` без выхода уходит за край и падает.

    10 мин на чтение · 40 мин на практику

  10. Функции: имя для расчёта и assert, который ловит неверное число

    Девятый урок курса по Python. Проход по ряду получает имя и считает любой ряд: Казахстан — 11,52%, мир — 4,68%. Плюс `assert`, который останавливает расчёт на пустом ряде, `lambda` в `sorted(key=)` и измеренная ловушка: `into=[]` в заголовке копит значения между вызовами.

    11 мин на чтение · 40 мин на практику

  11. Ошибки и исключения: нет файла или мусор в файле

    Десятый урок курса по Python. Из пяти строк чужой выгрузки разобрались три: запятая — это точка, а «нет данных» и пустая строка — не числа. `try/except/else/finally`, своё имя ошибки в одну строку и главное умение — читать traceback снизу вверх, начиная с последней строки.

    10 мин на чтение · 40 мин на практику

  12. Файлы и pathlib: путь, который не ломается на чужой машине

    Одиннадцатый урок курса по Python. Программа пишет данные, читает их построчно и кладёт отчёт рядом. Путь строит `Path`, а не склейка строк: в Windows тот же путь пишется через обратную косую. И кодировку указывают всегда — без неё её выбирает система, а не вы.

    9 мин на чтение · 40 мин на практику

  13. CSV: запятая внутри поля и метка, которую ставит Excel

    Двенадцатый урок курса по Python. `split(",")` на строке `2022,15.0,"шок, война, логистика"` даёт пять кусков вместо трёх — измерено. Модуль `csv` даёт три. Плюс `DictReader`, обязательный `newline=""` и метка из Excel, из-за которой `row["year"]` отвечает `KeyError`, хотя колонка на месте.

    9 мин на чтение · 40 мин на практику

  14. JSON: ответ API, который в первом уроке мы разобрали на веру

    Тринадцатый урок курса по Python. Ответ Всемирного банка — список из двух элементов: служебная часть и записи. Разбираем его руками и находим то, что портит расчёты молча: `null` становится `None`, а ключи-числа после круга через JSON возвращаются строками — `2025` уходит, `"2025"` приходит.

    10 мин на чтение · 40 мин на практику

  15. Даты и время: 45 дней, часовой пояс и формат, который читается двумя способами

    Четырнадцатый урок курса по Python. Между 15 января и 1 марта — 45 дней, и считает их `timedelta`, а не вы. Плюс два подвоха: `01.02.2026` разбирается двумя форматами без единой ошибки — январём и февралём, — а наивное время нельзя вычесть из осознанного, и Python говорит об этом прямо.

    11 мин на чтение · 40 мин на практику

  16. Множества: `&`, `-`, `|` и то, чего нет во второй выгрузке

    Пятнадцатый урок курса по Python. Из пяти названий в списке разных — четыре: множество съедает повтор молча. Зато три вопроса к двум выгрузкам решаются тремя знаками: `&` — что в обеих, `-` — чего не стало, `|` — всё вместе. Плюс `{}` — это пустой словарь, а не пустое множество.

    7 мин на чтение · 40 мин на практику

  17. Итераторы и генераторы: 800 984 байта против 208

    Шестнадцатый урок курса по Python. Сто тысяч квадратов списком занимают почти четыре мегабайта, генератором — 376 байт: измерено, вместе со всеми числами. Разница не в том, как считать, а в том, когда появляются значения. Плюс главная ошибка: генератор одноразовый, и второй проход по нему тихо даёт пустоту.

    11 мин на чтение · 40 мин на практику

  18. Свой модуль и пакет: `import`, `__name__` и файл, который подменил стандартный

    Семнадцатый урок курса по Python. Сводка выросла до одного длинного файла, и пора разложить её по именам. `import` выполняет чужой файл целиком, `__name__` отличает модуль от запущенного, а свой `csv.py` рядом с программой молча заменяет стандартный.

    10 мин на чтение · 40 мин на практику

  19. HTTP из Python: статус, байты и два разных «не получилось»

    Восемнадцатый урок курса по Python. Запрос к Нацбанку: 200, `text/xml`, 11 407 байт — и это `bytes`, а не строка. Плюс разница, из-за которой рушится обработка ошибок: `HTTPError` — сервер ответил «нет», `URLError` — ответа не было вовсе.

    9 мин на чтение · 40 мин на практику

  20. Разбор XML: дерево вместо строки, `None` вместо тега и адрес перед именем

    Девятнадцатый урок курса по Python. Тот же ответ Нацбанка, но читает его разборщик: 39 валют, курс по имени тега, а не по кускам строки. Плюс два подвоха: `find` для отсутствующего тега возвращает `None`, а тег с пространством имён по короткому имени не находится вовсе.

    9 мин на чтение · 40 мин на практику

  21. Вежливость к чужому серверу: таймаут, повтор с отступом и кеш

    Двадцатый урок курса по Python. Три вещи, из которых состоит вежливость к чужому серверу: таймаут — не ждать вечно, повтор с удвоением паузы — не бить лежачего, кеш — не спрашивать дважды. Измерено на своём сервере: четыре чтения, один запрос.

    9 мин на чтение · 40 мин на практику

  22. SQLite: история вместо перезаписанного файла, `?` вместо склейки

    Двадцать первый урок курса по Python. База вместо файла: строку добавляют, вчерашние остаются, а повторный запуск дня не плодит дубли. Плюс два измеренных подвоха: склейка значения в запрос вернула всю таблицу вместо одной валюты, а закрытие без `commit` потеряло запись.

    14 мин на чтение · 40 мин на практику

  23. SQL из Python: `GROUP BY`, `JOIN` и пустой ответ, который не ноль

    Двадцать второй урок курса по Python. База считает сама: `GROUP BY` даёт по строке на валюту, `JOIN` подставляет названия из второй таблицы, а месяц — это группа из первых семи символов даты. Плюс подвох: `avg` по пустому ответу возвращает не ноль, а `None`.

    12 мин на чтение · 40 мин на практику

  24. Расписание: аргументы, журнал, замок и код возврата

    Двадцать третий урок курса по Python. Программа, которая работает ночью без вас: аргументы вместо правки кода, журнал с уровнями вместо `print`, замок против двух одновременных запусков и код возврата, который единственный и читает планировщик. Плюс cron, launchd и systemd — строкой каждый.

    12 мин на чтение · 40 мин на практику

  25. Зачем pandas, если есть списки: что показал замер

    Двадцать четвёртый урок курса по Python. Модуль про pandas начинается с вопроса, с которого и должен: стоит ли он того. Отвечает замер, а не вера. Где pandas быстрее в сорок раз, где всего вдвое, где он медленнее обычного цикла, сколько стоит памяти — и правило, когда таблица уже нужна.

    13 мин на чтение · 40 мин на практику

  26. Словарь модуля: восемь слов, которыми говорит таблица

    Не урок, а справочная страница перед плотной частью модуля про pandas. Восемь слов — таблица, столбец, подпись и позиция, маска, пропуск, ключ, тип и форма — на одной таблице из трёх строк. Прочитайте один раз сейчас и возвращайтесь, когда слово встретится: рядом сказано, в каком уроке оно объясняется.

    4 мин на чтение

  27. DataFrame и Series: подписи вместо номеров

    Двадцать пятый урок курса по Python. Таблица, у которой есть подписи строк, отвечает не так, как список: `loc` берёт по подписи, `iloc` — по номеру, а сложение двух рядов идёт по годам, а не по порядку. Разбираем `DataFrame` и `Series`, индекс, срезы и `NaN`, который появляется сам.

    11 мин на чтение · 40 мин на практику

  28. Чтение и запись: CSV, JSON и SQL одной строкой

    Двадцать шестой урок курса по Python. Чужой файл — это разделитель, запятая в дробях, BOM и своя метка пропуска; в цикле про каждую мелочь надо помнить самому, в `read_csv` это аргументы. Разбираем `read_csv`, `to_csv`, `read_sql` и `to_sql`, а заодно то, чего файл про таблицу не помнит.

    12 мин на чтение · 40 мин на практику

  29. Выборка и фильтры: оставить только нужное

    Двадцать седьмой урок курса по Python. Маска — это столбец из «да» и «нет», и ею таблица фильтруется целиком. Разбираем `df[маска]`, `.loc[маска, столбцы]`, `&`, `|`, `~` и обязательные скобки, `isin`, `between`, `str`, а также подписи, которые после фильтра остаются прежними.

    9 мин на чтение · 40 мин на практику

  30. Группировки и агрегаты: посчитать по категориям и по месяцам

    Двадцать восьмой урок курса по Python. `groupby` — это цикл, написанный вопросом: разрезать таблицу по ключу, посчитать каждый кусок, собрать обратно. Разбираем `agg` со своими именами столбцов, два ключа, ключ, которого нет в таблице, `transform` для доли и группы, которые теряются молча.

    11 мин на чтение · 40 мин на практику

  31. Соединение таблиц: склеить два источника по ключу

    Двадцать девятый урок курса по Python. `merge` соединяет две таблицы по ключу — и по умолчанию молча выбрасывает строки, которым пары не нашлось. Разбираем `inner` и `left`, `indicator`, ключи с разными именами, `join` по подписям и дубликат в ключе, который размножает строки вместе с суммами.

    12 мин на чтение · 40 мин на практику

  32. Грязные данные: пропуски, дубли и типы

    Тридцатый урок курса по Python. Данные приходят сломанными: числа строками, город в трёх написаниях, строка-близнец и пустая ячейка. Разбираем `isna`, `to_numeric` с `errors="coerce"`, `astype`, `drop_duplicates` — и главный вопрос урока: выбросить пропуск или заполнить, и чем за это платят.

    13 мин на чтение · 40 мин на практику

  33. Время в таблице: ресемплинг, скользящее среднее и честность

    Тридцать первый урок курса по Python. Индекс из дат умеет то, чего не умеет список: `asfreq` показывает дни, которых нет, `resample` складывает дни в недели, `rolling` сглаживает. И измеренная цена сглаживания: размах падает вдвое, а день настоящего пика исчезает из ряда.

    8 мин на чтение · 40 мин на практику

  34. matplotlib: первый график и файл, а не окно

    Тридцать второй урок курса по Python. Рисуем ряд из прошлого урока: лист и оси, линия, подписи, сетка, легенда — и сохранение в файл без единого окна на экране. Плюс три вещи, которые ломают график у всех: `Agg`, порядок «сначала рисуем, потом сохраняем» и незакрытая фигура.

    11 мин на чтение · 40 мин на практику

  35. Как не соврать графиком: шкала, ноль и подписи

    Тридцать третий урок курса по Python. Те же два числа: от нуля столбик выше в 1.31 раза, с осью от восьми — в 4.86. Тот же отрезок линии: 14° на широком листе и 73° на узком. Проценты против процентных пунктов, выбор куска ряда — и график, который проверяет сам себя.

    12 мин на чтение · 40 мин на практику

  36. Отчёт-страница: таблица, картинка и источник в одном файле

    Тридцать четвёртый урок курса по Python. Собираем HTML из данных: шаблон вместо склейки строк, `html.escape` для всего, что пришло из таблицы, картинка внутри файла — и страница, которая проверяет саму себя. Один файл, который открывается везде и печатается в PDF.

    11 мин на чтение · 40 мин на практику

  37. Числа в отчёте: форматы, округление и единицы

    Тридцать пятый урок курса по Python. `1234567.891` и `1 234 567,89` — одно число и два разных отчёта. Разбираем формат-строки, разделители по-нашему, `round`, который округляет к чётному, `Decimal` для денег и сумму округлённых, которая не равна округлённой сумме.

    10 мин на чтение · 40 мин на практику

  38. Сводка, которая обновляется сама: конвейер целиком

    Тридцать шестой урок курса по Python и конец модуля про отчёт. Четыре шага в одном `main()`, запись через временный файл, повтор без последствий и код возврата; `--dry-run` добавляется в задании. И правило, ради которого всё: упавший источник оставляет вчерашний отчёт, а не стирает его.

    11 мин на чтение · 40 мин на практику

  39. Среднее, медиана, разброс: когда среднее врёт

    Тридцать седьмой урок курса по Python и начало модуля про деньги. Десять стран, один год: среднее 20.48 %, медиана 13.88 % — и среднее выше, чем было у восьми стран из десяти. `mean`, `median`, `std`, четверти и правило, по которому меру выбирают до того, как увидят результат.

    7 мин на чтение · 40 мин на практику

  40. Инфляция как множитель: сколько стоил тенге

    Тридцать восьмой урок курса по Python. Десять годовых ставок, сложенные в сумму, дают 92.98 % — и это неверный ответ: цены выросли на 141.98 %, потому что проценты перемножаются. Индекс через `cumprod`, множитель, среднегодовая ставка и тысяча 2014 года, от которой к 2024-му осталось 413 тенге.

    12 мин на чтение · 40 мин на практику

  41. Своя инфляция: ваша корзина против официальной

    Тридцать девятый урок курса по Python. «Инфляция 8 %, а у меня всё подорожало вдвое» — обе фразы бывают правдой одновременно, и разводят их веса. Корзина, доля каждой позиции в расходах, вклад в рост — и почему простое среднее по позициям обещает 84.6 % там, где корзина выросла на 69.8 %.

    12 мин на чтение · 40 мин на практику

  42. Откуда берутся деньги: наличные, депозиты, кредит

    Сороковой урок курса по Python. В 2025 году наличные вне депозитных организаций составляли девять процентов широкой денежной массы; остальные средства были банковскими депозитами, значительная часть которых создаётся при кредитовании и других балансовых операциях. Агрегаты как матрёшка, деньги на тенге ВВП, денежный множитель — и что обо всём этом сказано в законе.

    15 мин на чтение · 40 мин на практику

  43. Как читать официальную статистику

    Сорок первый урок курса по Python. В одной строке официальной таблицы — пять чисел об одних и тех же ценах, и все пять верные. На какой вопрос отвечает каждое, как достать веса официальной корзины, которых в публикации нет, и почему у Всемирного банка выходит не то число, что в новостях.

    17 мин на чтение · 40 мин на практику

  44. Внешнее и своё: один шок — разные цены

    Сорок второй урок курса по Python. В 2022 году мировая еда подорожала на 14.9 % — одинаково для всех. Инфляция у десяти соседей вышла от 8.6 до 72.3 %, разница в восемь раз. Две привычные причины — курс и деньги — проверяются связью, и одна страна двигает ответ, а у денег ещё и переворачивает знак.

    13 мин на чтение · 40 мин на практику

  45. Первая модель: линейная регрессия

    Сорок третий урок курса по Python. Прямая, проведённая через шестнадцать лет цен, даёт R² 0.927 и проигрывает правилу «как в прошлом году» — на сотую долю пункта. Ошибка у неё не случайная, а с формой: плюс, минус, плюс. Прямая по логарифму ошибается вдвое меньше, потому что цены умножаются.

    13 мин на чтение · 40 мин на практику

  46. Обучение и проверка: почему нельзя мерить на своём

    Сорок четвёртый урок курса по Python. Та же модель на тех же данных: 2.48 пункта ошибки на годах, которым её учили, и 35.99 на тех, которых она не видела. Случайный разрез вместо разреза по времени показывает 5.37 и врёт. Многочлен пятой степени учится почти идеально и ошибается втрое хуже прямой.

    8 мин на чтение · 40 мин на практику

  47. Классификация и матрица ошибок

    Сорок пятый урок курса по Python. Модель отвечает «да» или «нет»: будет ли в следующем году инфляция выше десяти процентов. Точность 0.75 против 0.675 у модели, которая всегда говорит «нет», — и матрица ошибок показывает, что при этом пропущено двадцать высоких лет из двадцати шести.

    14 мин на чтение · 40 мин на практику

  48. Где кончается модель

    Сорок шестой урок курса по Python и конец модуля про модели. Та же прямая обещает индекс 146 206 на 2100 год и минус тысячу на 1800-й — и ни один ответ не помечает как сомнительный. Границу модели приходится дописывать руками: чему училась, где проверена, за каким годом не применима.

    8 мин на чтение · 40 мин на практику

  49. Языковая модель у себя на машине: Ollama и первый локальный запрос

    Сорок седьмой урок курса по Python. Ставим Ollama, получаем первый ответ без API-ключа и разбираем путь запроса целиком: программа отправляет JSON на localhost, проверяет HTTP-ответ и только потом берёт текст модели. Данные остаются на вашем компьютере — если вы сами не открыли локальный порт наружу.

    7 мин на чтение · 40 мин на практику

  50. Промпт как код: параметры и воспроизводимость

    Сорок восьмой урок курса по Python. Перестаём набирать запрос к модели одной случайной строкой: отделяем роль, задачу, данные и ограничения, фиксируем temperature, seed и предел ответа, а затем сохраняем весь запрос рядом с результатом. Одинаковый запрос становится проверяемым опытом — но не обещанием побитно одинакового текста.

    6 мин на чтение · 40 мин на практику

  51. Структурированный ответ: JSON от модели и его проверка

    Сорок девятый урок курса по Python. Просим модель вернуть не свободный текст, а JSON по заданной схеме, разбираем его стандартным модулем `json` и проверяем библиотекой `jsonschema`. Три отдельные границы — синтаксис, структура и факты — не дают красивой строке незаметно попасть в отчёт.

    6 мин на чтение · 40 мин на практику

  52. Модель на наших данных: число проходит сверку

    Пятидесятый урок курса по Python. Даём модели только небольшую таблицу с идентификаторами источников, принимаем структурированные утверждения и сверяем каждое число с исходной записью. Модель предлагает формулировку, но число, единицу и год в итоговый текст подставляет наш код.

    5 мин на чтение · 40 мин на практику

  53. Чего нельзя доверять модели: факт, вывод и причина

    Пятьдесят первый урок курса по Python. Разделяем наблюдение, вычисленный вывод и объяснение причины. Код может подтвердить число и воспроизвести расчёт, но правдоподобная причинная история остаётся гипотезой, пока у неё нет отдельного источника и человеческой проверки.

    5 мин на чтение · 40 мин на практику

  54. Тесты pytest: проверяем обещания конвейера

    Пятьдесят второй урок курса по Python. Превращаем правила проекта в автоматические тесты: отделяем подготовку данных от файлов, проверяем обычный случай, границы и ожидаемые ошибки, а затем запускаем весь набор одной командой.

    3 мин на чтение · 40 мин на практику

  55. Аннотации типов и mypy: ошибка до запуска

    Пятьдесят третий урок курса по Python. Описываем форму данных в сигнатурах, сужаем `None` проверкой и запускаем `mypy`, чтобы несовместимые значения находились до выполнения программы.

    4 мин на чтение · 40 мин на практику

  56. Зависимости: повторяемое окружение вместо «у меня работает»

    Пятьдесят четвёртый урок курса по Python. Отделяем прямые зависимости от полного lock-файла, фиксируем версию Python и собираем чистое окружение, которое можно воспроизвести через год.

    2 мин на чтение · 30 мин на практику

  57. Финал: проверить, опубликовать и уметь повторить

    Пятьдесят пятый урок и завершение начального курса Python. Собираем проверки в один шлюз, создаём неизменяемый каталог отчёта, публикуем его только после успеха и оставляем читателю проверяемые сведения об источнике и времени сборки.

    4 мин на чтение · 20 мин на практику