Сторонние библиотеки и pip
Допустим, у нас на руках выгрузка продаж: список чеков, в каждом товар, количество и цена. Нужна выручка по каждому товару.
Всё необходимое мы уже проходили — словарь и цикл:
Python 3.13sales = [ {"товар": "Кофе", "количество": 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.13import 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.13import 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, а лежать в одном месте две версии не могут. Обновили ради новой — сломали старую.
Поэтому под каждый проект заводят отдельное виртуальное окружение: свой набор пакетов, который ничего не знает о соседях.

Создаём окружение и входим в него:
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 сотни тысяч, но на старте хватит нескольких:
Остальное ищется на PyPI тогда, когда упрётесь в задачу. Учить список наизусть заранее не нужно 🎓.
Проверка понимания
Зачем для каждого проекта заводят отдельное виртуальное окружение?
