Сторонние библиотеки и pip

Допустим, у нас на руках выгрузка продаж: список чеков, в каждом товар, количество и цена. Нужна выручка по каждому товару.

Всё необходимое мы уже проходили — словарь и цикл:

Python 3.13
sales = [
    {"товар": "Кофе", "количество": 3, "цена": 150},
    {"товар": "Хлеб", "количество": 2, "цена": 60},
    {"товар": "Кофе", "количество": 1, "цена": 150},
    {"товар": "Молоко", "количество": 4, "цена": 45},
    {"товар": "Хлеб", "количество": 2, "цена": 60},
]

revenue = {}
for row in sales:
    revenue[row["товар"]] = revenue.get(row["товар"], 0) + row["количество"] * row["цена"]

print(revenue)
{'Кофе': 600, 'Хлеб': 240, 'Молоко': 180}

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

Задача при этом типовая, её решают тысячи людей ежедневно. Поэтому под неё давно написан инструмент: библиотека pandas.

То же самое на pandas

Python 3.13
import pandas as pd

sales = [
    {"товар": "Кофе", "количество": 3, "цена": 150},
    {"товар": "Хлеб", "количество": 2, "цена": 60},
    {"товар": "Кофе", "количество": 1, "цена": 150},
    {"товар": "Молоко", "количество": 4, "цена": 45},
    {"товар": "Хлеб", "количество": 2, "цена": 60},
]

table = pd.DataFrame(sales)
table["сумма"] = table["количество"] * table["цена"]

print(table.groupby("товар")["сумма"].sum().to_string())
товар
Кофе      600
Молоко    180
Хлеб      240

Цикл свернулся в одну строку, которая читается почти по-русски: сгруппируй по товару, возьми колонку «сумма», сложи. А сортировка, ради которой пришлось бы дописывать код, — это ещё один вызов в той же цепочке:

Python 3.13
import pandas as pd

sales = [
    {"товар": "Кофе", "количество": 3, "цена": 150},
    {"товар": "Хлеб", "количество": 2, "цена": 60},
    {"товар": "Кофе", "количество": 1, "цена": 150},
    {"товар": "Молоко", "количество": 4, "цена": 45},
    {"товар": "Хлеб", "количество": 2, "цена": 60},
]

table = pd.DataFrame(sales)
table["сумма"] = table["количество"] * table["цена"]

print(table.groupby("товар")["сумма"].sum().sort_values(ascending=False).to_string())
товар
Кофе      600
Хлеб      240
Молоко    180

Вот ради чего нужны сторонние библиотеки. Кто-то уже прошёл путь от «сложить числа по группам» до «отфильтровать, пересчитать и построить график», отладил это на тысячах чужих проектов и отдал вам готовым.

Откуда они берутся

Вместе с Python приезжает только стандартная библиотека, а pandas в неё не входит. На чистой машине строка import pandas закончится ошибкой ModuleNotFoundError, пока пакет не установлен.

Скачивает и ставит их pip — менеджер пакетов, который приезжает вместе с Python. Проверить, что он на месте:

pip --version

Куда ставить: сначала окружение

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

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

Два проекта, у каждого своё venv с собственными версиями пакетов: django 3.0 + requests 2.20 в проекте A, django 4.2 + requests 2.31 в проекте B

Создаём окружение и входим в него:

python -m venv myenv
source myenv/bin/activate

Что вы внутри, видно по началу строки, где появляется имя окружения:

(myenv) $

Ставим пакет

Пока окружение активно, pip кладёт пакеты в него, а не в общую папку:

pip install pandas

Если нужна конкретная версия, её указывают через двойное равно:

pip install pandas==2.0.3

Посмотреть, что уже установлено, — pip list. Убрать лишнее — pip uninstall pandas.

Чтобы то же самое собралось у коллеги

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

pip freeze > requirements.txt

Внутри — построчно пакет и его точная версия:

numpy==1.25.2
pandas==2.0.3
python-dateutil==2.8.2

Файл кладут в репозиторий рядом с кодом, и дальше любой, кто склонирует проект, повторяет окружение одной командой:

pip install -r requirements.txt

Версии зафиксированы, поэтому у него соберётся ровно то же, что у вас, а не «у меня-то работает».

Куда идти дальше

Пакетов на PyPI сотни тысяч, но на старте хватит нескольких:

Когда понадобитсяБиблиотека
Таблицы, отчёты, аналитикаpandas
Запросы к чужому API по HTTPrequests
Достать данные из HTML-страницыbeautifulsoup4
Графики и диаграммыmatplotlib
Свой веб-сервис или APIflask, fastapi

Остальное ищется на PyPI тогда, когда упрётесь в задачу. Учить список наизусть заранее не нужно 🎓.

Проверка понимания

Зачем для каждого проекта заводят отдельное виртуальное окружение?