SQL и Анализ данных
12.7K subscribers
680 photos
70 videos
3 files
695 links
Базы данных и всё, что с ними связано!

Сотрудничество: @haarrp

РКН № 6766085482
Download Telegram
Теперь можно ничем не беспокоиться
😁2419👍4
🍰 Polars v1.37.0: min/max строки по другой колонке - в одну строку

Раньше, чтобы найти строку с минимальным/максимальным значением по другой колонке, приходилось:
- сортировать
- группировать
- писать сложные фильтры

Теперь в Polars v1.37.0 всё проще.

Добавили методы выражений:
min_by
max_by

Они позволяют находить min/max значения по любой колонке одной понятной строкой кода - без лишней магии и многошаговых костылей.

Пример логики:
"дай продукт с максимальными продажами внутри каждой категории" - теперь делается красиво и читаемо.

Обновление:

pip install -U polars
🔥7👍41
🚀 STEP3-VL-10B - мультимодальная модель, которая бьёт гигантов (и весит всего 10B)

StepFun выпустили STEP3-VL-10B - компактную open multimodal модель, которая по метрикам догоняет и местами обгоняет монстров в 10-20 раз больше.

Что заявляют по качеству
- держит SOTA/near-SOTA по визуальному восприятию + reasoning
- на ряде тестов конкурирует с GLM-4.6V, Qwen3-VL и даже Gemini 2.5 Pro
- сильна в OCR, понимании GUI, пространственном мышлении (важно для embodied AI)

Ключевые цифры
- обучена на 1.2T токенов
- 1400+ RL-раундов (RLHF + RLVR)
- поддержка PaCoRe (parallel collaborative reasoning) и контекст до 128K
- в классе <10B лидирует в STEM-задачах:
94.43% на AIME 2025 (с PaCoRe)

Архитектура
- PE-lang visual encoder (1.8B)
- Qwen3-8B decoder
- multi-crop high-res: 728×728 global + локальные кропы

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


Base: https://modelscope.cn/models/stepfun-ai/Step3-VL-10B-Base
Chat: https://modelscope.cn/models/stepfun-ai/Step3-VL-10B
👍62🔥1
⚡️Пошаговый план: как получить оффер на аналитика в 2026 году?

Приглашаем на бесплатный вебинар, где Андрон Алексанян - эксперт в области аналитики и CEO школы аналитики Simulative — в прямом эфире разберет все важные аспекты в работе аналитика, а также расскажет как получить оффер быстрее других.

Это очень полезное событие для тех кто только зашел в аналитику и для тех, кто хочет в нее зайти в ближайшее время. Особенно если вы не понимаете, какие навыки действительно важны или боитесь, что без опыта вас не возьмут на работу. Кстати тут разберут и возрастной аспект: как стать аналитиком в 30/40/50 лет и т.д.

На вебинаре будет:
🟠Разберем полный роадмап: что учить, в каком порядке, до какого уровня;
🟠Структура хорошего портфолио с примерами;
🟠Что говорят реальные наниматели - какие у них сейчас требования:
— Покажем реальные примеры, как оформить резюме и портфолио, чтобы привлекать внимание;
— Обсудим какие отклики работают, а какие сразу отправляют в корзину;
— Изнанка найма: инсайдерский взгляд на процессы отбора

🟠 Практические техники для новичков: разберём, как компенсировать недостаток опыта и быстро закрывать пробелы в знаниях.

💬 Всем зарегистрировавшимся Simulative пришлют полезный материал — карту компетенций аналитика данных со всеми нужными инструментами для освоения.

😶Зарегистрироваться на бесплатный вебинар
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ SQL совет: миграции БД без боли (как в продакшене)

Если ты до сих пор “правишь базу руками”, а потом ловишь рассинхрон между dev/stage/prod - остановись.

Правильная миграция БД должна быть:
воспроизводимой
версионируемой
безопасной при откате
без даунтайма (по возможности)

