Первый раз столкнулась с шифрованием.
Попросили сделать номера телефонов хешированными. Ну, я полезла смотреть как это. Короче, вот вам нарытая инфа:
Что такое вообще это ваше хеширование.❓ Это преобразование информации с помощью особых математических формул. В результате возникает хеш — отображение данных в виде короткой строки, в идеале — уникальной для каждого набора информации. Размер строки может быть одинаковым для информации разного объема.
Причем хеш-функций существует очень много, они различаются методами вычислений, назначением, надежностью и другими параметрами.
Основная цель – проверка информации и хранение конфиденциальных данных.❗️
Создадим небольшой датафрейм с номерами телефонов для тестирования
1️⃣ способ - с использованием библиотеки hashlib:
Сначала определяется функция hash_phone_number, которая принимает строку с номером телефона, кодирует его в байты и затем вычисляет SHA-256 хэш с помощью hashlib.sha256().
2️⃣ способ – с использованием уже готовой функции hash()
В результате получаем два варианта уникального кода номеров телефонов. Можно и пароли так хэшировать.
❗️ ❗️ ❗️ P.S. Все кто оставлял заявку в гугл-форме на следующий поток, пишите в поле свой ТГ ник не просто как отображается имя в телеге, а таким образом: пример моего ника - @Valeria_Shuvaeva, чтобы я Вас могла найти. Это можно найти в Settings. Если я кому-то не пишу, то значит просто не смогла Вас найти 😭
Ссылка тут - 🔗 заявка
Попросили сделать номера телефонов хешированными. Ну, я полезла смотреть как это. Короче, вот вам нарытая инфа:
Что такое вообще это ваше хеширование.
Причем хеш-функций существует очень много, они различаются методами вычислений, назначением, надежностью и другими параметрами.
Основная цель – проверка информации и хранение конфиденциальных данных.
Создадим небольшой датафрейм с номерами телефонов для тестирования
data = {'phone': [9055548974, 9876543210, 5551234567, 7778889999]}
df = pd.DataFrame(data)Сначала определяется функция hash_phone_number, которая принимает строку с номером телефона, кодирует его в байты и затем вычисляет SHA-256 хэш с помощью hashlib.sha256().
import hashlib
def hash_phone_number(phone_number):
return hashlib.sha256(phone_number.encode()).hexdigest()
df['code1'] = df['phone'].astype(str).apply(hash_phone_number)
df['code2'] = df['phone'].astype(str).apply(lambda x: hash(x))
В результате получаем два варианта уникального кода номеров телефонов. Можно и пароли так хэшировать.
Ссылка тут - 🔗 заявка
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17👍7
Я давно вынашивала идею поиграться с Яндекс-метрикой. 📊 Это и полезно, и интересно.
Если создать свой сайт, то можно ее прикрутить к нему. Но сайт создавать хоть и не очень сложно, но времени потребуется все равнонебольшой вагон много. И тут меня осенило! А можно ли к статьям в Дзене прикрутить счетчик метрики? Оказывается – ДА, МОЖНО!
Я зашла на Дзен, создала там свой канал. И в нем написала несколько статей. Потом зашла на https://metrika.yandex.ru/ и добавила там счетчик. Задала ему имя Анализ трафика.
В поле с адресом сайта, который мы будем анализировать, вбила адрес канала с Дзена: dzen.ru/analysts_world и нажала сохранить.
Потом я добавила цели. Они позволяют отслеживать важные события на сайте: клики на кнопки, просмотры определенных страниц, скачивание файлов, отправку форм и многие другие.
Я выбрала только посещение страниц и в условие добавила опять ссылку на канал. Однако, мне этого показалось мало. Вдруг посетители зайдут сразу на статью, минуя канал, и я создала еще несколько целей – и там указала посещение именно статей. Можете увидеть на скрине.
Вот теперь счетчик готов!🕯 У него есть номер ( мой с номером 96707090) Теперь осталось прикрутить его к Дзену! Несите отвертку!
В настройках канала есть раздел Веб-аналитика. И там можно вбить номер вашего счетчика в поле Яндекс.Метрика.
Все! Теперь можно отслеживать посещения страниц.📈 Буду вам показывать какие отчеты там есть и что интересного можно узнать. Полазайте там по страницам, чтобы было что исследовать. 🎮
➡️ https://dzen.ru/analysts_world
Если у вас есть опыт, какие-то идеи как создать какой-то отчет, то пишите сюда или мне в директ - будем экспериментировать и делиться знаниями.
Если создать свой сайт, то можно ее прикрутить к нему. Но сайт создавать хоть и не очень сложно, но времени потребуется все равно
Я зашла на Дзен, создала там свой канал. И в нем написала несколько статей. Потом зашла на https://metrika.yandex.ru/ и добавила там счетчик. Задала ему имя Анализ трафика.
В поле с адресом сайта, который мы будем анализировать, вбила адрес канала с Дзена: dzen.ru/analysts_world и нажала сохранить.
Потом я добавила цели. Они позволяют отслеживать важные события на сайте: клики на кнопки, просмотры определенных страниц, скачивание файлов, отправку форм и многие другие.
Я выбрала только посещение страниц и в условие добавила опять ссылку на канал. Однако, мне этого показалось мало. Вдруг посетители зайдут сразу на статью, минуя канал, и я создала еще несколько целей – и там указала посещение именно статей. Можете увидеть на скрине.
Вот теперь счетчик готов!
В настройках канала есть раздел Веб-аналитика. И там можно вбить номер вашего счетчика в поле Яндекс.Метрика.
Все! Теперь можно отслеживать посещения страниц.
➡️ https://dzen.ru/analysts_world
Если у вас есть опыт, какие-то идеи как создать какой-то отчет, то пишите сюда или мне в директ - будем экспериментировать и делиться знаниями.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥20👍10❤9✍5🔥3
Ну что, пришло время посмотреть на результаты Яндекс-метрики в Дзене.🔍
Так как в основном, как я предполагаю, Вы смотрели статьи по моей просьбе, то это должно быть видно в каком-то отчете. Такой отчет есть. Он называется "Отчет по источникам" и находится: Отчеты-> Источники-> Источники, сводка. Тут видно по источникам откуда приходят люди.
Какие же существуют источники? Сначала рассмотрим тот, через который пришли Вы:
✔️ Прямые заходы. Это Вы и те, кто заходил по прямой ссылке.(рис.2) Смотрим картинки здесь. Там можно и весь пост прочитать тоже.
Смотрим базовые числовые метрики, которые присутствуют почти в каждом отчете. Именно с них всегда начинается анализ:
🎯Метрика "Визиты". Видно по графику, что 21го марта, когда я опубликовала пост был пик заходов, а всего было их 11 (визитов).
🎯Метрика "Посетители" - уникальных посетителей тут тоже 11, то есть заходил не один и тот же человек, а разные люди.
🎯Метрика "Отказы" показывает, что если человек провел на сайте меньше 15 секунд, то это будет считаться отказом. По этой метрике видно нравится контент аудитории или она заглядывает и сразу уходит.
🎯Метрика "Глубина просмотра" - количество страниц, просмотренных посетителем во время визита.
🎯Метрика "Время на сайте" - сколько всего времени человек провел на сайте. или средняя продолжительность визита в секундах.
✔️ Переходы по рекламе. Здесь нет такого, но если бы я запускала рекламную кампанию, то смотрела бы здесь - есть от нее толк или нет.
✔️ Переходы из поисковых систем - люди могут переходить из органики. Органика — это природный нативный трафик, привлеченный из сайтов. Посетители приходят в такие источники “естественным” образом, в основном, из поиска. На мою страничку вышли из Яндекса (6 человек) и Гугла (1 человек). (рис.3)
✔️ Переходы по ссылкам на сайтах. У меня нет нигде ссылок на каких-то сторонних сайтах, поэтому тут виден только Дзен.
✔️ Переходы из рекомендательных систем. Дзен сам рекламирует свои статьи и мы видим, что метрика Визиты показывает сколько было визитов.
Если мы нажмем значок % рядом с метрикой Посетители, то увидим, что прямые заходы составляют 50% , что логично. Основные посетители - Вы и есть. (рис.4)
Можно посмотреть посетителей на типе графика "Круговая диаграмма". Выбираем наверху кружочек. (рис.5)
В отчете по идее должно быть 50% как показано выше (11/22), а тут 47,8% - это 11/(11+7+4+1)
Почему-то в "Итого и средние" показывается 22, а не 23. Кто знает, скажите почему.❓
Тут можно смотреть не только визиты, а еще и выбрать цель. У меня это просто Посещение, а в настоящем сайте-магазине это может быть заполнение заявки на покупку чего-либо. И тогда мы видим слово перед которым трепещут все аналитики: конверсия. (рис.6)
Тут для нас конверсия - это доля целевых визитов в общем числе визитов. Цель тут была просто посещение страниц. Поэтому для прямых заходов получаем конверсию 0,909 = 10 целевых визитов/11 визитов(тут не видно, смотрим в прошлом отчете) 0,909*100 = 90,9%
Отчетов там много, так что
🔠 🔠 🔠 🔠 🔠 🔠 🔠 🔠 🔠 🔠 🔠 🔠 🔠
Так как в основном, как я предполагаю, Вы смотрели статьи по моей просьбе, то это должно быть видно в каком-то отчете. Такой отчет есть. Он называется "Отчет по источникам" и находится: Отчеты-> Источники-> Источники, сводка. Тут видно по источникам откуда приходят люди.
Какие же существуют источники? Сначала рассмотрим тот, через который пришли Вы:
Смотрим базовые числовые метрики, которые присутствуют почти в каждом отчете. Именно с них всегда начинается анализ:
🎯Метрика "Визиты". Видно по графику, что 21го марта, когда я опубликовала пост был пик заходов, а всего было их 11 (визитов).
🎯Метрика "Посетители" - уникальных посетителей тут тоже 11, то есть заходил не один и тот же человек, а разные люди.
🎯Метрика "Отказы" показывает, что если человек провел на сайте меньше 15 секунд, то это будет считаться отказом. По этой метрике видно нравится контент аудитории или она заглядывает и сразу уходит.
🎯Метрика "Глубина просмотра" - количество страниц, просмотренных посетителем во время визита.
🎯Метрика "Время на сайте" - сколько всего времени человек провел на сайте. или средняя продолжительность визита в секундах.
Если мы нажмем значок % рядом с метрикой Посетители, то увидим, что прямые заходы составляют 50% , что логично. Основные посетители - Вы и есть. (рис.4)
Можно посмотреть посетителей на типе графика "Круговая диаграмма". Выбираем наверху кружочек. (рис.5)
В отчете по идее должно быть 50% как показано выше (11/22), а тут 47,8% - это 11/(11+7+4+1)
Почему-то в "Итого и средние" показывается 22, а не 23. Кто знает, скажите почему.
Тут можно смотреть не только визиты, а еще и выбрать цель. У меня это просто Посещение, а в настоящем сайте-магазине это может быть заполнение заявки на покупку чего-либо. И тогда мы видим слово перед которым трепещут все аналитики: конверсия. (рис.6)
Тут для нас конверсия - это доля целевых визитов в общем числе визитов. Цель тут была просто посещение страниц. Поэтому для прямых заходов получаем конверсию 0,909 = 10 целевых визитов/11 визитов(тут не видно, смотрим в прошлом отчете) 0,909*100 = 90,9%
Отчетов там много, так что
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegraph
ЯНДЕКС - МЕТРИКА
Мир аналитика данных | Дзен (dzen.ru)
❤🔥11⚡3🏆2🍓1
Думаю это будет полезным для всех.
Итак, есть две таблички: с отделами и данными по зарплате у сотрудников и их начальников.
Создадим быстренько датафреймы, на котором потренируемся прям в юпитер ноутбуке с помощью библиотеки pandasql. Про эту библиотеку пост тут.
data = {'id': [1,2,3,4,5,6],
'name': ['Финансы','Риски','Розница','Безопасность','ДКК','Аналитика']}
Departament = pd.DataFrame(data)data = { 'id': [1,2,3,4,5,6],
'id_head': [1, 1,2,4,5,3],
'id_dep':[2,2,3,3,8,4],
'sal': [45000,80000,100000,65000,35000,50000] }
Personal = pd.DataFrame(data)Самый простой способ:
select d.name as Department,
count(p.id) as count_personal
from Personal p
join Departament d on d.id = p.id_dep
group by 1
order by 1 desc
limit 1
Но в случае если у нескольких отделов одинаковое количество сотрудников, то результат выдаст один отдел, а не два.
Поэтому рекомендую сделать второй вариант через подзапрос. Можете потренироваться - написать сами.
Это можно реализовать соединив таблицу с этой же модифицированной таблицей. Сделаем табличку с помощью группировки, чтобы был уникальный сотрудник и его з/пл. И присоединим ее с помощью left join к основной по ключу p1.id_head = p2.id.
Тогда в одной строке будет и з/пл сотрудника и з/пл его руководителя. И потом оставляем тех, у кого sal>sal_head
select p1.id
from Personal p1
join (select id,sal as sal_head
from Personal
group by 1) p2 on p1.id_head = p2.id
where sal>sal_head
📎 Тут ноутбук с решением.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥8🆒2
🎓 Подошел к концу текущий поток моего обучающего курса по SQL и Python(Pandas). Я сама не верю, что провела уже два потока. Когда я писала этот курс, то потратила огромное количество сил и энергии и когда вела его, то тоже старалась много отдать, быть на связи, помогать даже с резюме и отвечать на разные вопросы иногда даже просто "за жизнь".
Это крутое время, проведенное вместе! Тем не менее, как говорится, "все хорошее - когда-то заканчивается". И вот, я хочу объявить, что сейчас будет последний поток в обозримом будущем, так как летом я буду занята собственным обучением и проектами.
🚀 Так что стартует набор на крайний поток обучения!
📅 Дата потока открытая. Начнем, как только наберется достаточное количество участников.
👨💻👩💻 Если вы хотите присоединиться к потоку и расширить свои знания SQL и Python, не упустите эту возможность! Присоединяйтесь к нашей группе и начнем это захватывающее образовательное путешествие вместе!
🌟 Спасибо за ваш интерес и участие! Многие просили программу обучения.
Оставляйте заявку в гугл-форме на курс, ну или пишите напрямую @Valeria_Shuvaeva
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4
Мир аналитика данных pinned «☝️ 🔈 Важное объявление для тех кто хочет попасть на .. последний поток по SQL и Python! Заявка на мой курс тут. 🎓 Подошел к концу текущий поток моего обучающего курса по SQL и Python(Pandas). Я сама не верю, что провела уже два потока. Когда я писала этот…»
🚀 Анализ Поисковых Запросов в Яндекс.Метрике
Продолжаю изучение Яндекс.Метрики и делюсь выводами:
🔍 Кто посещает сайт?
География: Основная аудитория из России, но были случаи и из Аргентины!
(Отчеты - Аудитория - География.)
Пол: Преобладают женщины.
(Отчеты - Аудитория - Пол. )
Возраст: Большая часть — это люди в возрасте 25-34 года.
(Отчеты - Аудитория - Возраст. )
🔍 Откуда приходят посетители? Отчеты - Источники - Поисковые запросы
Этот отчет предоставляет информацию о том, какие конкретные запросы пользователи вводили в поисковые системы (например, Яндекс или Google), которые впоследствии привели их на ваш сайт. Изучение этих данных помогает адаптировать контент под популярные запросы и улучшить SEO. Например, слова "собеседование", "питон", "пандас" и "аналитика" часто приводили пользователей на мой сайт в Дзене.
📊 Зачем это нужно?
Инсайты и SEO: Понимание популярных запросов и оптимизация сайта под них помогает улучшить видимость в поисковиках и сделать контент релевантным для аудитории.
Улучшение сайта: Анализ запросов позволяет совершенствовать навигацию и структуру сайта, делая его более удобным для пользователей.
🚀 Пример использования данных:
Если вы обнаружили, что многие пользователи ищут "лучшие способы сохранения данных", можно создать соответствующий контент, который не только отвечает на их запросы, но и повышает лояльность аудитории.
Мне, походу, надо сосредоточиться на статьях с разбором тестовых🙂
✅ Открытый доступ к статистике:
Хочу предоставить Вам возможность самостоятельно ознакомиться с отчетами и статистикой. Я сделала доступ к моему счетчику открытым!
Используйте эту ссылку: https://metrika.yandex.ru/dashboard?id=96707090😮
Пользуйтесь на здоровье!
Продолжаю изучение Яндекс.Метрики и делюсь выводами:
🔍 Кто посещает сайт?
География: Основная аудитория из России, но были случаи и из Аргентины!
(Отчеты - Аудитория - География.)
Пол: Преобладают женщины.
(Отчеты - Аудитория - Пол. )
Возраст: Большая часть — это люди в возрасте 25-34 года.
(Отчеты - Аудитория - Возраст. )
🔍 Откуда приходят посетители? Отчеты - Источники - Поисковые запросы
Этот отчет предоставляет информацию о том, какие конкретные запросы пользователи вводили в поисковые системы (например, Яндекс или Google), которые впоследствии привели их на ваш сайт. Изучение этих данных помогает адаптировать контент под популярные запросы и улучшить SEO. Например, слова "собеседование", "питон", "пандас" и "аналитика" часто приводили пользователей на мой сайт в Дзене.
📊 Зачем это нужно?
Инсайты и SEO: Понимание популярных запросов и оптимизация сайта под них помогает улучшить видимость в поисковиках и сделать контент релевантным для аудитории.
Улучшение сайта: Анализ запросов позволяет совершенствовать навигацию и структуру сайта, делая его более удобным для пользователей.
🚀 Пример использования данных:
Если вы обнаружили, что многие пользователи ищут "лучшие способы сохранения данных", можно создать соответствующий контент, который не только отвечает на их запросы, но и повышает лояльность аудитории.
Мне, походу, надо сосредоточиться на статьях с разбором тестовых
Хочу предоставить Вам возможность самостоятельно ознакомиться с отчетами и статистикой. Я сделала доступ к моему счетчику открытым!
Используйте эту ссылку: https://metrika.yandex.ru/dashboard?id=96707090
Пользуйтесь на здоровье!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4❤3👎1
🔍 Рабочая задача: Анализ данных с регулярными выражениями в Python
🙌 Недавно мне попалась интересная задача на работе, связанная с обработкой текстовых данных. Расскажу, как я это сделала, чтобы вы тоже могли попробовать!
Попросили вытащить из колонки параметров в базе одну цифру, которая следует за словом type. У данных тип object, слов разных технических там много.
Я воспользовалась регулярным выражением. Все таки регулярки - это мощь! 💪
А теперь пишем функцию, которую можно будет в apply запихнуть.
В отдельной колонке будут записаны числа после type, даже если их несколько (смотрите на картинке )
🔑 Расшифрую
⏩ re.findall ищет все совпадения, что позволяет надежно извлекать числа, даже если их несколько в одной строке.
⏩ pattern = 'type:\s*(\d+)'
\s* или \s обозначает любой пробельный символ (пробелы, табуляции, новые строки и т. д.), а * означает "ноль или более" таких символов. Это означает, что между двоеточием и значением может быть любое количество пробелов или даже их отсутствие.
(\d+) - \d означает любую цифру, а + говорит о "одном или более" вхождении. Скобки () используются для группировки выражения, чтобы можно было извлечь только интересующую нас часть (т.е. сами цифры, а не кавычки или пробелы вокруг них).
🙌 Недавно мне попалась интересная задача на работе, связанная с обработкой текстовых данных. Расскажу, как я это сделала, чтобы вы тоже могли попробовать!
Попросили вытащить из колонки параметров в базе одну цифру, которая следует за словом type. У данных тип object, слов разных технических там много.
Я воспользовалась регулярным выражением. Все таки регулярки - это мощь! 💪
import pandas as pd
import re
# Создам образец, чтобы можно было скопировать
data = {
"params": [
"example type:1 with text type:11",
"another type:2 sample",
"more text type:3 here",
"type:4 is also included",
"and a final type:5 example"
]
}
df = pd.DataFrame(data)
А теперь пишем функцию, которую можно будет в apply запихнуть.
def find_numbers(text):
pattern = 'type:\s*(\d+)' # Это шаблон для поиска
numbers = re.findall(pattern, text) # Ищем все совпадения
return numbers
В отдельной колонке будут записаны числа после type, даже если их несколько (смотрите на картинке )
df['type']= df['params'].apply(find_numbers)
🔑 Расшифрую
\s* или \s обозначает любой пробельный символ (пробелы, табуляции, новые строки и т. д.), а * означает "ноль или более" таких символов. Это означает, что между двоеточием и значением может быть любое количество пробелов или даже их отсутствие.
(\d+) - \d означает любую цифру, а + говорит о "одном или более" вхождении. Скобки () используются для группировки выражения, чтобы можно было извлечь только интересующую нас часть (т.е. сами цифры, а не кавычки или пробелы вокруг них).
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17⚡6😁3
🎉 Радостные новости! 🌟 Я стала автором курса по аналитике у SkillFactory! Это не только новый этап в моей карьере, но и захватывающий вызов, который я с радостью принимаю. Буду успевать все совмещать 🤪
В связи с этим новым начинанием, я приняла решение отменить текущий поток обучения. Мне очень жаль, что приходится его отменять. Хотелось бы всё успевать, но физически это оказывается непросто.
В связи с этим новым начинанием, я приняла решение отменить текущий поток обучения. Мне очень жаль, что приходится его отменять. Хотелось бы всё успевать, но физически это оказывается непросто.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🔥19❤6🆒4
👋 Друзья, я вся погружена в работу над курсом для SF, поэтому времени на посты почти не остаётся. Но вот этим не могу не поделиться! 🚀
Недавно я наткнулась на интересную задачу и решила показать решение, которое, надеюсь, будет полезно многим из вас.
Надо было сгруппировать данные в DataFrame по колонке account_id и объединить значения из колонки type через запятую.
У меня были разные типы оплат у аккаунтов, и нужно было показать, какие типы использует каждый аккаунт.
Вот как это сделать с помощью pandas:
Давайте разберёмся, что здесь происходит.
📌 Группировка данных по account_id. Из каждой группы выбираем значения колонки type.
📌Применение функции apply с join. Мы объединяем все значения type в каждой группе в одну строку, разделяя их запятыми.
📊 Таким образом, значения из колонки type сгруппированы по account_id и объединены через запятую в новой колонке type_combined. 🔍
Надеюсь, вам это пригодится! ✨
Недавно я наткнулась на интересную задачу и решила показать решение, которое, надеюсь, будет полезно многим из вас.
Надо было сгруппировать данные в DataFrame по колонке account_id и объединить значения из колонки type через запятую.
У меня были разные типы оплат у аккаунтов, и нужно было показать, какие типы использует каждый аккаунт.
Вот как это сделать с помощью pandas:
import pandas as pd
# Создам DataFrame для примера
data = {
'account_id': [1, 1, 2, 2, 3, 3, 3],
'type': ['A', 'B', 'A', 'C', 'B', 'A', 'D']
}
df = pd.DataFrame(data)
# Сгруппируем данные по колонке 'account_id' и объединим значения колонки 'type' через запятую
df_grouped = df.groupby('account_id')['type'].apply(','.join).reset_index()
# Переименую колонку для красоты
df_grouped.rename(columns={'type': 'type_combined'}, inplace=True)
Давайте разберёмся, что здесь происходит.
📌 Группировка данных по account_id. Из каждой группы выбираем значения колонки type.
df.groupby('account_id')['type']📌Применение функции apply с join. Мы объединяем все значения type в каждой группе в одну строку, разделяя их запятыми.
.apply(','.join)📊 Таким образом, значения из колонки type сгруппированы по account_id и объединены через запятую в новой колонке type_combined. 🔍
Надеюсь, вам это пригодится! ✨
👍29❤5
🤖 У нас теперь есть бот для анонимных сообщений!
Если у вас есть вопросы или что-то, чем вы хотите поделиться, но не хотите раскрывать свою личность, просто напишите боту. Я постараюсь честно ответить (если это не будет под NDA) или как-то прокомментирую.
🗝 Пишите сюда: t.me/anonaskbot?start=UwPGvL1G1RVzcgu
У меня много кода в блоге, но иногда хочется и порассуждать.🤪
Если у вас есть вопросы или что-то, чем вы хотите поделиться, но не хотите раскрывать свою личность, просто напишите боту. Я постараюсь честно ответить (если это не будет под NDA) или как-то прокомментирую.
🗝 Пишите сюда: t.me/anonaskbot?start=UwPGvL1G1RVzcgu
У меня много кода в блоге, но иногда хочется и порассуждать.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
✅ Всем привет!
Я участвую в классной инициативе с другими аналитическими каналами! 📊 Андрон из Simulative обратился ко мне с предложением добавить этот канал в специальную папку. Всего участвуют 15 каналов, где эксперты делятся своим опытом и знаниями. На большинство из них я уже была подписана, поэтому сразу согласилась.
Здесь представлены каналы про Data Science, «хардовые» советы для аналитиков 🖥, каналы о развитии софт-скиллов 🌟, а также каналы про визуализацию. 📈 То, что в подборке есть каналы Бабушкина и Михайлова, уже говорит о многом. Эти ребята действительно крутые! 💪
Ссылка на папку: https://t.me/addlist/dMeiok8FCdA3ZTMy
Мне для обзора выпал канал Юрия Борзило https://t.me/y_borzilo, который я давно знаю и очень рекомендую всем, кто интересуется аналитикой! Юра – действующий продуктовый аналитик, и у него много информации про А/Б тесты.
Вот подборка его постов про А/Б тесты за год: https://t.me/y_borzilo/477
Признавайтесь, у кого есть опыт A/Б тестов? В одном из постов Юра писал о двух крайностях:
1️⃣ Давайте ничего не будем АБ тестировать.
2️⃣ Давайте АБ тестировать вообще все.
Как всегда, нужна золотая середина. Сам по себе этот инструмент не хороший и не плохой, но у него есть ряд ограничений, которые надо учитывать при применении.
Сейчас так много информации, что учиться и совершенствовать свои навыки стало проще, чем когда-либо. Правда, со временем всё так же сложно 😂
Я участвую в классной инициативе с другими аналитическими каналами! 📊 Андрон из Simulative обратился ко мне с предложением добавить этот канал в специальную папку. Всего участвуют 15 каналов, где эксперты делятся своим опытом и знаниями. На большинство из них я уже была подписана, поэтому сразу согласилась.
Здесь представлены каналы про Data Science, «хардовые» советы для аналитиков 🖥, каналы о развитии софт-скиллов 🌟, а также каналы про визуализацию. 📈 То, что в подборке есть каналы Бабушкина и Михайлова, уже говорит о многом. Эти ребята действительно крутые! 💪
Ссылка на папку: https://t.me/addlist/dMeiok8FCdA3ZTMy
Мне для обзора выпал канал Юрия Борзило https://t.me/y_borzilo, который я давно знаю и очень рекомендую всем, кто интересуется аналитикой! Юра – действующий продуктовый аналитик, и у него много информации про А/Б тесты.
Вот подборка его постов про А/Б тесты за год: https://t.me/y_borzilo/477
Признавайтесь, у кого есть опыт A/Б тестов? В одном из постов Юра писал о двух крайностях:
Как всегда, нужна золотая середина. Сам по себе этот инструмент не хороший и не плохой, но у него есть ряд ограничений, которые надо учитывать при применении.
Сейчас так много информации, что учиться и совершенствовать свои навыки стало проще, чем когда-либо. Правда, со временем всё так же сложно 😂
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Борзило
⇨ Про аналитику, продукты, маркетинг
⇨ Автор курса по АБ тестам
⇨ Смело пиши - @borzilo_y
ИНН 026702638983
⇨ Автор курса по АБ тестам
⇨ Смело пиши - @borzilo_y
ИНН 026702638983
👍18🔥5❤2😁1🆒1
📊 Новая Задачка с Работы
Недавно столкнулась с интересной задачей. У каждого клиента client_id есть параметр - подсчет чего-либо. Назовем эту колонку count.
✅ Быстренько создадим датафремчик с примером:
🎯Нужно для каждого клиента найти максимальное значение в колонке count с помощью метода idxmax.
Казалось бы, можно использовать просто max(), но есть нюансы.
✅ Группировка и нахождение индексов с максимальным значением.
Группируем по client_id и находим строки с максимальным значением count для каждой группы (client_id).
✅ Фильтрация: Используем эти индексы для фильтрации исходного DataFrame, оставляя только строки с максимальными значениями count для каждого client_id.
Результат - df_filtered видим на картинке.
❓ А теперь поясню про вариант с max():
Да, задачу можно решить с помощью функции max() при группировке. Этот подход подходит для нахождения максимального значения count для каждого клиента, но не возвращает строку полностью! А мне нужно было видеть всю инфу по строке, так как там много колонок было.
Эта строчка кода вернет только две колонки: client_id и count
Смоделируем бизнес ситуацию, где такое можно было бы использовать:
🛍 Вы работаете в розничной сети, которая имеет программу лояльности для своих клиентов 🛍 . Клиенты могут иметь несколько аккаунтов (например, основной аккаунт и семейные аккаунты). В каждом аккаунте фиксируется активность клиента (покупки, участие в акциях и т.д.). Вам необходимо анализировать наиболее активные аккаунты для предоставления специальных предложений и акций.
Вот такой интересный случай из практики🤪
Недавно столкнулась с интересной задачей. У каждого клиента client_id есть параметр - подсчет чего-либо. Назовем эту колонку count.
import pandas as pd
data = {
"client_id": [111, 222, 111, 333, 333, 444, 444],
"info": ['AAA', 'AAA', 'BBB', 'CCC', 'DDD', 'DDD', 'EEE'],
"count": [10, 1, 9, 8, 6, 0, 1]
}
df = pd.DataFrame(data)
🎯Нужно для каждого клиента найти максимальное значение в колонке count с помощью метода idxmax.
Казалось бы, можно использовать просто max(), но есть нюансы.
Группируем по client_id и находим строки с максимальным значением count для каждой группы (client_id).
idx = df.groupby('client_id')['count'].idxmax()df_filtered = df.loc[idx] #выбирает строки по индексам из idx.
Результат - df_filtered видим на картинке.
Да, задачу можно решить с помощью функции max() при группировке. Этот подход подходит для нахождения максимального значения count для каждого клиента, но не возвращает строку полностью! А мне нужно было видеть всю инфу по строке, так как там много колонок было.
df.groupby('client_id',as_index=False)['count'].max()Эта строчка кода вернет только две колонки: client_id и count
Смоделируем бизнес ситуацию, где такое можно было бы использовать:
Вот такой интересный случай из практики
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡34👍17
🎉 Сохраняем порядок строк при объединении датафреймов в Pandas! 🎉
Привет, друзья! Сегодня я расскажу вам, как правильно объединить два датафрейма и при этом сохранить порядок строк первого! 🧩⬇️
👉 Для этого мы используем df.index, чтобы порядок строк из первого датафрейма оставался неизменным, а из второго добавляем нужные данные. 💼📈
📄 Пример кода:
Набросаю пару таблиц, на которых будем экспериментировать.
Добавим индексный столбец к исходному датафрейму.
Объединяем датафреймы:
Видим, что строки левой таблицы идут сначала не в нужном нам порядке.
Сортируем по исходному индексу:
Удаляем вспомогательный индексный столбец, если он больше не нужен
🔍 И получаем результат: df_final. Смотрим картинку с поэтапным процессом. Специально разбито все по частям, чтобы отследить результат.
С помощью этих шагов мы сохраняем порядок строк из первого датафрейма и добавляем нужные данные из второго. 🚀✨
Привет, друзья! Сегодня я расскажу вам, как правильно объединить два датафрейма и при этом сохранить порядок строк первого! 🧩⬇️
👉 Для этого мы используем df.index, чтобы порядок строк из первого датафрейма оставался неизменным, а из второго добавляем нужные данные. 💼📈
📄 Пример кода:
Набросаю пару таблиц, на которых будем экспериментировать.
import pandas as pd
# Первый df
df1 = pd.DataFrame({
'account_id': [1, 2, 1, 3, 4],
'value_df1': [10, 20, 30, 40, 50]
})
# Второй df
df2 = pd.DataFrame({
'account_id': [1, 2, 3, 5],
'value_df2': ['1 from df2',
'2 from df2',
'3 from df2',
'5 from df2']
})
Добавим индексный столбец к исходному датафрейму.
df1['original_index'] = df1.index
Объединяем датафреймы:
df_merged = pd.merge(df1, df2, on='account_id', how='outer')
Видим, что строки левой таблицы идут сначала не в нужном нам порядке.
Сортируем по исходному индексу:
df_merged = df_merged.sort_values(by='original_index').reset_index(drop=True)
Удаляем вспомогательный индексный столбец, если он больше не нужен
df_final = df_merged.drop(columns=['original_index'])
🔍 И получаем результат: df_final. Смотрим картинку с поэтапным процессом. Специально разбито все по частям, чтобы отследить результат.
С помощью этих шагов мы сохраняем порядок строк из первого датафрейма и добавляем нужные данные из второго. 🚀✨
🔥32❤6🍓2
Центр научной коммуникации Университета ИТМО проводит анализ профессионального сообщества ML- и DS-специалистов в России. Мы хотим узнать больше о том, как устроена профессиональная коммуникация в вашей сфере, кого вы считаете лидерами рынка на данный момент.
Ваше участие поможет нам сформировать полную картину современного состояния индустрии. Мы гарантируем полную анонимность и конфиденциальность ваших ответов.
Опрос займет не более 10 минут вашего времени.
Ссылка на анкету: https://forms.gle/dHRsqQJteuty51Bp7
p.s. Я погуглила университет. Оказалось, что это национальный исследовательский университет, основанный в 1900 в Санкт-Петербурге. Это вам не игры. Тут все серьезно.
Таким помогать - одно удовольствие. 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍6😁1
Хочу поделиться своими рекомендациями так как многие люди тратят деньги и время на неподходящие курсы, которые не приносят желаемых результатов.
Постепенное освоение навыков значительно повысит ваши шансы на успешное трудоустройство! А уже с приобретением опыта вы сможете продвигаться дальше и продолжать развивать свои способности.
Удачи! 🚀📈😊
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥40❤12😍2⚡1💯1
⚡️Хитрая задачка с работы.
Попросили меня выгрузить всех клиентов, у которых ставка кредита меньше или равно указанных. Должны быть меньше вот этих (как пример, цифры придуманные):
📉 Срок рассрочки 3 мес.: 5.93%
📉 Срок рассрочки 4 мес.: 6.64%
📉 Срок рассрочки 6 мес.: 7.05%
В базе данные хранятся у каждого клиента в параметре value просто как текст:
installment_0_0_3_7,59 Срок рассрочки 3 мес. installment_0_0_4_8,42 Срок рассрочки 4 мес. installment_0_0_6_10,84 Срок рассрочки 6 мес.
Сравнить нужно не только ставку, но и соотнести с продолжительностью кредита.
Решение 🚀
✔️ Генерация данных. 📊 Создадим небольшой датафрейм:
Обработка данных 🛠
✔️ Создаем пустой список для хранения обработанных данных.
✔️ Извлечение данных с помощью iterrows() 🔄
Для каждой строки извлекаем client_id, сроки рассрочки и процентные ставки из столбца value. Используем регулярное выражение для поиска всех совпадений в value, которые соответствуют шаблону installment_0_0_<term>_<rate>.
📚Как работает iterrows() 🐍 Метод iterrows() проходит по строкам DataFrame и возвращает пары (index, row) для каждой строки. Здесь index - это индекс строки, а row - это Series, представляющая данные строки.
То есть я извлекаю сроки рассрочки и процентные ставки из колонки value и потом добавляю их в новый DataFrame.
Регулярное выражение для извлечения данных 🔍
Разберем matches = re.findall(r'installment_0_0_(\d+)_([\d,\.]+)', value) подробно:
1. Ищет буквальный текст "installment_0_0_" в строке.
2. (\d+): Находит одну или более цифр и сохраняет их как первую группу захвата (срок кредитования).
3. Ищет символ подчеркивания _.
4.([\d,\.]+): Находит одну или более цифр, запятых или точек и сохраняет их как вторую группу захвата (ставка кредита).
5. Метод re.findall возвращает список кортежей, каждый из которых содержит группы захвата.
У нас получился датафрейм с колонками client_id, rate и term. Вуаля! А теперь можно отфильтровать нужное.
✔️ Фильтрация данных 🎯
Далее я фильтрую данные по заданным условиям. Проценты не должны превышать определенных значений для каждого срока рассрочки
📌Так как код большой, то я оставлю ссылку на юпитер ноутбук. Тестируйте, модифицируйте.
Попросили меня выгрузить всех клиентов, у которых ставка кредита меньше или равно указанных. Должны быть меньше вот этих (как пример, цифры придуманные):
📉 Срок рассрочки 3 мес.: 5.93%
📉 Срок рассрочки 4 мес.: 6.64%
📉 Срок рассрочки 6 мес.: 7.05%
В базе данные хранятся у каждого клиента в параметре value просто как текст:
installment_0_0_3_7,59 Срок рассрочки 3 мес. installment_0_0_4_8,42 Срок рассрочки 4 мес. installment_0_0_6_10,84 Срок рассрочки 6 мес.
Сравнить нужно не только ставку, но и соотнести с продолжительностью кредита.
Решение 🚀
data = [
{
'client_id': 111,
'value': 'installment_0_0_3_7,59 Срок рассрочки 3 мес.'
'installment_0_0_4_8,42 Срок рассрочки 4 мес.'
'installment_0_0_6_10,84 Срок рассрочки 6 мес.'
},
{
'client_id': 222,
'value': 'installment_0_0_3_4,93 Срок рассрочки 3 мес.'
},
{
'client_id': 333,
'value': 'installment_0_0_4_5,64 Срок рассрочки 4 мес.'
'installment_0_0_6_6,05 Срок рассрочки 6 мес.'
},
{
'client_id': 444,
'value': 'installment_0_0_3_7,78 Срок рассрочки 3 мес.'
'installment_0_0_6_9,60 Срок рассрочки 6 мес.'
},
{
'client_id': 555,
'value': 'installment_0_0_4_8,57 Срок рассрочки 4 мес.'
'installment_0_0_6_8 Срок рассрочки 6 мес.'
}
]
# Создание DataFrame
df = pd.DataFrame(data)
Обработка данных 🛠
processed_data = []
Для каждой строки извлекаем client_id, сроки рассрочки и процентные ставки из столбца value. Используем регулярное выражение для поиска всех совпадений в value, которые соответствуют шаблону installment_0_0_<term>_<rate>.
📚Как работает iterrows() 🐍 Метод iterrows() проходит по строкам DataFrame и возвращает пары (index, row) для каждой строки. Здесь index - это индекс строки, а row - это Series, представляющая данные строки.
То есть я извлекаю сроки рассрочки и процентные ставки из колонки value и потом добавляю их в новый DataFrame.
for index, row in df.iterrows():
client_id = row['client_id']
value = row['value']
# Извлечение сроков и ставок с помощью регулярного выражения
matches = re.findall(r'installment_0_0_(\d+)_([\d,\.]+)', value)
for match in matches:
term = f"Срок рассрочки {match[0]} мес."
rate_str = match[1].replace(',', '.')
rate_str = re.sub(r'\.$', '', rate_str)
rate = float(rate_str)
processed_data.append({
'client_id': client_id,
'rate': rate,
'term': term
})
# Создание нового DataFrame из обработанных данных
processed_df = pd.DataFrame(processed_data)
Регулярное выражение для извлечения данных 🔍
Разберем matches = re.findall(r'installment_0_0_(\d+)_([\d,\.]+)', value) подробно:
1. Ищет буквальный текст "installment_0_0_" в строке.
2. (\d+): Находит одну или более цифр и сохраняет их как первую группу захвата (срок кредитования).
3. Ищет символ подчеркивания _.
4.([\d,\.]+): Находит одну или более цифр, запятых или точек и сохраняет их как вторую группу захвата (ставка кредита).
5. Метод re.findall возвращает список кортежей, каждый из которых содержит группы захвата.
У нас получился датафрейм с колонками client_id, rate и term. Вуаля! А теперь можно отфильтровать нужное.
Далее я фильтрую данные по заданным условиям. Проценты не должны превышать определенных значений для каждого срока рассрочки
# Определение условий фильтрации
conditions = {
"Срок рассрочки 3 мес.": 5.93,
"Срок рассрочки 4 мес.": 6.64,
"Срок рассрочки 6 мес.": 7.05
}
filtered_df = processed_df[processed_df.apply(
lambda row: row['term'] in conditions and row['rate'] <= conditions[row['term']], axis=1)]
📌Так как код большой, то я оставлю ссылку на юпитер ноутбук. Тестируйте, модифицируйте.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍9❤4👎3
🎉 Один хороший человек наконец-то достиг первой серьезной отметки - 1000 подписчиков на своем Телеграмм-канале! 🎉
📚 В честь этого он устраивает розыгрыш трех потрясающих книг! По аналитике конечно📚 А я всегда поддерживаю такие начинания. 👌
1. Статистика и Котики – Владимир Савельев
2. Графики, которые убеждают всех – Александр Богачев
3. Погружение в аналитику данных. От Exсel к Python и R – Джордж Маунт
🎁 Я тоже участвую и надеюсь на удачу. 😃 Присоединяйтесь!
Условия участия очень просты - быть его подписчиком.
🍀 Пусть удача будет на вашей стороне! https://t.me/analitikza30
📚 В честь этого он устраивает розыгрыш трех потрясающих книг! По аналитике конечно📚 А я всегда поддерживаю такие начинания. 👌
1. Статистика и Котики – Владимир Савельев
2. Графики, которые убеждают всех – Александр Богачев
3. Погружение в аналитику данных. От Exсel к Python и R – Джордж Маунт
Условия участия очень просты - быть его подписчиком.
🍀 Пусть удача будет на вашей стороне! https://t.me/analitikza30
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥17🔥6👍2🎉2❤1🤗1💘1
📊 ⚡️Хитрая задачка с работы. Возвращение. 📊
👨💻Наконец удалось выкроить время, чтобы поэкспериментировать с этой хитрой задачей, и теперь у меня есть решение, которое не использует циклы! Всё сделано исключительно с помощью Pandas!
Давайте разберем его пошагово:
1️⃣ Генерация данных как и в прошлый раз💾
Здесь мы создаем список словарей, где каждый словарь содержит client_id и строку value с информацией о рассрочках.
2️⃣ Извлечение данных (сроков рассрочки и ставок из строки value) с использованием регулярного выражения 🔍
3️⃣ Преобразование данных в нужный формат 🔄 Преобразуем строковые значения в числовой формат и добавляем текстовое описание к срокам рассрочки.
4️⃣ Определение условий фильтрации 🕵️♂️
Задаем условия для фильтрации данных по срокам рассрочки и максимальным допустимым ставкам.
5️⃣ Фильтрация данных 📊
📎 Вот ссылка на обновленный Jupyter Notebook. В нём вы найдёте ещё дополнительные варианты решения, которые прислал Дмитрий в комментариях. Спасибо ему за это! 🙂
👨💻Наконец удалось выкроить время, чтобы поэкспериментировать с этой хитрой задачей, и теперь у меня есть решение, которое не использует циклы! Всё сделано исключительно с помощью Pandas!
Давайте разберем его пошагово:
Здесь мы создаем список словарей, где каждый словарь содержит client_id и строку value с информацией о рассрочках.
import pandas as pd
data = [
{ 'client_id': 111,
'value': 'installment_0_0_3_7,59 Срок рассрочки 3 мес.'
'installment_0_0_4_8,42 Срок рассрочки 4 мес.'
'installment_0_0_6_10,84 Срок рассрочки 6 мес.'
},
{
'client_id': 222,
'value': 'installment_0_0_3_4,93 Срок рассрочки 3 мес.'
},
{
'client_id': 333,
'value': 'installment_0_0_4_5,64 Срок рассрочки 4 мес.'
'installment_0_0_6_6,05 Срок рассрочки 6 мес.'
},
{
'client_id': 444,
'value': 'installment_0_0_3_7,78 Срок рассрочки 3 мес.'
'installment_0_0_6_9,60 Срок рассрочки 6 мес.'
},
{
'client_id': 555,
'value': 'installment_0_0_4_8,57 Срок рассрочки 4 мес.'
'installment_0_0_6_8 Срок рассрочки 6 мес.'
}
]
df = pd.DataFrame(data)
extracted = df.set_index('client_id')['value'].str.extractall(r'installment_0_0_(\d+)_([\d,]+)')
extracted = extracted.reset_index(level=1, drop=True).reset_index()
extracted.columns = ['client_id', 'term', 'rate']extracted['rate'] = extracted['rate'].str.replace(',', '.').astype(float)
extracted['term'] = 'Срок рассрочки ' + extracted['term'] + ' мес.'Задаем условия для фильтрации данных по срокам рассрочки и максимальным допустимым ставкам.
conditions = {
"Срок рассрочки 3 мес.": 5.93,
"Срок рассрочки 4 мес.": 6.64,
"Срок рассрочки 6 мес.": 7.05
}filtered_df = extracted[extracted.apply(
lambda row: row['term'] in conditions and row['rate'] <= conditions[row['term']], axis=1
)]
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤2👍2
📊 Анализ данных: Извлечение доменов почт клиентов 📊
Привет, друзья! Меня на днях попросили проанализировать домены почт у клиента если сможем.✉️ Цитата:
Я ответила, что можем иполезла в базу пошла за кофе.
Покажу решение на примере SQL-запроса и Python кода.
📜 SQL-запрос
Для начала я использую SQL-запрос, чтобы извлечь домены почт из базы данных:
Этот запрос выполняет следующие действия:
✔️ SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', 1)
- SUBSTRING_INDEX(email, '@', -1) извлекает часть строки после символа @ (то есть домен почты).
- SUBSTRING_INDEX(..., '.', 1) затем извлекает часть строки до первой точки в домене, чтобы получить тип почты.
Таким образом, если email выглядит как user@mail.com, результат будет mail. Если email выглядит как user@yandex.ru, результат будет yandex.
✔️ COUNT(*) — считает количество пользователей с каждым доменом.
✔️ WHERE client_id = 1000 AND type = 'user' — фильтрует данные по определённому аккаунту и типу пользователя.
✔️ GROUP BY 1 — группирует результаты по домену.
💻 Python код
После получения данных из SQL-запроса, мы используем Python для дальнейшей обработки. В целом можно и в SQL написать было, но базе и так тяжело, не стала нагружать ее подзапросами.
P.S. Функция SUBSTRING_INDEX используется в MySQL и не поддерживается PostgreSQL. В PostgreSQL для аналогичной задачи нужно использовать
Цифра 2 в функции split_part(email, '@', 2) указывает на то, что мы хотим получить вторую часть строки, разделённую символом '@'. Мы разделяем email на две части: до символа '@' и после него. Нам нужна часть, идущая после символа '@', то есть домен почты.
📝 Результаты
После выполнения этого кода мы получаем таблицу, отсортированную по количеству пользователей для каждого домена, с процентным значением.
Теперь понятно какие почтовые домены наиболее популярны среди пользователей.✉️
Привет, друзья! Меня на днях попросили проанализировать домены почт у клиента если сможем.
Типа такого: яндекс - 1,2 млн / 15% мейл.ру - …. гугл
Я ответила, что можем и
Покажу решение на примере SQL-запроса и Python кода.
📜 SQL-запрос
Для начала я использую SQL-запрос, чтобы извлечь домены почт из базы данных:
query = ""
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', 1) AS mail_type, COUNT(*)
FROM user.user
WHERE client_id = 1000
AND type = 'user'
GROUP BY 1
"""
users = pd.read_sql(query, connection)
Этот запрос выполняет следующие действия:
- SUBSTRING_INDEX(email, '@', -1) извлекает часть строки после символа @ (то есть домен почты).
- SUBSTRING_INDEX(..., '.', 1) затем извлекает часть строки до первой точки в домене, чтобы получить тип почты.
Таким образом, если email выглядит как user@mail.com, результат будет mail. Если email выглядит как user@yandex.ru, результат будет yandex.
💻 Python код
После получения данных из SQL-запроса, мы используем Python для дальнейшей обработки. В целом можно и в SQL написать было, но базе и так тяжело, не стала нагружать ее подзапросами.
import pandas as pd
#Сортировка данных по количеству пользователей в порядке убывания
users_sorted = users.sort_values('count(*)', ascending=False)
# Подсчёт общего количества пользователей
total_count = users_sorted['count(*)'].sum()
# Расчёт процента для каждого домена
users_sorted['percentage'] = (users_sorted['count(*)'] / total_count) * 100
P.S. Функция SUBSTRING_INDEX используется в MySQL и не поддерживается PostgreSQL. В PostgreSQL для аналогичной задачи нужно использовать
split_part(split_part(email, '@', 2), '.', 1) AS mail_type
Цифра 2 в функции split_part(email, '@', 2) указывает на то, что мы хотим получить вторую часть строки, разделённую символом '@'. Мы разделяем email на две части: до символа '@' и после него. Нам нужна часть, идущая после символа '@', то есть домен почты.
📝 Результаты
После выполнения этого кода мы получаем таблицу, отсортированную по количеству пользователей для каждого домена, с процентным значением.
Теперь понятно какие почтовые домены наиболее популярны среди пользователей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31❤5