Операции над множествами
Set – множество, в котором отсутствуют повторяющиеся элементы:
Set – множество, в котором отсутствуют повторяющиеся элементы:
>>> a = set([1,2,3,4])
>>> b = set([3,4,5,6])
>>> a | b # объединение
{1, 2, 3, 4, 5, 6}
>>> a & b # пересечение
{3, 4}
>>> a < b # подмножества
False
>>> a - b # разница
{1, 2}
>>> a ^ b # симметрическая разность
{1, 2, 5, 6}
Метод get для словарей
У словарей есть метод get, который возвращает значение по ключу, переданному в аргументах функции. Однако если такого ключа в словаре нет, то исключение не выбрасывается, а возвращается значение по умолчанию, которое передаётся вторым аргументом, или же None, если второй аргумент не передан.
В качестве примера создадим словарь с именами, которые можно получить по определенным значениям, и напишем функцию, которая возвращает приветственную фразу со взятием имени из этого словаря:
Смотрим на результат:
Вызов функции с аргументом в виде несуществующего в словаре ключа:
У словарей есть метод get, который возвращает значение по ключу, переданному в аргументах функции. Однако если такого ключа в словаре нет, то исключение не выбрасывается, а возвращается значение по умолчанию, которое передаётся вторым аргументом, или же None, если второй аргумент не передан.
В качестве примера создадим словарь с именами, которые можно получить по определенным значениям, и напишем функцию, которая возвращает приветственную фразу со взятием имени из этого словаря:
names = {
382: 'Alice',
590: 'Bob',
951: 'Dilbert'
}
def greeting(user_id):
name = names.get(user_id, 'there')
return f'Hi {name}!'
Смотрим на результат:
greeting(382)
# 'Hi Alice!'
Вызов функции с аргументом в виде несуществующего в словаре ключа:
greeting(0)
# 'Hi there!'
В общем, мы создали объединенный чат нескольких каналов для взаимопомощи в программировании и просто общения – @python_chat_ru
uuid
Стандартный модуль uuid — быстрый и простой способ сгенерировать UUID (universally unique identifier, глобально уникальный идентификатор).
Так мы создаём случайное 128-битное число, которое наверняка будет уникальным.
Существует более 2¹²² возможных UUID. Это более 5 ундециллионов, то есть 36 нулей.
Вероятность нахождения дубликатов в заданном наборе крайне мала. Даже при наличии триллиона UUID вероятность того, что среди них есть дубликат, гораздо меньше, чем один к миллиарду.
Вполне недурно для двух строк кода.
Стандартный модуль uuid — быстрый и простой способ сгенерировать UUID (universally unique identifier, глобально уникальный идентификатор).
from uuid import uuid4
user_id = uuid4()
print(user_id)
Так мы создаём случайное 128-битное число, которое наверняка будет уникальным.
Существует более 2¹²² возможных UUID. Это более 5 ундециллионов, то есть 36 нулей.
Вероятность нахождения дубликатов в заданном наборе крайне мала. Даже при наличии триллиона UUID вероятность того, что среди них есть дубликат, гораздо меньше, чем один к миллиарду.
Вполне недурно для двух строк кода.
Дробные числа в Python могут иметь значение NaN, которое ничему не равно, включая самого себя. Один из способов получить их – использовать модуль math.
Кроме того, объект NaN не является уникальным в отличие от None, вы можете иметь несколько различных объектов NaN из разных источников:
Также это означает, что нельзя использовать NaN в качестве ключа в словаре:
>>> math.nan == math.nan
False
Кроме того, объект NaN не является уникальным в отличие от None, вы можете иметь несколько различных объектов NaN из разных источников:
>>> float('nan')
nan
>>> float('nan') is float('nan')
False
Также это означает, что нельзя использовать NaN в качестве ключа в словаре:
>>> d = dict()
>>> d[float('nan')] = 1
>>> d
{nan: 1}
>>> d[float('nan')]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: nan
Новая рубрика #кодподписчика
На днях одна подписчица присала мне свой интересный и крайне необычный скрипт, поэтому я решил создать новую рубрику на своём канале, в которой буду выкладывать интересные работы своих подписчиков.
В общем, суть программы в том, что берется произвольная картинка, разбивается на кусочки, создаются папки на рабочем столе и эти кусочки первоначальной картинки ставятся как иконки на папки. То есть получается некая мозаика, которую можно собрать в единую картинку прямо на рабочем столе вашего компьютера. По-моему, это отличный и вполне необычный способ отвлечься от работы, особо ничего не открывая.
Теперь по технической части: скрипт написан на Python с использованием модулей win32api и pillow. Весь исходный код доступен здесь на гитхабе, советую посмотреть. Также подписчица просила в раздел Issues написать ваши идеи насчет того, что можно добавить и улучшить.
Да, теперь каждый может прислать своё любое нетривиальное творение мне в личные сообщения, и я с большой вероятностью опубликую.
На днях одна подписчица присала мне свой интересный и крайне необычный скрипт, поэтому я решил создать новую рубрику на своём канале, в которой буду выкладывать интересные работы своих подписчиков.
В общем, суть программы в том, что берется произвольная картинка, разбивается на кусочки, создаются папки на рабочем столе и эти кусочки первоначальной картинки ставятся как иконки на папки. То есть получается некая мозаика, которую можно собрать в единую картинку прямо на рабочем столе вашего компьютера. По-моему, это отличный и вполне необычный способ отвлечься от работы, особо ничего не открывая.
Теперь по технической части: скрипт написан на Python с использованием модулей win32api и pillow. Весь исходный код доступен здесь на гитхабе, советую посмотреть. Также подписчица просила в раздел Issues написать ваши идеи насчет того, что можно добавить и улучшить.
Да, теперь каждый может прислать своё любое нетривиальное творение мне в личные сообщения, и я с большой вероятностью опубликую.
Буквально недавно вышел Python 3.8, делать обзор его новых фишек на канал?
Anonymous Poll
97%
Да!
3%
Нет(
Моржовый оператор (Walrus Operator) в Python 3.8
Новый способ присваивания выражения (
Присваивания с помощью моржа требуется делать в круглых скобках, и перед знаком равно пишется двоеточие. Внутри скобок либо создается новая переменная, либо происходит присвоение значения уже существующий переменной.
Но фишка заключается в том, что вся эта конструкция, скажем так, возвращает присвоенное значение, как это делают обычные функции.
Пойдем дальше и рассмотрим пример, в котором раскрывается весь потенциал моржового оператора:
То есть мы только что прямо в проверке условия объявили новую переменную n и далее использовали ее вместо того, чтобы вычислять значение заново. Для сравнения посмотрим, как мы это могли сделать раньше:
В первом случае появляется лишняя строка кода, в которой объявляется ненужная переменная. Во втором случае дважды вызвана одна и та же функция, а это потеря в производительности.
Если вам понравился моржовый оператор, то дайте мне фидбек – я сделаю отдельный пост с конкретными примерами.
Новый способ присваивания выражения (
:=
), или оператор «морж», был самой обсуждаемой функцией, представленной в последней версии Python. Новое дополнение к языку было предложено в PEP 572. Сразу посмотрим, как это выглядит в коде:(x:= 5)
print(x) # 5
Присваивания с помощью моржа требуется делать в круглых скобках, и перед знаком равно пишется двоеточие. Внутри скобок либо создается новая переменная, либо происходит присвоение значения уже существующий переменной.
Но фишка заключается в том, что вся эта конструкция, скажем так, возвращает присвоенное значение, как это делают обычные функции.
a = (b:= 7)
print(a, b) # 7 7
Пойдем дальше и рассмотрим пример, в котором раскрывается весь потенциал моржового оператора:
# пусть a – контейнер или последовательность
if (n:= len(a)) > 10:
print(f'Слишком много элементов, а именно {n}')
То есть мы только что прямо в проверке условия объявили новую переменную n и далее использовали ее вместо того, чтобы вычислять значение заново. Для сравнения посмотрим, как мы это могли сделать раньше:
n = len(a)
if n > 10:
print(f'Слишком много элементов, а именно {n}')
# или
if len(a) > 10:
print(f'Слишком много элементов, а именно {len(a)}')
В первом случае появляется лишняя строка кода, в которой объявляется ненужная переменная. Во втором случае дважды вызвана одна и та же функция, а это потеря в производительности.
Если вам понравился моржовый оператор, то дайте мне фидбек – я сделаю отдельный пост с конкретными примерами.
Моржовый оператор – примеры
В предыдущем посте мы обсудили синтаксис нового оператора присваивания. В личные сообщения я получил большое количество просьб продолжить, поэтому в этом посте мы рассмотрим частные случаи, когда морж в коде выглядит солидно.
Но для начала стоит отметить ещё один важный момент – моржовый оператор не создаёт новую область видимости:
Теперь к практичным примерам использования.
1. Повторно используем значение в списке:
2. Повторное использование значения из условия в генераторных выражениях:
3. Чтение данных из файла внутри циклов while:
В предыдущем посте мы обсудили синтаксис нового оператора присваивания. В личные сообщения я получил большое количество просьб продолжить, поэтому в этом посте мы рассмотрим частные случаи, когда морж в коде выглядит солидно.
Но для начала стоит отметить ещё один важный момент – моржовый оператор не создаёт новую область видимости:
if (n:= len(a)) > 10:
print(f'Слишком много элементов')
print(f'Количество элементов: {n}')
Теперь к практичным примерам использования.
1. Повторно используем значение в списке:
foo = [y:= f(x), y * 2, y * 3]
# вместо
foo = [f(x), f(x) * 2, f(x) * 3]
2. Повторное использование значения из условия в генераторных выражениях:
[y for x in data if (y:=f(x))]
# вместо
result = []
for x in data:
result = f(x)
if result:
results.append(result)
3. Чтение данных из файла внутри циклов while:
while (block := f.read(256)) != '':
process(block)
# вместо
while True:
stuff()
if fail_condition:
break
Перестановки (Permutations)
4! = 24
itertools.permutations
генерирует перестановки, возвращая итерируемый объект. Полагаю, не надо объяснять, как с их помощью вы можете сбрутить чей-то пароль?>>> import itertools
>>> for p in itertools.permutations('ABCD'):
... print(p)
('A', 'B', 'C', 'D')
('A', 'B', 'D', 'C')
('A', 'C', 'B', 'D')
('A', 'C', 'D', 'B')
('A', 'D', 'B', 'C')
('A', 'D', 'C', 'B')
('B', 'A', 'C', 'D')
('B', 'A', 'D', 'C')
('B', 'C', 'A', 'D')
('B', 'C', 'D', 'A')
('B', 'D', 'A', 'C')
('B', 'D', 'C', 'A')
('C', 'A', 'B', 'D')
('C', 'A', 'D', 'B')
('C', 'B', 'A', 'D')
('C', 'B', 'D', 'A')
('C', 'D', 'A', 'B')
('C', 'D', 'B', 'A')
('D', 'A', 'B', 'C')
('D', 'A', 'C', 'B')
('D', 'B', 'A', 'C')
('D', 'B', 'C', 'A')
('D', 'C', 'A', 'B')
('D', 'C', 'B', ‘A’)
4! = 24
Логические any и all
Одна из многих причин, почему Python является таким популярным языком, заключается в том, что он читаем и выразителен. Предлагаю взглянуть на следующий код:
Функция
На мой взгляд, эти две функции заслуживают отдельного внимания всего лишь из-за их простоты в использовании.
Одна из многих причин, почему Python является таким популярным языком, заключается в том, что он читаем и выразителен. Предлагаю взглянуть на следующий код:
statements = [True, True, False]
if any(statements):
print('Как минимум одно выражение истинно')
if all(statements):
print('Все выражения истинны')
if any(statements) and not all(statements):
print('Как минимум одно выражение истинно и одно не истинно')
Функция
any
возвращает значение True
, если хотя бы одно из переданных утверждений верно, all
– когда все верны.На мой взгляд, эти две функции заслуживают отдельного внимания всего лишь из-за их простоты в использовании.
3 способа добавить элемент в список
Напоминаю, списки в Python – упорядоченные последовательности элементов различных типов данных. Списки можно изменять, например добавлять новые элементы.
1. list.append(x) – добавляет элемент, переданный в качестве аргумента, в конец списка. Этот метод является самым простым и распространённым в коде.
2. list.insert(i, x) – вставляет элемент в переданную позицию. Первый аргумент означает индекс элемента, перед которым будет добавлено новое значения.
Таким образом,
3. list.extend(iterable) – расширяет список, добавляя все элементы другой коллекции.
Тема должна быть достаточно легкая и знакомая многим, но повторенье – мать ученья.
P. S. Кстати, оцените новый логотип ;)
Напоминаю, списки в Python – упорядоченные последовательности элементов различных типов данных. Списки можно изменять, например добавлять новые элементы.
1. list.append(x) – добавляет элемент, переданный в качестве аргумента, в конец списка. Этот метод является самым простым и распространённым в коде.
arr = [1, 2]
arr.append(3)
# [1, 2, 3]
2. list.insert(i, x) – вставляет элемент в переданную позицию. Первый аргумент означает индекс элемента, перед которым будет добавлено новое значения.
Таким образом,
list.insert(0, x)
вставит элемент в начало списка, а list.insert(len(list), x)
эквивалентно записи list.append(x)
.arr = [1, 2]
arr.insert(1, 3)
# [1, 3, 2]
3. list.extend(iterable) – расширяет список, добавляя все элементы другой коллекции.
arr = [1, 2]
arr2 = [3, 4]
arr.extend(arr2)
# [1, 2, 3, 4]
Тема должна быть достаточно легкая и знакомая многим, но повторенье – мать ученья.
P. S. Кстати, оцените новый логотип ;)
Разница между генераторными выражениями и генераторами коллекций
Сначала предлагаю сравнить следующие две строчки кода:
Единственная разница в этих двух записях – скобки; в первой строчки они квадратные, а во второй – круглые. Сообщу заранее, что значением переменной
Можем в этом убедиться, распечатав обе переменные:
В первом варианте всё должно быть более менее понятно, а если нет, то рекомендую прочитать пост про генераторы коллекций.
Переменная
Но вот возникает вопрос, а что использовать то? Здесь всё тоже достаточно просто.
Если вам нужен результат в виде списка прямо сейчас для дальнейшего выполнения программы, то используйте генераторные выражения. А если же значения понадобятся еще не скоро или вообще неизвестно, понадобится ли они вообще, то предпочтительнее генераторы, чтобы не занимать лишнюю память и не нагружать систему.
Сначала предлагаю сравнить следующие две строчки кода:
a = [i for i in range(5)]
x = (i for i in range(5))
Единственная разница в этих двух записях – скобки; в первой строчки они квадратные, а во второй – круглые. Сообщу заранее, что значением переменной
a
является список, а переменная x
хранит в себе генератор.Можем в этом убедиться, распечатав обе переменные:
print(a)
print(x)
# [0, 1, 2, 3, 4]
# <generator object <genexpr> at 0x1079d4050>
В первом варианте всё должно быть более менее понятно, а если нет, то рекомендую прочитать пост про генераторы коллекций.
Переменная
x
, как уже выяснилось, хранит в себе по сути самый обычный генератор. Про генераторы на канале также был отдельный пост. Можем получить его значения с помощью цикла:for i in x:
print(i, end=' ')
# 0 1 2 3 4
Но вот возникает вопрос, а что использовать то? Здесь всё тоже достаточно просто.
Если вам нужен результат в виде списка прямо сейчас для дальнейшего выполнения программы, то используйте генераторные выражения. А если же значения понадобятся еще не скоро или вообще неизвестно, понадобится ли они вообще, то предпочтительнее генераторы, чтобы не занимать лишнюю память и не нагружать систему.
Есть заказ. Сейчас поймем насколько интересно 1-2 раза в неделю делать подборки заказов и постить их, например в четверг или пятницу
Anonymous Poll
55%
Да, заказы нужны (1 пост в неделю)
7%
Нет, не надо (я итак при бабле)
38%
Мне все равно, главное пилите крутой контент полезный
Закрытый чат канала Python Lounge (ограничение участия (бесплатно, но нужно пройти отбор), но зато только отборный контент и самые крутые кодеры)
Anonymous Poll
36%
Да, я бы зашел в такой
34%
Не, у меня 500 чатов, ну камон
16%
Если будут крутые кодеры, которые будут помогать - я за
15%
Реально будут менторы из Stanford и MIT? Если да - готов пройти любой отбор
Пишем простой сайт на Python.
Часть 1/3
Сегодня разберём создание страницы при помощи CGI-скриптов.
Настройка локального сервера.
В Python уже встроен CGI сервер, поэтому его настройка не составит труда.
Теперь откройте браузер и в адресной строке наберите localhost:8000
Теперь в той папке, где мы запустили сервер, создаём папку
В этой папке создаём скрипт
Первая строка говорит о том, что это Python скрипт (CGI-скрипты можно не только на Python писать).
Вторая строка пишет заголовок.
Он обозначает, что это будет html файл (бывает ещё css, javascript, pdf и куча других, и браузер различает их по заголовкам).
Третья строка отделяет заголовки от тела ответа.
Четвёртая печатает Hello world.
Теперь переходим на
И радуемся!
В следующей части будет обработка форм и cookies.
Часть 1/3
Сегодня разберём создание страницы при помощи CGI-скриптов.
Настройка локального сервера.
В Python уже встроен CGI сервер, поэтому его настройка не составит труда.
from http.server import HTTPServer, CGIHTTPRequestHandler server_address = ("", 8000) httpd = HTTPServer(server_address, CGIHTTPRequestHandler) httpd.serve_forever()
Теперь откройте браузер и в адресной строке наберите localhost:8000
Теперь в той папке, где мы запустили сервер, создаём папку
cgi-bin
(у меня она уже создана).В этой папке создаём скрипт
hello.py
со следующим содержимым:#!/usr/bin/env python3 print("Content-type: text/html") print() print("<h1>Hello world!</h1>")
Первая строка говорит о том, что это Python скрипт (CGI-скрипты можно не только на Python писать).
Вторая строка пишет заголовок.
Он обозначает, что это будет html файл (бывает ещё css, javascript, pdf и куча других, и браузер различает их по заголовкам).
Третья строка отделяет заголовки от тела ответа.
Четвёртая печатает Hello world.
Теперь переходим на
localhost:8000/cgi-bin/hello.py
И радуемся!
В следующей части будет обработка форм и cookies.
Доброе утро, питонисты 🙃
Сегодняшний день я планирую начать с полезных советов для программиста, которые я и сам использую.
Настройте ваши подписки
Обычный человек потребляет в почте, соцсетях, Telegram множество контента.
Не тратьте время на ерунду и бесцельный сёрфинг!
Выпилите из ленты котиков и прочую милоту, оставьте только полезное.
Так, обыденно просматривая новости в различных каналах, вы сможете попутно учиться.
Кейсы, новости отрасли, советы разработчиков чаще будут у вас перед глазами.
Используйте для обучения сервисы
Кому-то нравится читать, а кому-то — смотреть видео.
Есть сервисы с игровыми механиками.
На мой взгляд, лучше всего для тренировки навыков программирования подходит CodeFights: если я вижу, что кто-то сделал код быстрее или интереснее, у меня азарт просыпается.
Ещё есть сервис CodeCombat, мобильные приложения: Code School, CodeHS, Free Code Camp и так далее.
P.S не расслабляйтесь, сегодня вас ждёт 2 часть создании сайтов, а именно - обработка форм.
Сегодняшний день я планирую начать с полезных советов для программиста, которые я и сам использую.
Настройте ваши подписки
Обычный человек потребляет в почте, соцсетях, Telegram множество контента.
Не тратьте время на ерунду и бесцельный сёрфинг!
Выпилите из ленты котиков и прочую милоту, оставьте только полезное.
Так, обыденно просматривая новости в различных каналах, вы сможете попутно учиться.
Кейсы, новости отрасли, советы разработчиков чаще будут у вас перед глазами.
Используйте для обучения сервисы
Кому-то нравится читать, а кому-то — смотреть видео.
Есть сервисы с игровыми механиками.
На мой взгляд, лучше всего для тренировки навыков программирования подходит CodeFights: если я вижу, что кто-то сделал код быстрее или интереснее, у меня азарт просыпается.
Ещё есть сервис CodeCombat, мобильные приложения: Code School, CodeHS, Free Code Camp и так далее.
P.S не расслабляйтесь, сегодня вас ждёт 2 часть создании сайтов, а именно - обработка форм.
В первой части мы научились писать Hello world.
Сегодня мы рассмотрим более сложную вещь - обработку данных форм.
Создадим в нашей папке файл index.html со следующим содержимым:
Запускаем локальный сервер, и переходим на
Завтра научимся работать с Cookies.
Сегодня мы рассмотрим более сложную вещь - обработку данных форм.
Создадим в нашей папке файл index.html со следующим содержимым:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Обработка данных форм</title>
</head>
<body>
<form action="/cgi-bin/form.py">
<input type="text" name="TEXT_1">
<input type="text" name="TEXT_2">
<input type="submit">
</form>
</body>
</html>
А в папке cgi-bin/ - файл form.py (обработчик формы)#!/usr/bin/env python3
import cgi
form = cgi.FieldStorage()
text1 = form.getfirst("TEXT_1", "не задано")
text2 = form.getfirst("TEXT_2", "не задано")
print("Content-type: text/html\n")
print("""<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Обработка данных форм</title>
</head>
<body>""")
print("<h1>Обработка данных форм!</h1>")
print("<p>TEXT_1: {}</p>".format(text1))
print("<p>TEXT_2: {}</p>".format(text2))
print("""</body>
</html>""")
Попробуем это в действии.Запускаем локальный сервер, и переходим на
localhost:8000:
Готово, теперь мы научились обрабатывать данные из форм.Завтра научимся работать с Cookies.
Сегодня мы пропустим познавательную статейку и начнём разбираться с Cookies.
2/3 часть, вторая половина.
Cookies (печеньки) — небольшой фрагмент данных, отправленный веб-сервером и сохраняемый на компьютере пользователя
Браузер всякий раз при попытке открыть страницу соответствующего сайта пересылает этот фрагмент данных веб-серверу в составе HTTP-запроса.
Отправка печенек осуществляется заголовком Set-cookie:
Например, если сохранить этот скрипт в
Срок её хранения до мая 2033 года.
Все эти параметры не являются обязательными.
Вечером попробуем обработать cookies.
2/3 часть, вторая половина.
Cookies (печеньки) — небольшой фрагмент данных, отправленный веб-сервером и сохраняемый на компьютере пользователя
Браузер всякий раз при попытке открыть страницу соответствующего сайта пересылает этот фрагмент данных веб-серверу в составе HTTP-запроса.
Отправка печенек осуществляется заголовком Set-cookie:
#!/usr/bin/env python3 print("Set-cookie: name=value; expires=Wed May 18 03:33:20 2033; path=/cgi-bin/; httponly") print("Content-type: text/html\n") print("Cookies!!!")
Например, если сохранить этот скрипт в
/cgi-bin/cookie.py
и зайти на localhost:8000/cgi-bin/cookie.py
, то вам поставится печенька с именем name и значением value. Срок её хранения до мая 2033 года.
Все эти параметры не являются обязательными.
Вечером попробуем обработать cookies.
Х5 проводит масштабный контест по машинному обучению, успейте зарегистрироваться!
RetailHero - это не одно, а сразу три соревнования и конференция 15 февраля 2020! Разыгрываются 1 600 000 ₽ призовых 💰
Организаторами были подготовлены три задачи, чтобы учесть вкусы самых искушённых участников:
✨ Каким клиентам нужно отправить SMS?
Вы не раз могли слышать про Uplift моделирование. А теперь - наконец-то можно его попробовать реализовать самим! В этой задаче необходимо подготовить список клиентов, ранжированный по эффективности коммуникации.
https://retailhero.ai/c/uplift_modeling/
✨ Какие товары клиент купит в следующий раз?
Более серьезная задача, где будет еще и немного ML Engineering с условиями еще и по нагрузке на решение. Тут участникам предстоит построить рекомендательную систему и при этом сделать сервис, который выдержит нагрузку.
https://retailhero.ai/c/recommender_syst…
✨ Как расставить товары по полкам?
Для любителей Computer Science, алгоритмов и оптимизации, ACM-style задача. Нужно реализовать алгоритм, который сможет найти самую эффективную расстановку товаров.
https://retailhero.ai/c/shelf_allocation…
Участвовать можно хоть в одном соревновании, хоть в двух, хоть в трёх, на ваш выбор! 🙂
Можно в команде. А можно в составах разных команд - в каждой задаче в новой команде 👍🏻
Канал для всех задач в slack ods.ai: https://app.slack.com/client/T040HKJE3/C…
Регистрация на соревнование и конференцию, подробное описание задач на странице Retail Hero:
https://retailhero.ai/
RetailHero - это не одно, а сразу три соревнования и конференция 15 февраля 2020! Разыгрываются 1 600 000 ₽ призовых 💰
Организаторами были подготовлены три задачи, чтобы учесть вкусы самых искушённых участников:
✨ Каким клиентам нужно отправить SMS?
Вы не раз могли слышать про Uplift моделирование. А теперь - наконец-то можно его попробовать реализовать самим! В этой задаче необходимо подготовить список клиентов, ранжированный по эффективности коммуникации.
https://retailhero.ai/c/uplift_modeling/
✨ Какие товары клиент купит в следующий раз?
Более серьезная задача, где будет еще и немного ML Engineering с условиями еще и по нагрузке на решение. Тут участникам предстоит построить рекомендательную систему и при этом сделать сервис, который выдержит нагрузку.
https://retailhero.ai/c/recommender_syst…
✨ Как расставить товары по полкам?
Для любителей Computer Science, алгоритмов и оптимизации, ACM-style задача. Нужно реализовать алгоритм, который сможет найти самую эффективную расстановку товаров.
https://retailhero.ai/c/shelf_allocation…
Участвовать можно хоть в одном соревновании, хоть в двух, хоть в трёх, на ваш выбор! 🙂
Можно в команде. А можно в составах разных команд - в каждой задаче в новой команде 👍🏻
Канал для всех задач в slack ods.ai: https://app.slack.com/client/T040HKJE3/C…
Регистрация на соревнование и конференцию, подробное описание задач на странице Retail Hero:
https://retailhero.ai/