Simulative – Telegram
7.37K subscribers
1.71K photos
71 videos
1 file
1.27K links
Привет! Мы — образовательная платформа в сфере аналитики Simulative: simulative.ru

Создаём курсы-симуляторы, где обучаем не на «апельсинках», а на кейсах из реального бизнеса.

Наш уютный чат: @itresume_chat
Поддержка: @simulative_support
Download Telegram
🔥 Новые крутые фичи на платформе IT Resume

На нашей платформе с задачами по программированию IT Resume произошли большие обновления, и мы спешим с вами поделиться ☺️

💥 Во-первых, вот несколько новых крутых задач, которые вам точно стоит порешать:

[Тестовое Тинькофф] Отчет о зарплате

Это задача по SQL из тестового задания в Тинькофф на позицию Аналитика. Кстати, на платформе есть еще несколько задач из этого цикла - некоторые совсем простые, а над некоторыми придется крепко подумать.

🔗 Ссылка на задачу: ссылка


Сделать из широкой таблицы длинную

Классическая задача на pivot-unpivot в SQL. Недавно сразу 2 человека сказали нам, что встретили эту задачу на собеседованиях в разные компании, поэтому мы решили включить ее сегодня в подборку - обязательно порешайте!

🔗 Ссылка на задачу: ссылка


Поиск опасности

Типичная алгоритмическая задача на Python, которые очень часто встречаются на технических секциях собеседований в любые компании.

🔗 Ссылка на задачу: ссылка


💥 Во-вторых, за последнее время мы внедрили много крутейшего функционала и теперь решать задачи стало еще приятней:

Решения других пользователей

Вы много просили об этом, поэтому мы добавили раздел с решениями других пользователей 😍 Теперь вы не просто можете порешать задачу и посмотреть на эталонное решение, но и познакомиться с решениями других пользователей!

Цветовые схемы в редакторе кода

Теперь вы можете выбрать одну из 4 цветовых тем в редакторе кода, когда решаете задачи. Если любите темную тему - попробуйте cobalt или material, а если светлую - вам зайдет 3024-day.

Шорткаты и автокомплит

Да, долгожданная фича - теперь вы можете отправлять код на проверку/выполнение нажатием одной клавиши, а также воспользоваться автоматическим дополнением кода 🔥

Так что обязательно заглядывайте к нам, чтобы подготовиться к собеседованию, подкачать свой скилл да и просто порешать задачки 😉

🔗 Ссылка на платформу 👉 ссылка 👈
🔥105👍3
🔥 SQL vs Excel

Мы частенько встречаем в требованиях к аналитику - умение пользоваться Excel. Это действительно широко используемый инструмент работы с данными. Но когда дело доходит до сложных анализов и больших объемов данных, есть более удобный и иногда незаменимый инструмент – SQL.

Давайте проведем небольшое сравнение некоторых агрегатных функций в Excel и SQL, и узнаем, почему изучение SQL имеет смысл. Возможно, вы даже сможете доказать работодателю, что ваши навыки SQL круче и ценнее, чем знание Excel!

🟢 COUNT, SUM, AVG

Excel – рабочая лошадка, этот инструмент хорош в вопросах подсчета, суммирования и вычисления среднего. Но когда работать приходится даже с 5000+ строками, он сдает позиции. А для SQL это не проблема, он может сделать те же вычисления и объемы его не пугают:

SELECT COUNT(col) AS count_row,
SUM(col) AS sum_total,
AVG(col) AS avg_total
FROM table
;


С SQL вы получите результаты быстро даже для миллионов записей. Чистая магия! 🔮

🔵 GROUP BY

Одной из ключевых особенностей SQL является группировка данных с помощью GROUP BY. В Excel это можно реализовать с помощью сложных формул или использования сводных таблиц, но это требует куда больше усилий и времени. А SQL легко группирует ваши данные и применяет агрегатные функции к каждой группе:

SELECT category_name, COUNT(*) 
AS count_products
FROM products
GROUP BY category_name;

Удобно, правда?

🟣 Оконные функции

