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

Python: от данных до своей сводки Урок 1 из 56

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

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

Зачем это нужно

Вам называют цифры. Инфляция — столько-то. Рост — такой-то. Виноват — вот этот. Проверить сказанное вы не можете, и остаётся верить или не верить.

Этот курс о том, как перестать выбирать между «верить» и «не верить». Данные о ценах, деньгах и курсе лежат открыто; чтобы их взять и посчитать, нужен один инструмент — Python — и несколько вечеров.

Начнём с конца: с ответа, который вы получите через пятнадцать минут, ещё ничего не зная о языке.

Сразу целиком

Сначала проверьте, что язык есть: в терминале python3 --version (в Windows — py --version). Ответило номером — продолжайте. Не ответило — начните со следующего урока, там Python ставится с нуля за десять минут, и возвращайтесь сюда.

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

"""Первая программа курса: она задаёт вопрос, ради которого курс написан.

Ничего ставить не нужно — всё, что здесь используется, приходит вместе с
Python. Программа сама сходит за официальными числами и посчитает по ним.
"""

import json
import urllib.request

# Всемирный банк отдаёт показатели по странам без ключа и без регистрации.
# FP.CPI.TOTL — индекс потребительских цен, FP.CPI.TOTL.ZG — инфляция в процентах.
API = "https://api.worldbank.org/v2/country/{}/indicator/{}?format=json&per_page=80&date={}:{}"


def rows(country, indicator, first, last):
    """Возвращает {год: значение} — то, что ответил Всемирный банк."""
    url = API.format(country, indicator, first, last)
    with urllib.request.urlopen(url, timeout=30) as answer:
        data = json.load(answer)
    if len(data) < 2 or not data[1]:
        return {}
    return {int(item["date"]): item["value"] for item in data[1] if item["value"] is not None}


def main():
    print("== во сколько раз выросли цены в Казахстане")
    prices = rows("KZ", "FP.CPI.TOTL", 2010, 2025)
    base, last = min(prices), max(prices)
    times = prices[last] / prices[base]
    print(f"индекс цен {base} года: {prices[base]:.1f}")
    print(f"индекс цен {last} года: {prices[last]:.1f}")
    print(f"цены выросли в {times:.2f} раза")
    # Одно и то же отношение читается в обе стороны, и путать их дорого.
    print(f"1000 тенге {last} года = {1000 / times:.0f} тенге в ценах {base} года")
    print(f"то, что в {base} году стоило 1000 тенге, стоит {1000 * times:.0f}")

    print()
    print("== тот же мир, разные цены: инфляция по годам, %")
    countries = {"KZ": "Казахстан", "WLD": "мир", "GE": "Грузия",
                 "AM": "Армения", "PL": "Польша"}
    years = range(2021, 2026)
    print("страна      " + "".join(f"{year:>7}" for year in years))
    for code, name in countries.items():
        inflation = rows(code, "FP.CPI.TOTL.ZG", 2021, 2025)
        line = "".join(f"{inflation[year]:7.1f}" if year in inflation else f"{'—':>7}"
                       for year in years)
        print(f"{name:<12}{line}")


main()

Запустите python3 tsena.py. Вывод:

== во сколько раз выросли цены в Казахстане
индекс цен 2010 года: 100.0
индекс цен 2025 года: 348.1
цены выросли в 3.48 раза
1000 тенге 2025 года = 287 тенге в ценах 2010 года
то, что в 2010 году стоило 1000 тенге, стоит 3481

== тот же мир, разные цены: инфляция по годам, %
страна         2021   2022   2023   2024   2025
Казахстан       8.0   15.0   14.5    8.7   11.4
мир             3.5    8.1    5.8    3.0    3.0
Грузия          9.6   11.9    2.5    1.1    3.9
Армения         7.2    8.6    2.0    0.3    3.3
Польша          5.1   14.4   11.5    3.8    3.8

Если сети нет

Программа ходит в интернет, и это первое, что может не получиться: нет связи, закрыт доступ, у чужого сервера выходной. Тогда возьмите ту же программу с уже готовыми числами — они из того же ответа Всемирного банка, и печатает она то же самое.

"""Та же программа без сети: числа уже в ней.

Их взяли из того же ответа Всемирного банка, поэтому напечатает она то же самое.
Дальше по курсу мы научимся получать их сами.
"""

# Индекс потребительских цен: 2010 год принят за 100.
prices = {2010: 100.0, 2025: 348.1}
# Инфляция по годам, %; «—» там, где числа нет.
inflation = {
    "Казахстан": {2021: 8.0, 2022: 15.0, 2023: 14.5, 2024: 8.7, 2025: 11.4},
    "мир": {2021: 3.5, 2022: 8.1, 2023: 5.8, 2024: 3.0, 2025: 3.0},
    "Грузия": {2021: 9.6, 2022: 11.9, 2023: 2.5, 2024: 1.1, 2025: 3.9},
    "Армения": {2021: 7.2, 2022: 8.6, 2023: 2.0, 2024: 0.3, 2025: 3.3},
    "Польша": {2021: 5.1, 2022: 14.4, 2023: 11.5, 2024: 3.8, 2025: 3.8},
}

