Вышла версия 0.6.0 расширения the-stats-duck для DuckDB. Это статистический движок, который используют проекты Bedevere и KoliLang. Он позволяет делать полноценную статистику прямо в SQL — распределения, тесты, регрессию и даже графики. Расширение с открытым исходным кодом (лицензия MIT) работает везде, где работает DuckDB, включая браузер.
Первое, что обычно делают с новым датасетом — «щупают» его. Функция meta() выдаёт полный профиль таблицы: по одной строке на колонку с количеством пропусков, уникальных значений, средним, медианой и так далее. В отличие от встроенного SUMMARIZE, meta() — это табличная функция, которую можно джойнить и фильтровать.
Версия добавила обычный метод наименьших квадратов. Функция lm() возвращает таблицу коэффициентов (оценка, стандартная ошибка, t-статистика, p-value), а lm_summary() — метрики модели целиком (R², скорректированный R², F-критерий). Под капотом — разложение Холецкого для X'X, всё сверено с R до четвёртого знака.
Для тех, кто не хочет предполагать нормальность, есть бутстреп. Функция bootstrap(value, statistic, n_iters [, seed]) возвращает список статистик по каждой ресемплинговой выборке. Можно передать seed для воспроизводимости, даже с группировкой GROUP BY.
Главная новинка графической части — грамматика ggsql, которая компилируется в Vega-Lite. В v0.6.0 появились violin (скрипичные диаграммы), двумерные фасеты (FACET BY row, col) и модификатор STAT smooth для послойного сглаживания LOESS. Например, DRAW point DRAW line STAT smooth рисует scatter plot с трендовой линией в одну строку. Модификатор STAT summary усредняет значения по группам, а STAT identity — явная заглушка. Для линейной регрессии есть отдельная команда DRAW regression.
Пополнился зоопарк распределений: отрицательное биномиальное, гипергеометрическое, Вейбулла, логнормальное и Пуассона — каждое с R-стилем функций d/p/q и полным набором генераторов случайных чисел. Всё перекрёстно проверено с R до шестого знака.
И самое важное для тех, кто работает с SAS/SPSS/Stata: чтение XPT-файлов было ускорено кардинально. Раньше парсер перечитывал файл с нуля для каждого чанка в 2048 строк, получалось O(N²). Теперь файл парсится один раз в буферизованное колоночное хранилище. Результаты: файл на 200 тысяч строк (7 MB) — с 67 секунд до 1.3 секунды (ускорение в 52 раза). Реальный CDISC pilot qs.xpt (122k строк) — с 39 секунд до 1.1 секунды (в 36 раз). 1.6 миллиона строк — с 70 минут до 15 секунд.
Расширение живёт на GitHub как the-stats-duck и питает Bedevere с KoliLang, но работает как обычное расширение DuckDB.