Ключевые правила миграций:
1) Каждое изменение = отдельная миграция (не правь историю)
2) Только вперёд: rollback делай отдельной миграцией
3) Миграции должны быть idempotent, если это возможно
4) Никаких “ALTER TABLE в обед” на проде
5) Разделяй schema и data миграции
6) Для больших таблиц - делай изменения по шагам (expand -> migrate -> contract)

Самый безопасный паттерн:
- Добавляешь новое поле/таблицу (expand)
- Пишешь код, который работает и со старым, и с новым
- Переносишь данные (migrate)
- Удаляешь старое (contract)


-- 1) таблица миграций (если нет инструмента)
create table if not exists schema_migrations (
version text primary key,
applied_at timestamptz not null default now()
);

-- 2) миграция: добавляем колонку безопасно
alter table users add column if not exists phone text;

-- 3) перенос данных (пример)
update users
set phone = regexp_replace(contact, '[^0-9+]', '', 'g')
where phone is null and contact is not null;

-- 4) фиксируем версию миграции
insert into schema_migrations(version)
values ('2026_01_21_add_users_phone')
on conflict do nothing;
👍63🔥2😭1💊1
Карьера — это путь, на котором иногда хочется остановиться и сверить курс. Вы осваиваете новые навыки и решаете задачи, но превращается ли это в системный рост или просто в движение по инерции?

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

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

Анатолий Карпов — ez-аналитик Mailꓸru Group и VK, самый читаемый эксперт в аналитике, по исследованию NEWHR.

Зарегистрируйтесь на вебинар и получите ясность в своем развитии — https://clc.to/erid_2W5zFGHr2uE

Реклама. ООО "КАРПОВ КУРСЫ". ИНН 7811764627. erid: 2W5zFGHr2uE
🖥 SQL задачка на внимательность (и одна классическая ловушка)

У тебя есть таблица логов. Нужно найти пользователей, которые заходили 3 дня подряд.

Таблица:
- user_id
- event_date (DATE)

Задача:
Верни user_id и дату третьего дня серии (то есть конец 3-дневной цепочки).

Ловушка:
1) В один день может быть несколько событий - их нельзя считать как разные дни
2) Дни должны идти подряд по календарю (не “3 записи подряд”)


-- PostgreSQL / MySQL 8+ (через window functions)
WITH uniq_days AS (
SELECT DISTINCT user_id, event_date
FROM user_events
),
grp AS (
SELECT
user_id,
event_date,
event_date
- INTERVAL '1 day' * (ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_date))
AS anchor
FROM uniq_days
),
runs AS (
SELECT
user_id,
MIN(event_date) AS start_day,
MAX(event_date) AS end_day,
COUNT(*) AS days_cnt
FROM grp
GROUP BY user_id, anchor
)
SELECT user_id, end_day AS third_day
FROM runs
WHERE days_cnt >= 3
ORDER BY user_id, third_day;


Почему это работает:
- DISTINCT убирает повторы в один день
- “anchor” превращает подряд идущие даты в одну группу
- дальше считаем длину серии и берём конец
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥42🏆1
This media is not supported in your browser
VIEW IN TELEGRAM
LuxTTS - очень быстрый и компактный TTS с клонированием голоса

Модель со ставкой на скорость + реализм, при этом она остается лёгкой и доступной по ресурсам.

Главные фишки:

- До 150× realtime при генерации речи
- 🎙️ Хорошая передача эмоций и естественности
- 🧬 Качественное voice cloning
- 💾 Влезает примерно в 1 ГБ VRAM
- 🖥️ Работает и на CPU - 2–6× realtime

Подходит для:
- голосовых ассистентов
- озвучки приложений
- быстрых прототипов без тяжёлой инфраструктуры

- LuxTTS работает как мульти-язычная TTS-модель, и русский входит в список языков.

Repo: https://github.com/ysharma3501/LuxTTS
Модель: https://huggingface.co/YatharthS/LuxTTS
4👍2🔥1
Forwarded from Machinelearning
📌 Банхаммер Anthropic: как потерять доступ к API, заставив Claude писать инструкции для Claude.

Любопытный кейс португальского разработчика Хуго Даниэля, который решил поиграть в жесткую автоматизацию с Сlaude Сode. и проиграл