Вот где SQL действительно выделяется. Оконные функции позволяют нам делать вычисления на основе определенного окна данных, а не только по группам, как это делается в Excel. Например, мы можем вычислять скользящее среднее или найти топ-значения в определенном окне. В Excel это потребовало бы использования сложных формул или макросов, в то время как в SQL оконные функции - встроенная возможность.

SELECT date,
value,
AVG(value) OVER (
ORDER BY date ROWS
BETWEEN 2 PRECEDING
AND CURRENT ROW)
AS rolling_average
FROM table_name;

Быстро, легко и главное – коротко!

Итак, можно с уверенностью сказать, что Excel – неплохой выбор для небольших объемов данных, но SQL – это босс. Изучив SQL вы сделаете свою аналитику эффективной и удобной! Поэтому время начать учить SQL и перейти на новый уровень аналитической мощи! 💥

📢 Приглашаем вас на наш Симулятор «Аналитик данных», где мы не просто рассказываем теорию по SQL, Python, продуктовым метрикам и другим темам, но и даем много задач из реальной работы аналитика!

#sql
🔥7👍41
🔍 Быстро и надежно: Избегаем проблем с NumPy! 🔍

Аналитики знают, что NumPy - это мощный инструмент для численных вычислений. Однако, существует одна тонкость, о которой стоит помнить.

Если в массиве NumPy присутствует значение NaN (Not a Number), некоторые агрегатные функции могут вернуть неожиданный результат. И это может оказаться совсем не то, чего вы ожидаете!

import numpy as np
arr = np.array([1, 2, 3, np.NaN])
np.sum(arr) # nan
np.mean(arr) # nan
np.max(arr) # nan

Но не беспокойтесь, у нас есть решение! 👇

🔵 Во-первых, хорошей практикой является проверка массива на наличие значений NaN и их замена, например, на 0. Это поможет избежать проблем в большинстве случаев.

🟠 Однако, есть ещё один способ избежать проблем, который предлагает сам NumPy. Для тех, кто хочет быть на высоте, существуют специальные методы, нечувствительные к значениям NaN! 🚀

Например, вместо использования функций np.sum, np.mean, np.max и др., вы можете воспользоваться np.nansum, np.nanmean, np.nanmax и другими аналогичными методами.

import numpy as np
arr = np.array([1, 2, 3, np.NaN])
np.nansum(arr) # 6.0
np.nanmean(arr) # 2.0
np.nanmax(arr) # 3.0

Их особенностью является то, что они игнорируют значения NaN в массиве и возвращают результат, как будто эти значения не существуют.

Теперь, даже если где-то в вашем массиве присутствует хотя бы одно значение NaN, это уже не повлияет на все остальные вычисления! Вы получите верные и надежные результаты! 💪

💬 Пишите в комментариях, если вам пригодился этот совет или если у вас есть свои хитрости по работе с NumPy! 📚

#python #numpy
🔥24👍61
🔥 Как извлекать данные из JSON в PostgreSQL?

JSON стал популярным форматом данных благодаря своей гибкости и простоте использования. И если вы используете PostgreSQL, то у вас есть доступ ко множеству функций и операторов для работы с JSON- документами. Давайте сегодня разберемся, как извлечь значения полей из JSON с помощью различных операторов.

💡 Сразу обозначим примерный JSON, с которым будем работать:

{
"name": "Ivan Ivanov",
"age": 25,
"person": {
"address": {
"city": "Moscow",
"street": "Pushkina str"
},
"phone": "+7 904 111 22 33"
},
"items": [
{
"name": "Item 1",
"price": 1000
},
{
"name": "Item 2",
"price": 1500
},
{
"name": "Item 3",
"price": 2000
}
]
}
Итак, приступим к разбору!

🔹 Оператор ->

Оператор -> позволяет получать значение определенного поля из JSON-документа по ключу. Для этого необходимо указать путь к нужному полю. Рассмотрим пример:

SELECT json_data -> 'name' 
AS name 
FROM my_table;

Здесь мы извлекаем значение поля name из JSON-документа. Результатом будет столбец name с извлеченными значениями, в нашем случае "Ivan Ivanov" (кавычки так же сохранятся).

🔹 Оператор ->>