print("== во сколько раз выросли цены в Казахстане")
base, last = min(prices), max(prices)
times = prices[last] / prices[base]
print(f"индекс цен {base} года: {prices[base]:.1f}")
print(f"индекс цен {last} года: {prices[last]:.1f}")
print(f"цены выросли в {times:.2f} раза")
print(f"1000 тенге {last} года = {1000 / times:.0f} тенге в ценах {base} года")
print(f"то, что в {base} году стоило 1000 тенге, стоит {1000 * times:.0f}")

print()
print("== тот же мир, разные цены: инфляция по годам, %")
years = range(2021, 2026)
print("страна      " + "".join(f"{year:>7}" for year in years))
for name, series in inflation.items():
    line = "".join(f"{series[year]:7.1f}" if year in series else f"{'—':>7}"
                   for year in years)
    print(f"{name:<12}{line}")

Выводит:

== во сколько раз выросли цены в Казахстане
индекс цен 2010 года: 100.0
индекс цен 2025 года: 348.1
цены выросли в 3.48 раза
1000 тенге 2025 года = 287 тенге в ценах 2010 года
то, что в 2010 году стоило 1000 тенге, стоит 3481

== тот же мир, разные цены: инфляция по годам, %
страна         2021   2022   2023   2024   2025
Казахстан       8.0   15.0   14.5    8.7   11.4
мир             3.5    8.1    5.8    3.0    3.0
Грузия          9.6   11.9    2.5    1.1    3.9
Армения         7.2    8.6    2.0    0.3    3.3
Польша          5.1   14.4   11.5    3.8    3.8

Числа здесь записаны прямо в программе, и это честно называется так: они не «получены», а перенесены. Как устроен ответ банка, разберём в тринадцатом уроке, а как сходить за ним самому — в восемнадцатом.

Разбор

Что вы только что посчитали

Первые пять строк — про деньги в вашем кармане. Индекс цен 2010 года — 100, в 2025-м — 348,1. Значит, цены выросли в 3,48 раза, и это число читается в обе стороны.

Тысяча тенге, которая лежит у вас сегодня, покупает столько же, сколько в 2010 году покупали 287 тенге. И наоборот: за то, что в 2010 году стоило тысячу, теперь просят 3481 тенге. Одно и то же отношение, две разные фразы — и перепутать их значит ошибиться в двенадцать раз.

Не «примерно втрое» и не «все знают». Число посчитано на ваших глазах из официального ряда, и вы можете поменять год с 2010 на 2015 и посмотреть, что будет.

Тот же шок — разные цифры

Вторая таблица важнее первой, и вот почему.

Когда цены растут, объяснение обычно звучит так: мир подорожал, война, логистика, зерно, нефть. Проверим. В 2022 году подорожало действительно у всех: мир — 8,1%, Казахстан — 15,0%.

А дальше пути расходятся. К 2025 году мир вернулся к 3,0%, Армения — к 3,3%, Грузия — к 3,9%, Польша — к 3,8%. Казахстан — 11,4% и снова вверх.

Шок был общий — значит, одним им разницу не объяснить. Насколько он вообще виноват, по этой таблице не видно: чтобы это оценить, нужно положить рядом структуру импорта, курс валют, веса в потребительской корзине, тарифы и внутренние решения. Таблица говорит меньше и надёжнее: ответ «виноват внешний мир» на ней не сходится.

Что из этого следует и чего не следует

Следует одно: «виноват внешний мир» — недостаточное объяснение. Оно не выдерживает сравнения со странами, которые получили ту же нефть, ту же пшеницу и ту же логистику.

Но и обратное простое объяснение — «напечатали денег» — само по себе не сходится, и это мы тоже проверим в курсе. Широкая денежная масса растёт в Армении на 13–18% в год, в Грузии на 11–17%, в Казахстане на 12–21%. Рост сопоставим, а инфляция отличается в три-четыре раза. Значит, дело не в одном ряде цифр: рядом стоят курс тенге, тарифы, налоги и то, куда идут новые деньги.

Курс не даст вам готового виноватого. Он даст вам умение положить рядом четыре ряда и увидеть, какой из них не сходится. Это надёжнее любого чужого вывода — включая наш.

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

Как мы будем учиться

Курс по Go на этой площадке построен на методике Виктора Фёдоровича Шаталова — советского педагога, чья система позволяла школьникам проходить программу в несколько раз быстрее. Второй курс идёт по ней же; о самой системе — в описании методики.