Хуго был активным пользователем Сlaude, тратил 220 евро в месяц и однажды решил настроить генерацию шаблонных файлов для новых проектов двумя агентами. Схема была примерно такая:

🟢Claude A (в одном окне): отвечает за обновление файла CLAUDE.md. Это файл с контекстом и инструкциями, как вести себя модели в конкретном проекте.

🟢Claude B (в другом окне): пытается выполнять задачи внутри этого проекта, используя инструкции из CLAUDE.md.

🟠Loop: когда Claude B косячил, Хуго копировал ошибку, скармливал ее Claude A и говорил: "Поправь инструкции, чтобы этот дурак больше так не делал".

В какой-то момент Claude A, видимо, устал от тупости коллеги и начал генерировать инструкции капсом, чтобы жестко задать поведение - файл наполнился директивами, которые выглядели как System Prompts.

🟡На этом этапе Хуго и получил бан от Anthropic.

Гипотеза бана в том, что сработали эвристики защиты от Prompt Injection. Система безопасности Anthropic увидела, что пользователь генерирует и скармливает модели текст, который структурно и лексически выглядит как системные инструкции. Вобщем, для алгоритмов безопасности это выглядит как попытка джейлбрейка.

Ожидаемо, саппорт хранил молчание: ни через систему апелляции (она, кстати на Google Forms), ни письма в поддержку не дали результатов. Через насколько дней пришел только молчаливый возврат средств за подписку. Так что причины блокировки так и остались гипотезой.

🟡Автор справедливо замечает: хорошо, что это был не Google.

Если бы подобный эксперимент проводился у "Корпорации Добра" - сработал бы их вездесущий триггер на "злонамеренную активность", и человек мог бы потерять Gmail, Google Photos, документы и получить кирпич вместо Android-смартфона.

История Хуго - хорошее напоминание о том, что модерация в ИИ сейчас - это черный ящик.

Если вы занимаетесь авто-генерацией промптов, которые выглядят как системные инструкции (то, что называют meta-prompting и scaffolding) - вы ходите по минному полю.




@ai_machinelearning_big_data

#AI #ML #Story #Anthropic
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥63
Аналитик данных: от базовой теории к практике

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

Бесплатный демокурс от karpovꓸcourses помогает сделать первые реальные шаги: вы познакомитесь с Python, SQL: переменными и запросами, попробуете решать задачи, которые решают начинающие аналитики в компаниях, и получите ясное представление о профессии.

Автор курса — Анатолий Карпов, бывший ведущий аналитик Mailꓸru Group и VK, самый читаемый эксперт в аналитике, по исследованию NEWHR. Его курсы прошли уже более 290 000 студентов.

Получите доступ к демокурсу: https://clc.to/erid_2W5zFHoLeXi

Реклама. ООО "КАРПОВ КУРСЫ". ИНН 7811764627. erid: 2W5zFHoLeXi
🔥4
Интеллектуальное импортозамещение СУБД: миграция с MS SQL и Oracle без переписывания кода

В условиях новых технологических реалий перед CIO, IT-директорами и руководителями проектов стоит критически важная задача - обеспечить плавный переход на отечественные решения без остановки бизнес-процессов и роста бюджетов.

Digital Q.DataBase от Диасофт предлагает принципиально иной подход: миграция с западных СУБД без необходимости переписывания сотен тысяч строк кода.

Программа вебинара:
📊 Стратегия импортозамещения СУБД: новые критерии выбора.
🔧 Архитектура Digital Q.DataBase: технические возможности и преимущества.
⚙️ Технология "Полиглот" в действии: механизмы поддержки T-SQL и PL/SQL, минимизация доработок при миграции.
Практический опыт внедрения: анализ реальных проектов: от пилота до промышленной эксплуатации. Метрики, сроки, результаты.

Дата и время: 3 февраля, 14:00 (МСК)

Регистрация по ссылке
Реклама. ООО "ДИАСОФТ ЭКОСИСТЕМА". ИНН 9715403607.
💊2
🧠 Ситуация

У тебя есть старая таблица пользователей:

users_old
---------
id
full_name -- "Ivan Petrov"
email
created_at


