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

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

Наш уютный чат: @itresume_chat
Поддержка: @simulative_support
Download Telegram
🔥5👍1
Как тестить гипотезы быстро? 🔥

Давайте обсудим типичную задачу аналитика. Вам нужно проанализировать эффективность email-рассылок в вашей компании и предложить алгоритм:

Как писать письма, которые продают

Ок, есть задача - надо делать. Для начала, разобьем письма на значимые признаки. Например:

* Тема письма
* Содержание письма (полезность, информация про компанию, акция)
* Call to action (купи, подпишись, заполни форму, перейди по ссылке)
* Стилистика (формальная, мемная, casual)

А теперь нужно протестировать, что работает лучше. Стандартный подход - забить болт запускать A/B тесты. То есть делить всю базу подписчиков на 2 равных группы и тестировать 2 разных заголовка (остальное одинаковое). Потом еще 2 разных заголовка. Потом 2 победителя между собой. Потом то же самое для остальных признаков.

Если рассылки вы делаете 1-2 раза в неделю - можете представить, сколько времени займет такой тест?... Одним словом - много. Его результат будет уже просто неактуален.

И как быть? 🧐

Есть способ решения этой проблемы - MVT или многопараметрическое тестирование. Это фреймворк, который обязан знать каждый аналитик - он сокращает время на тесты в десятки раз и существенно повышает качество теста.

Подробно про MVT и как его использовать рассказал наш CEO, Андрон, в своем телеграм-канале.

🔗 Ссылка на пост:
https://news.1rj.ru/str/andron_233/8

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

🔗 Ссылка на канал: https://news.1rj.ru/str/andron_233

P.S. Сегодня вышел новый пост про ABCD-сегментацию клиентов, а скоро будет новый про аналитику в SMM и гранулярность признаков 😉
🔥8👍75
🖐 Всем привет!

Мы на днях обсуждали, какие каналы читают наши сотрудники и когда уделяют время самообразованию 📚

🕰 Оказалось, наш аналитик добирается до соц сетей только перед сном, а вот преподаватель блока по математике заряжается контентом по утрам. А вы что скажете?

Проголосуйте в опросе 😃
😁3🔥2
👨‍🏫 Кстати, вот несколько каналов, в которые мы активно заглядываем:

🔹 https://news.1rj.ru/str/prometriki
🔹 https://news.1rj.ru/str/andron_233
🔹 https://news.1rj.ru/str/data_new_gold

📖 А какие образовательные каналы вам нравятся? Пишите в комментариях 👇
6🔥4
🔥 Базовая Шпаргалка по Работе с Файлами в Python 🔥

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

Открытие файла для чтения
Чтение по строкам
Запись в файл
Добавление в файл
Чтение и запись в бинарных файлах
Работа с контекстом
Проверка наличия файла
Удаление файла
Создание директори
Список файлов в директории
Использование библиотеки shutil
Использование библиотеки os

И для удобства мы сделали для вас notebook 😊

Сохраняйте и пользуйтесь 👇
https://colab.research.google.com/drive/1CqADXAdImiAQ9VIYYzYGdwIuiXQrAF7K?usp=sharing

Если у вас есть какие-либо дополнения, не стесняйтесь оставлять в комментариях!

#python
👍11🔥73
Ищем junior-аналитика к себе в команду! 🔥

У нас сегодня огненная новость - ищем в команду на один из наших проектов заряженного junior-аналитика, который готов впитывать кучу новой информации и быстро развиваться на стыке аналитики и Data Science.

Требования к кандидату:

- Знание Python + Pandas - обязательно
- Английский на уровне чтения литературы и документации - обязательно
- Базовое знание статистики и математики - приветствуется
- Опыт работы с базовыми алгоритмами DS (PCA, ANOVA, кластеризация и т.д.) - приветствуется

Все необходимые знания можно добрать в процессе - главное владеть питоном и быть готовым быстро обучаться
🙂

Чем предстоит заниматься:

Мы строим продукт на стыке маркетинга и аналитики, который позволяет рекламодателям экономить миллоны бюджета за счет data-driven маркетинга. Мы умеем разбирать рекламные креативы на десятки признаков - слова, объекты, цвета и т.д. Ваша задача - под руководством опытного наставника генерировать идеи, тестировать разные алгоритмы на этих данных и улучшать продукт.

Задачи бомбически интересные, беклог полон идей + это классная возможность стартануть карьеру в международном стартапе с возможностью быстрого перехода в Data Science.

Что мы предлагаем:

- Обучение в бою и быстрый профессиональный рост с нуля до опытного аналитика/DS под руководством опытного наставника
- Комфортные условия труда - удаленка, гибкий график, з/п по договоренности
- Крутая строчка в резюме + рекомендации от CEO международного стартапа
- Возможность быстро вырасти внутри компании и получить опцион
- Никакой бюрократии, общение напрямую с CTO, совместные мозгоштурмы и полный креатив