Из неё взяты четыре вещи.

Сначала целое, потом детали. Каждый урок начинается с работающей программы. Вы запускаете её, ничего ещё не понимая, — как сегодня, — и только потом разбираете по частям.

Опорный сигнал. В конце разбора — карта урока: одна картинка на экран, где существенное показано фигурами и связями. Её можно сфотографировать и держать в телефоне; смысл в том, чтобы вы могли перерисовать её от руки.

Образ вместо определения. Каждый незнакомый термин объясняется картинкой из быта. Индекс цен — это не «дефлятор корзины», а линейка, у которой в 2010 году было сто делений, а сегодня триста сорок восемь.

Право не понять с первого раза. Нет оценок, нет проваленных тестов, нет «вы не прошли». Одно обязательное задание в уроке — маленькое и выполнимое всегда — и два по желанию.

Что мы построим

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

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

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

Что нужно, чтобы начать

Компьютер, интернет и Python. Проверьте, есть ли он: в терминале наберите python3 --version. Если ответило номером версии — вы готовы к этому уроку. Если нет — это следующий урок, там ставим язык и рабочее место с нуля.

Больше ничего: ни платных курсов, ни ключей, ни регистрации. Данные, которые мы считаем, открыты для всех — в этом и смысл.

Карта урока

Карта урока: цены, сравнение и вопрос

Скажите своими словами

Не подглядывая, ответьте вслух или на бумаге. Ответы — в конце урока.

  1. Что означает «индекс цен 2025 года равен 348,1», если в 2010 году он был 100?
  2. Почему таблица по другим странам сильнее, чем один ряд по Казахстану?
  3. Почему из этих двух таблиц ещё нельзя назвать виноватого?

Разминка

Три коротких шага перед заданием: предсказать, дописать, починить. Сегодня они про print — то единственное, что из программы уже можно повторить самому. Ответы — в конце урока.

1. Предскажите. Что напечатает эта строка?

print("хлеб", 260 * 3)

2. Заполните пропуск. Вместо ... поставьте то, что даст сумму за три буханки.

price = 260
count = 3
print(f"итого: {...} тенге")

3. Почините. Программа не запускается. Прочитайте, что говорит Python, и почините строку.

print("итого: 780 тенге)

Задание

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

По желанию.

  • Добавьте в таблицу вторую строку стран: Кыргызстан (KG), Узбекистан (UZ), Турцию (TR). Посмотрите, кто рядом с нами, а кто нет.
  • Замените индикатор FP.CPI.TOTL.ZG на PA.NUS.FCRF — это средний курс валюты к доллару. Что случилось с тенге за те же годы?
  • Найдите в интернете чьё-нибудь публичное утверждение о ценах в Казахстане и проверьте его этой программой.

Куда это встанет в проекте

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

Долги, которые видно уже сейчас. Программа падает без интернета и ничего не говорит по-человечески. Она берёт данные каждый раз заново, хотя годовой ряд меняется раз в год. И в ней нет ни одной проверки: если Всемирный банк ответит пустотой, мы этого не заметим. Всё это — ближайшие уроки.

Ответы

Показать ответы

На вопросы

  1. Что цены выросли в 3,48 раза: за ту же корзину, которая в 2010 году стоила 100 условных единиц, в 2025-м платят 348,1. Обратная сторона — тысяча сегодняшних тенге покупает столько же, сколько в 2010 году покупали 287 тенге, а корзина за тысячу тенге 2010 года стоит теперь 3481.
  2. Потому что один ряд можно объяснить чем угодно. Сравнение проверяет объяснение: если во всём виноват общий внешний шок, то у стран, получивших тот же шок, цифры должны быть похожими. Они не похожи.
  3. Потому что совпадение и разница — это ещё не причина. Мы увидели, что одним внешним шоком объяснить нельзя; чтобы назвать причину, нужно положить рядом деньги, курс, тарифы и налоги — и это работа нескольких уроков, а не одной таблицы.

К разминке

  1. хлеб 780. print печатает всё, что ему дали, через пробел, а 260 * 3 он считает до того, как печатать.
хлеб 780
  1. price * count. В фигурных скобках f-строки можно писать не только имя, но и вычисление.
price = 260
count = 3
print(f"итого: {price * count} тенге")
итого: 780 тенге
  1. SyntaxError: unterminated string literal — не закрыта кавычка. Python называет строку и место, и это первое, чему стоит верить: он показывает, где сломалось, а не ругает вас.
print("итого: 780 тенге")
итого: 780 тенге

Источники

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Проверить задание

Сначала решите и запустите в VS Code — редактор покажет ошибку на месте. Готовое решение вставьте сюда. Проверяет модель: она укажет на ошибку, но не даст готовый ответ.

Чтобы проверить, нужно войти. Войти

Комментарии (0)

Пока нет комментариев. Будьте первым.