Что нужно уметь и знать, чтобы устроиться аналитиком? 🔥
Нам часто задают вопрос: «А что нужно знать, чтобы быстро устроиться аналитиком в крутую компанию на хорошую зарплату?»
Мы подготовили для вас список навыков, которые вам точно нужно освоить для комфортного трудоустройства.
🧠 Знания:
- Продуктовые метрики (MAU/WAU/DAU, retention, LTV, Lifetime, CAC, CPL, CR и т.д.)
- Математическая статистика, теория вероятностей
- А/B тестирование и проверка гипотез
🧑💻 Навыки:
- SQL на продвинутом уровне
- Базовый синтаксис Python на высоком уровне
- Библиотеки Python для анализа данных (Numpy, Pandas)
- Библиотеки Python для визуализации данных (Matplotlib, Seaborn, Plotly)
🛠 Инструменты:
- BI-системы (Power BI, Metabase/Redash/Superset)
- Git / Github
Что еще нужно уметь?
- Приносить пользу для бизнеса. Нужно не просто уметь писать SQL-запросы, а подобрать нужный вид анализа под задачу, провести аналитику с помощью SQL и сгенерировать выводы.
- Собрать портфолио. Когда ты только в начале пути — правильно оформленное резюме/портфолио — ключ к успеху.
- Уметь проходить собеседования. Тестовые задания и технические собеседования — всегда большой стресс. Нужно иметь высокий уровень подготовки и натренированность, чтобы достойно проходить все этапы найма.
В целом, это основной арсенал, который понадобится вам при поиске работы в сфере анализа данных. Выглядит массивно, согласитесь? 🙄
Кстати, если вы только присматриваетесь к сфере аналитики или уже находитесь в процессе изучения и хотите глубже прокачать свои знания и практические скиллы, то приглашаем вас на нашу специальную программу — Симулятор «Аналитик данных» 🤩
Это большая образовательная программа, где вы в 12 модулях последовательно получаете все необходимые навыки и знания для освоения профессии аналитика данных. Вот несколько важных вещей, за счет которых ваше обучение будет намного эффективней, чем на обычном курсе:
◾️ Упор на практику — каждый урок сопровождается большим количеством практических заданий.
◾️ Бизнес-кейсы — все обучение происходит на кейсах из реального бизнеса, а вы с первого дня учитесь решать задачи, за которые работодатель готов платить большие деньги. Мы не поддерживаем обучение на «яблоках» и «апельсинах» — мы за «обучение в бою».
◾️ Комбинированный формат в каждом уроке — видеолекции, текстовые уроки, конспекты, практическая часть.
◾️ Поддержка наставника — наши преподаватели всегда готовы прийти на помощь, разъяснить непонятную тему или направить в нужном направлении.
И это далеко не все! Записывайтесь на нашу персональную онлайн-экскурсию в Симулятор “Аналитик данных” и посмотрите, как устроено обучение своими глазами 👀
👉🏻 Записаться на экскурсию — https://forms.gle/qSyfrudojoZpodYaA
Нам часто задают вопрос: «А что нужно знать, чтобы быстро устроиться аналитиком в крутую компанию на хорошую зарплату?»
Мы подготовили для вас список навыков, которые вам точно нужно освоить для комфортного трудоустройства.
🧠 Знания:
- Продуктовые метрики (MAU/WAU/DAU, retention, LTV, Lifetime, CAC, CPL, CR и т.д.)
- Математическая статистика, теория вероятностей
- А/B тестирование и проверка гипотез
🧑💻 Навыки:
- SQL на продвинутом уровне
- Базовый синтаксис Python на высоком уровне
- Библиотеки Python для анализа данных (Numpy, Pandas)
- Библиотеки Python для визуализации данных (Matplotlib, Seaborn, Plotly)
🛠 Инструменты:
- BI-системы (Power BI, Metabase/Redash/Superset)
- Git / Github
Что еще нужно уметь?
- Приносить пользу для бизнеса. Нужно не просто уметь писать SQL-запросы, а подобрать нужный вид анализа под задачу, провести аналитику с помощью SQL и сгенерировать выводы.
- Собрать портфолио. Когда ты только в начале пути — правильно оформленное резюме/портфолио — ключ к успеху.
- Уметь проходить собеседования. Тестовые задания и технические собеседования — всегда большой стресс. Нужно иметь высокий уровень подготовки и натренированность, чтобы достойно проходить все этапы найма.
В целом, это основной арсенал, который понадобится вам при поиске работы в сфере анализа данных. Выглядит массивно, согласитесь? 🙄
Кстати, если вы только присматриваетесь к сфере аналитики или уже находитесь в процессе изучения и хотите глубже прокачать свои знания и практические скиллы, то приглашаем вас на нашу специальную программу — Симулятор «Аналитик данных» 🤩
Это большая образовательная программа, где вы в 12 модулях последовательно получаете все необходимые навыки и знания для освоения профессии аналитика данных. Вот несколько важных вещей, за счет которых ваше обучение будет намного эффективней, чем на обычном курсе:
◾️ Упор на практику — каждый урок сопровождается большим количеством практических заданий.
◾️ Бизнес-кейсы — все обучение происходит на кейсах из реального бизнеса, а вы с первого дня учитесь решать задачи, за которые работодатель готов платить большие деньги. Мы не поддерживаем обучение на «яблоках» и «апельсинах» — мы за «обучение в бою».
◾️ Комбинированный формат в каждом уроке — видеолекции, текстовые уроки, конспекты, практическая часть.
◾️ Поддержка наставника — наши преподаватели всегда готовы прийти на помощь, разъяснить непонятную тему или направить в нужном направлении.
И это далеко не все! Записывайтесь на нашу персональную онлайн-экскурсию в Симулятор “Аналитик данных” и посмотрите, как устроено обучение своими глазами 👀
👉🏻 Записаться на экскурсию — https://forms.gle/qSyfrudojoZpodYaA
❤7🔥6👍2👎1
😎Спойлер к задаче с War-code😎
Мы разобрали задачи war-code.ru и решили заспойлерить вам подсказку, которая пригодится вам в решении задачек 😏 Речь о функции SQL
Чтобы не портить удовольствие от решения настоящей задачи, мы рассмотрим работу
Нам нужна таблица с датами и количеством посещений. Запрос будет выглядеть следующим образом:
Кажется, здесь все в порядке, но если мы внимательнее посмотрим на ось дат, то увидим, что некоторые из них отсутствуют 😱
А все дело в том, что с 10/05 по 10/07 никто не заходил на платформу, и запрос не смог ничего сгруппировать в те дни. Аналогично с 10/11 по 10/14. Такие графики могут серьезно сбить с толку, ведь не всегда можно заметить пропущенные даты. Показать такое инвесторам, конечно, здорово, но нечестно. А честно будет в подобных задачах использовать
Как это работает?
🔵 Простейший пример, возвращающий список чисел от
Вот, например, все даты от
❗️Чтобы избежать разрывов, можно использовать
✅ Задача выполнена, наш сет и график соответствуют действительности.
Кажется, мы полностью вас подготовили, так что приглашаем попробовать ваши силы в задаче «Data Engineering» на war-code.ru 💪
Мы разобрали задачи war-code.ru и решили заспойлерить вам подсказку, которая пригодится вам в решении задачек 😏 Речь о функции SQL
generate_series. Чтобы не портить удовольствие от решения настоящей задачи, мы рассмотрим работу
generate_series на другом примере. Давайте построим график посещения нашими пользователями сайта war-code 👨💻 Нам нужна таблица с датами и количеством посещений. Запрос будет выглядеть следующим образом:
SELECTПосмотрите на картинку 1 👀
eventtime::date AS days,
COUNT(*) AS "User Visits"
FROM warcode
WHERE
eventtime > current_date -
interval '14 day'
AND eventtime <
date_trunc('day', current_date)
GROUP BY 1
ORDER BY 1;
Кажется, здесь все в порядке, но если мы внимательнее посмотрим на ось дат, то увидим, что некоторые из них отсутствуют 😱
А все дело в том, что с 10/05 по 10/07 никто не заходил на платформу, и запрос не смог ничего сгруппировать в те дни. Аналогично с 10/11 по 10/14. Такие графики могут серьезно сбить с толку, ведь не всегда можно заметить пропущенные даты. Показать такое инвесторам, конечно, здорово, но нечестно. А честно будет в подобных задачах использовать
generate_series(). Как это работает?
generate_series(start, stop, step) - это функция, которая возвращает набор строк и принимает два обязательных аргумента, start и stop, и один необязательный, step. 🔵 Простейший пример, возвращающий список чисел от
1 до 5: SELECT generate_series(1, 5)📅
Generate_series может принимать не только числа, но и даты (чтобы сгенерировать список дат). Тогда, в качестве шага, обязательно используйте интервал. Вот, например, все даты от
'2023-10-01' до '2023-10-14' с интервалом в один день: SELECT generate_series(
'2023-10-01'::timestamp,
'2023-10-14'::timestamp,
'1 day'::interval)::date
AS days
;
Возвращаемся к нашему графику. Уже знаете, что мы будем делать? Мы отдельно напишем генерацию даты в CTE, а затем с помощью left join добавим таблицу с ранее рассчитанными данными: WITH generated_days AS (Теперь в нашем итоговом сете есть несколько дней со значениями
SELECT generate_series(
'2023-10-01'::timestamp,
'2023-10-10'::timestamp,
'1 day'::interval)::date
AS days
)
SELECT days, "User Visits"
FROM generated_days
LEFT JOIN (
SELECT
eventtime::date AS days,
count(*) AS "User Visits"
FROM warcode
WHERE eventtime >
current_date -
interval '14 day'
AND eventtime < date_trunc('day', current_date)
GROUP BY 1
) t USING (days)
ORDER BY 1;
NULL в графе посещение пользователей. Cет выглядит определенно правдивее. ❗️Чтобы избежать разрывов, можно использовать
coalesce() и поставить значение 0 для пустых полей. SELECT days, COALESCE("User Visits", 0);
Итак, наш итоговый сет готов, чтобы на основе него построить график зависимости посещения пользователей от даты. Посмотрите на картинку 2. ✅ Задача выполнена, наш сет и график соответствуют действительности.
Кажется, мы полностью вас подготовили, так что приглашаем попробовать ваши силы в задаче «Data Engineering» на war-code.ru 💪
🔥5❤4👍3🤩1
Как тестить гипотезы быстро? 🔥
Давайте обсудим типичную задачу аналитика. Вам нужно проанализировать эффективность email-рассылок в вашей компании и предложить алгоритм:
Как писать письма, которые продают
Ок, есть задача - надо делать. Для начала,разобьем письма на значимые признаки . Например:
* Тема письма
* Содержание письма (полезность, информация про компанию, акция)
* Call to action (купи, подпишись, заполни форму, перейди по ссылке)
* Стилистика (формальная, мемная, casual)
А теперь нужно протестировать, что работает лучше. Стандартный подход -забить болт запускать A/B тесты. То есть делить всю базу подписчиков на 2 равных группы и тестировать 2 разных заголовка (остальное одинаковое). Потом еще 2 разных заголовка. Потом 2 победителя между собой. Потом то же самое для остальных признаков.
Если рассылки вы делаете 1-2 раза в неделю - можете представить, сколько времени займет такой тест?... Одним словом - много. Его результат будет уже просто неактуален.
И как быть? 🧐
Есть способ решения этой проблемы - MVT или многопараметрическое тестирование. Это фреймворк, который обязан знать каждый аналитик - он сокращает время на тесты в десятки раз и существенно повышает качество теста.
Подробно про MVT и как его использовать рассказал наш CEO, Андрон, в своем телеграм-канале.
🔗 Ссылка на пост: https://news.1rj.ru/str/andron_233/8
Андрон много пишет про аналитику, метрики и делится практическим опытом. Если вы интересуетесь аналитикой, то обязательно подпишитесь по ссылке ниже.
🔗 Ссылка на канал: https://news.1rj.ru/str/andron_233
P.S. Сегодня вышел новый пост про ABCD-сегментацию клиентов, а скоро будет новый про аналитику в SMM и гранулярность признаков 😉
Давайте обсудим типичную задачу аналитика. Вам нужно проанализировать эффективность email-рассылок в вашей компании и предложить алгоритм:
Как писать письма, которые продают
Ок, есть задача - надо делать. Для начала,
* Тема письма
* Содержание письма (полезность, информация про компанию, акция)
* Call to action (купи, подпишись, заполни форму, перейди по ссылке)
* Стилистика (формальная, мемная, casual)
А теперь нужно протестировать, что работает лучше. Стандартный подход -
Если рассылки вы делаете 1-2 раза в неделю - можете представить, сколько времени займет такой тест?... Одним словом - много. Его результат будет уже просто неактуален.
И как быть? 🧐
Есть способ решения этой проблемы - MVT или многопараметрическое тестирование. Это фреймворк, который обязан знать каждый аналитик - он сокращает время на тесты в десятки раз и существенно повышает качество теста.
Подробно про MVT и как его использовать рассказал наш CEO, Андрон, в своем телеграм-канале.
🔗 Ссылка на пост: https://news.1rj.ru/str/andron_233/8
Андрон много пишет про аналитику, метрики и делится практическим опытом. Если вы интересуетесь аналитикой, то обязательно подпишитесь по ссылке ниже.
🔗 Ссылка на канал: https://news.1rj.ru/str/andron_233
P.S. Сегодня вышел новый пост про ABCD-сегментацию клиентов, а скоро будет новый про аналитику в SMM и гранулярность признаков 😉
🔥8👍7❤5
🖐 Всем привет!
Мы на днях обсуждали, какие каналы читают наши сотрудники и когда уделяют время самообразованию 📚
🕰 Оказалось, наш аналитик добирается до соц сетей только перед сном, а вот преподаватель блока по математике заряжается контентом по утрам. А вы что скажете?
Проголосуйте в опросе 😃
Мы на днях обсуждали, какие каналы читают наши сотрудники и когда уделяют время самообразованию 📚
🕰 Оказалось, наш аналитик добирается до соц сетей только перед сном, а вот преподаватель блока по математике заряжается контентом по утрам. А вы что скажете?
Проголосуйте в опросе 😃
😁3🔥2
Когда вы выкрадываете время для самообразования? 😉
Anonymous Poll
5%
Рано утром (до 7.00)
16%
Утром (с 8.00 до 12.00)
10%
Днём (с 12.00 до 16.00)
11%
Вечером (с 16.00 до 19.00)
45%
Поздним вечером (с 19.00 до 21.00)
43%
По ночам (после 21.00)
👨🏫 Кстати, вот несколько каналов, в которые мы активно заглядываем:
🔹 https://news.1rj.ru/str/prometriki
🔹 https://news.1rj.ru/str/andron_233
🔹 https://news.1rj.ru/str/data_new_gold
📖 А какие образовательные каналы вам нравятся? Пишите в комментариях 👇
🔹 https://news.1rj.ru/str/prometriki
🔹 https://news.1rj.ru/str/andron_233
🔹 https://news.1rj.ru/str/data_new_gold
📖 А какие образовательные каналы вам нравятся? Пишите в комментариях 👇
❤6🔥4
🔥 Базовая Шпаргалка по Работе с Файлами в Python 🔥
Работа с файлами в Python - это важная часть обработки данных и автоматизации задач. Мы подготовили для вас базовую шпаргалку с основными операциями для работы с файлами.
✅ Открытие файла для чтения
✅ Чтение по строкам
✅ Запись в файл
✅ Добавление в файл
✅ Чтение и запись в бинарных файлах
✅ Работа с контекстом
✅ Проверка наличия файла
✅ Удаление файла
✅ Создание директори
✅ Список файлов в директории
✅ Использование библиотеки shutil
✅ Использование библиотеки os
И для удобства мы сделали для вас notebook 😊
Сохраняйте и пользуйтесь 👇
https://colab.research.google.com/drive/1CqADXAdImiAQ9VIYYzYGdwIuiXQrAF7K?usp=sharing
Если у вас есть какие-либо дополнения, не стесняйтесь оставлять в комментариях!
#python
Работа с файлами в Python - это важная часть обработки данных и автоматизации задач. Мы подготовили для вас базовую шпаргалку с основными операциями для работы с файлами.
✅ Открытие файла для чтения
✅ Чтение по строкам
✅ Запись в файл
✅ Добавление в файл
✅ Чтение и запись в бинарных файлах
✅ Работа с контекстом
✅ Проверка наличия файла
✅ Удаление файла
✅ Создание директори
✅ Список файлов в директории
✅ Использование библиотеки shutil
✅ Использование библиотеки os
И для удобства мы сделали для вас notebook 😊
Сохраняйте и пользуйтесь 👇
https://colab.research.google.com/drive/1CqADXAdImiAQ9VIYYzYGdwIuiXQrAF7K?usp=sharing
Если у вас есть какие-либо дополнения, не стесняйтесь оставлять в комментариях!
#python
👍11🔥7❤3
Ищем junior-аналитика к себе в команду! 🔥
У нас сегодня огненная новость - ищем в команду на один из наших проектов заряженного junior-аналитика, который готов впитывать кучу новой информации и быстро развиваться на стыке аналитики и Data Science.
Требования к кандидату:
- Знание Python + Pandas - обязательно
- Английский на уровне чтения литературы и документации - обязательно
- Базовое знание статистики и математики - приветствуется
- Опыт работы с базовыми алгоритмами DS (PCA, ANOVA, кластеризация и т.д.) - приветствуется
Все необходимые знания можно добрать в процессе - главное владеть питоном и быть готовым быстро обучаться 🙂
Чем предстоит заниматься:
Мы строим продукт на стыке маркетинга и аналитики, который позволяет рекламодателям экономить миллоны бюджета за счет data-driven маркетинга. Мы умеем разбирать рекламные креативы на десятки признаков - слова, объекты, цвета и т.д. Ваша задача - под руководством опытного наставника генерировать идеи, тестировать разные алгоритмы на этих данных и улучшать продукт.
Задачи бомбически интересные, беклог полон идей + это классная возможность стартануть карьеру в международном стартапе с возможностью быстрого перехода в Data Science.
Что мы предлагаем:
- Обучение в бою и быстрый профессиональный рост с нуля до опытного аналитика/DS под руководством опытного наставника
- Комфортные условия труда - удаленка, гибкий график, з/п по договоренности
- Крутая строчка в резюме + рекомендации от CEO международного стартапа
- Возможность быстро вырасти внутри компании и получить опцион
- Никакой бюрократии, общение напрямую с CTO, совместные мозгоштурмы и полный креатив
Если вам заходит - скорей отправляйте свое резюме нашему CEO Андрону в личку + напишите пару слов, почему мы должны выбрать именно вас.
P.S. Вакансия горящая, принимать решение будем быстро, так что не затягивайте 😉
P.P.S. Не тратьте много времени на резюме - лучше расскажите, почему вы классный и почему мы сработаемся.
У нас сегодня огненная новость - ищем в команду на один из наших проектов заряженного junior-аналитика, который готов впитывать кучу новой информации и быстро развиваться на стыке аналитики и Data Science.
Требования к кандидату:
- Знание Python + Pandas - обязательно
- Английский на уровне чтения литературы и документации - обязательно
- Базовое знание статистики и математики - приветствуется
- Опыт работы с базовыми алгоритмами DS (PCA, ANOVA, кластеризация и т.д.) - приветствуется
Все необходимые знания можно добрать в процессе - главное владеть питоном и быть готовым быстро обучаться 🙂
Чем предстоит заниматься:
Мы строим продукт на стыке маркетинга и аналитики, который позволяет рекламодателям экономить миллоны бюджета за счет data-driven маркетинга. Мы умеем разбирать рекламные креативы на десятки признаков - слова, объекты, цвета и т.д. Ваша задача - под руководством опытного наставника генерировать идеи, тестировать разные алгоритмы на этих данных и улучшать продукт.
Задачи бомбически интересные, беклог полон идей + это классная возможность стартануть карьеру в международном стартапе с возможностью быстрого перехода в Data Science.
Что мы предлагаем:
- Обучение в бою и быстрый профессиональный рост с нуля до опытного аналитика/DS под руководством опытного наставника
- Комфортные условия труда - удаленка, гибкий график, з/п по договоренности
- Крутая строчка в резюме + рекомендации от CEO международного стартапа
- Возможность быстро вырасти внутри компании и получить опцион
- Никакой бюрократии, общение напрямую с CTO, совместные мозгоштурмы и полный креатив
Если вам заходит - скорей отправляйте свое резюме нашему CEO Андрону в личку + напишите пару слов, почему мы должны выбрать именно вас.
P.S. Вакансия горящая, принимать решение будем быстро, так что не затягивайте 😉
P.P.S. Не тратьте много времени на резюме - лучше расскажите, почему вы классный и почему мы сработаемся.
🔥8👍7❤1
🔥 Разбор вопросов из актуального теста от компании Kaspersky 🚀
Недавно Касперский проводил входные тестирования на стажировку, и мы решили для вас эти тесты и сейчас поделимся разбором части вопросов.
А когда этот пост наберет 15 огоньков, разберем с вами продолжение этого теста.
Вопрос 1: Выберите запросы, которые не упадут с ошибкой.
1. Все вернут ошибку
2. SELECT ID, NAME, COUNT(*) FROM T1 GROUP BY ID, NAME;
3. SELECT COUNT(ID), * FROM T1 GROUP BY (ID);
4. SELECT COUNT(ID), * FROM T1 GROUP BY (ID) HAVING AGE>18;
5. SELECT * FROM T1 GROUP BY (COL1);
6. SELECT COUNT(ID) FROM T1 HAVING AGE>18;
✅ Ответы и объяснения:
1. SELECT ID, NAME, COUNT(*) FROM T1 GROUP BY ID, NAME; - Не вызовет ошибку.
Этот запрос выберет уникальные комбинации столбцов ID и NAME из таблицы T1, подсчитает количество строк в каждой комбинации и выведет результат.
2. SELECT COUNT(ID), * FROM T1 GROUP BY (ID); - Вызовет ошибку.
В операторе GROUP BY указан столбец ID, который используют для группировки результатов. Но когда используется агрегатная функция COUNT(ID), SQL ожидает, что также будут указаны, какие другие столбцы должны быть включены в результат, если они не являются частью агрегации.
3. SELECT COUNT(ID), * FROM T1 GROUP BY (ID) HAVING AGE>18; - Вызовет ошибку.
Аналогично предыдущему запросу.
4. SELECT * FROM T1 GROUP BY (COL1); - Вызовет ошибку.
При использовании оператора GROUP BY, обычно требуется агрегировать столбцы, которые не включены в часть выражения GROUP BY. В данном случае, используют оператор *, чтобы выбрать все столбцы, но не предоставляете агрегатную функцию для столбцов, не включенных в GROUP BY. Такой запрос будет считаться некорректным.
5. SELECT COUNT(ID) FROM T1 HAVING AGE>18; - Вызовет ошибку.
Ошибка связана с использованием оператора HAVING, который обычно используется для фильтрации результатов агрегатных функций, примененных к данным, сгруппированным с помощью оператора GROUP BY. Но в запросе отсутствует оператор GROUP BY, поэтому использование HAVING без GROUP BY будет рассматриваться как некорректное использование.
Вопрос 2: Какого типа данных не встретишь в SQL?
1. MEDIUMINT
2. SMALLINT
3. BIGINT
4. COMMENT
5. AUTO_INCREMENT
6. NULL
7. IDENTITY
8. TINYINT
9. DECIMAL
✅ Ответ:COMMENT, AUTO_INCREMENT, IDENTITY. Эти три опции не являются типами данных в SQL, а представляют собой различные атрибуты или свойства столбцов.
Вопрос 3: Вам необходимо очистить все содержимое таблицы. Каким запросом вы воспользуетесь?
Выберите один вариант из списка
1. DELETE FROM
2. TRUNCATE
3. DROP TABLE
4. TRUNCATE
5. DROP TABLE
Ответы и объяснения:
1. DELETE FROM my_schema.old_table WHERE NAME IS NULL;
Этот запрос удаляет строки из таблицы, удовлетворяющие условию "WHERE NAME IS NULL". Это не полная очистка таблицы.
2. TRUNCATE my_schema.old_table WHERE NAME IS NULL;
TRUNCATE TABLE не поддерживает использование WHERE для фильтрации строк, и данная комбинация вызовет ошибку.
3. DROP TABLE my_schema.old_table;
DROP TABLE удаляет всю таблицу, а не только её содержимое.
4. TRUNCATE my_schema.old_table;
Правильный вариант для очистки содержимого таблицы. Этот запрос удалит все строки из таблицы, но оставит саму таблицу в базе данных.
5. DROP TABLE my_schema.old_table WHERE NAME IS NULL;
DROP TABLE не поддерживает использование WHERE для фильтрации строк, и данная комбинация вызовет ошибку.
Итак, правильный запрос для очистки содержимого таблицы - TRUNCATE my_schema.old_table
💥 Мы стараемся максимально подготовить вас к собеседованиям и верим в вас! Не забудь нажать огонек, чтобы мы запостили продолжение.
#sql #Kaspersky #interview_problems
Недавно Касперский проводил входные тестирования на стажировку, и мы решили для вас эти тесты и сейчас поделимся разбором части вопросов.
А когда этот пост наберет 15 огоньков, разберем с вами продолжение этого теста.
Вопрос 1: Выберите запросы, которые не упадут с ошибкой.
1. Все вернут ошибку
2. SELECT ID, NAME, COUNT(*) FROM T1 GROUP BY ID, NAME;
3. SELECT COUNT(ID), * FROM T1 GROUP BY (ID);
4. SELECT COUNT(ID), * FROM T1 GROUP BY (ID) HAVING AGE>18;
5. SELECT * FROM T1 GROUP BY (COL1);
6. SELECT COUNT(ID) FROM T1 HAVING AGE>18;
✅ Ответы и объяснения:
Этот запрос выберет уникальные комбинации столбцов ID и NAME из таблицы T1, подсчитает количество строк в каждой комбинации и выведет результат.
2. SELECT COUNT(ID), * FROM T1 GROUP BY (ID); - Вызовет ошибку.
В операторе GROUP BY указан столбец ID, который используют для группировки результатов. Но когда используется агрегатная функция COUNT(ID), SQL ожидает, что также будут указаны, какие другие столбцы должны быть включены в результат, если они не являются частью агрегации.
3. SELECT COUNT(ID), * FROM T1 GROUP BY (ID) HAVING AGE>18; - Вызовет ошибку.
Аналогично предыдущему запросу.
4. SELECT * FROM T1 GROUP BY (COL1); - Вызовет ошибку.
При использовании оператора GROUP BY, обычно требуется агрегировать столбцы, которые не включены в часть выражения GROUP BY. В данном случае, используют оператор *, чтобы выбрать все столбцы, но не предоставляете агрегатную функцию для столбцов, не включенных в GROUP BY. Такой запрос будет считаться некорректным.
5. SELECT COUNT(ID) FROM T1 HAVING AGE>18; - Вызовет ошибку.
Ошибка связана с использованием оператора HAVING, который обычно используется для фильтрации результатов агрегатных функций, примененных к данным, сгруппированным с помощью оператора GROUP BY. Но в запросе отсутствует оператор GROUP BY, поэтому использование HAVING без GROUP BY будет рассматриваться как некорректное использование.
1. MEDIUMINT
2. SMALLINT
3. BIGINT
4. COMMENT
5. AUTO_INCREMENT
6. NULL
7. IDENTITY
8. TINYINT
9. DECIMAL
✅ Ответ:
Выберите один вариант из списка
1. DELETE FROM
my_schema.old_table WHERE NAME IS NULL;2. TRUNCATE
my_schema.old_table WHERE NAME IS NULL;3. DROP TABLE
my_schema.old_table;4. TRUNCATE
my_schema.old_table;5. DROP TABLE
my_schema.old_table WHERE NAME IS NULL;Ответы и объяснения:
Этот запрос удаляет строки из таблицы, удовлетворяющие условию "WHERE NAME IS NULL". Это не полная очистка таблицы.
2. TRUNCATE my_schema.old_table WHERE NAME IS NULL;
TRUNCATE TABLE не поддерживает использование WHERE для фильтрации строк, и данная комбинация вызовет ошибку.
3. DROP TABLE my_schema.old_table;
DROP TABLE удаляет всю таблицу, а не только её содержимое.
4. TRUNCATE my_schema.old_table;
Правильный вариант для очистки содержимого таблицы. Этот запрос удалит все строки из таблицы, но оставит саму таблицу в базе данных.
5. DROP TABLE my_schema.old_table WHERE NAME IS NULL;
DROP TABLE не поддерживает использование WHERE для фильтрации строк, и данная комбинация вызовет ошибку.
Итак, правильный запрос для очистки содержимого таблицы - TRUNCATE my_schema.old_table
#sql #Kaspersky #interview_problems
🔥62👍9❤4
📊🔍Разница между оконными и агрегатными функциями
Основное различие между оконными и агрегатными функциями заключается в том, КАК они обрабатывают данные:
Агрегатные функции сворачивают несколько строк в одну строку результата. Они выполняют операцию над набором строк, сгруппированных по определенным критериям, и возвращают единственное значение для каждой группы. Например, функции
Оконные функции, напротив, предоставляют результаты для каждой отдельной строки в наборе данных. Они выполняют агрегатную операцию над набором строк, но результат отображается как новое значение столбца в каждой строке. Оконные функции позволяют анализировать данные на уровне строк, не сворачивая их. Некоторые функции, такие как
Для наглядности, представьте себе задачу: вернуть название отдела и максимальную зарплату в каждом отделе.
Используем агрегатные функции:
Используем оконные функции:
Вопрос о разнице между оконными и агрегатными функциями часто встречается на собеседованиях. Уверены, теперь вы точно ответите на этот вопрос, если столкнетесь с ним 😎
#sql #interview_problems
Основное различие между оконными и агрегатными функциями заключается в том, КАК они обрабатывают данные:
Агрегатные функции сворачивают несколько строк в одну строку результата. Они выполняют операцию над набором строк, сгруппированных по определенным критериям, и возвращают единственное значение для каждой группы. Например, функции
SUM(), AVG(), MAX() и MIN() являются агрегатными функциями.Оконные функции, напротив, предоставляют результаты для каждой отдельной строки в наборе данных. Они выполняют агрегатную операцию над набором строк, но результат отображается как новое значение столбца в каждой строке. Оконные функции позволяют анализировать данные на уровне строк, не сворачивая их. Некоторые функции, такие как
SUM(), AVG(), MAX() и MIN(), могут использоваться как оконные функции.Для наглядности, представьте себе задачу: вернуть название отдела и максимальную зарплату в каждом отделе.
Используем агрегатные функции:
SELECT department,В этом случае мы получаем одну запись на каждый отдел (см. карточку 1).
MAX(salary) AS max_salary
FROM employee
GROUP BY department
Используем оконные функции:
SELECT employee_name,Здесь мы получим для каждой строки в исходных данных максимальную зарплату в соответствующем отделе (см. карточку 2).
salary,
department,
MAX(salary) OVER (PARTITION BY
department) AS max_salary
FROM employee
Вопрос о разнице между оконными и агрегатными функциями часто встречается на собеседованиях. Уверены, теперь вы точно ответите на этот вопрос, если столкнетесь с ним 😎
#sql #interview_problems
👍26🔥7❤4
📊 Работа с пропущенными данными - Восстановление и удаление данных
Пропущенные данные - распространенная проблема в анализе данных. Иногда значения отсутствуют, тогда они обозначаются в виде вопросительных знаков ❓, нулей 0️⃣ или пустых ячеек.
Например, в таблице нормализованных потерь есть пропущенное значение, обозначенное как
Давайте сначала создадим датафрейм для примера (см. в карточках под постом)
Как обработать пропущенные данные?
Каждая ситуация уникальна, и подход к ней должен быть индивидуальным. Давайте начнем с восстановления данных.
1 Способ: Восстановление данных
Самый лучший способ, конечно, восстановить данные, если у вас есть доступ к дополнительной информации. Этот способ обеспечивает наиболее точные результаты. Сделать это можно так:
2 Способ: Удаление данных
Но, к сожалению, не всегда данные можно восстановить из источника.
Тогда можно попробовать просто удалить строки или столбцы с пропущенными данными. Если вы анализируете цену и другие атрибуты вам не важны, то отсутствие информации о цене может повлиять на ваши выводы (например, при расчете среднего). В этом случае лучше удалить строки с отсутствующей ценой, чтобы не включать их в расчет.
Этот способ будет актуальным, если у вас много данных и небольшое количество пропусков.
Обработка пропущенных данных может быть сложной задачей, но правильный подход к ней позволяет извлечь более точную информацию из ваших данных.
Сегодня мы разобрали, как заполнять пропущенные данные и удалять их. А когда наберем 25 👍 , подробно расскажем вам про замену средним и случаи, когда стоит оставить пропуски 😉
#python #pandas
Пропущенные данные - распространенная проблема в анализе данных. Иногда значения отсутствуют, тогда они обозначаются в виде вопросительных знаков ❓, нулей 0️⃣ или пустых ячеек.
Например, в таблице нормализованных потерь есть пропущенное значение, обозначенное как
NaN.Давайте сначала создадим датафрейм для примера (см. в карточках под постом)
Как обработать пропущенные данные?
Каждая ситуация уникальна, и подход к ней должен быть индивидуальным. Давайте начнем с восстановления данных.
1 Способ: Восстановление данных
Самый лучший способ, конечно, восстановить данные, если у вас есть доступ к дополнительной информации. Этот способ обеспечивает наиболее точные результаты. Сделать это можно так:
# Заполнение пропущенных значений на основе дополнительной информацииРезультат смотрите в карточках
df.loc[df['Модель'] == 'Outback', 'Цена'] = 17625
df.loc[df['Модель'] == 'Civic', 'Потери'] = 150
df.loc[df['Модель'] == 'Mustang', 'Тип топлива'] = 'Дизель'
2 Способ: Удаление данных
Но, к сожалению, не всегда данные можно восстановить из источника.
Тогда можно попробовать просто удалить строки или столбцы с пропущенными данными. Если вы анализируете цену и другие атрибуты вам не важны, то отсутствие информации о цене может повлиять на ваши выводы (например, при расчете среднего). В этом случае лучше удалить строки с отсутствующей ценой, чтобы не включать их в расчет.
Этот способ будет актуальным, если у вас много данных и небольшое количество пропусков.
# Удаление строк с пропущенными значениями в столбце "Цена"Результат смотрите в карточках
df = df.dropna(subset=['Цена'])
Обработка пропущенных данных может быть сложной задачей, но правильный подход к ней позволяет извлечь более точную информацию из ваших данных.
Сегодня мы разобрали, как заполнять пропущенные данные и удалять их. А когда наберем 25 👍 , подробно расскажем вам про замену средним и случаи, когда стоит оставить пропуски 😉
#python #pandas
👍25🔥3😁2
А мы продолжаем разбор актуального теста от компании Kaspersky 🚀😊
Когда этот пост наберет 30 🔥огоньков, подкинем еще вопросов😉
Вопрос 1
* В таблице T1 больше строк, чем в T2.
* В таблице Т2 есть все значения из T1, а в Т1 не все из T2.
Выберите все варианты запросов, в результате которых будет выведено все содержимое таблицы T1 и количество строк в результате будет равняться количеству строк исходной T1.
1. SELECT * FROM T2 LEFT JOIN T1 ON (T1.key = T2.key);
2. SELECT * FROM T2 JOIN T1 ON (T1.key = T2.key);
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
4. SELECT * FROM T1;
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Ответы и объяснения:
1. SELECT * FROM T2 LEFT JOIN T1 ON (T1.key = T2.key);
Этот запрос не подходит, так как он начинает соединение с T2 и включает все строки из T2 и только совпадающие строки из T1. Он не возвращает все строки из T1.
2. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Этот запрос не подходит, так как INNER JOIN выбирает только совпадающие строки из T1 и T2, но не возвращает все строки из T1.
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Аналогично предыдущему.
✅ 4. SELECT * FROM T1;
Этот запрос подходит, так как он выбирает все строки из T1 без соединения с T2. Это то, что нам нужно, чтобы получить все содержимое таблицы T1.
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
Этот запрос также не подходит. Он использует RIGHT JOIN, чтобы включить все строки из T2 и только совпадающие строки из T1. Остальные строки будут заполнены значениями NULL.
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
Не подходит аналогично 2 и 3.
✅ 7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Этот запрос подходит, так как это LEFT JOIN, который включает все строки из T1 и только совпадающие строки из T2.
Вопрос 2: В результате каких запросов выведутся строки, заканчивающиеся на "lab"?
1. SELECT Name FROM T1 WHERE RIGHT(Name, 3) = 'lab'
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Ответы и объяснения:
✅ 1. SELECT Name FROM T1 WHERE RIGHT(Name, 3) = 'lab'
Подходит. Этот запрос выберет строки, в которых последние три символа в столбце `Name` равны "lab". Это подходящий вариант, если все имена завершаются на "lab". Например, "testlab" будет выбрано, но "laboratory" - нет.
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых в столбце `Name` есть подстрока "lab" в любой части строки.
✅ 3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
Подходит. Этот запрос выберет строки, в которых столбец `Name` оканчивается на "lab". Это подходящий вариант, если вам нужны все строки, где имя заканчивается на "lab".
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых пять последних символов в столбце `Name` содержат подстроку "lab".
Вопрос 3: Расположите конструкции запроса на выдачу прав пользователю в правильном порядке
1. ON
2. GRANT
3. TO
Правильный порядок:
1. GRANT
2. ON
3. TO
Оператор GRANT в SQL используется для выдачи прав доступа к объектам базы данных, таким как таблицы, представления, процедуры и другие. Он предоставляет возможность управления безопасностью данных, определяя, какие действия могут выполнять определенные пользователи или роли в отношении этих объектов.
Пример использования оператора GRANT:
-- Выдача прав на чтение таблицы "employees" пользователю "user1"
GRANT SELECT ON employees TO user1;
Удачи на собеседованиях!
Не забудь нажать огонек 🔥, чтобы мы запостили продолжение.
#sql #Kaspersky #interview_problems
Когда этот пост наберет 30 🔥огоньков, подкинем еще вопросов😉
Вопрос 1
* В таблице T1 больше строк, чем в T2.
* В таблице Т2 есть все значения из T1, а в Т1 не все из T2.
Выберите все варианты запросов, в результате которых будет выведено все содержимое таблицы T1 и количество строк в результате будет равняться количеству строк исходной T1.
1. SELECT * FROM T2 LEFT JOIN T1 ON (T1.key = T2.key);
2. SELECT * FROM T2 JOIN T1 ON (T1.key = T2.key);
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
4. SELECT * FROM T1;
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Ответы и объяснения:
Этот запрос не подходит, так как он начинает соединение с T2 и включает все строки из T2 и только совпадающие строки из T1. Он не возвращает все строки из T1.
2. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Этот запрос не подходит, так как INNER JOIN выбирает только совпадающие строки из T1 и T2, но не возвращает все строки из T1.
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Аналогично предыдущему.
✅ 4. SELECT * FROM T1;
Этот запрос подходит, так как он выбирает все строки из T1 без соединения с T2. Это то, что нам нужно, чтобы получить все содержимое таблицы T1.
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
Этот запрос также не подходит. Он использует RIGHT JOIN, чтобы включить все строки из T2 и только совпадающие строки из T1. Остальные строки будут заполнены значениями NULL.
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
Не подходит аналогично 2 и 3.
✅ 7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Этот запрос подходит, так как это LEFT JOIN, который включает все строки из T1 и только совпадающие строки из T2.
Вопрос 2: В результате каких запросов выведутся строки, заканчивающиеся на "lab"?
1. SELECT Name FROM T1 WHERE RIGHT(Name, 3) = 'lab'
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Ответы и объяснения:
Подходит. Этот запрос выберет строки, в которых последние три символа в столбце `Name` равны "lab". Это подходящий вариант, если все имена завершаются на "lab". Например, "testlab" будет выбрано, но "laboratory" - нет.
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых в столбце `Name` есть подстрока "lab" в любой части строки.
✅ 3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
Подходит. Этот запрос выберет строки, в которых столбец `Name` оканчивается на "lab". Это подходящий вариант, если вам нужны все строки, где имя заканчивается на "lab".
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых пять последних символов в столбце `Name` содержат подстроку "lab".
Вопрос 3: Расположите конструкции запроса на выдачу прав пользователю в правильном порядке
1. ON
2. GRANT
3. TO
Правильный порядок:
2. ON
3. TO
Оператор GRANT в SQL используется для выдачи прав доступа к объектам базы данных, таким как таблицы, представления, процедуры и другие. Он предоставляет возможность управления безопасностью данных, определяя, какие действия могут выполнять определенные пользователи или роли в отношении этих объектов.
Пример использования оператора GRANT:
-- Выдача прав на чтение таблицы "employees" пользователю "user1"
GRANT SELECT ON employees TO user1;
Удачи на собеседованиях!
Не забудь нажать огонек 🔥, чтобы мы запостили продолжение.
#sql #Kaspersky #interview_problems
🔥56😱2
🔥 Бесплатный курс по Pandas!
Мы уже написали множество постов для тех, кто работает с Pandas, и уже очевидно, что его польза неоспорима.
Но все ли вы владеете им свободно? Pandas необходимый инструмент для аналитика данных, и мы хотим, чтобы вы были экспертом в нем. Потому наша команда недавно запустила бесплатный онлайн-курс, где на практических примерах и задачах вы прокачаете навыки и знания по работе с данными с помощью библиотеки Pandas в Python.
Что вас ждет на курсе:
◾️ начнете работать с Pandas на примере реальных аналитических задач (проведете многомерный ABC-анализ, XYZ-анализ, рассчитаете динамику продаж и т.д.)
◾️ изучите все от самых азов до продвинутых функций (например, сложная агрегация, оконные функции и т.д.)
◾️ сделаете собственный проект — ваш итоговый кейс! (реальный кейс автоматизации обработки финансовой отчетности от крупной региональной аптечной сети и добавите его к себе в портфолио)
Если вы только начинаете путь в анализе данных и хотите научиться использовать современные инструменты, мы поможем сделать первый шаг 😉
👉🏻 Зарегистрироваться на курс: ссылка
Мы уже написали множество постов для тех, кто работает с Pandas, и уже очевидно, что его польза неоспорима.
Но все ли вы владеете им свободно? Pandas необходимый инструмент для аналитика данных, и мы хотим, чтобы вы были экспертом в нем. Потому наша команда недавно запустила бесплатный онлайн-курс, где на практических примерах и задачах вы прокачаете навыки и знания по работе с данными с помощью библиотеки Pandas в Python.
Что вас ждет на курсе:
◾️ начнете работать с Pandas на примере реальных аналитических задач (проведете многомерный ABC-анализ, XYZ-анализ, рассчитаете динамику продаж и т.д.)
◾️ изучите все от самых азов до продвинутых функций (например, сложная агрегация, оконные функции и т.д.)
◾️ сделаете собственный проект — ваш итоговый кейс! (реальный кейс автоматизации обработки финансовой отчетности от крупной региональной аптечной сети и добавите его к себе в портфолио)
Если вы только начинаете путь в анализе данных и хотите научиться использовать современные инструменты, мы поможем сделать первый шаг 😉
👉🏻 Зарегистрироваться на курс: ссылка
🔥10👍2❤1🎉1
🎩🐍 Одиночка в Python: Магия Singleton-паттерна✨🪄
Паттерн Singleton - это настоящий гений в мире проектирования классов. Он позволяет нам создать только один экземпляр класса и обеспечить глобальную точку доступа к этому экземпляру. Имея такую возможность, мы можем контролировать доступ к общему ресурсу и гарантировать, что всегда используется один и тот же объект.
Один из способов реализации Singleton в Python - использовать магический метод
Давайте посмотрим на пример:
В этом примере мы создали класс Singleton и объявили переменную
Метод
🤔 Для чего мы используем паттерн Singleton в нашей работе:
- чтобы гарантировать, что у нас есть только один экземпляр класса для доступа к общим ресурсам, таким как база данных, файловая система или настройки приложения,
- чтобы обеспечивать согласованное взаимодействие разных частей нашей системы, используя один единственный объект,
- чтобы управлять количеством создаваемых экземпляров класса и оптимизировать использование наших ресурсов.
❗️ Но будьте осторожны!
Иногда применение Singleton может быть нецелесообразным или даже привести к проблемам. Например Singleton может усложнить расширение функциональности класса, так как он предоставляет только одну точку доступа к объекту.
Подобные тонкости, лайфхаки и фишки мы более подробно разбираем у нас в Симуляторе "Аналитик данных" 🔥
🕵️ А если хотите посмотреть, как устроена наша флагманская обучающая программа изнутри и понять, как вы можете бустануть свою карьеру в аналитике на реальных бизнес-кейсах, то записывайтесь на индивидуальную бесплатную экскурсию!
#python #ООП
Паттерн Singleton - это настоящий гений в мире проектирования классов. Он позволяет нам создать только один экземпляр класса и обеспечить глобальную точку доступа к этому экземпляру. Имея такую возможность, мы можем контролировать доступ к общему ресурсу и гарантировать, что всегда используется один и тот же объект.
Один из способов реализации Singleton в Python - использовать магический метод
__new__. Метод __new__ вызывается при создании нового экземпляра класса и отвечает за его создание. Давайте посмотрим на пример:
class Singleton:
instance = None
def __new__(cls, *args, **kwargs):
if not cls.instance:
cls.instance = super().__new__(cls, *args, **kwargs)
return cls.instance
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # True
В этом примере мы создали класс Singleton и объявили переменную
instance, которая будет хранить единственный экземпляр класса.Метод
__new__ проверяет, существует ли экземпляр класса. Если нет, то он создает новый экземпляр и сохраняет его в переменную instance. При последующих вызовах Singleton() будет возвращаться тот же самый экземпляр. Таким образом, мы гарантируем, что всегда используется только один экземпляр класса.🤔 Для чего мы используем паттерн Singleton в нашей работе:
- чтобы гарантировать, что у нас есть только один экземпляр класса для доступа к общим ресурсам, таким как база данных, файловая система или настройки приложения,
- чтобы обеспечивать согласованное взаимодействие разных частей нашей системы, используя один единственный объект,
- чтобы управлять количеством создаваемых экземпляров класса и оптимизировать использование наших ресурсов.
❗️ Но будьте осторожны!
Иногда применение Singleton может быть нецелесообразным или даже привести к проблемам. Например Singleton может усложнить расширение функциональности класса, так как он предоставляет только одну точку доступа к объекту.
Подобные тонкости, лайфхаки и фишки мы более подробно разбираем у нас в Симуляторе "Аналитик данных" 🔥
🕵️ А если хотите посмотреть, как устроена наша флагманская обучающая программа изнутри и понять, как вы можете бустануть свою карьеру в аналитике на реальных бизнес-кейсах, то записывайтесь на индивидуальную бесплатную экскурсию!
#python #ООП
👍11❤4🔥2👎1