Если вам заходит - скорей отправляйте свое резюме нашему CEO Андрону в личку + напишите пару слов, почему мы должны выбрать именно вас.

P.S. Вакансия горящая, принимать решение будем быстро, так что не затягивайте 😉

P.P.S. Не тратьте много времени на резюме - лучше расскажите, почему вы классный и почему мы сработаемся.
🔥8👍71
🔥 Разбор вопросов из актуального теста от компании Kaspersky 🚀

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

А когда этот пост наберет 15 огоньков, разберем с вами продолжение этого теста.

Вопрос 1: Выберите запросы, которые не упадут с ошибкой.

1. Все вернут ошибку
2. SELECT ID, NAME, COUNT(*) FROM T1 GROUP BY ID, NAME;
3. SELECT COUNT(ID), * FROM T1 GROUP BY (ID);
4. SELECT COUNT(ID), * FROM T1 GROUP BY (ID) HAVING AGE>18;
5. SELECT * FROM T1 GROUP BY (COL1);
6. SELECT COUNT(ID) FROM T1 HAVING AGE>18;

Ответы и объяснения:

1. SELECT ID, NAME, COUNT(*) FROM T1 GROUP BY ID, NAME; - Не вызовет ошибку.

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

2. SELECT COUNT(ID), * FROM T1 GROUP BY (ID); - Вызовет ошибку.

В операторе GROUP BY  указан столбец ID, который используют для группировки результатов. Но когда используется агрегатная функция COUNT(ID), SQL ожидает, что также будут указаны, какие другие столбцы должны быть включены в результат, если они не являются частью агрегации.

3. SELECT COUNT(ID), * FROM T1 GROUP BY (ID) HAVING AGE>18; - Вызовет ошибку.

Аналогично предыдущему запросу.

4. SELECT * FROM T1 GROUP BY (COL1); - Вызовет ошибку.

При использовании оператора GROUP BY, обычно требуется агрегировать столбцы, которые не включены в часть выражения GROUP BY. В данном случае, используют оператор *, чтобы выбрать все столбцы, но не предоставляете агрегатную функцию для столбцов, не включенных в GROUP BY. Такой запрос будет считаться некорректным.

5. SELECT COUNT(ID) FROM T1 HAVING AGE>18; - Вызовет ошибку.

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

Вопрос 2: Какого типа данных не встретишь в SQL?

1. MEDIUMINT
2. SMALLINT
3. BIGINT
4. COMMENT
5. AUTO_INCREMENT
6. NULL
7. IDENTITY
8. TINYINT
9. DECIMAL

Ответ: COMMENT, AUTO_INCREMENT, IDENTITY. Эти три опции не являются типами данных в SQL, а представляют собой различные атрибуты или свойства столбцов.

Вопрос 3: Вам необходимо очистить все содержимое таблицы. Каким запросом вы воспользуетесь?

Выберите один вариант из списка

1. DELETE FROM my_schema.old_table WHERE NAME IS NULL;
2. TRUNCATE my_schema.old_table WHERE NAME IS NULL;
3. DROP TABLE my_schema.old_table;
4. TRUNCATE my_schema.old_table;
5. DROP TABLE my_schema.old_table WHERE NAME IS NULL;

Ответы и объяснения:

1. DELETE FROM my_schema.old_table WHERE NAME IS NULL;

Этот запрос удаляет строки из таблицы, удовлетворяющие условию "WHERE NAME IS NULL". Это не полная очистка таблицы.

2. TRUNCATE my_schema.old_table WHERE NAME IS NULL;

TRUNCATE TABLE не поддерживает использование WHERE для фильтрации строк, и данная комбинация вызовет ошибку.

3. DROP TABLE my_schema.old_table;

DROP TABLE удаляет всю таблицу, а не только её содержимое.

4. TRUNCATE my_schema.old_table;

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

5. DROP TABLE my_schema.old_table WHERE NAME IS NULL;

DROP TABLE не поддерживает использование WHERE для фильтрации строк, и данная комбинация вызовет ошибку.

Итак, правильный запрос для очистки содержимого таблицы - TRUNCATE my_schema.old_table

💥 Мы стараемся максимально подготовить вас к собеседованиям и верим в вас! Не забудь нажать огонек, чтобы мы запостили продолжение.

#sql #Kaspersky #interview_problems
🔥62👍94
📊🔍Разница между оконными и агрегатными функциями

Основное различие между оконными и агрегатными функциями заключается в том, КАК они обрабатывают данные:

Агрегатные функции сворачивают несколько строк в одну строку результата. Они выполняют операцию над набором строк, сгруппированных по определенным критериям, и возвращают единственное значение для каждой группы. Например, функции SUM(), AVG(), MAX() и MIN() являются агрегатными функциями.

Оконные функции, напротив, предоставляют результаты для каждой отдельной строки в наборе данных. Они выполняют агрегатную операцию над набором строк, но результат отображается как новое значение столбца в каждой строке. Оконные функции позволяют анализировать данные на уровне строк, не сворачивая их. Некоторые функции, такие как SUM(), AVG(), MAX() и MIN(), могут использоваться как оконные функции.

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

Используем агрегатные функции:

SELECT department,
MAX(salary) AS max_salary
FROM employee
GROUP BY department
В этом случае мы получаем одну запись на каждый отдел (см. карточку 1).

Используем оконные функции:

SELECT employee_name,
salary,
department,
MAX(salary) OVER (PARTITION BY
department) AS max_salary
FROM employee
Здесь мы получим для каждой строки в исходных данных максимальную зарплату в соответствующем отделе (см. карточку 2).

Вопрос о разнице между оконными и агрегатными функциями часто встречается на собеседованиях. Уверены, теперь вы точно ответите на этот вопрос, если столкнетесь с ним 😎

#sql #interview_problems
👍26🔥74
👍8
📊 Работа с пропущенными данными - Восстановление и удаление данных

Пропущенные данные - распространенная проблема в анализе данных. Иногда значения отсутствуют, тогда они обозначаются в виде вопросительных знаков , нулей 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
👍15🔥4
А мы продолжаем разбор актуального теста от компании 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
🔥56😱2
🔥 Бесплатный курс по Pandas!

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

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

Что вас ждет на курсе:

◾️ начнете работать с Pandas на примере реальных аналитических задач (проведете многомерный ABC-анализ, XYZ-анализ, рассчитаете динамику продаж и т.д.)

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

◾️ сделаете собственный проект — ваш итоговый кейс! (реальный кейс автоматизации обработки финансовой отчетности от крупной региональной аптечной сети и добавите его к себе в портфолио)

Если вы только начинаете путь в анализе данных и хотите научиться использовать современные инструменты, мы поможем сделать первый шаг 😉

👉🏻 Зарегистрироваться на курс: ссылка
🔥10👍21🎉1
🎩🐍 Одиночка в Python: Магия Singleton-паттерна🪄

Паттерн 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 #ООП
👍114🔥2👎1
🧐 Хитрые вопросы c собеседований по SQL

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

Знакомое ощущение?

Запросы на такие каверзные вопросы растут, информации в свободном доступе нет, поэтому наши преподаватели решили поделиться с вами материалом по хитрым вопросам с собеседований по SQL!

🔗 Скачать материал: ссылка

Они помогут junior-аналитикам успешно подготовиться к собеседованиям, а кому то – расширить горизонт своих знаний.

Вот почему этот материал станет вашим незаменимым помощником:

◾️ Будете готовы к самым хитрым и сложным вопросам по SQL. Собрали максимально боевые вопросы — вы не встретите здесь воды и общих формулировок, только максимально “мясной” контент.

◾️ Объясняем все вопросы в контексте решения бизнес-задач с примерами ответов и пояснениями к ним.

◾️ Узнаете не просто объяснение всех вопросов, но и какую область знаний они проверяют, и найдете свои слабые места.

◾️ Доступность и удобство.

Команда Simulative настоятельно рекомендует вам скачать этот материал! И скоро у нас будет для вас новая полезная подборка 😉

🔗 Скачать материал: ссылка

#sql
10🔥2🎉2👍1
🔍 Ошибка в использовании алиасов в SQL-запросе

При написании SQL-запросов, мы часто руководствуемся не правилами синтаксиса SQL, а правилом «как думается, так и пишется» 😄

Например, мы хотим отобрать строки, где разница между старой и новой ценой (diff) больше 100. Это звучит логично. Но в SQL не все так просто, и многие попадают в эту ловушку.

Давайте посмотрим на наш «интуитивный» запрос:

SELECT old_price - new_price AS diff
FROM goods
WHERE diff > 100


Ошибка здесь заключается в том, что мы используем алиас столбца diff в операторе WHERE. Запрос кажется логичным, но порядок выполнения операторов в SQL-запросе не позволяет этого сделать.

Фильтр WHERE выполняется до оператора SELECTAS), поэтому столбец 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🔥61👎1
Разбор тестового задания на junior-аналитика - СБЕР, Ozon или Пятерочка? 🔥

Друзья, скоро мы планируем проводить большой вебинар, где будем разбирать очередное тестовое задание на позицию junior-аналитика. Но мы никак не можем выбрать - какую компанию разбирать, внутри нашей команды развязались настоящие баталии 😁

Помогите нам выбрать - проголосуйте за вариант, который вам больше всего нравится. Ваш голос будет решающим!
👍10🔥41