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 типичных ошибок при написании SQL-запросов

Сегодня подготовили разбор типичных ошибок при работе с SQL. Традиционно - вместе с онлайн-университетом SF Education 🙂

Основные тезисы:

1. Преобразование типов. 1/2 = 0. В некоторых СУБД деление целых чисел дает строго целое число. Как быть - рассказываем в карточках.

2. HAVING вместо WHERE. Встречали конструкции типа HAVING date >= '2019-01-01'? Так делать не надо.

3. Алиасы и план запроса. Фильтр WHERE обрабатывается сильно раньше оператора SELECT в плане запросе. Это накладывает некоторые ограничения на использование алиасов.

4. Лишние подзапросы. Тот случай, когда размер - не главное. Главное - опыт 😉

5. Игнорирование CASE. С помощью CASE можно сократить запрос в несколько раз и даже решить некоторые нетривиальные задачи.
👍13
​​🔥 Тестовое задание на позицию Бизнес-аналитика

Собрали для вас тестовое задание на позицию бизнес-аналитика 👉🏻https://vk.cc/cbjbKI

Тест состоит из вопросов по темам:

* Python (Pandas)
* SQL
* Продуктовые метрики
* Статистика и теория вероятностей
* Power BI

А на сколько вопросов вы смогли ответить правильно? 😏
👍52
🔥 5 ошибок при составлении резюме

Чтобы привлекать внимание рекрутеров, нужно не только много уметь, но еще и «вкусно» это преподнести 🙂

Сегодня вместе с онлайн-университетом SF Education обсудили 5 типичных ошибок, которые встречаются в большинстве резюме.

Например:

Старайтесь максимально указывать инструменты и технологии, с которыми вы работаете

Посудите сами - вариант «До»:

- Создание аналитической системы для отдела маркетинга

Вариант «После»:

+ Разработал аналитическую систему на основе Power BI и Airflow + Python + PostgreSQL в качестве хранилища

Остальные пункты читайте в карточках 😏

- - - - -

Кстати, о том, как «вкусно» упаковать свое резюме, подробно и с примерами мы рассказали в статье 👉🏻 https://vk.cc/cbvYHr
👍3🔥21
​​🔥 CHANGELOG.md - IT Resume [Февраль]

Февраль хоть и короткий месяц, но мы много чего успели:

0. Готовим кое-что новое и крутое 😉
1. Упростили процедуру регистрации — теперь не придется городить сложные пароли
2. Исправили 50+ багов по задачам, добавили новые разборы и решения
3. Добавили несколько задач и тестовых заданий с собеседований

А также:

+ Тот самый Глеб Михайлов застримил у нас со своими леопардами 👉🏻 https://vk.cc/cbz2Hn
+ Собрали почти 30К просмотров и 100 комментариев на Хабре и все это на одной статье 👉🏻 https://vk.cc/cbz2OY

Stay tuned! 🙂
🔥4👍2
​​💥Тотальный код ревью - разбираем решение на Python

Рассмотрим задачу:

Дан массив целых чисел nums размерности 2n. Элементы массива расположены в следующем порядке: [x1, x2, ..., xn, y1, y2, …, yn]. Необходимо преобразовать массив к виду [x1, y1, x2, y2, …, xn, yn].

Пример:

Дано: nums = [2, 5, 1, 3, 4, 7], n = 3
Результат: [2, 3, 5, 4, 1, 7]

Давайте разберем решение одного из пользователей нашей платформы и сделаем его тотальный код-ревью.

Кстати, попробуйте решить задачку сами 👉 https://vk.cc/cbz9ba

Решение, которое предложил пользователь:

 class Answer:
def shuffle(self, nums, n):
p = []
p1 = []

tot = []

for i in nums[0:n]:
p.append(i)


for i in nums[n:]:
p1.append(i)

for i in range(len(p)):
tot.append(p[i])
tot.append(p1[i])
return tot

Отметим, что поставленную задачу этот код действительно решает. Однако многое тут можно оптимизировать.


1. Избавимся от range

Начнем немного с конца. В последнем цикле пользователь предлагает цикл по i с помощью range(len(p)).

В целом, это логично - длина массивов p и p1 одинаковая, так что ошибок здесь нет. Но это же код на Python - давайте перепишем его на питонячем!

Сцепим два списка с помощью zip и проитерируем по ним одновременно. А чтобы пополнить список tot на очередной итерации, просто используем «+=».

 for el1, el2, in zip(p, p1):
tot += [el1, el2]

Можете проверить - результат будет такой же.


2. Избавимся от лишних циклов

Вообще говоря, столько циклов тут и не нужно. Пользователь сначала пробегает по первой части списка, занося нужные элементы в новый список p. Далее он делает аналогично с p1.

Сходу в голову приходят 2 варианта:

- Пробежаться в цикле 1 раз и добавить проверку if
- Сцепить 2 подмассива

1 вариант:

 for i, el in enumerate(nums):
if i < n:
p.append(el)
else:
p1.append(el)

Тут у нас опять 2 массива. Чтобы от них избавиться, можно заглядывать «немного вперед»:

 for i, el in enumerate(a):
if i < n:
tot += [el, a[i+n]]

Но и тут как будто что-то не то. Немного смущают индексы.

2 вариант:

Так давайте избавимся от них с помощью слайсинга и функции zip:

 for a, b in zip(nums[:n], nums[n:]):
tot += [a, b]

Вот это уже получше. Мы сразу избавились от 2 лишних циклов и от 2 дополнительных списков.


3. Наведем красоту

Помимо исправлений по коду, несколько замечаний про внешнее оформление кода.

— Задание массивов лучше не растягивать на 3 строки, а оформить в виде одной:

p, p1, tot = [], [], []

— Между некоторыми блоками кода есть 2 пустые строки. Это не соответствует PEP8
👍20
​​🗣 А где вы размещаете свое резюме?

Поиск работы - занятие очень интересное 😅 Расскажите - а где вы размещаете свое резюме? Используете только сайты с вакансиями (типа ХХ) или также задействуете профильные платформы (гитхаб, линкедин, твиттер и прочие)?

Кстати, если мы забыли какой-то вариант - поделитесь в комментариях 🙂
🔥1
Где у вас размещено резюме?
Anonymous Poll
35%
LinkedIn
5%
Superjob
14%
Хабр Карьера
6%
GitHub
1%
Facebook
3%
Свой сайт
9%
Сторонние сервисы
👍2
🔥 3 уровня использования map в Python

0. Базовая информация

* Встроенная функция map(<function>, <iterable>) используется для применения функции <function> к каждому элементу итерируемого объекта <iterable> (например, списку или кортежу).

* Результат такой функции - итератор.

* Чтобы получить из итератора список с результатом - используйте функцию list():

list(map(<function>, <iterable>))

1. Классическое использование

map - это кусочек функционального программирования в Python. Поэтому чаще всего ее используют вместе с лямбда-функциями.

Задача:

Дан список, состоящий из строк. Нужно убрать пробелы из начала и конца каждой строки.

Решение:

list(map(lambda x: x.strip(), [' IT ', ' Resume ']))

# ['IT', 'Resume']

2. Продвинутое использование

А как насчет обработки сразу нескольких итерируемых объектов? Легко!

Задача:

Даны 2 списка - numbers и powers. Необходимо возвести numbers[i] в степень powers[i].

Решение:

numbers = [2, 3, 4]
powers = [0, 1, 2]

list(map(lambda x, y: x**y, numbers, powers))

# [1, 3, 16]

- - -

► Задачки по программированию и аналитике: IT Resume
👍20
🔥 Как правильно именовать объекты в Python?

1. Какие стили именования вообще бывают?

* camelCase - первая буква первого слова маленькая, остальные - большие
* PascalCase или UpperCamelCase - все первые буквы большие
* snake_case - все маленькие, слова разделены _
* kebab-case - все маленькие, слова разделены -
* UPPER_SNAKE_CASE - все большие, разделены _

2. Как выбрать стиль для конкретного объекта?

Просто руководствуйтесь общим правилом:

* модули - snake_case
* классы - PascalCase
* функции/методы - snake_case
* переменные - snake_case или camelCase
* константы - UPPER_SNAKE_CASE

3. А какими должны быть имена переменных?

* Легко читаемыми: userToken
* Не слишком длинными: не userApiAccessToken, а userToken
* Достаточными для передачи смысла: token - слишком общее название, лучше уточнить - userToken или accessToken

* Общие имена тоже можно использовать, но только если из контекста и так все ясно. Например:

 def update_user(self, data):
[self.user[k] = data[k] for k in data.keys()]

* Сокращения можно использовать только если переменная исчезает мгновенно. Например: lambda a: a**2.

4. Как лучше - 'create\_user' или 'user\_creation'?

И тут есть парочка полезных рекомендаций:

* функции и методы → глаголы: update_user, create_record
* булевые функции/переменные отвечают на вопрос «да/нет»: isGuest, shouldClear, hasRights, canAccess
* коллекции - множественное число: random_words, users_list

5. Универсальное правило

В именовании переменных есть волшебное правило, которое покрывает абсолютно все ситуации. И состоит оно всего из 3 пунктов:

* Названия должны быть такими, чтобы однозначно было понятно, что это и что там лежит
* Стили именования должны быть согласованы: можете использовать любой стиль, главное не мешайте их между собой
* Исключения из правил есть. Всегда. Например, shouldHideMobileMenu - и никуда тут не деться

В конце концов, руководствуйтесь здравым смыслом 😉

- - - - -

► Задачки по программированию и аналитике: IT Resume
👍8🔥5
Расширяем свои знания в Python с помощью совместного материала с Selectel.

В новых карточках собрали 7 способов использовать функцию zip в Python.

Эта функция создает несколько кортежей из элементов коллекций, которые были ей переданы. Сегодня подробно рассмотрим, как обрабатывать коллекции разной длины, создавать словари и даже транспонировать матрицы с помощью zip.
🔥19👍6😢1