Оператор ->> используется для извлечения значения поля в типе text. В отличие от оператора ->, который возвращает значение в формате JSON. Например, получим текстовое значение поля age:

SELECT json_data ->> 'age' 
AS age 
FROM my_table;

Или, аналогично прошлому примеру, можем использовать оператор ->>, чтобы получить результат в текстовом формате.

🔹 Извлечение элементов массива

JSON также позволяет хранить данные в виде массивов. Используя операторы -> и ->>, мы можем извлекать значения элементов массива по индексу. Извлечем первый элемент из массива items:

SELECT json_data-> 'items'-> 0 
AS first_item 
FROM my_table;

🔹 Использование пути для извлечения данных

Если JSON-документ имеет сложную структуру с вложенными объектами, можно использовать путь для указания конкретного поля:

SELECT json_data -> 'person' ->
'address' ->> 'city' AS city 
FROM my_table;

В этом примере мы извлекаем значение поля city, находящегося во вложенном объекте address, который в свою очередь находится в объекте person.

💡 Знание и использование операторов -> и ->> для извлечения данных из JSON в PostgreSQL дает широкие возможности для работы с гибкими иерархическими структурами данных. Это помогает извлекать нужные значения и использовать их в запросах.

P.S. Если вы хотите попробовать самостоятельно запросы из поста, вам понадобится предварительно создать табличку с JSON-файлом. Вы можете сделать это так:

CREATE TABLE my_table (
id serial NOT NULL PRIMARY KEY,
json_data json NOT NULL
);

INSERT INTO my_table (json_data)
VALUES('здесь ваш JSON-файл');

#sql
🔥18👍6
🔥 Match/case со списками и словарями

Признавайтесь, ждали ли вы наш заключительный пост о нашем новом знакомом - match/case? Сегодня испробуем, как он может работать со списками и словарями.

🟢 Надеемся вы уже убедились, что возможности у match/сase огромные. И они далеки от обычного if/else. Со списками, например, мы можем сопоставлять индексы, значения и даже длину списка! Например:

- Используем _ в качестве wildcard (и мы можем добавлять их сколь угодно много)
- Мы можем извлечь значения, присвоив им имя (case [i1, i2, i3])
- *_ звездочка-подчеркивание используется, чтобы брать все оставшиеся элементы

Смотрите код, который у нас получился, на карточке 1 😉

🔵 Что еще можно сделать?

Мы также можем следить за расположением элементов. Например подберем:

- Любой список, начинающийся с А
- Любой список из 3 предметов, начинающийся с Б, а затем А ИЛИ С
- Любой список, где второй элемент с конца - Д

Код с фруктами на карточках 2-3 😉

🟣 Можем ли мы мэтчить словари?

Конечно да! Мы даже можем быть очень точными в наших мэтчах. Например:

- Смэтчить любой словарь с ключом name
- Смэтчить любую str, если она состоит из заглавных букв

Код на карточке 4!

💡 Обратите внимание, что мы проверяем типы, добавляя скобки () после типа класса. И несмотря на то, что мы использовали только str(), это также будет работать и для int().

🔥 Вот такие удивительные вещи может match/case! Расскажите, приходилось ли вам уже использовать его в работе, или вы раньше не были знакомы с этой конструкцией? Или может вы думали, что это простой switch/case? 🤪

#python
🔥9👍3
🔥8👍64
🔥 Полезная команда для анализа данных!

Сегодня хотим обсудить с вами удивительную тему в PostgreSQL, которая поможет вам ускорить и улучшить свои аналитические запросы - материализованные представления (Materialized Views).

🟢 Что такое материализованные представления?

Это специальный тип представлений (view) в PostgreSQL, которые сохраняют результаты выполнения запроса как физическую таблицу в базе данных. При этом данные материализованного представления обновляются только по мере необходимости, когда базовые таблицы изменяются.

Материализованные вьюшки находится между обычным view и таблицей. По сути, они строятся на основе запроса, ссылающегося на одну или несколько таблиц, и результаты хранятся физически, что делает их похожими на кэш.

Это основное отличие от простого view, которое обращается к источнику каждый раз, когда вы его вызываете. То есть, прежде, чем получить результат, вам придется немного подождать.

👉🏼 Теперь представим, что у вас есть сложный запрос, который часто выполняется для получения отчетов или анализа данных. Использование материализованных представлений может значительно ускорить процесс выполнения запроса и уменьшить нагрузку на базу данных.

1️⃣ Во-первых, это ускорит запросы: Поскольку данные уже предварительно вычислены и сохранены в таблице, выполнение запросов становится намного быстрее.

2️⃣ Во-вторых, снизит нагрузки на базу данных: Представления обновляются только по мере необходимости, что позволяет снизить количество обращений к базовым таблицам и оптимизировать работу с данными.

3️⃣ В третьих, их просто легко использовать: Материализованные представления могут быть использованы так же, как и обычные таблицы, что делает их удобными и гибкими для аналитических запросов.


🔵 Как создать материализованное представление:

Для создания материализованного представления вам потребуется выполнить следующие шаги:

1️⃣ Написать запрос, который будет формировать данные для представления.

2️⃣ Создать материализованное представление с помощью команды CREATE MATERIALIZED VIEW.

3️⃣ Определить опции материализованного представления (столбцы, условия фильтрации и сортировки данных, а также права доступа для пользователей или ролей).

4️⃣ Указать опцию REFRESH MATERIALIZED VIEW для обновления данных представления по мере необходимости. Вы можете настроить автоматическое обновление представления или выполнять его вручную.

🎯 Пример

Предположим, у вас есть базовая таблица sales_data, содержащая информацию о продажах, и вы хотите создать материализованное представление, которое будет содержать сумму продаж по каждому месяцу.

-- Создание материализованного представления
CREATE MATERIALIZED VIEW
monthly_sales AS
SELECT DATE_TRUNC('month',
order_date) AS month,
SUM(sales_amount) AS
total_sales
FROM sales_data
GROUP BY month;

-- Обновление данных в представлении
REFRESH MATERIALIZED VIEW monthly_sales;

🔎 Использование материализованных представлений в PostgreSQL - это мощный инструмент для оптимизации аналитических запросов и повышения производительности вашей базы данных. Попробуйте применить эту фишку в своих проектах и убедитесь как улучшится скорость выполнения запросов и облегчится ваша ежедневная рутина! 📈

💥 В нашем Симуляторе «Аналитик данных» мы раскрываем еще больше возможностей SQL, Python и других инструментов аналитика!

#sql
👍10🔥63
🔥 Pandas vs SQL

Мы уже написали множество постов для тех, кто работает с Pandas, еще больше для тех, кто работает с SQL. А что, если среди нас все еще остались те, кто пользуется только одним из этих инструментов? 🤔

💡По большому счету, можно сказать, что и Pandas, и SQL, позволяют нам манипулировать данными. Кто-то делает это быстрее, кто-то медленнее - везде свои преимущества. Но если вдруг вы, эксперты в Pandas, и до сих пор не работаете с SQL, или профессионально работаете с SQL, но вам так и не поддается Pandas - этот пост для вас!

🔎 В карточках под постом мы представили некоторые операции в Pandas и их соответствующие аналоги в SQL 👇

🚀 Владение обоими инструментами поможет вам работать с данными более эффективно и с легкостью решать задачи анализа. Будь то Pandas или SQL, оба этих инструмента предоставляют множество возможностей для манипуляции данными. Выберите тот, который подходит вам больше, или, что еще лучше, освоите оба!

#sql #pandas
🔥9👍5
🔥42👍53
🔥 Разбираем что такое CPA!

Сегодня мы рассмотрим одну из ключевых метрик в мире маркетинга - CPA (общая стоимость привлечения нового клиента по определенному каналу или кампании). CPA позволяет оценить эффективность маркетинговых кампаний и определить, сколько стоит привлечение одного нового клиента. 🎯

🤔 CPA vs CAC

Многие компании путают эти два показателя и используют их взаимозаменяемо для обозначения маркетинговых затрат, связанных с привлечением новых клиентов. Тем не менее, CPA и CAC технически отличаются:

1️⃣ CPA относится только к маркетинговой стоимости, чтобы потенциальный клиент предпринял действие, которое приведет к конверсии. Эта конверсия не обязательно завершается покупкой. Это может быть подписка на новостную рассылку или загрузка электронной книги или отправка формы лида, независимо от вашей цели конверсии.

2️⃣ CAC же относится к маркетинговым и другим затратам на привлечение клиентов в больших масштабах. Другие затраты - это стоимость используемых инструментов маркетинга, затраты поставщика рекламы, заработную плату команды и расходы агентства.

⚙️ Как рассчитать CPA

Чтобы рассчитать CPA, просто разделите общую стоимость на количество новых клиентов, привлеченных по тому же каналу/кампании.

($) общая сумма, потраченная на привлечение новых клиентов по определенному каналу или кампании 
/
(#) новые клиенты, привлеченные по тому же каналу или кампании
=
($) Стоимость приобретения

Пример

На маркетинговое сотрудничество с инфлюенсерами было потрачено 10000. Привлеченные клиенты - 1000.

CPA = 10000 / 1000 = 10

🟢 Преимущества

Если одним из ваших основных каналов привлечения являются медиа, то расчет CPA полезен для определения эффективности ваших кампаний. Чем ниже ваш CPA по отношению к вашему LTV, тем выше будет ваша прибыль.

🔴 Недостатки

Поскольку CPA является достаточно конкретной метрикой, важно также отслеживать другие более общие показатели (ROI, LTV, коэффициент конверсии и т. д.), чтобы получить полную картину всех маркетинговых усилий по отношению к доходу, который они генерируют.

📌 А какой CPA хороший?

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

1. Ваша отрасль: что вы продаете? Еда, мода, фитнес-продукты, электроника и т. д.
2. CLV: Сколько стоит этот клиент после приобретения и сколько прибыли он приносит?
3. Частота повторных покупок: сколько покупок совершают существующие клиенты по сравнению с новыми.
4. Средняя продолжительность жизни клиента.
5. CR: Сколько ваших клиентов в конечном итоге отменят подписку или просто перестанут покупать у вас?

💎 Бенчмарки

Cредний CPA составляет 59,18 - 60,76 долларов. Например, для приложений дейтинга CPA составляют 6.91 доллар, а для отрасли права и медицины - более 126 долларов.

Лучший способ определить, ниже ли нормального ваш CPA, выше или просто средний, - это сравнить его с внутренним эталоном - вашим LTV.

❗️Дополнительно

Иметь очень низкий CPA не всегда хорошо. Это может означать, что вы не инвестируете достаточно, чтобы расти. Лучше установите некоторую цель CPA в контексте вашего соотношения LTV:CAC, чтобы вы достигли такого CPA, который достаточно низок, чтобы расти прибыльно, но не так низок, чтобы расти недостаточно быстро.

👉 Приходите в наш Симулятор «Аналитик данных», чтобы понимать, как работать с бизнес-метриками, как их считать с помощью разных инструментов (Python, SQL) и как их правильно анализировать!

#продуктовые_метрики
🔥82
🔥 Экономим память при работе с Pandas

Сегодня мы хотим поделиться с вами полезным советом в работе с Pandas. Обычно на обучении говорят, что важно следить за типами данных в столбцах, но для новичков это может быть непонятно. Особенно когда речь идет о борьбе за оптимизацию использования памяти. Поэтому, мы покажем вам, почему это важно и как справиться с этой задачей.

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

🟢 Пример

Создадим DataFrame с помощью Pandas и NumPy, используя случайно сгенерированные целые значения от 1 до 100:

import pandas as pd
import numpy as np

df = pd.DataFrame(
np.random.randint(1, 100,
size=(10**7, 2)),
columns=["A", "B"])

Теперь, чтобы узнать, сколько места занимает столбец 'A', мы можем использовать метод info() для этого столбца:

df['A'].info()
# dtypes: int64(1)
# memory usage: 76.3 MB

Как видим, тип данных этого столбца - int64, и занимает он - 76.3 МБ памяти. Это очень прилично!

Мы точно должны что-то с этим сделать! Вообще, для диапазона от 1 до 100, нам вполне будет достаточно типа int8. Так и сделаем, преобразуем столбец:

df['A'] = df['A'].astype(np.int8)

После преобразования давайте снова проверим информацию о столбце 'A':

df['A'].info()
# dtypes: int8(1)
# memory usage: 9.5 MB

Теперь тип данных столбца 'A' - int8, и занимает он всего 9.5 МБ памяти. Это значительное сокращение используемой памяти по сравнению с исходным значением.

🔵 Видите, простое преобразование типов данных может значительно сократить использование памяти. Это особенно полезно, когда мы имеем дело с огромными объемами данных и хотим оптимизировать производительность.

#pandas
🔥14👍51
🔥 Когда пригодится SELF JOIN?

Как часто вы используете соединение таблицы с самой собой? Это не часто встречающаяся практика. Но на самом деле self join помогает решить удивительно большой список задач. Давайте посмотрим!

1️⃣ Поиск пробелов

Имеется таблица foo (см. Карточку 1)

Иногда необходимо найти места, так называемых пробелов в значениях. В нашем случае - число, с которого этот разрыв начинается. Например, у нас есть строки: 1, 4, 9 - разрывы здесь это 2-3, 5-8. И нам нужно получить первое число каждого разрыва, то есть 2 и 5. И для этого мы можем соединить таблицу саму с собой.


2️⃣ Поиск дублирующихся строк

Допустим, таблица foo теперь содержит имена, фамилии и почту клиентов. (см. Карточку 2)

Для поиска дублирующихся строк на основе конкретного столбца, например email, можно использовать тот же подход:


3️⃣ Ранжирование

Имеем таблицу player. (см. Карточку 3)

Чтобы назначить определенное место каждому спортсмену мы снова соединим таблицу саму с собой.


💥 Есть еще множество необычных вещей, на которые способен self join, о которых мы вам еще расскажем. Но сначала поделитесь, приходилось ли вам использовать подобные конструкции в своей работе? Может быть у вас есть свои лайфхаки? Пишите в комментариях!

#sql
🔥10👍41
10👍6🔥4
🔍 Целостность данных при merge в Pandas

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

Но есть решение! У метода merge() есть параметр validate, который проверяет, имеет ли merge определенный тип.

🔹 Объединение с Уникальными Ключами (One-to-One Merge)

При таком объединении ключи должны быть уникальными в обеих таблицах. Давайте посмотрим на пример:

import pandas as pd

df1 = pd.DataFrame({
'colA': ['A', 'B', 'C'],
'colB': [1, 2, 3]})

df2 = pd.DataFrame({
'colA': ['A', 'B', 'C'],
'colC': [4, 5, 6]})
# ключи уникальны

result = pd.merge(df1, df2,
on='colA',
validate='one_to_one')
print(result)

Все получилось и мы не получим никакой ошибки:

  colA  colB  colC
0 A 1 4
1 B 2 5
2 C 3 6

🔹 Обработка Повторяющихся Ключей

Если в одной из таблиц есть повторяющиеся ключи, merge выдаст ошибку:

import pandas as pd

df1 = pd.DataFrame({
'colA': ['A', 'B', 'C'],
'colB': [1, 2, 3]})

df2 = pd.DataFrame({
'colA': ['A', 'B', 'B'],
'colC': [4, 5, 6]})
# повторяющиеся ключи:
'colA': ['A', 'B', 'C'] и
'colA': ['A', 'B', 'B']

try:
result = pd.merge(df1, df2,
on = 'colA',
validate='one_to_one')
except pd.errors.MergeError as e:
print(f"Ошибка: {e}")

Результат:

Ошибка объединения: Merge keys are not unique in right dataset; not a one-to-one merge

🔹 Какие еще есть объединения?

- one_to_one: Ключи должны быть уникальными в обоих датафреймах
- one_to_many: Ключи должны быть уникальными в левом датафрейме.
- many_to_one: Ключи должны быть уникальными в правом датафрейме.
- many_to_many: Ключи могут быть уникальными, а могут и не быть в обоих датафреймах

И Pandas выдаст ошибку слияния, если merge не соответствует указанному типу.

Это поможет вам предотвратить ошибки, которые часто могут остаться незамеченными.

#python #pandas
👍20🔥81