📊 Работа с пропущенными данными - Восстановление и удаление данных
Пропущенные данные - распространенная проблема в анализе данных. Иногда значения отсутствуют, тогда они обозначаются в виде вопросительных знаков ❓, нулей 0️⃣ или пустых ячеек.
Например, в таблице нормализованных потерь есть пропущенное значение, обозначенное как
Давайте сначала создадим датафрейм для примера (см. в карточках под постом)
Как обработать пропущенные данные?
Каждая ситуация уникальна, и подход к ней должен быть индивидуальным. Давайте начнем с восстановления данных.
1 Способ: Восстановление данных
Самый лучший способ, конечно, восстановить данные, если у вас есть доступ к дополнительной информации. Этот способ обеспечивает наиболее точные результаты. Сделать это можно так:
2 Способ: Удаление данных
Но, к сожалению, не всегда данные можно восстановить из источника.
Тогда можно попробовать просто удалить строки или столбцы с пропущенными данными. Если вы анализируете цену и другие атрибуты вам не важны, то отсутствие информации о цене может повлиять на ваши выводы (например, при расчете среднего). В этом случае лучше удалить строки с отсутствующей ценой, чтобы не включать их в расчет.
Этот способ будет актуальным, если у вас много данных и небольшое количество пропусков.
Обработка пропущенных данных может быть сложной задачей, но правильный подход к ней позволяет извлечь более точную информацию из ваших данных.
Сегодня мы разобрали, как заполнять пропущенные данные и удалять их. А когда наберем 25 👍 , подробно расскажем вам про замену средним и случаи, когда стоит оставить пропуски 😉
#python #pandas
Пропущенные данные - распространенная проблема в анализе данных. Иногда значения отсутствуют, тогда они обозначаются в виде вопросительных знаков ❓, нулей 0️⃣ или пустых ячеек.
Например, в таблице нормализованных потерь есть пропущенное значение, обозначенное как
NaN.Давайте сначала создадим датафрейм для примера (см. в карточках под постом)
Как обработать пропущенные данные?
Каждая ситуация уникальна, и подход к ней должен быть индивидуальным. Давайте начнем с восстановления данных.
1 Способ: Восстановление данных
Самый лучший способ, конечно, восстановить данные, если у вас есть доступ к дополнительной информации. Этот способ обеспечивает наиболее точные результаты. Сделать это можно так:
# Заполнение пропущенных значений на основе дополнительной информацииРезультат смотрите в карточках
df.loc[df['Модель'] == 'Outback', 'Цена'] = 17625
df.loc[df['Модель'] == 'Civic', 'Потери'] = 150
df.loc[df['Модель'] == 'Mustang', 'Тип топлива'] = 'Дизель'
2 Способ: Удаление данных
Но, к сожалению, не всегда данные можно восстановить из источника.
Тогда можно попробовать просто удалить строки или столбцы с пропущенными данными. Если вы анализируете цену и другие атрибуты вам не важны, то отсутствие информации о цене может повлиять на ваши выводы (например, при расчете среднего). В этом случае лучше удалить строки с отсутствующей ценой, чтобы не включать их в расчет.
Этот способ будет актуальным, если у вас много данных и небольшое количество пропусков.
# Удаление строк с пропущенными значениями в столбце "Цена"Результат смотрите в карточках
df = df.dropna(subset=['Цена'])
Обработка пропущенных данных может быть сложной задачей, но правильный подход к ней позволяет извлечь более точную информацию из ваших данных.
Сегодня мы разобрали, как заполнять пропущенные данные и удалять их. А когда наберем 25 👍 , подробно расскажем вам про замену средним и случаи, когда стоит оставить пропуски 😉
#python #pandas
👍25🔥3😁2
А мы продолжаем разбор актуального теста от компании Kaspersky 🚀😊
Когда этот пост наберет 30 🔥огоньков, подкинем еще вопросов😉
Вопрос 1
* В таблице T1 больше строк, чем в T2.
* В таблице Т2 есть все значения из T1, а в Т1 не все из T2.
Выберите все варианты запросов, в результате которых будет выведено все содержимое таблицы T1 и количество строк в результате будет равняться количеству строк исходной T1.
1. SELECT * FROM T2 LEFT JOIN T1 ON (T1.key = T2.key);
2. SELECT * FROM T2 JOIN T1 ON (T1.key = T2.key);
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
4. SELECT * FROM T1;
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Ответы и объяснения:
1. SELECT * FROM T2 LEFT JOIN T1 ON (T1.key = T2.key);
Этот запрос не подходит, так как он начинает соединение с T2 и включает все строки из T2 и только совпадающие строки из T1. Он не возвращает все строки из T1.
2. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Этот запрос не подходит, так как INNER JOIN выбирает только совпадающие строки из T1 и T2, но не возвращает все строки из T1.
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Аналогично предыдущему.
✅ 4. SELECT * FROM T1;
Этот запрос подходит, так как он выбирает все строки из T1 без соединения с T2. Это то, что нам нужно, чтобы получить все содержимое таблицы T1.
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
Этот запрос также не подходит. Он использует RIGHT JOIN, чтобы включить все строки из T2 и только совпадающие строки из T1. Остальные строки будут заполнены значениями NULL.
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
Не подходит аналогично 2 и 3.
✅ 7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Этот запрос подходит, так как это LEFT JOIN, который включает все строки из T1 и только совпадающие строки из T2.
Вопрос 2: В результате каких запросов выведутся строки, заканчивающиеся на "lab"?
1. SELECT Name FROM T1 WHERE RIGHT(Name, 3) = 'lab'
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Ответы и объяснения:
✅ 1. SELECT Name FROM T1 WHERE RIGHT(Name, 3) = 'lab'
Подходит. Этот запрос выберет строки, в которых последние три символа в столбце `Name` равны "lab". Это подходящий вариант, если все имена завершаются на "lab". Например, "testlab" будет выбрано, но "laboratory" - нет.
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых в столбце `Name` есть подстрока "lab" в любой части строки.
✅ 3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
Подходит. Этот запрос выберет строки, в которых столбец `Name` оканчивается на "lab". Это подходящий вариант, если вам нужны все строки, где имя заканчивается на "lab".
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых пять последних символов в столбце `Name` содержат подстроку "lab".
Вопрос 3: Расположите конструкции запроса на выдачу прав пользователю в правильном порядке
1. ON
2. GRANT
3. TO
Правильный порядок:
1. GRANT
2. ON
3. TO
Оператор GRANT в SQL используется для выдачи прав доступа к объектам базы данных, таким как таблицы, представления, процедуры и другие. Он предоставляет возможность управления безопасностью данных, определяя, какие действия могут выполнять определенные пользователи или роли в отношении этих объектов.
Пример использования оператора GRANT:
-- Выдача прав на чтение таблицы "employees" пользователю "user1"
GRANT SELECT ON employees TO user1;
Удачи на собеседованиях!
Не забудь нажать огонек 🔥, чтобы мы запостили продолжение.
#sql #Kaspersky #interview_problems
Когда этот пост наберет 30 🔥огоньков, подкинем еще вопросов😉
Вопрос 1
* В таблице T1 больше строк, чем в T2.
* В таблице Т2 есть все значения из T1, а в Т1 не все из T2.
Выберите все варианты запросов, в результате которых будет выведено все содержимое таблицы T1 и количество строк в результате будет равняться количеству строк исходной T1.
1. SELECT * FROM T2 LEFT JOIN T1 ON (T1.key = T2.key);
2. SELECT * FROM T2 JOIN T1 ON (T1.key = T2.key);
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
4. SELECT * FROM T1;
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Ответы и объяснения:
Этот запрос не подходит, так как он начинает соединение с T2 и включает все строки из T2 и только совпадающие строки из T1. Он не возвращает все строки из T1.
2. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Этот запрос не подходит, так как INNER JOIN выбирает только совпадающие строки из T1 и T2, но не возвращает все строки из T1.
3. SELECT * FROM T1 JOIN T2 ON (T1.key = T2.key);
Аналогично предыдущему.
✅ 4. SELECT * FROM T1;
Этот запрос подходит, так как он выбирает все строки из T1 без соединения с T2. Это то, что нам нужно, чтобы получить все содержимое таблицы T1.
5. SELECT * FROM T1 RIGHT JOIN T2 ON (T1.key = T2.key);
Этот запрос также не подходит. Он использует RIGHT JOIN, чтобы включить все строки из T2 и только совпадающие строки из T1. Остальные строки будут заполнены значениями NULL.
6. SELECT Т1.* FROM T2 JOIN T1 ON (T1.key = T2.key);
Не подходит аналогично 2 и 3.
✅ 7. SELECT * FROM T1 LEFT JOIN T2 ON (T1.key = T2.key);
Этот запрос подходит, так как это LEFT JOIN, который включает все строки из T1 и только совпадающие строки из T2.
Вопрос 2: В результате каких запросов выведутся строки, заканчивающиеся на "lab"?
1. SELECT Name FROM T1 WHERE RIGHT(Name, 3) = 'lab'
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Ответы и объяснения:
Подходит. Этот запрос выберет строки, в которых последние три символа в столбце `Name` равны "lab". Это подходящий вариант, если все имена завершаются на "lab". Например, "testlab" будет выбрано, но "laboratory" - нет.
2. SELECT Name FROM T1 WHERE Name LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых в столбце `Name` есть подстрока "lab" в любой части строки.
✅ 3. SELECT Name FROM T1 WHERE Name LIKE '%lab'
Подходит. Этот запрос выберет строки, в которых столбец `Name` оканчивается на "lab". Это подходящий вариант, если вам нужны все строки, где имя заканчивается на "lab".
4. SELECT Name FROM T1 WHERE RIGHT(Name, 5) LIKE '%lab%'
Не подходит. Этот запрос выберет строки, в которых пять последних символов в столбце `Name` содержат подстроку "lab".
Вопрос 3: Расположите конструкции запроса на выдачу прав пользователю в правильном порядке
1. ON
2. GRANT
3. TO
Правильный порядок:
2. ON
3. TO
Оператор GRANT в SQL используется для выдачи прав доступа к объектам базы данных, таким как таблицы, представления, процедуры и другие. Он предоставляет возможность управления безопасностью данных, определяя, какие действия могут выполнять определенные пользователи или роли в отношении этих объектов.
Пример использования оператора GRANT:
-- Выдача прав на чтение таблицы "employees" пользователю "user1"
GRANT SELECT ON employees TO user1;
Удачи на собеседованиях!
Не забудь нажать огонек 🔥, чтобы мы запостили продолжение.
#sql #Kaspersky #interview_problems
🔥56😱2
🔥 Бесплатный курс по Pandas!
Мы уже написали множество постов для тех, кто работает с Pandas, и уже очевидно, что его польза неоспорима.
Но все ли вы владеете им свободно? Pandas необходимый инструмент для аналитика данных, и мы хотим, чтобы вы были экспертом в нем. Потому наша команда недавно запустила бесплатный онлайн-курс, где на практических примерах и задачах вы прокачаете навыки и знания по работе с данными с помощью библиотеки Pandas в Python.
Что вас ждет на курсе:
◾️ начнете работать с Pandas на примере реальных аналитических задач (проведете многомерный ABC-анализ, XYZ-анализ, рассчитаете динамику продаж и т.д.)
◾️ изучите все от самых азов до продвинутых функций (например, сложная агрегация, оконные функции и т.д.)
◾️ сделаете собственный проект — ваш итоговый кейс! (реальный кейс автоматизации обработки финансовой отчетности от крупной региональной аптечной сети и добавите его к себе в портфолио)
Если вы только начинаете путь в анализе данных и хотите научиться использовать современные инструменты, мы поможем сделать первый шаг 😉
👉🏻 Зарегистрироваться на курс: ссылка
Мы уже написали множество постов для тех, кто работает с Pandas, и уже очевидно, что его польза неоспорима.
Но все ли вы владеете им свободно? Pandas необходимый инструмент для аналитика данных, и мы хотим, чтобы вы были экспертом в нем. Потому наша команда недавно запустила бесплатный онлайн-курс, где на практических примерах и задачах вы прокачаете навыки и знания по работе с данными с помощью библиотеки Pandas в Python.
Что вас ждет на курсе:
◾️ начнете работать с Pandas на примере реальных аналитических задач (проведете многомерный ABC-анализ, XYZ-анализ, рассчитаете динамику продаж и т.д.)
◾️ изучите все от самых азов до продвинутых функций (например, сложная агрегация, оконные функции и т.д.)
◾️ сделаете собственный проект — ваш итоговый кейс! (реальный кейс автоматизации обработки финансовой отчетности от крупной региональной аптечной сети и добавите его к себе в портфолио)
Если вы только начинаете путь в анализе данных и хотите научиться использовать современные инструменты, мы поможем сделать первый шаг 😉
👉🏻 Зарегистрироваться на курс: ссылка
🔥10👍2❤1🎉1
🎩🐍 Одиночка в Python: Магия Singleton-паттерна✨🪄
Паттерн Singleton - это настоящий гений в мире проектирования классов. Он позволяет нам создать только один экземпляр класса и обеспечить глобальную точку доступа к этому экземпляру. Имея такую возможность, мы можем контролировать доступ к общему ресурсу и гарантировать, что всегда используется один и тот же объект.
Один из способов реализации Singleton в Python - использовать магический метод
Давайте посмотрим на пример:
В этом примере мы создали класс Singleton и объявили переменную
Метод
🤔 Для чего мы используем паттерн Singleton в нашей работе:
- чтобы гарантировать, что у нас есть только один экземпляр класса для доступа к общим ресурсам, таким как база данных, файловая система или настройки приложения,
- чтобы обеспечивать согласованное взаимодействие разных частей нашей системы, используя один единственный объект,
- чтобы управлять количеством создаваемых экземпляров класса и оптимизировать использование наших ресурсов.
❗️ Но будьте осторожны!
Иногда применение Singleton может быть нецелесообразным или даже привести к проблемам. Например Singleton может усложнить расширение функциональности класса, так как он предоставляет только одну точку доступа к объекту.
Подобные тонкости, лайфхаки и фишки мы более подробно разбираем у нас в Симуляторе "Аналитик данных" 🔥
🕵️ А если хотите посмотреть, как устроена наша флагманская обучающая программа изнутри и понять, как вы можете бустануть свою карьеру в аналитике на реальных бизнес-кейсах, то записывайтесь на индивидуальную бесплатную экскурсию!
#python #ООП
Паттерн Singleton - это настоящий гений в мире проектирования классов. Он позволяет нам создать только один экземпляр класса и обеспечить глобальную точку доступа к этому экземпляру. Имея такую возможность, мы можем контролировать доступ к общему ресурсу и гарантировать, что всегда используется один и тот же объект.
Один из способов реализации Singleton в Python - использовать магический метод
__new__. Метод __new__ вызывается при создании нового экземпляра класса и отвечает за его создание. Давайте посмотрим на пример:
class Singleton:
instance = None
def __new__(cls, *args, **kwargs):
if not cls.instance:
cls.instance = super().__new__(cls, *args, **kwargs)
return cls.instance
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # True
В этом примере мы создали класс Singleton и объявили переменную
instance, которая будет хранить единственный экземпляр класса.Метод
__new__ проверяет, существует ли экземпляр класса. Если нет, то он создает новый экземпляр и сохраняет его в переменную instance. При последующих вызовах Singleton() будет возвращаться тот же самый экземпляр. Таким образом, мы гарантируем, что всегда используется только один экземпляр класса.🤔 Для чего мы используем паттерн Singleton в нашей работе:
- чтобы гарантировать, что у нас есть только один экземпляр класса для доступа к общим ресурсам, таким как база данных, файловая система или настройки приложения,
- чтобы обеспечивать согласованное взаимодействие разных частей нашей системы, используя один единственный объект,
- чтобы управлять количеством создаваемых экземпляров класса и оптимизировать использование наших ресурсов.
❗️ Но будьте осторожны!
Иногда применение Singleton может быть нецелесообразным или даже привести к проблемам. Например Singleton может усложнить расширение функциональности класса, так как он предоставляет только одну точку доступа к объекту.
Подобные тонкости, лайфхаки и фишки мы более подробно разбираем у нас в Симуляторе "Аналитик данных" 🔥
🕵️ А если хотите посмотреть, как устроена наша флагманская обучающая программа изнутри и понять, как вы можете бустануть свою карьеру в аналитике на реальных бизнес-кейсах, то записывайтесь на индивидуальную бесплатную экскурсию!
#python #ООП
👍11❤4🔥2👎1
🧐 Хитрые вопросы c собеседований по SQL
Недавно мы проводили опрос среди наших читателей и выяснили, что у многих есть пробелы, казалось бы в решении простых задач по SQL. Знания есть, а навык применения их в контексте бизнеса — отсутствует. Поэтому от такого на интервью их бросает в дрожь, вводит в ступор и, как итог, — собеседование провалено.
Знакомое ощущение?
Запросы на такие каверзные вопросы растут, информации в свободном доступе нет, поэтому наши преподаватели решили поделиться с вами материалом по хитрым вопросам с собеседований по SQL!
🔗 Скачать материал: ссылка
Они помогут junior-аналитикам успешно подготовиться к собеседованиям, а кому то – расширить горизонт своих знаний.
Вот почему этот материал станет вашим незаменимым помощником:
◾️ Будете готовы к самым хитрым и сложным вопросам по SQL. Собрали максимально боевые вопросы — вы не встретите здесь воды и общих формулировок, только максимально “мясной” контент.
◾️ Объясняем все вопросы в контексте решения бизнес-задач с примерами ответов и пояснениями к ним.
◾️ Узнаете не просто объяснение всех вопросов, но и какую область знаний они проверяют, и найдете свои слабые места.
◾️ Доступность и удобство.
Команда Simulative настоятельно рекомендует вам скачать этот материал! И скоро у нас будет для вас новая полезная подборка 😉
🔗 Скачать материал: ссылка
#sql
Недавно мы проводили опрос среди наших читателей и выяснили, что у многих есть пробелы, казалось бы в решении простых задач по SQL. Знания есть, а навык применения их в контексте бизнеса — отсутствует. Поэтому от такого на интервью их бросает в дрожь, вводит в ступор и, как итог, — собеседование провалено.
Знакомое ощущение?
Запросы на такие каверзные вопросы растут, информации в свободном доступе нет, поэтому наши преподаватели решили поделиться с вами материалом по хитрым вопросам с собеседований по SQL!
🔗 Скачать материал: ссылка
Они помогут junior-аналитикам успешно подготовиться к собеседованиям, а кому то – расширить горизонт своих знаний.
Вот почему этот материал станет вашим незаменимым помощником:
◾️ Будете готовы к самым хитрым и сложным вопросам по SQL. Собрали максимально боевые вопросы — вы не встретите здесь воды и общих формулировок, только максимально “мясной” контент.
◾️ Объясняем все вопросы в контексте решения бизнес-задач с примерами ответов и пояснениями к ним.
◾️ Узнаете не просто объяснение всех вопросов, но и какую область знаний они проверяют, и найдете свои слабые места.
◾️ Доступность и удобство.
Команда Simulative настоятельно рекомендует вам скачать этот материал! И скоро у нас будет для вас новая полезная подборка 😉
🔗 Скачать материал: ссылка
#sql
❤10🔥2🎉2👍1
🔍 Ошибка в использовании алиасов в SQL-запросе
При написании SQL-запросов, мы часто руководствуемся не правилами синтаксиса SQL, а правилом «как думается, так и пишется» 😄
Например, мы хотим отобрать строки, где разница между старой и новой ценой (diff) больше
❌ Давайте посмотрим на наш «интуитивный» запрос:
Ошибка здесь заключается в том, что мы используем алиас столбца
Фильтр
✅ Правильный способ - использовать вычислимое выражение внутри
Теперь запрос отработает корректно!
❗️Имейте в виду, что внутри оператора
🤔 Какие ошибки в SQL вы совершали? Поделитесь своими вопросами и опытом в комментариях! 👇
#sql
При написании SQL-запросов, мы часто руководствуемся не правилами синтаксиса SQL, а правилом «как думается, так и пишется» 😄
Например, мы хотим отобрать строки, где разница между старой и новой ценой (diff) больше
100. Это звучит логично. Но в SQL не все так просто, и многие попадают в эту ловушку.❌ Давайте посмотрим на наш «интуитивный» запрос:
SELECT old_price - new_price AS diff
FROM goods
WHERE diff > 100
Ошибка здесь заключается в том, что мы используем алиас столбца
diff в операторе WHERE. Запрос кажется логичным, но порядок выполнения операторов в SQL-запросе не позволяет этого сделать. Фильтр
WHERE выполняется до оператора SELECT (и AS), поэтому столбец diff фактически не существует на момент выполнения WHERE. Это вызывает ошибку: "ERROR: column 'diff' does not exist."✅ Правильный способ - использовать вычислимое выражение внутри
WHERE:SELECT old_price - new_price AS diff
FROM goods
WHERE old_price - new_price > 100
Теперь запрос отработает корректно!
❗️Имейте в виду, что внутри оператора
ORDER BY, например, мы можем использовать алиасы, так как этот оператор выполняется после SELECT.🤔 Какие ошибки в SQL вы совершали? Поделитесь своими вопросами и опытом в комментариях! 👇
#sql
👍15🔥6❤1👎1
Разбор тестового задания на junior-аналитика - СБЕР, Ozon или Пятерочка? 🔥
Друзья, скоро мы планируем проводить большой вебинар, где будем разбирать очередное тестовое задание на позицию junior-аналитика. Но мы никак не можем выбрать - какую компанию разбирать, внутри нашей команды развязались настоящие баталии 😁
Помогите нам выбрать - проголосуйте за вариант, который вам больше всего нравится. Ваш голос будет решающим!
Друзья, скоро мы планируем проводить большой вебинар, где будем разбирать очередное тестовое задание на позицию junior-аналитика. Но мы никак не можем выбрать - какую компанию разбирать, внутри нашей команды развязались настоящие баталии 😁
Помогите нам выбрать - проголосуйте за вариант, который вам больше всего нравится. Ваш голос будет решающим!
👍10🔥4❤1
🔥 Тестовое какой компании будем разбирать на вебинаре?
Anonymous Poll
43%
СБЕР
46%
Ozon
11%
Пятерочка
🔥6👍2❤1
📊 Работа с пропущенными данными. Часть 2
А мы продолжаем обсуждение методов работы с пропущенными данными. Снова работаем с таблицей об автомобилях (см. под постом).
Замена пропущенных значений средним
Итак, один из стандартных методов - замена пропущенных значений средним значением по переменной.
Заменять данные часто лучше, чем удалять, так как информация не теряется. Но вы должны делать это осознанно и помнить, что результат будет менее точным, ведь вы заменяете недостающие данные на предполагаемые значения.
Но что, если эти значения нельзя усреднить, как в случае с категориальными переменными?
Для такой переменной, как тип топлива, не существует среднего типа топлива, поскольку значения переменных не являются числами. В этом случае можно попробовать использовать наиболее часто встречающееся значение (моду).
Результат замены смотрите под постом 👇
Самое часто встречающееся значение -
Оставить пропуски без изменений
В некоторых случаях оставление пропущенных данных без изменений тоже будет полезным.
🔹 Если пропущенные значения возникли случайно и не имеют системного характера, их можно оставить, если они не влияют на анализ.
🔹 Если данные собраны из разных источников, пропуски могут отражать различия в доступности информации. Замена или удаление может исказить реальное положение вещей.
🔹 Оставление пропущенных данных может служить сигналом о недостоверности данных, что может стимулировать дополнительный анализ.
🔹 Замена пропущенных значений может исказить структуру данных. Например, замена средним значением может создать ложное представление о распределении.
🔹 В некоторых случаях пропущенные значения важны для контекста данных, особенно в анализе текста или текстовых данных.
🔹 Замена пропущенных значений может потребовать дополнительных вычислений и ресурсов, а оставление данных без изменений может быть более эффективным.
Но при оставлении пропущенных данных важно понимать, как это влияет на анализ, и иногда требуется дополнительное исследование влияния пропусков на результаты анализа.
Конечно, каждая ситуация уникальна, и к ней следует относиться по-разному. Тем не менее, мы рассмотрели самые типичные варианты решения проблемы пропущенных данных, пользуйтесь!
_ _ _ _ _ _ _ _
А если хотите полностью прокачать свои навыки работы в Pandas, то присоединяйтесь к нашему бесплатному курсу!
Это часть нашей полноценной обучающей программы — Симулятора "Аналитик данных" — мы собрали здесь самое лучшее для вашего обучения:
🔸 задачи из реальной практики (провести многомерный ABC-анализ, XYZ-анализ, рассчитать динамику продаж и т.д.)
🔸 самые азы и подвинутые функции (сложная агрегация, оконные функции и т.д.)
🔸 итоговый проект (сделаете ваш первый кейс и добавите к себе в портфолио!)
Вы готовы бустануть свои знания и навыки в работе с Pandas? 😉
🔗 Ждем вас на бесплатном курсе — ссылка
А мы продолжаем обсуждение методов работы с пропущенными данными. Снова работаем с таблицей об автомобилях (см. под постом).
Замена пропущенных значений средним
Итак, один из стандартных методов - замена пропущенных значений средним значением по переменной.
Заменять данные часто лучше, чем удалять, так как информация не теряется. Но вы должны делать это осознанно и помнить, что результат будет менее точным, ведь вы заменяете недостающие данные на предполагаемые значения.
# Замена NaN средними значениями
df['Цена'].fillna(df['Цена'].mean(),
inplace=True)
df['Год'].fillna(
int(df['Год'].mean()),
inplace=True)
Но что, если эти значения нельзя усреднить, как в случае с категориальными переменными?
Для такой переменной, как тип топлива, не существует среднего типа топлива, поскольку значения переменных не являются числами. В этом случае можно попробовать использовать наиболее часто встречающееся значение (моду).
# Замена пропущенных значений модой
mode=df['Топливо'].mode()[0]
df['Топливо'].fillna(mode,
inplace=True)
Результат замены смотрите под постом 👇
Самое часто встречающееся значение -
Бензин, на него и заменилось пропущенное значение.Оставить пропуски без изменений
В некоторых случаях оставление пропущенных данных без изменений тоже будет полезным.
🔹 Если пропущенные значения возникли случайно и не имеют системного характера, их можно оставить, если они не влияют на анализ.
🔹 Если данные собраны из разных источников, пропуски могут отражать различия в доступности информации. Замена или удаление может исказить реальное положение вещей.
🔹 Оставление пропущенных данных может служить сигналом о недостоверности данных, что может стимулировать дополнительный анализ.
🔹 Замена пропущенных значений может исказить структуру данных. Например, замена средним значением может создать ложное представление о распределении.
🔹 В некоторых случаях пропущенные значения важны для контекста данных, особенно в анализе текста или текстовых данных.
🔹 Замена пропущенных значений может потребовать дополнительных вычислений и ресурсов, а оставление данных без изменений может быть более эффективным.
Но при оставлении пропущенных данных важно понимать, как это влияет на анализ, и иногда требуется дополнительное исследование влияния пропусков на результаты анализа.
Конечно, каждая ситуация уникальна, и к ней следует относиться по-разному. Тем не менее, мы рассмотрели самые типичные варианты решения проблемы пропущенных данных, пользуйтесь!
_ _ _ _ _ _ _ _
А если хотите полностью прокачать свои навыки работы в Pandas, то присоединяйтесь к нашему бесплатному курсу!
Это часть нашей полноценной обучающей программы — Симулятора "Аналитик данных" — мы собрали здесь самое лучшее для вашего обучения:
🔸 задачи из реальной практики (провести многомерный ABC-анализ, XYZ-анализ, рассчитать динамику продаж и т.д.)
🔸 самые азы и подвинутые функции (сложная агрегация, оконные функции и т.д.)
🔸 итоговый проект (сделаете ваш первый кейс и добавите к себе в портфолио!)
Вы готовы бустануть свои знания и навыки в работе с Pandas? 😉
🔗 Ждем вас на бесплатном курсе — ссылка
👍10🔥6
🔥 Использование frame_exclusion в оконных функциях PostgreSQL
Эта опция полезна, когда вам нужно исключить определенные строки из оконных вычислений на основе конкретных условий.
Давайте рассмотрим пример использования frame_exclusion.
У нас есть таблица
Разберемся, что мы делаем?
1. Мы выбираем данные о клиентах, датах заказов и суммах заказов из таблицы
2. Используем оконную функцию
3.
4.
5.
6. И, наконец,
Еще frame_exclusion может быть полезной, например, в таких задачах:
✅ Вычисление средней цены акций без учета выбросов
В таблице с ценами акций возникли выбросы - аномально высокие или низкие цены. Вы хотите вычислить среднюю цену акций за определенный период, исключая выбросы. Используйте frame_exclusion для исключения строк с выбросами.
✅ Определение времени простоя оборудования
Вы анализируете данные по времени простоя оборудования в производстве с учетом перерывов в работе менее 30 минут. Чтобы исключить перерывы, как раз понадобится frame_exclusion.
Еще больше примеров разбираем у нас в Симуляторе "Аналитик данных" 🔥
🕵️ Если хотите посмотреть, как устроена наша флагманская обучающая программа изнутри и понять, как вы можете бустануть свою карьеру в аналитике на реальных бизнес-кейсах, то записывайтесь на индивидуальную бесплатную экскурсию!
#sql
frame_exclusion - это дополнительная опция для оконных функций в PostgreSQL, позволяющая более гибко управлять оконными рамками. Эта опция полезна, когда вам нужно исключить определенные строки из оконных вычислений на основе конкретных условий.
Давайте рассмотрим пример использования frame_exclusion.
У нас есть таблица
orders с данными о заказах клиентов. Мы хотим рассчитать кумулятивную сумму заказов для каждого клиента, исключая из вычислений текущий заказ. Тогда код будет выглядеть так:SELECT
client_id,
order_date,
order_amount,
SUM(order_amount) OVER (
PARTITION BY client_id
ORDER BY order_date
ROWS BETWEEN UNBOUNDED
PRECEDING AND 1 PRECEDING
EXCLUDE CURRENT ROW
) AS cumulative_amount
FROM orders;
Разберемся, что мы делаем?
1. Мы выбираем данные о клиентах, датах заказов и суммах заказов из таблицы
orders.2. Используем оконную функцию
SUM, чтобы вычислить кумулятивную сумму заказов для каждого клиента.3.
PARTITION BY разделяет данные на разделы (группы) по client_id.4.
ORDER BY устанавливает порядок сортировки заказов по order_date.5.
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING определяет оконную рамку, включая все строки, начиная с первой строки и заканчивая строкой перед текущей строкой.6. И, наконец,
EXCLUDE CURRENT ROW исключает текущую строку из окна, что позволяет нам исключить текущий заказ из вычисления кумулятивной суммы.Еще frame_exclusion может быть полезной, например, в таких задачах:
✅ Вычисление средней цены акций без учета выбросов
В таблице с ценами акций возникли выбросы - аномально высокие или низкие цены. Вы хотите вычислить среднюю цену акций за определенный период, исключая выбросы. Используйте frame_exclusion для исключения строк с выбросами.
✅ Определение времени простоя оборудования
Вы анализируете данные по времени простоя оборудования в производстве с учетом перерывов в работе менее 30 минут. Чтобы исключить перерывы, как раз понадобится frame_exclusion.
Еще больше примеров разбираем у нас в Симуляторе "Аналитик данных" 🔥
🕵️ Если хотите посмотреть, как устроена наша флагманская обучающая программа изнутри и понять, как вы можете бустануть свою карьеру в аналитике на реальных бизнес-кейсах, то записывайтесь на индивидуальную бесплатную экскурсию!
#sql
👍10🔥5❤2😁1
🧾Порядок операций в SQL и место оконных функций в этом порядке
При написании SQL-запросов важно знать, в каком порядке выполняются различные операции. Вот порядок выполнения подзапросов SQL:
1. FROM / JOINS
Здесь задаются источники данных, включая таблицы и объединения (JOIN), которые используются в запросе.
2. WHERE
На этом этапе выполняется фильтрация данных. Строки, которые не соответствуют условиям, исключаются из результирующего набора.
3. GROUP BY
Если есть группировка (
4. Агрегирующие функции
Выполняются агрегирующие функции, такие как
5. HAVING
Здесь применяются условия к группам данных, и группы, которые не соответствуют условиям, исключаются.
6. Оконные функции
Оконные функции вычисляются на этом этапе. Оконные функции позволяют выполнять вычисления по группам строк в окне, определенном с помощью
7. SELECT
Выбираются столбцы для включения в результирующий набор.
8. DISTINCT
Если используется ключевое слово
9. UNION / INTERSECT / EXCEPT
Если используются операторы
10. ORDER BY
Здесь определяется порядок сортировки строк в результирующем наборе.
11. OFFSET
Если используется оператор
12. LIMIT / FETCH / TOP
Здесь ограничивается количество возвращаемых строк.
☝️🧐Важно отметить, что оконные функции (оконные агрегаты) вычисляются на шестом этапе, что означает, что нельзя использовать их в операторе
_ _ _ _ _ _ _ _ _
А вы хотите научиться правильно писать SQL-запросы и работать с оконными функциями?
В программе Симулятора "Аналитик данных" есть целый модуль, посвященный SQL, куда входит изучение операторов, подзапросов, агрегаций и оконных функций на реальных кейсах и задачах из бизнеса.
👉🏻 Выбрать тариф вы можете на сайте по ссылке: ссылка
При написании SQL-запросов важно знать, в каком порядке выполняются различные операции. Вот порядок выполнения подзапросов SQL:
1. FROM / JOINS
Здесь задаются источники данных, включая таблицы и объединения (JOIN), которые используются в запросе.
2. WHERE
На этом этапе выполняется фильтрация данных. Строки, которые не соответствуют условиям, исключаются из результирующего набора.
3. GROUP BY
Если есть группировка (
GROUP BY), данные группируются по указанным столбцам.4. Агрегирующие функции
Выполняются агрегирующие функции, такие как
SUM, COUNT, AVG, и другие, над данными в группах.5. HAVING
Здесь применяются условия к группам данных, и группы, которые не соответствуют условиям, исключаются.
6. Оконные функции
Оконные функции вычисляются на этом этапе. Оконные функции позволяют выполнять вычисления по группам строк в окне, определенном с помощью
PARTITION BY и ORDER BY.7. SELECT
Выбираются столбцы для включения в результирующий набор.
8. DISTINCT
Если используется ключевое слово
DISTINCT, дубликаты удаляются из результирующего набора.9. UNION / INTERSECT / EXCEPT
Если используются операторы
UNION, INTERSECT, EXCEPT, объединяются результаты запросов.10. ORDER BY
Здесь определяется порядок сортировки строк в результирующем наборе.
11. OFFSET
Если используется оператор
OFFSET, пропускаются указанное количество строк.12. LIMIT / FETCH / TOP
Здесь ограничивается количество возвращаемых строк.
☝️🧐Важно отметить, что оконные функции (оконные агрегаты) вычисляются на шестом этапе, что означает, что нельзя использовать их в операторе
WHERE (который вычисляется на втором этапе). Однако, можно обойти это ограничение, используя общий запрос (CTE - common table expression), где можно вызывать оконные функции и сохранять их результаты как столбцы в CTE. CTE рассматривается как таблица, и результаты оконных функций будут оцениваться оператором WHERE как обычные значения столбцов ._ _ _ _ _ _ _ _ _
А вы хотите научиться правильно писать SQL-запросы и работать с оконными функциями?
В программе Симулятора "Аналитик данных" есть целый модуль, посвященный SQL, куда входит изучение операторов, подзапросов, агрегаций и оконных функций на реальных кейсах и задачах из бизнеса.
👉🏻 Выбрать тариф вы можете на сайте по ссылке: ссылка
🔥21👍6
🪄 Волшебство магических методов в Python ✨
В мире Python существуют методы, которые называются "магическими", потому что они позволяют определить специальное поведение объектов. Эти методы работают скрыто, но оказывают огромное влияние на наш код.
Один из первых магических методов, с которым мы сталкиваемся - это
Мы также переопределили метод
Еще одним распространенным магическим методом является
Здесь класс
Магические методы играют важную роль и при сравнении объектов операторами сравнения (
В этом примере мы переопределили метод
Кроме сравнения, магические методы также используются:
- для арифметических операций (сложения, вычитания и умножения),
- для создания контекстных менеджеров (которые позволяют управлять ресурсами и выполнением кода в блоке) ,
- для создания собственных итерируемых объектов.
Также магические методы позволяют контролировать процесс сериализации и десериализации объектов и многое другое.
Магические методы в Python предоставляют мощные возможности для определения поведения объектов и помогают создавать чистый и читаемый код. Пользуйтесь ими с умом! 🎩🐍
#python
В мире Python существуют методы, которые называются "магическими", потому что они позволяют определить специальное поведение объектов. Эти методы работают скрыто, но оказывают огромное влияние на наш код.
Один из первых магических методов, с которым мы сталкиваемся - это
__init__. Он вызывается при создании нового объекта класса и позволяет инициализировать атрибуты объекта.class Cat:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Я кот {self.name}"
cat = Cat("Буся")
print(cat)
# Я кот Буся
Здесь мы создали класс
Cat и определили метод __init__, который принимает аргумент name и устанавливает его в атрибут name. Мы также переопределили метод
__str__, чтобы получать информативное строковое представление объекта при его выводе. Магический метод str используется для определения текстового представления объекта. Этот метод вызывается, когда вы пытаетесь преобразовать объект в строку с помощью встроенной функции str() или когда объект используется в контексте, где ожидается строковое представление, например, при выводе на экран с помощью print().
Еще одним распространенным магическим методом является
__repr__. Он похож на __str__, но предназначен для возвращения представления объекта, которое можно использовать для его точного воссоздания. Обычно используется для отладки и представления объектов в консоли.class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Point({self.x}, {self.y})"
point = Point(2, 3)
print(point) # Point(2, 3)
Здесь класс
Point представляет точку на плоскости, и метод __repr__ возвращает строку, содержащую код для создания точки, что точно пригодится для отладки.Магические методы играют важную роль и при сравнении объектов операторами сравнения (
==, <, >). Для каждого из таких операторов есть свой магический метод.class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def __eq__(self, other):
return self.width == other.width and self.height == other.height
def __lt__(self, other):
return self.area() < other.area()
def area(self):
return self.width * self.height
rect1 = Rectangle(4, 5)
rect2 = Rectangle(4, 5)
rect3 = Rectangle(3, 6)
print(rect1 == rect2) # True
print(rect1 < rect3) # False
В этом примере мы переопределили метод
__eq__, чтобы сравнивать два прямоугольника на основе их ширины и высоты, и метод __lt__, чтобы сравнивать их по площади.Кроме сравнения, магические методы также используются:
- для арифметических операций (сложения, вычитания и умножения),
- для создания контекстных менеджеров (которые позволяют управлять ресурсами и выполнением кода в блоке) ,
- для создания собственных итерируемых объектов.
Также магические методы позволяют контролировать процесс сериализации и десериализации объектов и многое другое.
Магические методы в Python предоставляют мощные возможности для определения поведения объектов и помогают создавать чистый и читаемый код. Пользуйтесь ими с умом! 🎩🐍
#python
❤10🔥6😢2👍1
Стрим по SQL: Решение задач повышенной сложности 🔥
Недавно мы проводили стрим и решали задачи повышенной сложности по SQL, которые вызывали затруднение более чем у 500 человек 😱
Сегодня мы рады поделиться с вами записью этого кейса - там вас ждет только концентрация полезности, лайфхаков SQL и профессиональных приемов. Скорее смотрите, чтобы не пропустить!
🔗 Чтобы получить запись стрима, просто перейдите по ссылке
Недавно мы проводили стрим и решали задачи повышенной сложности по SQL, которые вызывали затруднение более чем у 500 человек 😱
Сегодня мы рады поделиться с вами записью этого кейса - там вас ждет только концентрация полезности, лайфхаков SQL и профессиональных приемов. Скорее смотрите, чтобы не пропустить!
🔗 Чтобы получить запись стрима, просто перейдите по ссылке
🔥17👍3❤2
Ошибка в SQL - не использовать COALESCE 🔥
Давайте рассмотрим пример из реального бизнеса. У нас есть таблица клиентов (
Отдел маркетинга решил создать email-рассылку, начинающуюся с фразы: "Приветствуем, имя_пользователя!" Однако, если поле name содержит
В таких случаях COALESCE может прийти на помощь:
Совет: Всегда лучше перестраховаться, особенно при вычислениях и агрегировании данных, где любая ошибка может быть незаметной, но существенной. Лучше подстелить "соломку" для безопасности.
✔️ Хотите стать крутым аналитиком данных? Приглашаем вас на персональную экскурсию в Симулятор - мы расскажем, как это сделать: simulative.ru/excursion
#sql
COALESCE - это оператор, который принимает несколько значений и возвращает первое, которое не является NULL. Если все значения NULL, он вернет NULL.COALESCE полезен, чтобы избежать случайных пропусков в вычислениях. Такие пропуски могут быть трудно заметить, особенно при вычислении средних значений на основе большого набора данных. Обычно пропуски заполняют средними, минимальными, максимальными, медианными или средними значениями, или с использованием интерполяции - это зависит от задачи.Давайте рассмотрим пример из реального бизнеса. У нас есть таблица клиентов (
clients), и в поле name хранятся имена пользователей.Отдел маркетинга решил создать email-рассылку, начинающуюся с фразы: "Приветствуем, имя_пользователя!" Однако, если поле name содержит
NULL, фраза становится "Приветствуем, !". Сами представляете выражение лица клиента, когда ему приходит такое письмо… В таких случаях COALESCE может прийти на помощь:
SELECT COALESCE(name, 'Дорогой друг')
FROM clients
Совет: Всегда лучше перестраховаться, особенно при вычислениях и агрегировании данных, где любая ошибка может быть незаметной, но существенной. Лучше подстелить "соломку" для безопасности.
✔️ Хотите стать крутым аналитиком данных? Приглашаем вас на персональную экскурсию в Симулятор - мы расскажем, как это сделать: simulative.ru/excursion
#sql
🔥11🤩6❤3👍3
3 полезных функции для работы с Pandas 🔥
Pandas - огромный фреймворк для анализа данных и в нем много встроенных методов. Это позволяет решать даже специфические задачи, не прибегая при этом к написанию большого количества кода.
Сегодня мы рассмотрим несколько очень удобных, но при этом неочевидных методов Pandas: stack, set_option, insert.
Для начала создадим таблицу, которая содержит название города, среднюю температуру в °C, скорость ветра в м/с
1️⃣ STACK
Давайте теперь переформатируем эту таблицу так, чтобы строки были разбиты не только по городам, но еще и по типу измерения (Температура/Скорость ветра).
По столбцам будут единицы измерения, а в ячейках таблицы - соответствующие значения.
Для этого воспользуемся методом
В
Если же передать список уровней
2️⃣ SET_OPTION
Знакомая ситуация? Думаем, да.
Чтобы сделать работу с Pandas более приятной и избавиться от дубляжей в коде, можно воспользоваться методом
Для начала рекомендуем прописать все необходимые конфигурации. Например:
После этого устанавливаем настройки с помощью
В таком случае выведется только 1 строка, нет цифр после запятой и присутствует полный размер датасета (внизу).
Все как заказывали 😄
Примечание: Чтобы отменить настройки, используйте reset_option:
3️⃣ INSERT
Еще одна знакомая до боли задача:
Зачастую эту задачу решают так:
- Создают новую колонку
- Добавляют в нее данные
- Сортируют вручную столбцы датафрейма в нужном порядке
Этого всего можно избежать, использовав метод
Например, добавим новый столбец Скорость ветра в км/ч в самое начало нашего датафрейма:
Все результаты команд смотрите в карточках под постом!)
✅ Хотите прокачать свои навыки на реальных бизнес-кейсах? Записывайтесь на наш бесплатный курс по Pandas: simulative.ru/pandas
#python #pandas
Pandas - огромный фреймворк для анализа данных и в нем много встроенных методов. Это позволяет решать даже специфические задачи, не прибегая при этом к написанию большого количества кода.
Сегодня мы рассмотрим несколько очень удобных, но при этом неочевидных методов Pandas: stack, set_option, insert.
Для начала создадим таблицу, которая содержит название города, среднюю температуру в °C, скорость ветра в м/с
import pandas as pd
multi_col = pd.MultiIndex.from_tuples(
[('Temperature', '°C'),
('Wind', 'm/s')])
df = pd.DataFrame(columns=multi_col,
index=['Тюмень','Москва','Краснодар'],
data=[[5, 2], [10, 5], [20, 1]])
1️⃣ STACK
Давайте теперь переформатируем эту таблицу так, чтобы строки были разбиты не только по городам, но еще и по типу измерения (Температура/Скорость ветра).
По столбцам будут единицы измерения, а в ячейках таблицы - соответствующие значения.
Для этого воспользуемся методом
stack(). Он возвращает измененный фрейм данных или ряд, имеющий многоуровневый индекс, при котором каждая строка разбивается на несколько частей. В
stack есть параметр level - уровни стекинга. Список «уровней», которые мы хотим перекинуть с оси столбцов на ось индекса. Например, если передать только 0 уровень, то в ось индекса попадут Типы измерений. df.stack(level = 0)
Если же передать список уровней
[0, 1], то все уровни с оси столбцов перейдут в индекс. df.stack(level = [0, 1])
2️⃣ SET_OPTION
Каждый раз при просмотре большого датафрейма приходится писать df.head(5), чтобы вывести только первые строки!
Знакомая ситуация? Думаем, да.
Чтобы сделать работу с Pandas более приятной и избавиться от дубляжей в коде, можно воспользоваться методом
set_option. Он позволяет заменить стандартные настройки Pandas на свои кастомные, настроив отдельные аспекты под себя. Для начала рекомендуем прописать все необходимые конфигурации. Например:
display_settings = {
# max кол-во столбцов для отображения
'max_columns': 10,
# max кол-во строк для отображения
'max_rows': 1,
# количество цифр знаков после запятой
'precision': 0,
# отображение полного размера датасета
'show_dimensions': True
}После этого устанавливаем настройки с помощью
set_option:for op, val in display_settings.items():
pd.set_option("display.{}".format(op), val)
В таком случае выведется только 1 строка, нет цифр после запятой и присутствует полный размер датасета (внизу).
Все как заказывали 😄
Примечание: Чтобы отменить настройки, используйте reset_option:
pd.reset_option("all", silent = True)
3️⃣ INSERT
Еще одна знакомая до боли задача:
Добавить новый столбец в середину или начало существующего датафрейма.
Зачастую эту задачу решают так:
- Создают новую колонку
- Добавляют в нее данные
- Сортируют вручную столбцы датафрейма в нужном порядке
Этого всего можно избежать, использовав метод
insert. Он позволяет добавлять столбец в определенном месте, используя индекс столбца. Например, добавим новый столбец Скорость ветра в км/ч в самое начало нашего датафрейма:
df.insert(0, ('Wind_km', 'km/h'),
df[('Wind', 'm/s')]/1000*3600)Все результаты команд смотрите в карточках под постом!)
✅ Хотите прокачать свои навыки на реальных бизнес-кейсах? Записывайтесь на наш бесплатный курс по Pandas: simulative.ru/pandas
#python #pandas
👍14🔥7❤3