Forwarded from Machinelearning
https://huggingface.co/learn/llm-course/chapter1/1
Создавайте инструменты с многоэтапным мышлением, используя LangChain и HF.
https://huggingface.co/learn/agents-course/unit0/introduction
Научите агентов принимать решения и учиться на основе окружающей среды.
https://huggingface.co/learn/deep-rl-course/unit0/introduction
Изучите как работает OCR, сегментация и классификация изображений с моделями HuggingFace.
https://huggingface.co/learn/audio-course/chapter0/introduction
Применяйте трансформеры к аудио: распознавание речи, тегирование музыки и синтез речи.
https://huggingface.co/learn/audio-course/chapter0/introduction
Узнайте, как ИИ меняет разработку игр: от поведения NPC до генерации контента.
https://huggingface.co/learn/ml-games-course/unit0/introduction
Работайте с 3D-данными, такими как облака точек и сетки, на стыке графики и ML.
https://huggingface.co/learn/ml-for-3d-course/unit0/introduction
Погрузитесь в технологию, лежащую в основе DALL·E и Stable Diffusion, и научитесь генерировать изображения.
https://huggingface.co/learn/diffusion-course/unit0/1
Коллекция практических ноутбуков от реальных разработчиков ИИ — учитесь, копируйте код и создавайте свои проекты. https://huggingface.co/learn/cookbook/index
@ai_machinelearning_big_data - подписаться
#free #courses #opensource #huggingface
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥3👍2💊2🤨1
🧠 SQL-задача с подвохом: “Найди самого активного… по количеству разных друзей”
📘 Условие
У тебя есть таблица дружбы:
Здесь каждая строка означает, что
Записи всегда односторонние: если есть
Нужно написать запрос, который найдёт пользователя с наибольшим числом уникальных друзей.
❓ Пример попытки:
🔍 Вопрос:
1) В чём здесь может быть логическая ошибка?
2) Какую строку подсчитает
3) Когда нужно использовать
4) Как обойти случай, если один и тот же друг записан несколько раз?
✅ Разбор подвоха
💣 Проблема: один пользователь может быть записан как друг **несколько раз**, особенно если приложение допускает дубли (или "перезапросы дружбы").
Пример:
```sql
INSERT INTO friends VALUES (1, 2), (1, 2), (1, 3);
```
В этом случае:
```sql
SELECT COUNT(friend_id) FROM friends WHERE user_id = 1;
-- → вернёт 3
```
Но реальных друзей у пользователя `1` — только **2**: `2` и `3`.
✅ Решение:
Используй `COUNT(DISTINCT friend_id)`:
```sql
SELECT user_id, COUNT(DISTINCT friend_id) AS unique_friends
FROM friends
GROUP BY user_id
ORDER BY unique_friends DESC
LIMIT 1;
```
🎯 Дополнительно можно убрать самого пользователя из списка друзей (на случай ошибок):
```sql
WHERE user_id != friend_id
```
⚠️ Подвох
• `COUNT()` без `DISTINCT` ловит даже опытных — особенно если в БД возможны дубли
• `LIMIT 1` не гарантирует "уникального победителя", если у нескольких одинаковый счёт
• Иногда friendship бывает и симметричной, тогда нужна защита от двойного счёта
📘 Условие
У тебя есть таблица дружбы:
friends(user_id, friend_id)
Здесь каждая строка означает, что
user_id дружит с friend_id. Записи всегда односторонние: если есть
(1, 2), это не значит, что будет (2, 1).Нужно написать запрос, который найдёт пользователя с наибольшим числом уникальных друзей.
❓ Пример попытки:
SELECT user_id, COUNT(friend_id) AS total_friends
FROM friends
GROUP BY user_id
ORDER BY total_friends DESC
LIMIT 1;
🔍 Вопрос:
1) В чём здесь может быть логическая ошибка?
2) Какую строку подсчитает
COUNT(friend_id)? 3) Когда нужно использовать
COUNT(DISTINCT friend_id)? 4) Как обойти случай, если один и тот же друг записан несколько раз?
✅ Разбор подвоха
💣 Проблема: один пользователь может быть записан как друг **несколько раз**, особенно если приложение допускает дубли (или "перезапросы дружбы").
Пример:
```sql
INSERT INTO friends VALUES (1, 2), (1, 2), (1, 3);
```
В этом случае:
```sql
SELECT COUNT(friend_id) FROM friends WHERE user_id = 1;
-- → вернёт 3
```
Но реальных друзей у пользователя `1` — только **2**: `2` и `3`.
✅ Решение:
Используй `COUNT(DISTINCT friend_id)`:
```sql
SELECT user_id, COUNT(DISTINCT friend_id) AS unique_friends
FROM friends
GROUP BY user_id
ORDER BY unique_friends DESC
LIMIT 1;
```
🎯 Дополнительно можно убрать самого пользователя из списка друзей (на случай ошибок):
```sql
WHERE user_id != friend_id
```
⚠️ Подвох
• `COUNT()` без `DISTINCT` ловит даже опытных — особенно если в БД возможны дубли
• `LIMIT 1` не гарантирует "уникального победителя", если у нескольких одинаковый счёт
• Иногда friendship бывает и симметричной, тогда нужна защита от двойного счёта
👀11👍9❤2🔥2💊1
git clone git@github.com:<your-username>/beekeeper-studio.git beekeeper-studio
cd beekeeper-studio/
yarn install
yarn run electron:serve
Beekeeper Studio без проблем работает на всех платформах: Linux, MacOS и Windows
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍3🔥2🤨2
🧠 SQL-задача с подвохом (Oracle)
Тема: агрегаты, подзапросы, фильтрация без оконных функци
📌 Задача:
Дана таблица
Пример данных:
🧩 Найти:
Выведите отделы, где ЗП всех сотрудников одинаковая, и эту ЗП.
🎯 Подвох:
- многие начинают с
- нужно найти отделы, где MIN(SALARY) = MAX(SALARY), но не забыть, что отдел может содержать одного сотрудника (это корректно)
✅ Ожидаемый результат:
🔍 Решение:
```sql
SELECT DEPT, MIN(SALARY) AS SALARY
FROM EMPLOYEES
GROUP BY DEPT
HAVING MIN(SALARY) = MAX(SALARY);
```
📌 **Пояснение подвоха:**
- `HAVING MIN = MAX` — проверяет, что все значения в группе одинаковые
- Не нужно подзапросов и оконных функций — решение минималистично и эффективно
- Часто используется для поиска «однородных» групп
🧪 Попробуй модифицировать запрос:
• Вывести только те отделы, где **больше одного сотрудника** и ЗП одинаковая
• Или отделы, где все сотрудники получают **разную** ЗП
👍 Лайк, если хотите задачу сложнее
➡ SQL Community
Тема: агрегаты, подзапросы, фильтрация без оконных функци
📌 Задача:
Дана таблица
EMPLOYEES:
CREATE TABLE EMPLOYEES (
ID NUMBER,
DEPT VARCHAR2(50),
SALARY NUMBER
);
Пример данных:
| ID | DEPT | SALARY |
|----|----------|--------|
| 1 | HR | 4000 |
| 2 | HR | 3000 |
| 3 | IT | 5000 |
| 4 | IT | 5000 |
| 5 | Finance | 6000 |
| 6 | Finance | 5500 |🧩 Найти:
Выведите отделы, где ЗП всех сотрудников одинаковая, и эту ЗП.
🎯 Подвох:
- многие начинают с
GROUP BY DEPT, но обычный AVG или SUM не помогут- нужно найти отделы, где MIN(SALARY) = MAX(SALARY), но не забыть, что отдел может содержать одного сотрудника (это корректно)
✅ Ожидаемый результат:
| DEPT | SALARY |
|---------|--------|
| IT | 5000 |🔍 Решение:
`
SELECT DEPT, MIN(SALARY) AS SALARY
FROM EMPLOYEES
GROUP BY DEPT
HAVING MIN(SALARY) = MAX(SALARY);
```
📌 **Пояснение подвоха:**
- `HAVING MIN = MAX` — проверяет, что все значения в группе одинаковые
- Не нужно подзапросов и оконных функций — решение минималистично и эффективно
- Часто используется для поиска «однородных» групп
🧪 Попробуй модифицировать запрос:
• Вывести только те отделы, где **больше одного сотрудника** и ЗП одинаковая
• Или отделы, где все сотрудники получают **разную** ЗП
Please open Telegram to view this post
VIEW IN TELEGRAM
❤28👍15🔥5🤨2
🧠 SQL-задача: "Самая длинная непрерывная сессия"
Условие:
Есть таблица логинов пользователей:
Нужно — для каждого пользователя найти его максимальную по длине цепочку непрерывных ежедневных входов.
Если он заходил 1, 2, 3, 5 и 6 января — самая длинная последовательность без пропусков: 3 дня (1–3 января).
Учитываются только уникальные дни входа (то есть даже если зашёл 3 раза в день — это один день).
Ожидаемый результат:
Решение основано на классической технике: «группировка по смещению».
Шаги:
1. Убираем дубликаты по датам
2. Пронумеровываем строки по `ROW_NUMBER` для каждой даты входа
3. Вычисляем разницу между датой и порядковым номером — она будет **одинакова для цепочки подряд идущих дат**
4. Группируем по этой разности и ищем максимальную длину цепи
Решение (PostgreSQL):
```sql
WITH distinct_dates AS (
SELECT DISTINCT user_id, DATE(login_time) AS login_date
FROM user_logins
),
numbered AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn
FROM distinct_dates
),
grouped AS (
SELECT *,
login_date - INTERVAL '1 day' * rn AS grp
FROM numbered
),
grouped_ranges AS (
SELECT user_id,
MIN(login_date) AS start_date,
MAX(login_date) AS end_date,
COUNT(*) AS chain_length
FROM grouped
GROUP BY user_id, grp
)
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY chain_length DESC) AS rnk
FROM grouped_ranges
) final
WHERE rnk = 1;
```
Как работает:
- `ROW_NUMBER` генерирует позицию в порядке дат
- Вычитание `login_date - rn` создаёт искусственный "ключ", по которому мы группируем
- Внутри группы — последовательные даты
- Выбираем цепочку с максимальной длиной по каждому `user_id`
Почему это задача с подвохом:
• Нельзя решить через простой
• Требуется умение работать с датами, оконными функциями и многоступенчатыми CTE
• Это реальный кейс из аналитики поведения пользователей, встречается в проде
➡ SQL Community
Условие:
Есть таблица логинов пользователей:
CREATE TABLE user_logins (
user_id INT,
login_time TIMESTAMP
);
Нужно — для каждого пользователя найти его максимальную по длине цепочку непрерывных ежедневных входов.
Если он заходил 1, 2, 3, 5 и 6 января — самая длинная последовательность без пропусков: 3 дня (1–3 января).
Учитываются только уникальные дни входа (то есть даже если зашёл 3 раза в день — это один день).
Ожидаемый результат:
| user_id | start_date | end_date | chain_length |
|---------|------------|------------|--------------|
| 101 | 2024-01-01 | 2024-01-03 | 3 |
| 102 | 2024-03-05 | 2024-03-09 | 5 |Решение основано на классической технике: «группировка по смещению».
1. Убираем дубликаты по датам
2. Пронумеровываем строки по `ROW_NUMBER` для каждой даты входа
3. Вычисляем разницу между датой и порядковым номером — она будет **одинакова для цепочки подряд идущих дат**
4. Группируем по этой разности и ищем максимальную длину цепи
Решение (PostgreSQL):
```sql
WITH distinct_dates AS (
SELECT DISTINCT user_id, DATE(login_time) AS login_date
FROM user_logins
),
numbered AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn
FROM distinct_dates
),
grouped AS (
SELECT *,
login_date - INTERVAL '1 day' * rn AS grp
FROM numbered
),
grouped_ranges AS (
SELECT user_id,
MIN(login_date) AS start_date,
MAX(login_date) AS end_date,
COUNT(*) AS chain_length
FROM grouped
GROUP BY user_id, grp
)
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY chain_length DESC) AS rnk
FROM grouped_ranges
) final
WHERE rnk = 1;
```
Как работает:
- `ROW_NUMBER` генерирует позицию в порядке дат
- Вычитание `login_date - rn` создаёт искусственный "ключ", по которому мы группируем
- Внутри группы — последовательные даты
- Выбираем цепочку с максимальной длиной по каждому `user_id`
Почему это задача с подвохом:
• Нельзя решить через простой
GROUP BY • Требуется умение работать с датами, оконными функциями и многоступенчатыми CTE
• Это реальный кейс из аналитики поведения пользователей, встречается в проде
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍7❤5🤨2💊2
🧠 8 полезных советов по Oracle SQL
Если ты уже «умеешь в SELECT», пора прокачать SQL в Oracle до следующего уровня. Эти советы не для новичков — они для тех, кто работает с продом, сложными запросами и оптимизацией.
⚡ 1. Используй `PIVOT`/`UNPIVOT` вместо `CASE`
Поворот таблиц через
🧱 2. Вызывай функции как таблицы (`TABLE()` + PL/SQL)
Если функция возвращает коллекцию, её можно SELECT’ить напрямую:
🚀 3. Генерация чисел без тормозов
🔍 4. Помогай оптимизатору через `CARDINALITY` hint
Oracle может ошибаться в оценке количества строк. Подскажи ему:
🧠 5. Используй `RESULT_CACHE` для повторяемых данных
Снизь нагрузку:
📉 6. Никогда не делай `ORDER BY` без `FETCH FIRST` или `ROWNUM`
Не сортируй всё зря:
📦 7. Управляй CTE через `MATERIALIZE` и `INLINE`
Это может влиять на производительность:
📊 8. Освой `MODEL` для расчётов как в Excel
Рядовые и прогнозные расчёты в SQL без курсоров:
💡 Не ограничивайся SELECT — используй весь потенциал Oracle SQL.
👍 Лайк и сохраняй себе, чтобы не потерять
➡ SQL Community | Чат
Если ты уже «умеешь в SELECT», пора прокачать SQL в Oracle до следующего уровня. Эти советы не для новичков — они для тех, кто работает с продом, сложными запросами и оптимизацией.
⚡ 1. Используй `PIVOT`/`UNPIVOT` вместо `CASE`
Поворот таблиц через
PIVOT делает код чище и легче масштабируется.
SELECT * FROM (
SELECT department_id, gender, salary FROM employees
)
PIVOT (
SUM(salary) FOR gender IN ('M' AS male_salary, 'F' AS female_salary)
);
🧱 2. Вызывай функции как таблицы (`TABLE()` + PL/SQL)
Если функция возвращает коллекцию, её можно SELECT’ить напрямую:
SELECT * FROM TABLE(my_package.get_active_users(SYSDATE));
🚀 3. Генерация чисел без тормозов
CONNECT BY LEVEL — это медленно. Лучше так:
SELECT rownum FROM dual CONNECT BY rownum <= 10000;
🔍 4. Помогай оптимизатору через `CARDINALITY` hint
Oracle может ошибаться в оценке количества строк. Подскажи ему:
SELECT /*+ cardinality(e 100000) */ * FROM employees e ...
🧠 5. Используй `RESULT_CACHE` для повторяемых данных
Снизь нагрузку:
SELECT /*+ RESULT_CACHE */ * FROM country_codes;
📉 6. Никогда не делай `ORDER BY` без `FETCH FIRST` или `ROWNUM`
Не сортируй всё зря:
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 10 ROWS ONLY;
📦 7. Управляй CTE через `MATERIALIZE` и `INLINE`
Это может влиять на производительность:
WITH /*+ MATERIALIZE */ heavy_part AS (...)
SELECT * FROM heavy_part WHERE rownum = 1;
📊 8. Освой `MODEL` для расчётов как в Excel
Рядовые и прогнозные расчёты в SQL без курсоров:
SELECT * FROM sales
MODEL
PARTITION BY (region)
DIMENSION BY (month)
MEASURES (sales)
RULES (
sales[13] = sales[12] * 1.1
);
💡 Не ограничивайся SELECT — используй весь потенциал Oracle SQL.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍13❤4🤔2💊2🔥1🤨1
🧩 SQL-задача с подвохом (Oracle): рейтинг клиентов по заказам
У тебя есть таблица заказов:
Данные:
🎯 Задача:
Напиши SQL-запрос, который для каждого
• сумму всех заказов (`SUM(amount)`) — учитывай только строки, где
• количество заказов (включая `NULL`-значения)
• рейтинг клиента (`RANK()`), где самый высокий
• если у клиента
⚠️ Подвох:
Oracle по умолчанию сортирует
💡 Ожидаемый результат:
✅ Решение:
```sql
SELECT
customer_id,
SUM(amount) AS sum_amount,
COUNT(*) AS order_count,
RANK() OVER (
ORDER BY SUM(amount) DESC NULLS LAST
) AS rank
FROM orders
GROUP BY customer_id;
```
🔍 Почему это работает:
• автоматически пропускает , то есть считает только валидные суммы
• считает все строки, даже с
• сортирует по убыванию суммы, а гарантирует, что клиенты без суммы окажутся в конце рейтинга
📌 Вывод:
Даже опытные аналитики иногда забывают, что чувствителен к и что Oracle требует явного указания , чтобы избежать неочевидных ошибок.
➡ SQL Community | Чат
У тебя есть таблица заказов:
CREATE TABLE orders (
order_id NUMBER PRIMARY KEY,
customer_id NUMBER,
amount NUMBER,
order_date DATE
);
Данные:
| order_id | customer_id | amount | order_date |
|----------|-------------|--------|------------|
| 1 | 101 | 500 | 01-JAN-24 |
| 2 | 102 | 300 | 02-JAN-24 |
| 3 | 103 | NULL | 02-JAN-24 |
| 4 | 101 | 700 | 03-JAN-24 |
| 5 | 102 | NULL | 04-JAN-24 |
| 6 | 104 | 400 | 05-JAN-24 |
| 7 | 103 | 200 | NULL |🎯 Задача:
Напиши SQL-запрос, который для каждого
customer_id вернёт:• сумму всех заказов (`SUM(amount)`) — учитывай только строки, где
amount не NULL • количество заказов (включая `NULL`-значения)
• рейтинг клиента (`RANK()`), где самый высокий
SUM(amount) получает ранг 1 • если у клиента
SUM(amount) NULL, он должен получить последний ранг⚠️ Подвох:
Oracle по умолчанию сортирует
NULL в ORDER BY либо вверх, либо вниз в зависимости от ASC или DESC. Это влияет на оконную функцию RANK(). Если не указать NULLS LAST, клиент с NULL в SUM(amount) может получить ранг 1 — что неверно.💡 Ожидаемый результат:
| customer_id | sum_amount | order_count | rank |
|-------------|------------|-------------|------|
| 101 | 1200 | 2 | 1 |
| 104 | 400 | 1 | 2 |
| 102 | 300 | 2 | 3 |
| 103 | 200 | 2 | 4 |
✅ Решение:
```sql
SELECT
customer_id,
SUM(amount) AS sum_amount,
COUNT(*) AS order_count,
RANK() OVER (
ORDER BY SUM(amount) DESC NULLS LAST
) AS rank
FROM orders
GROUP BY customer_id;
```
🔍 Почему это работает:
•
SUM(amount)NULL•
COUNT(*)NULL•
RANK()NULLS LAST📌 Вывод:
Даже опытные аналитики иногда забывают, что
RANK()NULLNULLS LASTPlease open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3🔥2🥱1🤨1
🧠 Хитрая SQL-задача на Oracle: кто не продал — тот тоже в списке
У вас есть таблица
Данные:
🎯 Задача:
Вывести
Но — обязательно включать продавцов, у которых все продажи NULL, и считать, что их сумма равна 0.
---
### ❗ Подвохы:
-
- Нужно сравнивать 0 с
- Надо корректно сгруппировать по региону и учитывать, где NULL'ы не попадают в
---
✅ Решение:
```sql
SELECT s.salesman_id
FROM (
SELECT
salesman_id,
region,
NVL(SUM(amount), 0) AS total_sales
FROM sales
GROUP BY salesman_id, region
) s
JOIN (
SELECT
region,
AVG(amount) AS avg_region_sales
FROM sales
WHERE amount IS NOT NULL
GROUP BY region
) r
ON s.region = r.region
WHERE s.total_sales < r.avg_region_sales;
```
🧠 Разбор:
1. В подзапросе `s`:
- `SUM(amount)` по продавцу → `NULL`, если продаж нет
- `NVL(..., 0)` превращает такие NULL в 0
2. В подзапросе `r`:
- `AVG(amount)` по региону, игнорируя NULL
- Только валидные продажи участвуют в средней
3. Сравниваем: **продавцы с 0 продаж тоже идут в сравнение**
💡 Вывод:
Этот запрос:
- корректно считает продажи даже для "нулевых" продавцов
- использует `NVL()` и фильтрацию `WHERE amount IS NOT NULL`
- демонстрирует знание поведения агрегатных функций и подзапросов
👀 На собеседованиях часто забывают, что `SUM(NULL)` даёт `NULL`, и сравнение с `AVG` не срабатывает без `NVL`.
➡ SQL Community | Чат
У вас есть таблица
sales:
CREATE TABLE sales (
salesman_id NUMBER,
region VARCHAR2(50),
amount NUMBER
);
Данные:
| salesman_id | region | amount |
|-------------|------------|--------|
| 101 | 'North' | 200 |
| 101 | 'North' | NULL |
| 102 | 'North' | 150 |
| 103 | 'North' | NULL |
| 104 | 'South' | 300 |
| 105 | 'South' | NULL |
🎯 Задача:
Вывести
salesman_id тех продавцов, чья сумма продаж в своём регионе меньше средней по региону, учитывая только те записи, где `amount` не NULL. Но — обязательно включать продавцов, у которых все продажи NULL, и считать, что их сумма равна 0.
---
### ❗ Подвохы:
-
SUM() и AVG() игнорируют NULL, но если у человека *все* значения NULL, SUM вернёт NULL.- Нужно сравнивать 0 с
AVG, а не NULL.- Надо корректно сгруппировать по региону и учитывать, где NULL'ы не попадают в
AVG.---
✅ Решение:
```sql
SELECT s.salesman_id
FROM (
SELECT
salesman_id,
region,
NVL(SUM(amount), 0) AS total_sales
FROM sales
GROUP BY salesman_id, region
) s
JOIN (
SELECT
region,
AVG(amount) AS avg_region_sales
FROM sales
WHERE amount IS NOT NULL
GROUP BY region
) r
ON s.region = r.region
WHERE s.total_sales < r.avg_region_sales;
```
🧠 Разбор:
1. В подзапросе `s`:
- `SUM(amount)` по продавцу → `NULL`, если продаж нет
- `NVL(..., 0)` превращает такие NULL в 0
2. В подзапросе `r`:
- `AVG(amount)` по региону, игнорируя NULL
- Только валидные продажи участвуют в средней
3. Сравниваем: **продавцы с 0 продаж тоже идут в сравнение**
💡 Вывод:
Этот запрос:
- корректно считает продажи даже для "нулевых" продавцов
- использует `NVL()` и фильтрацию `WHERE amount IS NOT NULL`
- демонстрирует знание поведения агрегатных функций и подзапросов
👀 На собеседованиях часто забывают, что `SUM(NULL)` даёт `NULL`, и сравнение с `AVG` не срабатывает без `NVL`.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🥱3❤2🔥1🤨1
🔥 Polars: шпаргалка
Polars ≠ Pandas. Это колоночный движок, вдохновлённый Rust и SQL. Никаких
🚀 Быстрый старт
📊 Выборка и фильтрация
• Комбинированные условия:
---
## ⚙️ Трансформации
• Вычисление новых колонок:
• Удаление/переименование:
•
🧠 Группировка и агрегаты
• Агрегация с кастомной функцией:
---
## 🪄 Ленивая обработка (LazyFrame)
✅ Всё оптимизируется *до выполнения* — pushdown, predicate folding, projection pruning.
🔥 Joins
Варианты:
📂 Работа с файлами
Ленивая загрузка:
---
## 🧮 Аналитика и окна
🧱 Структуры, списки, explode
• Работа с вложенными списками:
🧪 Полезные фичи
• Проверка типов:
• Проверка на null:
• Заполнение:
• Выбор n лучших:
📦 Советы и best practices
• Используй
• Избегай
• Сохраняй
•
✅ Polars: минимализм, скорость, безопасность.
Polars ≠ Pandas. Это колоночный движок, вдохновлённый Rust и SQL. Никаких
SettingWithCopyWarning — всё иммутабельно и параллелится.🚀 Быстрый старт
import polars as pl
df = pl.DataFrame({
"id": [1, 2, 3],
"name": ["Alice", "Bob", "Charlie"],
"score": [95, 85, 100]
})
📊 Выборка и фильтрация
df.filter(pl.col("score") > 90)
df.select(pl.col("name").str.lengths())
df[df["id"] == 2]
• Комбинированные условия:
df.filter((pl.col("score") > 80) & (pl.col("name").str.contains("A")))
---
## ⚙️ Трансформации
• Вычисление новых колонок:
df.with_columns([
(pl.col("score") / 100).alias("percent"),
pl.col("name").str.to_uppercase().alias("name_upper")
])
• Удаление/переименование:
df.drop("id").rename({"name": "username"})
•
apply() — только если нельзя обойтись иначе:
df.with_columns(
pl.col("score").map_elements(lambda x: x * 2).alias("doubled")
)
🧠 Группировка и агрегаты
df.groupby("name").agg([
pl.col("score").mean().alias("avg_score"),
pl.count()
])
• Агрегация с кастомной функцией:
df.groupby("name").agg(
(pl.col("score") ** 2).mean().sqrt().alias("rms")
)
---
## 🪄 Ленивая обработка (LazyFrame)
lf = df.lazy()
result = (
lf
.filter(pl.col("score") > 90)
.with_columns(pl.col("score").log().alias("log_score"))
.sort("log_score", descending=True)
.collect()
)
✅ Всё оптимизируется *до выполнения* — pushdown, predicate folding, projection pruning.
🔥 Joins
df1.join(df2, on="id", how="inner")
Варианты:
"inner", "left", "outer", "cross", "semi", "anti"📂 Работа с файлами
pl.read_csv("data.csv")
df.write_parquet("out.parquet")
pl.read_json("file.json", json_lines=True)
Ленивая загрузка:
pl.read_parquet("big.parquet", use_pyarrow=True).lazy()
---
## 🧮 Аналитика и окна
df.with_columns([
pl.col("score").rank("dense").over("group").alias("rank"),
pl.col("score").mean().over("group").alias("group_avg")
])
🧱 Структуры, списки, explode
df = pl.DataFrame({
"id": [1, 2],
"tags": [["a", "b"], ["c"]]
})
df.explode("tags")
• Работа с вложенными списками:
df.select(pl.col("tags").list.lengths())
🧪 Полезные фичи
• Проверка типов:
df.schema
df.dtypes
• Проверка на null:
df.filter(pl.col("score").is_null())
• Заполнение:
df.fill_null("forward")
• Выбор n лучших:
df.sort("score", descending=True).head(5)
📦 Советы и best practices
• Используй
lazy() для производительности.• Избегай
.apply() — если можешь, используй pl.col().map_elements() или векторные выражения.• Сохраняй
schema — удобно при пайплайнах данных.•
@pl.api.register_expr_namespace("yourns") — добавляй кастомные методы как namespace.✅ Polars: минимализм, скорость, безопасность.
❤12👍5🔥4🥱1
🛠️ Bob
• генератор кода
• ORM-подход
• гибкий конструктор SQL-запросов
📌 Что умеет Bob:
🔹 Генерация моделей и фабрик
Автоматически создаёт Go-код по схеме вашей базы данных. Ускоряет работу с моделями и минимизирует ручную писанину.
🔹 Поддержка PostgreSQL, MySQL, SQLite
Работает с самыми популярными базами данных — удобно для любых проектов.
🔹 Генерация типобезопасного кода из SQL
Как в
🔹 Гибкий конструктор запросов
Строит SQL-запросы на Go с читабельным синтаксисом — без ручной сборки строк.
🔹 Поддержка связей (associations)
Автоматически определяет связи между таблицами по внешним ключам. Включает
📚 Подробнее:
▪ GitHub: https://github.com/stephenafamo/bob
▪ Документация: https://bob.stephenafamo.com/docs/code-generation/intro
Если ты работаешь с Go и SQL — попробуй Bob. Это как
Bob — это универсальный инструмент для работы с SQL в Go, который сочетает в себе:• генератор кода
• ORM-подход
• гибкий конструктор SQL-запросов
📌 Что умеет Bob:
🔹 Генерация моделей и фабрик
Автоматически создаёт Go-код по схеме вашей базы данных. Ускоряет работу с моделями и минимизирует ручную писанину.
🔹 Поддержка PostgreSQL, MySQL, SQLite
Работает с самыми популярными базами данных — удобно для любых проектов.
🔹 Генерация типобезопасного кода из SQL
Как в
sqlc, но с поддержкой дополнительных ORM-фич.🔹 Гибкий конструктор запросов
Строит SQL-запросы на Go с читабельным синтаксисом — без ручной сборки строк.
🔹 Поддержка связей (associations)
Автоматически определяет связи между таблицами по внешним ключам. Включает
has-one, has-many, has-many-through и др.📚 Подробнее:
▪ GitHub: https://github.com/stephenafamo/bob
▪ Документация: https://bob.stephenafamo.com/docs/code-generation/intro
Если ты работаешь с Go и SQL — попробуй Bob. Это как
sqlc, но с усиленной ORM-магией.🤨5❤4👍4🔥2💊2❤🔥1🥱1
🗃️ Stoolap — лёгкая и быстрая SQL-база данных на чистом Go без зависимостей
Stoolap — это современный HTAP-движок (Hybrid Transactional/Analytical Processing), сочетающий OLTP и OLAP в одном ядре. Подходит как для транзакционных задач, так и для аналитики.
🚀 Возможности:
• Полностью написан на Go — никаких внешних зависимостей
• ACID-транзакции через MVCC
• Колонковое хранение с SIMD-ускорением
• Поддержка SQL: JOIN, агрегаты, оконные функции
• Встроенный тип JSON
• Поддержка
• CLI-режим и in-memory база
📦 Установка:
🔥 Быстрый старт (CLI):
📎 Репозиторий: https://github.com/stoolap/stoolap
🌐 Сайт: https://stoolap.io
@golang_google
Stoolap — это современный HTAP-движок (Hybrid Transactional/Analytical Processing), сочетающий OLTP и OLAP в одном ядре. Подходит как для транзакционных задач, так и для аналитики.
🚀 Возможности:
• Полностью написан на Go — никаких внешних зависимостей
• ACID-транзакции через MVCC
• Колонковое хранение с SIMD-ускорением
• Поддержка SQL: JOIN, агрегаты, оконные функции
• Встроенный тип JSON
• Поддержка
database/sql и интеграция с GORM • CLI-режим и in-memory база
📦 Установка:
go get github.com/stoolap/stoolap
🔥 Быстрый старт (CLI):
stoolap -db memory://
📎 Репозиторий: https://github.com/stoolap/stoolap
🌐 Сайт: https://stoolap.io
@golang_google
🔥5❤2👍1🤨1💊1
🚀 Представлен Apache Spark 4.0 — крупнейший релиз с момента запуска Spark 2.0
Databricks анонсировали Spark 4.0 с множеством фундаментальных улучшений производительности и архитектуры.
Новый релиз фокусируется на ускорении обработки, поддержке GenAI-нагрузок и расширенной масштабируемости.
🔥 Что нового:
• 💡 Project Tungsten++, Catalyst++ — переработка движка исполнения и оптимизации запросов
• 🧠 Поддержка генеративных AI-запросов — Spark теперь эффективнее работает с LLM-нагрузками
• ⚙️ Новый Execution Engine — более 2× ускорение в среднем, до 10× в некоторых кейсах
• 📦 Модульная архитектура — теперь ядро Spark отделено от MLlib, GraphX и др.
• 🌐 Поддержка нового Shuffle-движка и улучшенное распределение по кластерам
• 🧪 Обратная несовместимость — Spark 4.0 требует миграции, особенно для UDF и кастомных оптимизаций
📌 Подробности и тесты:
https://www.databricks.com/blog/introducing-apache-spark-40
@data_analysis_ml
Databricks анонсировали Spark 4.0 с множеством фундаментальных улучшений производительности и архитектуры.
Новый релиз фокусируется на ускорении обработки, поддержке GenAI-нагрузок и расширенной масштабируемости.
🔥 Что нового:
• 💡 Project Tungsten++, Catalyst++ — переработка движка исполнения и оптимизации запросов
• 🧠 Поддержка генеративных AI-запросов — Spark теперь эффективнее работает с LLM-нагрузками
• ⚙️ Новый Execution Engine — более 2× ускорение в среднем, до 10× в некоторых кейсах
• 📦 Модульная архитектура — теперь ядро Spark отделено от MLlib, GraphX и др.
• 🌐 Поддержка нового Shuffle-движка и улучшенное распределение по кластерам
• 🧪 Обратная несовместимость — Spark 4.0 требует миграции, особенно для UDF и кастомных оптимизаций
📌 Подробности и тесты:
https://www.databricks.com/blog/introducing-apache-spark-40
@data_analysis_ml
🥱5❤2👍1🔥1
Forwarded from Data Science. SQL hub
SQL_cheatsheet.pdf
754.9 KB
⚡️ SQL-шпаргалка, которая выручит в интервью, проекте и проде
Полный мастер-гайд по SQL в одном PDF: практичные примеры, чёткие объяснения и никакой воды.
Что внутри:
• 💬 Создание баз, таблиц и изменение схем
• 💬 Запросы любого уровня сложности: JOIN, GROUP BY, HAVING, PARTITION
• 💬 Подзапросы, CTE, оконные функции: ROW_NUMBER, RANK, DENSE_RANK
• 💬 VIEW, временные таблицы и работа с дубликатами
• 💬 Даты, строки, преобразования и агрегации
• 💬 Очистка данных, разбиение по разделителям
• 💬 UNION, INTERSECT, EXCEPT — управление сложными выборками
Затрагиваются и продвинутые кейсы:
• Парсинг адресов
• Кастомная сортировка
• Использование ISNULL и COALESCE
🧠 Это не просто набор команд — это концентрат боевого SQL-опыта.
Подходит для:
➡️ Подготовки к SQL-интервью
➡️ BI и аналитики
➡️ Web-разработки с базами
➡️ Встраивания SQL в проекты на Python, Go, Java и других языках
Полный мастер-гайд по SQL в одном PDF: практичные примеры, чёткие объяснения и никакой воды.
Что внутри:
• 💬 Создание баз, таблиц и изменение схем
• 💬 Запросы любого уровня сложности: JOIN, GROUP BY, HAVING, PARTITION
• 💬 Подзапросы, CTE, оконные функции: ROW_NUMBER, RANK, DENSE_RANK
• 💬 VIEW, временные таблицы и работа с дубликатами
• 💬 Даты, строки, преобразования и агрегации
• 💬 Очистка данных, разбиение по разделителям
• 💬 UNION, INTERSECT, EXCEPT — управление сложными выборками
Затрагиваются и продвинутые кейсы:
• Парсинг адресов
• Кастомная сортировка
• Использование ISNULL и COALESCE
🧠 Это не просто набор команд — это концентрат боевого SQL-опыта.
Подходит для:
➡️ Подготовки к SQL-интервью
➡️ BI и аналитики
➡️ Web-разработки с базами
➡️ Встраивания SQL в проекты на Python, Go, Java и других языках
❤5👍5🔥1🤨1
🧩 SQL-задача с подвохом: "Сотрудники без продаж в 2024 году"
У тебя есть две таблицы:
📌 Задание:
Найди всех сотрудников, у которых не было ни одной продажи в 2024 году.
💣 **Подвох:**
Многие делают
А нужно — у кого не было продаж именно в 2024 году, даже если они были в 2023 или 2022.
💡 **Подсказки:**
• Отфильтруй
• Используй
• Ищи
---
✅ Решение с `LEFT JOIN`:
```sql
SELECTe.name
FROM employees e
LEFT JOIN (
SELECT * FROM sales
WHERE sale_date >= '2024-01-01' AND sale_date < '2025-01-01'
) s ONe.id = s.employee_id
WHERE s.id IS NULL;
```
---
🔄 **Альтернатива с `NOT EXISTS`:**
```sql
SELECT name
FROM employees e
WHERE NOT EXISTS (
SELECT 1
FROM sales s
WHERE s.employee_id = e.id
AND s.sale_date >= '2024-01-01'
AND s.sale_date < '2025-01-01'
);
```
---
🎯 Отличная задача, чтобы понять, **где правильно ставить фильтрацию по дате**, и чем `LEFT JOIN` отличается от `NOT EXISTS`.
У тебя есть две таблицы:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR
);
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
employee_id INT,
sale_amount NUMERIC,
sale_date DATE
);
📌 Задание:
Найди всех сотрудников, у которых не было ни одной продажи в 2024 году.
💣 **Подвох:**
Многие делают
LEFT JOIN sales ON ... WHERE sale.id IS NULL, но это покажет только тех, у кого вообще не было продаж. А нужно — у кого не было продаж именно в 2024 году, даже если они были в 2023 или 2022.
💡 **Подсказки:**
• Отфильтруй
sales по дате (`2024-01-01` до `2024-12-31`) • Используй
LEFT JOIN или NOT EXISTS • Ищи
NULL только после фильтра---
✅ Решение с `LEFT JOIN`:
```sql
SELECT
FROM employees e
LEFT JOIN (
SELECT * FROM sales
WHERE sale_date >= '2024-01-01' AND sale_date < '2025-01-01'
) s ON
WHERE
```
---
🔄 **Альтернатива с `NOT EXISTS`:**
```sql
SELECT name
FROM employees e
WHERE NOT EXISTS (
SELECT 1
FROM sales s
WHERE s.employee_id =
AND s.sale_date >= '2024-01-01'
AND s.sale_date < '2025-01-01'
);
```
---
🎯 Отличная задача, чтобы понять, **где правильно ставить фильтрацию по дате**, и чем `LEFT JOIN` отличается от `NOT EXISTS`.
👍10🔥8😁2❤1🤨1
🧠 SkyRL-SQL — лёгкий RL-подход для Text-to-SQL от NovaSky, который превзошёл GPT-4o и o4-mini, обучаясь всего на 653 примерах!
📌 Что это:
SkyRL-SQL — это эффективный RL-фреймворк для генерации SQL-запросов из текста.
Модель
📊 Результаты на Spider-бенчмарках:
🔍 Особенности:
• RL-обучение по шагам с интерактивной проверкой
• Поддержка уточнения SQL на основе ошибок
• Обучение всего на 653 примерах
• Превосходит более крупные модели на практике
GitHub: https://github.com/NovaSky-AI/SkyRL
Блог: https://novasky-ai.github.io/posts/skyrl-sql
🧪 Отличный пример того, как можно бить гигантов с умной архитектурой, а не только размерами.
📌 Github
📌 Что это:
SkyRL-SQL — это эффективный RL-фреймворк для генерации SQL-запросов из текста.
Модель
SkyRL-SQL-7B обучена с нуля с использованием обучения с подкреплением (reinforcement learning), без гигантских датасетов.📊 Результаты на Spider-бенчмарках:
| Модель | Spider-Dev | Spider-Test | Realistic | DK | Syn | Среднее |
|--------------------|------------|-------------|-----------|------|------|---------|
| GPT-4o | 81.3 | 82.4 | 80.1 | 72.1 | 71.9 | 77.6 |
| o4-mini | 80.6 | 81.8 | 81.2 | 70.8 | 72.1 | 77.3 |
| **SkyRL-SQL-7B** | **83.9** | **85.2** | **81.1** | 72.0 | 73.7 | **79.2** |🔍 Особенности:
• RL-обучение по шагам с интерактивной проверкой
• Поддержка уточнения SQL на основе ошибок
• Обучение всего на 653 примерах
• Превосходит более крупные модели на практике
GitHub: https://github.com/NovaSky-AI/SkyRL
Блог: https://novasky-ai.github.io/posts/skyrl-sql
🧪 Отличный пример того, как можно бить гигантов с умной архитектурой, а не только размерами.
📌 Github
👍5❤4🔥2
Forwarded from Data Science. SQL hub
🛠️ Что нового в SQLite — свежие обновления и улучшения
🔗 https://www.sqlite.org/changes.html
SQLite — одна из самых популярных встраиваемых баз данных в мире, и каждое обновление приносит не только исправления, но и серьёзные улучшения производительности и безопасности.
Вот ключевые изменения из последних версий:
🆕 SQLite 3.46.0 (май 2024)
- Добавлена поддержка
- Новый флаг
- Оптимизации для
- Улучшено поведение
🧪 Расширенные тесты:
- SQLite теперь использует дополнительный fuzzing для анализа стабильности ядра при высоких нагрузках и необычных SQL
🧹 Также исправлены:
- Ошибки в индексах при сложной комбинации
- Утечка памяти при специфическом использовании
💡 SQLite остаётся одной из самых лёгких, надёжных и удобных баз данных, которую можно использовать буквально везде: от браузеров и мобильных приложений до IoT и CLI-утилит.
📚 Полный список изменений — здесь:
https://www.sqlite.org/changes.html
@sqlhub
🔗 https://www.sqlite.org/changes.html
SQLite — одна из самых популярных встраиваемых баз данных в мире, и каждое обновление приносит не только исправления, но и серьёзные улучшения производительности и безопасности.
Вот ключевые изменения из последних версий:
🆕 SQLite 3.46.0 (май 2024)
- Добавлена поддержка
contentless-delete для таблиц FTS5 — меньше места, выше скорость - Новый флаг
SQLITE_DBCONFIG_STMT_SCANSTATUS — можно отключать сбор статистики по выполнению запросов - Оптимизации для
LEFT JOIN + OR условий в WHERE — запросы выполняются заметно быстрее - Улучшено поведение
WITHOUT ROWID таблиц с составными ключами🧪 Расширенные тесты:
- SQLite теперь использует дополнительный fuzzing для анализа стабильности ядра при высоких нагрузках и необычных SQL
🧹 Также исправлены:
- Ошибки в индексах при сложной комбинации
JOIN + USING - Утечка памяти при специфическом использовании
PRAGMA function_list💡 SQLite остаётся одной из самых лёгких, надёжных и удобных баз данных, которую можно использовать буквально везде: от браузеров и мобильных приложений до IoT и CLI-утилит.
📚 Полный список изменений — здесь:
https://www.sqlite.org/changes.html
@sqlhub
❤3👍3🔥2🤨1
🔥 CTE + DELETE — это комбинация общего табличного выражения (Common Table Expression, CTE) и оператора DELETE, которая позволяет удобно удалять строки из таблицы, особенно в случаях, когда удаление зависит от сложного подзапроса или JOIN-ов.
🔍 Что такое CTE?
CTE (WITH выражение) — это временный набор данных, определённый перед основным SQL-запросом.
🧹 Зачем использовать CTE с DELETE?
Упрощает чтение и понимание кода при сложных условиях.
Позволяет использовать JOIN, ROW_NUMBER() и другие функции перед удалением.
Избавляет от подзапросов в WHERE, которые иногда трудно читать.
📌 Пример: Удалить дубликаты по email, оставив только один
🧠 Здесь:
CTE duplicates присваивает каждой строке номер внутри группы одинаковых email.
Удаляем все строки, где rn > 1 — то есть дубликаты.
📌 Пример: Удаление с JOIN
📌 Поддержка:
Работает в PostgreSQL, SQL Server, Oracle (с USING или WITH).
В MySQL с 8.0+ CTE поддерживаются, но DELETE с CTE может потребовать подзапрос.
🔍 Что такое CTE?
CTE (WITH выражение) — это временный набор данных, определённый перед основным SQL-запросом.
🧹 Зачем использовать CTE с DELETE?
Упрощает чтение и понимание кода при сложных условиях.
Позволяет использовать JOIN, ROW_NUMBER() и другие функции перед удалением.
Избавляет от подзапросов в WHERE, которые иногда трудно читать.
📌 Пример: Удалить дубликаты по email, оставив только один
WITH duplicates AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users
WHERE id IN (
SELECT id FROM duplicates WHERE rn > 1
);
🧠 Здесь:
CTE duplicates присваивает каждой строке номер внутри группы одинаковых email.
Удаляем все строки, где rn > 1 — то есть дубликаты.
📌 Пример: Удаление с JOIN
WITH to_delete AS (
SELECT u.id
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'cancelled'
)
DELETE FROM users
WHERE id IN (SELECT id FROM to_delete);
📌 Поддержка:
Работает в PostgreSQL, SQL Server, Oracle (с USING или WITH).
В MySQL с 8.0+ CTE поддерживаются, но DELETE с CTE может потребовать подзапрос.
👍12❤7😁2💊2🔥1