Новая схема БД требует нормализации:

users
------
id
first_name
last_name
email
created_at

profiles
--------
user_id
display_name -- оригинальное полное имя

⚠️ Проблема

В full_name данные грязные:

full_name
Ivan Petrov
Maria
John Smith Jr.
Anna-Marie Watson
Dmitry Ivanov
NULL
"" (пустая строка)

Требования миграции:

• Разбить имя на first_name и last_name

• Если фамилии нет → last_name = NULL

• Лишние пробелы убрать

• Суффиксы типа Jr. считать частью фамилии

• Пустые и NULL имена → first_name = 'Unknown'

• Оригинал имени сохранить в profiles.display_name

Миграция должна работать одним SQL-скриптом без Python

🎯 Задача

• Напиши SQL-миграцию, которая:

• Переносит данные из users_old в users

• Создаёт записи в profiles

• Чистит имя

• Работает корректно со всеми кейсами

💣 Усложнение (вот где ловушка)

• Таблица 10 млн строк, нельзя:

• Делать UPDATE по одной строке

• Использовать курсоры

• Только set-based SQL.

💡 Ожидаемое решение (PostgreSQL)
INSERT INTO users (id, first_name, last_name, email, created_at)
SELECT
id,

-- first_name
CASE
WHEN TRIM(full_name) IS NULL OR TRIM(full_name) = '' THEN 'Unknown'
ELSE split_part(TRIM(regexp_replace(full_name, '\s+', ' ', 'g')), ' ', 1)
END,

-- last_name
CASE
WHEN TRIM(full_name) IS NULL OR TRIM(full_name) = '' THEN NULL
WHEN array_length(string_to_array(TRIM(regexp_replace(full_name, '\s+', ' ', 'g')), ' '), 1) = 1
THEN NULL
ELSE substring(
TRIM(regexp_replace(full_name, '\s+', ' ', 'g'))
FROM position(' ' IN TRIM(regexp_replace(full_name, '\s+', ' ', 'g'))) + 1
)
END,

email,
created_at
FROM users_old;


INSERT INTO profiles (user_id, display_name)
SELECT
id,
NULLIF(TRIM(full_name), '')
FROM users_old;


Задача проверяет:
• работу со строками
• regexp_replace
• split_part
• edge cases
• производительность (set-based)
• реальную миграцию, а не учебный select
👍6🔥21
This media is not supported in your browser
VIEW IN TELEGRAM
🧠 Важно знать: избегай SELECT * для оптимизации запросов!

Использование SELECT * может привести к излишней загрузке данных и снижению производительности. Вместо этого, укажите только необходимые столбцы для выборки. Это не только упростит обработку данных, но и позволит использовать индексы более эффективно.


-- Вместо этого:
SELECT * FROM orders WHERE customer_id = 123;
-- Используйте явный выбор столбцов:
SELECT order_id, order_date, total_amount
FROM orders
WHERE customer_id = 123;
-- Дополнительно можно добавить индексы если это необходимо:
CREATE INDEX idx_customer_id ON orders(customer_id);
👍12😁42🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Как убрать дубликаты в SQL с использованием временной таблицы.

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


-- Создание временной таблицы с уникальными записями
CREATE TABLE temp_unique AS
SELECT DISTINCT *
FROM your_table;
-- Удаление всех записей из оригинальной таблицы
DELETE FROM your_table;
-- Вставка уникальных данных обратно в оригинальную таблицу
INSERT INTO your_table
SELECT *
FROM temp_unique;
-- Удаление временной таблицы
DROP TABLE temp_unique;
7👍3🔥1😁1
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 SQL: ЛОВУШКА ДУБЛЕЙ И ДАТ

Иногда самая коварная задача - найти “покупали 3 дня подряд”. Профи часто делают self-join на даты, но он ломается на дубликатах, таймзонах и нескольких покупках в день.

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

-- Задача:
-- Найти пользователей, которые совершали покупку 3 календарных дня подряд (минимум).
-- Условия:
-- 1) В один день может быть много покупок - считаем день один раз.
-- 2) Нужны именно подряд идущие дни без пропусков.
-- 3) Вернуть user_id и начало/конец самой длинной серии.


