Пакеты, Pkg и работа с данными

Как устроена экосистема Julia: менеджер пакетов Pkg, воспроизводимые окружения и пакет DataFrames для данных.

Pkg — встроенный менеджер пакетов Julia. Он устанавливает библиотеки, разрешает зависимости и создаёт воспроизводимые окружения проекта.

Установка пакетов

В REPL нажмите ] для входа в Pkg-режим. Основные команды:

(@v1.10) pkg> add DataFrames
(@v1.10) pkg> add Plots CSV
(@v1.10) pkg> status
(@v1.10) pkg> update
(@v1.10) pkg> remove CSV

В скрипте пакет подключают так:

using DataFrames
using Statistics

Воспроизводимые окружения

Это большое преимущество Julia. Команда activate . создаёт в папке проекта два файла: Project.toml (прямые зависимости) и Manifest.toml (точные версии всех пакетов, включая транзитивные). Скопировав эти файлы коллеге, он получит в точности то же окружение командой instantiate. Это решает «проблему воспроизводимости», знакомую по requirements.txt в Python, но строже.

Экосистема

Несмотря на молодость языка, у Julia зрелая экосистема для науки и данных:

ПакетНазначение
DataFrames.jlтабличные данные (аналог pandas)
Plots.jlпостроение графиков
DifferentialEquations.jlдифференциальные уравнения (один из лучших в мире)
Flux.jlмашинное обучение
JuMP.jlматематическая оптимизация

DataFrames: обзор

DataFrames.jl — стандарт для табличных данных в Julia, по идее близкий к pandas. Типичный код выглядит так (его не запускают здесь — нужен установленный пакет):

using DataFrames

df = DataFrame(name = ["Анна", "Иван", "Ольга"],
               age  = [30, 25, 35])

# фильтрация: строки, где age > 28
adults = df[df.age .> 28, :]

# новый столбец
df.age_in_5 = df.age .+ 5

# среднее по столбцу
mean_age = sum(df.age) / nrow(df)

Обратите внимание на .> и .+ — это уже знакомый вам broadcasting: операции применяются к каждому элементу столбца. Знание точечного синтаксиса напрямую переносится на работу с данными.

Как работает под капотом

Каждый столбец DataFrame — это обычный типизированный Vector Julia, например Vector{Int64} для возрастов. Поэтому операции над столбцами компилируются в быстрый код, как над любым массивом, без отдельного «движка», как у pandas. Это значит, что ваш собственный код для обработки таблиц так же быстр, как встроенные операции, — в отличие от Python, где «голый» цикл по DataFrame медленнее векторизованных методов pandas.

Частые ошибки

Главная путаница новичков с DataFrames — забыть точку в сравнении: df.age > 28 (без точки) пытается сравнить весь столбец-вектор с числом и упадёт, а нужно поэлементное df.age .> 28. Вторая ошибка — коммитить только Project.toml без Manifest.toml, теряя точную воспроизводимость версий.

Итоги

  • Pkg (режим ]) устанавливает пакеты: add, status, update, remove.
  • Project.toml + Manifest.toml дают строго воспроизводимое окружение.
  • Экосистема зрелая: DataFrames, Plots, Flux, JuMP, DifferentialEquations.
  • Столбцы DataFrame — обычные типизированные векторы, поэтому работа с данными быстра.
  • Для фильтрации и вычислений по столбцам используют broadcasting (.>, .+).
Проверьте себя
1. Какие два файла обеспечивают воспроизводимость окружения проекта в Julia?
Asetup.py и requirements.txt
BProject.toml и Manifest.toml
Cpackage.json и lockfile
Denvironment.yml и conda.lock
2. Почему фильтрация df[df.age .> 28, :] использует точку перед >?
AТочка обозначает комментарий
BЭто broadcasting: сравнение применяется к каждому элементу столбца-вектора
CТочка ускоряет загрузку пакета
DБез точки код был бы тем же