На канале уже 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
👀 Розыск регулярных выражений
⁉️ Озадачили тут меня недавно запросом. Реально ли найти клиентов (account_id) у которых более 70% пользователей с именами на латинице.
- Конечно реально, - ответила я и приняласьвспоминать гуглить регулярные выражения. Регулярка- это некий шаблон, по которому фильтруется текст. В Python для работы с регулярными выражениями используют модуль re.
^ - Соответствует началу строки.
[a-zA-Z] — любая буква на латинице в нижнем и верхнем регистре;
[0-9] — любая цифра от нуля до девяти
🔹 Как пример:
import re
s = "Yelena_Shon"
search = re.search(r'[a-zA-Z0-9]', s)
print(search)
Код выдаст <_sre.SRE_Match object; span=(0, 1), match='Y'>
🔹Еще вариант:
s = "Иван Петров"
search = re.search(r'[a-zA-Z0-9]', s)
print(search)
А этот код выдаст None
Но нам нужно как-то это применить в датафрейме, а не просто к строке, поэтому воспользуемся в дальнейшем apply.
🔥 Итак, я выкачала юзеров в датафрейм all_users со столбцами account_id, user_id, full_name.
Создадим столбец 'check_name', в котором будем записывать результат проверки
all_users['check_name']= all_users['full_name'].apply(lambda x: re.search(r'^[a-zA-Z0-9]',str(x))).fillna(0)
Затем отбираем там, где не ноль, чтобы потом посчитать юзеров написанных на латинице
all_eng_users = all_users[all_users['check_name']!=0]
Делаем группировку по аккаунтам c подсчетом количества пользователей (user_id) и создаем датафрейм count_eng_users. В нем будет две колонки: номера клиента-account_id и кол-во пользователей, написанных на латинице:
count_eng_users = all_eng_users.groupby('account_id', as_index = False).agg({'user_id':'count'}).rename(columns ={'user_id':'eng_count_users'})
Теперь то же самое сделаем, чтобы подсчитать сколько в аккаунтах есть пользователей не на латинице (то есть на русском языке, вариант “на китайском” автоматически отбрасываем, вряд ли такие есть вообще).
all_rus_users = all_users[all_users['check_name']==0]
count_rus_users = all_rus_users.groupby('account_id', as_index = False).agg({'user_id':'count'}).rename(columns ={'user_id':'rus_count_users'})
Далее объединяем эти две получившиеся таблички по account_id.
users_merged = pd.merge(count_rus_users, count_eng_users, on = ['account_id'], how = 'outer').fillna(0)
В результате получим табличку users_merged с колонками: account_id, rus_count_users, eng_count_users
Посчитаем % :
users_merged['% иностранных пользователей'] = round(((users_merged['eng_count_users']/(users_merged['eng_count_users']+users_merged['rus_count_users']))*100),1)
🚀 Ну и зафиналим. Отберем те аккаунты, у которых у которых более 70% пользователей с именами на латинице:
df_eng_name_users_more70 = users_merged[users_merged['% иностранных пользователей']>=70]
А вот тут можно потренироваться с регулярками:
🔹www.regextester.com
🔹regex101.com
Если Вам нравится, что я привожу рабочие примеры, то ставьте лайки👍, огонечки 🔥 и прочее.
Очень много блогов, где есть ссылки на статьи, какие-то примеры с питоном и sql, но почти не встречала, чтобы аналитики показывали свой код, какие-то задачи с работы. Надеюсь, Вы это оцените ❤️
⁉️ Озадачили тут меня недавно запросом. Реально ли найти клиентов (account_id) у которых более 70% пользователей с именами на латинице.
- Конечно реально, - ответила я и принялась
^ - Соответствует началу строки.
[a-zA-Z] — любая буква на латинице в нижнем и верхнем регистре;
[0-9] — любая цифра от нуля до девяти
🔹 Как пример:
import re
s = "Yelena_Shon"
search = re.search(r'[a-zA-Z0-9]', s)
print(search)
Код выдаст <_sre.SRE_Match object; span=(0, 1), match='Y'>
🔹Еще вариант:
s = "Иван Петров"
search = re.search(r'[a-zA-Z0-9]', s)
print(search)
А этот код выдаст None
Но нам нужно как-то это применить в датафрейме, а не просто к строке, поэтому воспользуемся в дальнейшем apply.
🔥 Итак, я выкачала юзеров в датафрейм all_users со столбцами account_id, user_id, full_name.
Создадим столбец 'check_name', в котором будем записывать результат проверки
all_users['check_name']= all_users['full_name'].apply(lambda x: re.search(r'^[a-zA-Z0-9]',str(x))).fillna(0)
Затем отбираем там, где не ноль, чтобы потом посчитать юзеров написанных на латинице
all_eng_users = all_users[all_users['check_name']!=0]
Делаем группировку по аккаунтам c подсчетом количества пользователей (user_id) и создаем датафрейм count_eng_users. В нем будет две колонки: номера клиента-account_id и кол-во пользователей, написанных на латинице:
count_eng_users = all_eng_users.groupby('account_id', as_index = False).agg({'user_id':'count'}).rename(columns ={'user_id':'eng_count_users'})
Теперь то же самое сделаем, чтобы подсчитать сколько в аккаунтах есть пользователей не на латинице (то есть на русском языке, вариант “на китайском” автоматически отбрасываем, вряд ли такие есть вообще).
all_rus_users = all_users[all_users['check_name']==0]
count_rus_users = all_rus_users.groupby('account_id', as_index = False).agg({'user_id':'count'}).rename(columns ={'user_id':'rus_count_users'})
Далее объединяем эти две получившиеся таблички по account_id.
users_merged = pd.merge(count_rus_users, count_eng_users, on = ['account_id'], how = 'outer').fillna(0)
В результате получим табличку users_merged с колонками: account_id, rus_count_users, eng_count_users
Посчитаем % :
users_merged['% иностранных пользователей'] = round(((users_merged['eng_count_users']/(users_merged['eng_count_users']+users_merged['rus_count_users']))*100),1)
🚀 Ну и зафиналим. Отберем те аккаунты, у которых у которых более 70% пользователей с именами на латинице:
df_eng_name_users_more70 = users_merged[users_merged['% иностранных пользователей']>=70]
А вот тут можно потренироваться с регулярками:
🔹www.regextester.com
🔹regex101.com
Если Вам нравится, что я привожу рабочие примеры, то ставьте лайки👍, огонечки 🔥 и прочее.
Очень много блогов, где есть ссылки на статьи, какие-то примеры с питоном и sql, но почти не встречала, чтобы аналитики показывали свой код, какие-то задачи с работы. Надеюсь, Вы это оцените ❤️
👍54🔥27
И вот что он/она (наверно она, это же нейросеть) выдала:
Выбор карьеры в аналититике данных может быть привлекательным для многих профессионалов по следующим причинам:
Сначала я посмеялась с аналититики. А если серьезно, то действительно есть высокий спрос. Самый большой спрос на мидлов и выше, если честно. Но и джуну реально найти работу. Я же в свое время нашла.
Оплата действительно достойная. Буду надеяться что с каждым годом она будет достойнее и достойнее. 😂 Насчет профессионального роста — в точку. Есть много направлений в аналитике и есть куда расти и в чем совершенствоваться
В целом нейросетка права и я с ней согласна. Я бы еще добавила, что это еще и ИНТЕРЕСНО
Ну и если Вам нужен какой-то знак или ментальный пинок, чтобы начать/продолжить заниматься или подредактировать резюме и выходить на
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍8❤🔥1⚡1
Проклинаешь рекрутера за фидбэк, которого нет? Бог тебя услышал.
аналитик от бога — свежий канал про карьеру и проф развитие как для начинающих аналитиков, так и для тимлидов.
🅰️Владислав, ex-Teamlead из Альфа-банка, ярко и с юмором пишет заметки и статьи о том, как аналитику выйти на новый уровень в своей карьере.
Вот топ лучших постов канала:
♦️Как можно выделиться на фоне других кандидатов?
♦️Гайд по работе с документацией API
♦️Как аналитику проявить себя на новом проекте?
♦️Обзор API и протоколов
Сделай отклик в храм финтеха!
аналитик от бога — свежий канал про карьеру и проф развитие как для начинающих аналитиков, так и для тимлидов.
🅰️Владислав, ex-Teamlead из Альфа-банка, ярко и с юмором пишет заметки и статьи о том, как аналитику выйти на новый уровень в своей карьере.
Вот топ лучших постов канала:
♦️Как можно выделиться на фоне других кандидатов?
♦️Гайд по работе с документацией API
♦️Как аналитику проявить себя на новом проекте?
♦️Обзор API и протоколов
Сделай отклик в храм финтеха!
❤11👍1👎1🔥1
Что может пойти не так? ❓ Месяц назад выкладывала тут задание про поиск клиентов, у которых более 70% пользователей с именами на латинице. Сделала его на питоне. Питон крут и все такое.
Но есть проблемка.. выгрузки по 50 млн строк и питон хоть и тянет, но обрабатывает дооолго. Решила переписать на SQL. Но не просто SQL, а для Clickhouse. Ему такое – море по колено.🌊
Стала искать гуглить про регулярки для Clickhouse. И вот, что нашла: match(где ищем, шаблон)
Сначала concat соединяю фамилию и имя пользователя, а потом оборачиваю в match и вторым аргументом прописываем [A-Za-z] – ищем английские буквы как в большом, так и в малом регистре. А потом заворачиваем все это безобразие в sum, чтобы посчитать количество пользователей так как результат match выдает единички напротив каждого с английскими буквами (смотрим пример на картинке).
SUM(MATCH(CONCAT(IFNULL(uu.first_name,''),' ',IFNULL(uu.last_name,'')), '[A-Za-z]')) as has_latin_letters
Чтобы прописать сразу и rate пишем вот так:
select uu.ACCOUNT_ID,
count(uu.id) as all,
SUM(MATCH(CONCAT(IFNULL(uu.first_name,''),' ',IFNULL(uu.last_name,'')), '[A-Za-z]')) as has_latin_letters,
round((sum(match(CONCAT(IFNULL(uu.first_name,''),' ',IFNULL(uu.last_name,'')), '[A-Za-z]'))/
count(uu.id))*100,2) as rate
from user.user uu
where uu.ACCOUNT_ID in {tuple(df_accounts['account_id'])}
and uu.deleted = 0
and uu.type = 'user'
group by uu.ACCOUNT_ID
В результате скрипт летает как Карлсон в самом расцвете сил 🚀
Но есть проблемка.. выгрузки по 50 млн строк и питон хоть и тянет, но обрабатывает дооолго. Решила переписать на SQL. Но не просто SQL, а для Clickhouse. Ему такое – море по колено.🌊
Стала искать гуглить про регулярки для Clickhouse. И вот, что нашла: match(где ищем, шаблон)
Сначала concat соединяю фамилию и имя пользователя, а потом оборачиваю в match и вторым аргументом прописываем [A-Za-z] – ищем английские буквы как в большом, так и в малом регистре. А потом заворачиваем все это безобразие в sum, чтобы посчитать количество пользователей так как результат match выдает единички напротив каждого с английскими буквами (смотрим пример на картинке).
SUM(MATCH(CONCAT(IFNULL(uu.first_name,''),' ',IFNULL(uu.last_name,'')), '[A-Za-z]')) as has_latin_letters
Чтобы прописать сразу и rate пишем вот так:
select uu.ACCOUNT_ID,
count(uu.id) as all,
SUM(MATCH(CONCAT(IFNULL(uu.first_name,''),' ',IFNULL(uu.last_name,'')), '[A-Za-z]')) as has_latin_letters,
round((sum(match(CONCAT(IFNULL(uu.first_name,''),' ',IFNULL(uu.last_name,'')), '[A-Za-z]'))/
count(uu.id))*100,2) as rate
from user.user uu
where uu.ACCOUNT_ID in {tuple(df_accounts['account_id'])}
and uu.deleted = 0
and uu.type = 'user'
group by uu.ACCOUNT_ID
В результате скрипт летает как Карлсон в самом расцвете сил 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥41
И если родные, близкие и друзья пожимают плечами и говорят: "- Да, забей. Все равно не получится", то это демотивирует очень сильно. Я наслышана о разных историях, так как "варюсь" в этом уже давно и хотела предложить вам такую простую, но искреннюю идею.
А когда случается радость - и заветный оффер в кармане, то порадуемся за человечка от всего сердца ❤️. И пожелаем ему много сил, терпения и веры в себя. Ведь первый/второй и т.д. оффер - это бесконечный путь развития своих скиллов и себя как личности на бесконечной дороге профессионального роста.
Так что @m0t0rama, держись там! Мы мысленно с тобой, поздравляем с оффером и желаем удачи!
Еще с утра я не думала, что накатаю такой пост. Но что-то захотелось и по фиг, что сейчас уже поздно и наверно имело смысл подождать до завтра. Не всегда следует действовать логично, иногда нужно прислушиваться к сердцу.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤61👍10🔥8
А еще Александра заметила, что есть много вопросов по резюме, поэтому предложила свою помощь! Отправляйте ей свои резюме, она подскажет, где их нужно скорректировать и какими видят их эйчары.👌
Пишите на почту: [email protected] с пометкой, что от канала Мир аналитика данных (так вас быстрее заметят)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤5
🔥 Как тестировать SQL код при решении тестовых? Есть библиотека Pandasql. 🛠 Она позволяет выполнять SQL-запросы прямо в Юпитере, а вместо базы можно просто создавать DataFrame.
Например:
Выполнение SQL-запроса с помощью pandasql:
Таким образом, мы получаем результат, который содержит только user_id пользователей, которые ни разу не отменяли заказы.
Учитывая, что осень - пора активных собеседований, то кому-то это точно пригодится.✔️
P.S. Пост про то, какие онлайн сайты можно использовать для SQL у меня тут
Например:
from pandasql import sqldfПредположим, у нас есть таблица user_actions с информацией о действиях пользователей на нашем сервисе, включая id пользователя, id заказа и тип действия. Мы хотим отобрать всех пользователей, которые ни разу не отменяли заказы.
import pandas as pd
# Создание DataFrame user_actions
user_actions = pd.DataFrame({'user_id': [1, 1, 2, 3, 3],
'order_id': [101, 102, 103, 104, 105],
'action': ['create_order', 'cancel_order', 'create_order', 'create_order', 'cancel_order']})
Выполнение SQL-запроса с помощью pandasql:
query = """Мы используем подзапрос, чтобы получить все user_id пользователей, которые отменили заказы, и затем исключаем этих пользователей из основного запроса с помощью оператора NOT IN.
SELECT DISTINCT user_id
FROM user_actions
WHERE user_id NOT IN (
SELECT user_id
FROM user_actions
WHERE action = 'cancel_order'
)
"""
sqldf(query)
Таким образом, мы получаем результат, который содержит только user_id пользователей, которые ни разу не отменяли заказы.
Учитывая, что осень - пора активных собеседований, то кому-то это точно пригодится.
P.S. Пост про то, какие онлайн сайты можно использовать для SQL у меня тут
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍2
📍 Пришло время упорядочить свои посты. Чтобы вам легче было в них ориентироваться и отыскать что-то нужное.
🐍🔤 🔤 🔤 🔤 🔤 🔤 ✨
- Живой кодинг на собеседовании. Примеры.
- Тестовое в Skyeng (ссылка на скрипт в комментариях)
- markdown и вставка картинок в Jupyter Notebook
- Метод format в Питоне
- Рабочий пример отчета для отдела продаж – формирование группы клиентов по разным условиям
- Особенности pivot_table на питоне
- Примеры сводной таблица pivot_table()
- Создание диапазона дат на питоне
- Рабочий скрипт по отвалу клиентов
- Отвал клиентов с доп.условиями
- Три топ клиента за год в каждой нише
- Кумулятивная функция сumsum()
- Примеры функции transform()
- Вопросы с собеседований по Python и Pandas
- Как определить к какой стране относится номер телефона? библиотека Phonenumbers
- Скрипт по когортному анализу (часть на SQL, часть на пандасе)
- Примеры np.where()
- Регулярные выражения на Питоне. модуль re
✨🔤 🔤 🔤 ✨ ✨
- Пример рабочего SQL скрипта в Jupyter Notebook
- Трафик, лиды, конверсия
- SQL Between
- HAVING в SQL
- Вопросы с собеседований по SQL
- Тестовое с решением
- Скрипт по когортному анализу (часть на SQL, часть на пандасе)
- Примеры использования CASE
- Group by на примере из курса Карпова и на рабочем примере.
- Регулярка для Clickhouse
- Библиотека Pandasql для написания SQL кода в Jupyter Notebook
✨🔤 🔤 🔤 🔤 🔤 ✨
- Как уменьшить вес Excel файла
- Excel vs Google таблицы
- Условное форматирование в Google таблицах.
- Выгрузка всех файлов с диска в Excel
✨☹️ ☹️ 😙 🤑 😓 😓 ✨
- Как я сменила профессию
- Какие бывают аналитики
- Мотивация
- Теория вероятности на минималках
- Как заходить в LinkedIn без VPN
- YandexGPT 2 рассказал почему стоит выбрать карьеру в аналитике данных
p.s. Вам знакомо то чувство чистоты, когда у вас на рабочем столе был бардак, а вы взяли и навели порядок? Книжки расставили по местам, бумаги рассортировали по папкам и протерли пыль с клавы. Вот сейчас что-то похожее ощущаю🍀
🐍
- Живой кодинг на собеседовании. Примеры.
- Тестовое в Skyeng (ссылка на скрипт в комментариях)
- markdown и вставка картинок в Jupyter Notebook
- Метод format в Питоне
- Рабочий пример отчета для отдела продаж – формирование группы клиентов по разным условиям
- Особенности pivot_table на питоне
- Примеры сводной таблица pivot_table()
- Создание диапазона дат на питоне
- Рабочий скрипт по отвалу клиентов
- Отвал клиентов с доп.условиями
- Три топ клиента за год в каждой нише
- Кумулятивная функция сumsum()
- Примеры функции transform()
- Вопросы с собеседований по Python и Pandas
- Как определить к какой стране относится номер телефона? библиотека Phonenumbers
- Скрипт по когортному анализу (часть на SQL, часть на пандасе)
- Примеры np.where()
- Регулярные выражения на Питоне. модуль re
✨
- Пример рабочего SQL скрипта в Jupyter Notebook
- Трафик, лиды, конверсия
- SQL Between
- HAVING в SQL
- Вопросы с собеседований по SQL
- Тестовое с решением
- Скрипт по когортному анализу (часть на SQL, часть на пандасе)
- Примеры использования CASE
- Group by на примере из курса Карпова и на рабочем примере.
- Регулярка для Clickhouse
- Библиотека Pandasql для написания SQL кода в Jupyter Notebook
✨
- Как уменьшить вес Excel файла
- Excel vs Google таблицы
- Условное форматирование в Google таблицах.
- Выгрузка всех файлов с диска в Excel
✨
- Как я сменила профессию
- Какие бывают аналитики
- Мотивация
- Теория вероятности на минималках
- Как заходить в LinkedIn без VPN
- YandexGPT 2 рассказал почему стоит выбрать карьеру в аналитике данных
p.s. Вам знакомо то чувство чистоты, когда у вас на рабочем столе был бардак, а вы взяли и навели порядок? Книжки расставили по местам, бумаги рассортировали по папкам и протерли пыль с клавы. Вот сейчас что-то похожее ощущаю
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥50❤6👍6💩2✍1❤🔥1
Мир аналитика данных pinned «📍 Пришло время упорядочить свои посты. Чтобы вам легче было в них ориентироваться и отыскать что-то нужное. 🐍 🔤 🔤 🔤 🔤 🔤 🔤 ✨ - Живой кодинг на собеседовании. Примеры. - Тестовое в Skyeng (ссылка на скрипт в комментариях) - markdown и вставка картинок в Jupyter…»