WITH days AS (
SELECT DISTINCT
user_id,
DATE(created_at) AS d
FROM orders
),
grp AS (
SELECT
user_id,
d,
-- трюк: для подряд идущих дат разность (дата - номер) постоянна
DATEADD(day, -ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY d), d) AS g
FROM days
),
streaks AS (
SELECT
user_id,
MIN(d) AS streak_start,
MAX(d) AS streak_end,
COUNT(*) AS streak_len
FROM grp
GROUP BY user_id, g
)
SELECT user_id, streak_start, streak_end, streak_len
FROM streaks
WHERE streak_len >= 3
ORDER BY streak_len DESC;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9😍2
Google переименовал ZetaSQL в GoogleSQL

Компания Google объявила о переименовании SQL-анализатора ZetaSQL в GoogleSQL. Проект развивает инструментарий для разбора и анализа грамматики, семантики, типов, модели данных и функций для языка SQL и диалекта GoogleSQL. Диалект GoogleSQL примечателен возможностью объединения запросов при помощи неименованных каналов (pipe) и применяется в различных продуктах и сервисах Google, среди которых BigQuery, Spanner, F1, BigTable, Dremel и Procella. Код проекта написан на языке С++ и распространяется под лицензией Apache 2.0.

https://opennet.ru/64735/
👍31🔥1
🖥 Большинство “парсеров” умирают через 2 дня.
Ты научишься делать те, которые живут в проде.

Это не про BeautifulSoup ради галочки.
Это про системы сбора данных, которые:

• не падают от мелких правок на сайте
• собирают данные в разы быстрее
• обновляют всё сами по расписанию
• обходят ограничения и баны
• выглядят как сервис, а не хаос из файлов

Ты начнёшь видеть сайты не как страницы, а как источники данных, к которым можно подключиться.

В итоге ты сможешь:

• забирать данные для своих проектов
• автоматизировать чужую рутину
• делать инструменты для аналитики
• брать коммерческие заказы на сбор данных

Это навык, который напрямую превращается в деньги.
Не “знаю Python”, а умею добывать данные из интернета профессионально.

🎁 48 часов скидка 50% на Stepik: https://stepik.org/a/269942/
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1🔥1😁1
Какой из перечисленных типов индексов в PostgreSQL подходит для геопространственных данных?
Anonymous Quiz
10%
B-tree
7%
Hash
51%
GiST
12%
GIN
5%
BRIN
15%
SP-GiST
1👍21🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Как не убить базу большими таблицами в SQL - фильтруй и агрегируй как можно раньше

Главная ошибка при работе с большими таблицами - делать SELECT * и потом надеяться, что "оно как-нибудь".

На больших объёмах это превращается в долгие запросы, высокую нагрузку и таймауты.

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

Практическое правило: если запрос возвращает миллионы строк - ты почти наверняка решаешь задачу неправильно. В 90% случаев тебе нужна витрина: GROUP BY, window-функции, или отдельная агрегированная таблица. А чтобы база не страдала, добавляй индексы под фильтры и под JOIN-ключи, и проверяй план выполнения через EXPLAIN.



ПЛОХО: тащим весь объём и только потом думаем
SELECT *
FROM events
WHERE created_at >= NOW() - INTERVAL '90 days';

-- ХОРОШО: сразу сужаем, берем нужные колонки, считаем агрегаты
SELECT
user_id,
COUNT(*) AS events_7d,
MAX(created_at) AS last_event_at
FROM events
WHERE created_at >= NOW() - INTERVAL '7 days'
GROUP BY user_id;

-- Индекс под фильтр по времени + join по user_id (частый паттерн)
CREATE INDEX IF NOT EXISTS idx_events_created_user
ON events (created_at, user_id);

-- Проверяй план, чтобы не было Seq Scan на миллионах строк
EXPLAIN (ANALYZE, BUFFERS)
SELECT user_id, COUNT(*)
FROM events
WHERE created_at >= NOW() - INTERVAL '7 days'
GROUP BY user_id;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥43