🎯 Еще один канал для всех кто увлекается аналитикой данных, data science, бизнес-анализом.
Forwarded from Аналитика данных / Data Study
Привет!
Готовлюсь к запуску 3-го потока курса "Бизнес-анализ в IT"
Старт обучения: 21 февраля
На курсы вы сможете:
✅ получить теорию и практику по сбору требований для разработки ПО
✅ научиться детализировать требования исходя из их типа (бизнес, пользовательские, функциональные, нефункциональные)
✅ познакомиться с тонкостями работы по Agile (Scrum, Kanban) и научиться работать с системами таск-трекинга и wiki для оформления требований
✅ получить готовые и отработанные шаблоны для оформления документации
✅ закрепить все полученные знания при решении бизнес-кейса по разработке системы и сбора требований
Больше информации о курсе, формате обучения, программы уроков вы можете найти на сайте https://datastudy.ru/2
P.S. На сайте указаны неправильные сроки старта обучения, до правок еще не добрался)))
По всем вопросам можете писать мне лично. Либо заполните форму предзаписи, я вам сам напишу 😉
Заполнить форму
Готовлюсь к запуску 3-го потока курса "Бизнес-анализ в IT"
Старт обучения: 21 февраля
На курсы вы сможете:
✅ получить теорию и практику по сбору требований для разработки ПО
✅ научиться детализировать требования исходя из их типа (бизнес, пользовательские, функциональные, нефункциональные)
✅ познакомиться с тонкостями работы по Agile (Scrum, Kanban) и научиться работать с системами таск-трекинга и wiki для оформления требований
✅ получить готовые и отработанные шаблоны для оформления документации
✅ закрепить все полученные знания при решении бизнес-кейса по разработке системы и сбора требований
Больше информации о курсе, формате обучения, программы уроков вы можете найти на сайте https://datastudy.ru/2
P.S. На сайте указаны неправильные сроки старта обучения, до правок еще не добрался)))
По всем вопросам можете писать мне лично. Либо заполните форму предзаписи, я вам сам напишу 😉
Заполнить форму
datastudy.ru
Бизнес-анализ в IT
❤3
Вопросы с собеседований по SQL
📍 В чем разница между сount(*) и count(колонка)?
count(*) считает все строки, в т.ч. с NULLs, а count(колонка) нет.
Как пример, привела скрины dbeawer из базы. Есть колонка first_payed_product_at с пропусками. В варианте count(*) считается все, а в варианте count(first_payed_product_at) только заполненные строки (820 значений).
📍 В чем разница между UNION и UNION ALL?
Основное различие между UNION и UNION ALL заключается в том, что операция UNION удаляет дублированные строки из результирующего набора, а UNION ALL не удаляет дубликаты.
📍 Что такое OVER()? Это предложение (
📍 Перечислите основные команды SQL. Просто перечисляете Select, From, Where, Group by, Having, Order by, если еще и оконки назовете, то вообще класс!
📍 Задачка. ->
📍 В чем разница между сount(*) и count(колонка)?
count(*) считает все строки, в т.ч. с NULLs, а count(колонка) нет.
Как пример, привела скрины dbeawer из базы. Есть колонка first_payed_product_at с пропусками. В варианте count(*) считается все, а в варианте count(first_payed_product_at) только заполненные строки (820 значений).
📍 В чем разница между UNION и UNION ALL?
Основное различие между UNION и UNION ALL заключается в том, что операция UNION удаляет дублированные строки из результирующего набора, а UNION ALL не удаляет дубликаты.
📍 Что такое OVER()? Это предложение (
clause) , которое превращает агрегатные функции в оконные.📍 Перечислите основные команды SQL. Просто перечисляете Select, From, Where, Group by, Having, Order by, если еще и оконки назовете, то вообще класс!
📍 Задачка. ->
🔥24👍7❤1
Фантастический сumsum() ⭐️
Если нужно посчитать кол-во дней от момента регистрации клиента до первых 100 тыс. за месяц, то можно сделать это через волшебную, фантастическую функцию сumsum. 🐍
SQL выгрузкой вытаскиваем данные о номере клиента, дате его регистрации, дате оплаты, ну и сумму его выручки конечно. Отсортировано по order by account_id, payment_date. То есть сверху будут самые ранние даты выручки. Получаем вот такой df с колонками:
|account_id) | account_reg_date |payment_date|amount|
✏️ Группируем по аккаунту, создаем новую колонку с кумулятивной суммой, то есть которая накапливается (см.пример на скрине)
df['cumsum_amount'] = df.groupby(['account_id '])['amount'].cumsum()
✏️ Потом мы оставляем только те строки, где накопленная выручка больше или равна ста тысяч
df_100k = df[df.cumsum_amount >= 100000]
Продолжение ->
Если нужно посчитать кол-во дней от момента регистрации клиента до первых 100 тыс. за месяц, то можно сделать это через волшебную, фантастическую функцию сumsum. 🐍
SQL выгрузкой вытаскиваем данные о номере клиента, дате его регистрации, дате оплаты, ну и сумму его выручки конечно. Отсортировано по order by account_id, payment_date. То есть сверху будут самые ранние даты выручки. Получаем вот такой df с колонками:
|account_id) | account_reg_date |payment_date|amount|
✏️ Группируем по аккаунту, создаем новую колонку с кумулятивной суммой, то есть которая накапливается (см.пример на скрине)
df['cumsum_amount'] = df.groupby(['account_id '])['amount'].cumsum()
✏️ Потом мы оставляем только те строки, где накопленная выручка больше или равна ста тысяч
df_100k = df[df.cumsum_amount >= 100000]
Продолжение ->
👍10🔥3😍1
Функция transform() в Python 🐍
👍 Подглядела эту функцию у коллеги. Не влюбиться в функцию просто не возможно! Она такая крутая! Короче, это метод, который применяет функцию к каждой группе данных и возвращает результат в том же порядке, что и исходные данные. Это очень удобный способ изменения исходных данных.
✏️ Синтаксис:
DataFrame.groupby('column_name').transform(function_name)
Создадим dataframe
data =
{'Name': ['Петров', 'Удалова', 'Ковалев', 'Сидоров', 'Ефремов', 'Титова'],
'Department': ['Sales', 'It', 'It', 'Sales', 'Other', 'Other'],
'Salary': [50000, 57000, 62000, 45000, 59000, 70000]}
df = pd.DataFrame(data)
Создаем новый столбец '%' – процент з/пл сотрудника к общей з/пл отдела. А почему бы и нет, что называется.
df['%'] =
df.groupby('Department')['Salary'].transform(lambda x: x/x.sum())
Этот код создаст новый столбец, который посчитает % зарплаты каждого работника к общей з/пл отдела. Функция transform() применяется к столбцу Salary каждой группы, сгруппированной по полю Department.
А еще можно сделать вот что
df['min'] =
df.groupby('Department')['Salary'].transform('min')
И напротив каждой строки будет указана минимальная сумма з/пл в отделе. Также можно посчитать максимальную з/пл, среднюю и общую сумму в отделе (max, mean и sum).
P.s. Хотите такого мультяшного персонажа? Заливаете свое фото и получаете через минуту🔝
https://imagetocartoon.com Можете в комменты кидать своих персов, чтобы веселее было🤩
✏️ Синтаксис:
DataFrame.groupby('column_name').transform(function_name)
Создадим dataframe
data =
{'Name': ['Петров', 'Удалова', 'Ковалев', 'Сидоров', 'Ефремов', 'Титова'],
'Department': ['Sales', 'It', 'It', 'Sales', 'Other', 'Other'],
'Salary': [50000, 57000, 62000, 45000, 59000, 70000]}
df = pd.DataFrame(data)
Создаем новый столбец '%' – процент з/пл сотрудника к общей з/пл отдела. А почему бы и нет, что называется.
df['%'] =
df.groupby('Department')['Salary'].transform(lambda x: x/x.sum())
Этот код создаст новый столбец, который посчитает % зарплаты каждого работника к общей з/пл отдела. Функция transform() применяется к столбцу Salary каждой группы, сгруппированной по полю Department.
А еще можно сделать вот что
df['min'] =
df.groupby('Department')['Salary'].transform('min')
И напротив каждой строки будет указана минимальная сумма з/пл в отделе. Также можно посчитать максимальную з/пл, среднюю и общую сумму в отделе (max, mean и sum).
P.s. Хотите такого мультяшного персонажа? Заливаете свое фото и получаете через минуту
https://imagetocartoon.com Можете в комменты кидать своих персов, чтобы веселее было
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥3❤1
А что, так можно было?
Я зарегистрировалась в LinkedIn еще в 2013 году, но ничего о себе не заполняла и вскоре забросила. Мне всегда hh помогал с поиском работы.
Но недавно я решила его реанимировать. Я думала, что там только для тех, кто хочет уехать зарубеж, а я вроде как не планирую. У меня тут семья, родные. Но в последнее время стала замечать, что очень много вакансий с телеграмм каналов и с geekjob.ru ссылаются на Linkedin. И там конкретный человек (HR или тимлид) описывает вакансию и кого именно они ищут. У нас есть возможность пообщаться напрямую с тимлидом даже без эйчар! И эти компании русские! Там их полно, если не все.
А еще очень важно создавать свою сеть контактов или модное сейчас слово networking. Ведь человек после общения с вами может порекомендовать вас в компанию. Чем больше у вас контактов, тем больше людей сможет с вами связаться.
VPN я не ставила, а вот тор-браузер скачала (firefox) и захожу через него.
Еще есть вот такой вариант - через расширение:
https://chrome.google.com/webstore/detail/%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-linkedin/lfpfgkjmoclpggokhdacgidpeoedmhjh
Оставляйте в комментариях ссылки на свой linkedin! Давайте создадим большое полезное сообщество!
Вот мой Linkedin
P.S. картинку сгенерировала в midjourney (если нужно, то поделюсь как получить безграничное кол-во попыток)
Я зарегистрировалась в LinkedIn еще в 2013 году, но ничего о себе не заполняла и вскоре забросила. Мне всегда hh помогал с поиском работы.
Но недавно я решила его реанимировать. Я думала, что там только для тех, кто хочет уехать зарубеж, а я вроде как не планирую. У меня тут семья, родные. Но в последнее время стала замечать, что очень много вакансий с телеграмм каналов и с geekjob.ru ссылаются на Linkedin. И там конкретный человек (HR или тимлид) описывает вакансию и кого именно они ищут. У нас есть возможность пообщаться напрямую с тимлидом даже без эйчар! И эти компании русские! Там их полно, если не все.
А еще очень важно создавать свою сеть контактов или модное сейчас слово networking. Ведь человек после общения с вами может порекомендовать вас в компанию. Чем больше у вас контактов, тем больше людей сможет с вами связаться.
VPN я не ставила, а вот тор-браузер скачала (firefox) и захожу через него.
Еще есть вот такой вариант - через расширение:
https://chrome.google.com/webstore/detail/%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-linkedin/lfpfgkjmoclpggokhdacgidpeoedmhjh
Оставляйте в комментариях ссылки на свой linkedin! Давайте создадим большое полезное сообщество!
Вот мой Linkedin
P.S. картинку сгенерировала в midjourney (если нужно, то поделюсь как получить безграничное кол-во попыток)
🥰10👍8❤7
1. Какой тип данных у переменной a?
a = 'Hello, world!'
print(type(a)) # <class 'str'>
2. Как можно разбить строку на подстроки?
s = 'one,two,three'
lst = s.split(',')
print(lst) #['one', 'two', 'three']
3. Как можно сгенерировать список чисел от 0 до 9 включительно?
lst = list(range(10))
print(lst) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Это вариант - range(stop) генерирует целые числа от 0 до целого числа stop
Есть вариант range(start, stop) — генерирует целые числа от start до stop
И еще один range(start, stop, step) — генерирует целые числа от start до stop с интервалами step
4. Как создать уникальный список значений из двух списков?
lst1 = [1, 2, 3, 4]
lst2 = [3, 4, 5, 6]
uni = list(set(lst1 + lst2))
print(uni) # [1, 2, 3, 4, 5, 6]
5. В чем разница между списком и кортежем?
Список (list) можно изменить после создания. Он представляет собой упорядоченные последовательности объектов, как правило, одного и того же типа.
Кортеж (tuple) нельзя изменить после создания. И в каждом индексе могут сосуществовать различные типы данных.
6. Как работает умножение строк?
'test' * 3
#=> 'testtesttest'
7. Как работает умножение списка?
[1,2,3] * 2
#=> [1, 2, 3, 1, 2, 3]
8. Что такое DataFrame в библиотеке Pandas? Да, такое тоже спрашивают. DataFrame — основной тип данных в Pandas, вокруг которого строится вся работа. Его можно представить в виде обычной таблицы с любым количеством столбцов и строк. Внутри ячеек такой «таблицы» могут быть данные самого разного типа: числовые, булевы, строковые и так далее.
import pandas as pd
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']}) - создаем какой-нибудь датасетик для примера.
9. Как выбрать строки в DataFrame с использованием условий?
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']})
df_filtered = df[df['col1']>1]
или если несколько условий:
df_filtered = df[(df['col1']>1)&(df['col2']!='b')]
Продолжение ->
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥4❤2
Это не мое, но меня попросили помочь..
А вообще по прогнозам Всемирного экономического форума, с 2020 до 2030 года количество вакансий для аналитика данных вырастет на 25%. Так что кто еще сомневается стоит ли идти в аналитики - дерзайте! Как писал Гюстав Флобер (французский писатель) "Самые восхитительные моменты вашей жизни — это не дни так называемого успеха, а, скорее, те времена, когда уныние и отчаяние порождают в вашей душе желание бросить вызов жизни, и предвкушение грядущих свершений."
1а.
SELECT *
FROM stream
WHERE stream_name LIKE '%Мой первый стрим на wasd.tv%'
1.b.
SELECT *
FROM stream
WHERE created_at = '2020-01-01'
2. SELECT COUNT(distinct stream_id)
FROM stream
3. SELECT EXTRACT(DAY FROM created_at) as day,
COUNT(distinct stream_id)
FROM stream
WHERE created_at > CURDATE() - INTERVAL 30 DAY
GROUP BY 1
4. SELECT EXTRACT(DAY FROM created_at) as day,
COUNT(distinct stream_id) as count_stream
FROM stream
GROUP BY 1
HAVING count_stream >=1000
5. SELECT *
FROM stream s
JOIN stream_status ss
ON s.id = ss.id
JOIN profile p
ON s.user_id = p.user_id
WHERE s.created_at = CURDATE()
AND ss.stream_status = 'RUNNING'
AND p.created_at < '2020-01-01'
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥3
Как определить к какой стране относится номер телефона? Вот есть у вас база и там много номеров. Но даже по коду +7 есть номера не только России, но и Казахстана. Когда стран много, то все варианты кодов не перечислить. Ну или у вас слишком много свободного времени. Но есть решение! Тут должна быть реклама чудо средства. И это ..пам, пам, пам.. библиотека Python Phonenumbers.
Все что нужно импортировать:
import pandas as pd
from tqdm import tqdm
import numpy as np
import phonenumbers
from phonenumbers import geocoder
Как пример:
phonenumbers.parse('+79991456887') выдаст вот такую информацию: PhoneNumber(country_code=7, national_number=9991456887, extension=None, italian_leading_zero=None, number_of_leading_zeros=None, country_code_source=0, preferred_domestic_carrier_code=None)
df_phones['phone_standart'] = '+' + df_phones['phone_standart'].astype('str')
Загоняем номера в лист number_lst = df_phones['phone_standart'].tolist()
Создаем пустой лист. true_number_lst =[]
Используем библиотеку tqdm, чтобы видеть, как идет процесс. Пока в цикле перебираются номера, у вас бежит бегунок и видно, что процесс идет.
for i in tqdm(number_lst):
try:
true_number_lst.append(phonenumbers.parse(i))
except:
true_number_lst.append(np.nan)
Теперь создаем список для кодов стран:
country_lst =[]
for j in tqdm(true_number_lst):
try:
country_lst.append(geocoder.region_code_for_number(j))
except:
country_lst.append(np.nan)
В результате список country_lst заполнился кодами стран.
Присвоим его колонке датафрейма:
df_phones['country_cod'] = country_lst
В результате получим то, что видите на картинке. Каждый номер, если он есть - идентифицирован.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥10❤1
На канале уже 1️⃣ 0️⃣ 0️⃣ 0️⃣ подписчиков! Для меня это прям ВАУ! 😮 Никогда не думала, что буду в своем роде блогером 😂, если можно так выразиться. Начинала писать, чтобы поделиться той информацией, которой мне самой не хватало, когда я училась. Ведь так хотелось посмотреть, а что же делают эти it аналитики? ❓ Я рада, что могу помогать кому-то таким образом перейти в аналитику или подсказать что-то тем, кто уже работает. Пусть люди улучшают свою жизнь привнося в нее радость от того, что занимаются тем, что им действительно нравится. Ну и хорошая зарплата еще никому не мешала. 🔼 В каждой работе можно найти элемент творчества, а в нашей его очень много и это тоже вдохновляет!😀
Ну и немного полезности:👍
Для собесов, как известно приходится решать тестовые и не всегда есть на компе установленная база данных с sql. Нашла, что оказывается есть онлайн версия sqlite
https://sqliteonline.com
Достаточной удобный сайт, с возможностью работать с разными СУБД, он умеет сохранять таблицы и запросы даже после закрытия.
Ну и немного полезности:
Для собесов, как известно приходится решать тестовые и не всегда есть на компе установленная база данных с sql. Нашла, что оказывается есть онлайн версия sqlite
https://sqliteonline.com
Достаточной удобный сайт, с возможностью работать с разными СУБД, он умеет сохранять таблицы и запросы даже после закрытия.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥28👍13❤3
Один вопрос - как на все, что я хочу изучить и в чем углубить знания, найти время? 🙈 Очень горячая пора.
Please open Telegram to view this post
VIEW IN TELEGRAM
karpov.courses
Бесплатный курс Математика для анализа данных | karpov сourses
Бесплатный курс Математика для анализа данных от Карпов Курсы. Изучите основы линейной алгебры, матанализа и статистики
👍28🔥3🥰1
Начну с определения, прямо как в школе.
Когортный анализ - способ изучить группы пользователей и клиентов, объединённых общими признаками в определённый период времени.
SQL запросом отбираем аккаунты клиентов, которые вас интересуют. df['account_id'] Допустим, по дате создания или у кого первая дата оплаты продукта с начала года. Колонки будут: week – неделя. в которой произошло это событие, номер клиента - account_id.
Вот так можно в SQL соединить год и неделю, на случай если нужен не только 2023, но и прошлые года:
concat(YEAR(first_payed_product_at),'-',week(first_payed_product_at,1)) as week. В итоге будут данные в таком формате: 2023-0, 2023-1, 2023-2 и прочееПо отобранным клиентам считаем выручку за 2023 год в разрезе платежных систем.
type – это тип платежной системы (tinkoff, yandex_kassa и прочее)
query = f""" -- здесь нужен f, чтобы потом в условии where можно было бы воспользоваться и указать список клиентов, по которым мы ищем выручку.Выгрузка сохраняется в датафрейм df_rev.
select account_id, type
sum(amount) as 'amount'
from payment
where account_id in {tuple(df_acc['account_id'])}
and deleted=0
and status='accepted'
and created_at >= '2023-01-01'
group by 1,2
order by 1,3
df_rev = pd.read_sql(query, connection)
Относим клиента в ту платежную систему, через которую прошли максимальные платежи за период – оставляем последние .last (мы сортировали их order by 3).
df_big = df_rev.groupby(by='account_id').last().reset_index()Соединяем базу со всеми клиентами – df_acc, который мы выкачали вначале с выгрузкой df_rev
Если не было выручки, то пишем fillna('no_payment’)
df_merge = pd.merge(df_acc, df_big, on = 'account_id', how = 'left').fillna('no_payment’)
А теперь самое интересное!df_final = df_merge.pivot_table(index = 'week', columns=['type'], values = 'account_id',aggfunc = 'count', margins=True).fillna(0).reset_index()
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍5🤯5❤1
Недавно открыла для себя использование np.where(). np – это numpy.
Покажу на простых примерах как его можно использовать. Создадим датафрейм. Не забываем import numpy as np Ну и как всегда import pandas as pd
df = pd.DataFrame({'Name': ['Дмитрий', 'Антон', 'Арсений', 'Сергей','Катерина'],
'Age': [38, 32, 40, 39, 37],
'Gender': ['M', 'M', 'M', 'M','F']})
Хочу создать столбец, основываясь на данных столбца Age:
📍 Если возраст старше или равен 35, то пусть в строке будет написано 'Старше 35', в противном случае - 'Моложе 35'
df['check_where_одно_условие'] = np.where(df.Age >=35, 'Старше 35', 'Моложе 35')
📍 Можно поставить два условия и больше. Если возраст старше или равен 35 и пол смотрим только мужской - M
df['check_where_два_условия'] = np.where((df.Age >=35)&(df.Gender == 'M'), 'Мужчина старше 35', 'нет')
Напротив Катерины в столбце 'check_where_два_условия' будет написано ‘нет’, так как оба условия одновременно не выполняются. Возраст старше 35, а вот пол женский - (df.Age >=35)&(df.Gender == 'M')
📍 Хотим рассчитать возраст через 3 года при условии, что это мужчина. Удобно, что посчитать что-то можно, не только текст вписать.
df['check_where_расчетное'] = np.where(df.Gender == 'M', df.Age+3, df.Age)
Мы также можем установить значения DataFrame, используя атрибут loc[].
df.loc[df.Age >=35, 'check_loc'] = 'да'
Но тогда там, где условие не выполняется будут пропуски – NaN. Как вариант, заполнить потом эти пропуски нулями.
В этом плане np.where() удобен тем, что можно сразу поставить, что будет прописано и при выполнении условия и при НЕ выполнении.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥5❤3
Прикладной анализ данных в социальных науках.
Читать можно без регистрации, удобно.
Там есть про:
- введение в понятие данных и описательные статистики числовых данных
- базовые статистические тесты в Python
- про категориальные переменные
- факторный анализ
- парсинг данных и автоматизация браузера, регулярные выражения
- про регрессии
и прочее. 🐍
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥8
Да и вообще - покидайте в комментарии свои личные блоги, даже если и не про аналитику. Не все же про метрики и питоны читать. Я даю официальное добро.
https://t.iss.one/BA_by_MA
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Марина Ахрамеева |Думай в тишине
1) Остановиться и подумать можно здесь
2) Книги,в которые нужно инвестировать время
3) Личный опыт (хороший и не очень)
2) Книги,в которые нужно инвестировать время
3) Личный опыт (хороший и не очень)
❤5👍2
Она довольно часто используется в SQL запросах.
В when мы задаем условие и то, что нам нужно получить при его выполнении, а в else – выполнить то, что условию не соответствует. В конце после end as прописываем как называться будет столбик.
Сначала покажу на примерах из курса Карпова.
🔹Нужно повысить цену на 5% только на те товары, цена которых превышает 100 рублей. Цену остальных товаров оставить без изменений. Также не повышайте цену на икру, которая и так стоит 800 рублей. Выведите id и наименования всех товаров, их старую и новую цену. Результат отсортируйте сначала по убыванию новой цены, затем по возрастанию id товара.
SELECT
product_id,
name,
price as old_price,
case
when price > 100
and name != 'икра' then price * 1.05
else price
end as new_price
FROM
products
ORDER BY 4 desc, product_id
🔹В следующем задании необходимо посчитать стоимость заказа, в котором будут три пачки сухариков, две пачки чипсов и один энергетический напиток. Колонку с рассчитанной стоимостью заказа нужно назвать order_price.
Тут мы будем суммировать цены с помощью sum, в который поместим то, что нам выдаст case
SELECT
sum(
case
when name = 'сухарики' then price * 3
when name = 'чипсы' then price * 2
when name = 'энергетический напиток' then price
else 0
end
) as order_price
FROM
products
🔹 А теперь покажу на рабочем примере:
Вот так рассчитывается общая рублевая сумма при условии, что есть цены не только в рублях, но и в других валютах. Если валюта рублевая (in ('RUB','RUR')), то цена просто amount, в противном случае (else) цена умножается на курс (amount*rate)
sum(
case
when currency in ('RUB', 'RUR') then amount
else amount * rate
end
) as amount
🔹Или допустим, вот такой еще пример. Если в базе есть данные по фио или о продукте, но где-то они пропущены, то можно сделать столбец с текстом 'есть данные' или 'не указано'. Вместо текста можно 1 и 0 поставить.
case
when name != '' then 'есть данные'
when name = '' then 'не указано'
when name is null then 'не указано'
end
as 'инфа'
Ну и конечно в одном запросе может быть несколько case как обычно в select через запятую.
Если понравился такой формат разбора Карпов+рабочий опыт, ставьте 🐳
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳36👍11❤3
data – дата, account_id – номер клиента, info – определенная информация из списка, у одного клиента может быть таких несколько, поэтому в таблице бывает представлено двумя и более строками, turnover – оборот клиента за определенный период времени.
Создадим пример датафрейма:
data = {'data':['2023-07-27','2023-07-27','2023-07-27','2023-07-27'],
'account_id': [111,111,333,444],
'info':['параметр 1','параметр 2','параметр 3','параметр 2'],
'turnover': [100, 200,300,400]}
df_old = pd.DataFrame(data)
Раньше таблица дополнялась снизу новыми данными на определенную дату и в конце концов стала очень большой. Поэтому было решено ее ОПТИМИЗИРОВАТЬ! Но сложность была в том, что если у account_id есть параметр info на старую дату, которого не было в новой выгрузке, то эту старую строку и нужно оставлять со всеми сопутствующими столбцами.
Пример таблицы, которую добавляем к той первоначальной
df_new = pd.DataFrame({'data':['2023-07-28','2023-07-28','2023-07-28','2023-07-28'],
'account_id': [111,555,666,777],
'info':['параметр 1','параметр 2','параметр 3','параметр 2'],
'turnover': [500, 600,700,800]})
💡Я придумала вот такой способ. Выкачиваю файл, который был в гуглдоке, подтягиваю его в юпитер и соединяю с новой таблицей именно в этой последовательности (сначала новый датафрейм, а потом старый):
df_all = pd.concat([df_new, df_old], ignore_index = True, sort = False)
А потом убираю дубликаты по двум важным столбцам: account_id и info
df_final = df_all.drop_duplicates(subset=['account_id', 'info'])
И в результате получается то, что нужно. На картинке видно, что у аккаунта 111 есть строка с параметром 2, датированная 27 июля (то есть ее оставили нетронутой) и есть строка с аккаунтом 111 и параметром 1 уже новая от 28 июля.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
Как всем известно этот оператор группирует строки и потом используя агрегирующие функции (SUM, AVG, COUNT, MIN, MAX ) над элементами этих групп и проводятся определённые операции.
Но просто один GROUP BY – это слишком легко, поэтому мы им воспользуемся вместе с CASE, а в случае рабочего примера еще и с подзапросом. Мощно, да? 💪
🔹Итак, это пример задания у Карпова:
Группу с выходными днями (суббота и воскресенье) назовите «weekend», а группу с будними днями (с понедельника по пятницу) — «weekdays».
В результат включите две колонки: колонку с группами назовите week_part, а колонку со средним размером заказа — avg_order_size.
SELECT
case
when date_part('dow', creation_time) in (0, 6) then 'weekend'
else 'weekdays'
end as week_part,
round(avg(array_length(product_ids, 1)), 2) as avg_order_size
FROM orders
GROUP BY 1 ORDER BY 2
Мы сначала определяем каждую строку как weekend или как weekdays, а потом их группируем с помощью GROUP BY и подсчитываем средний размер заказа в каждой группе.
🔹 А теперь покажу, как похожая структура используется на рабочем примере. Есть заявки от клиентов с разными статусами. Нужно найти по каждому финальному статусу количество клиентов – скольким одобрено, скольким отказано, скольким требуется исправление в заявке и т.д.
Тут еще используется подзапрос. Он необходим, так как я подсчитываю кол-во уже базируясь на данных сформировавшихся после case.
select status, count(*) as count_account_id
from(
select account_id,
(case when MAX(status) = 1 then 'Новый'
when MAX(status) = 2 then 'В работе'
when MAX(status) = 3 then 'Требуется исправления'
when MAX(status) = 5 then 'Одобрено'
when MAX(status) = 6 then 'Отказано'
else MAX(status) end) as status
from sales.checkout_request
group by 1
) tt
group by 1 order by status desc
Я обозначила результат подзапроса как tt иначе код выдаст ошибку. Всегда нужно давать имя подзапросу, который находится внутри from.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍7👎1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Forwarded from Data jobs — вакансии по data science, анализу данных, аналитике, искусственному интеллекту
👨🏻💻 Младший аналитик данных
SMS Traffic — является крупным игроком на рынке коммуникации компаний и клиентов, при помощи различных каналов связи, ищет младшего аналитика данных
Что почём?
▪️Junior
▪️До 100 000 ₽
▪️Офис (Москва)
📩 Изучить вакансию
SMS Traffic — является крупным игроком на рынке коммуникации компаний и клиентов, при помощи различных каналов связи, ищет младшего аналитика данных
Что почём?
▪️Junior
▪️До 100 000 ₽
▪️Офис (Москва)
📩 Изучить вакансию
hh.ru
Вакансия Младший аналитик данных в Москве, работа в компании SMS Traffic (вакансия в архиве c 29 августа 2023)
Зарплата: до 100000 ₽ за месяц. Москва. Требуемый опыт: 1–3 года. Полная занятость. Дата публикации: 14.08.2023.
❤8
Очень интересно и много полезной практики:
✔️ Как быстро прокачаться в настройке систем веб-аналитики?
✔️ Что влияет на размер выборки и длительность АБ теста?
✔️ Как прокачать скилл аналитика?
Хороших каналов мало не бывает
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Борзило
⇨ Про аналитику, продукты, маркетинг
⇨ Автор курса по АБ тестам
⇨ Смело пиши - @borzilo_y
ИНН 026702638983
⇨ Автор курса по АБ тестам
⇨ Смело пиши - @borzilo_y
ИНН 026702638983
🤩10❤1