Как-то давно Яндекс проводил митам, где собирался рассказывать про беспилотники. Даже обещал что-то показать. Из-за ажиотажа и нежелания того, чтобы на митап попали журналисты было тестовое задание. Причем в отличие от других митапов Яндекса это были не совсем простые вопросы на 5 минут, а достаточно сложная задача.
Заключалась она в следующем. Есть “игра” или “среда”, которая представляет собой двумерное поле из клеток. Есть клетки, по которым можно двигаться, есть стены, через которые нельзя двигаться. В этом пространстве двигается ровер - робот доставщик. На поле спавнятся заказы. Эти заказы нужно было быстро доставлять. Чем быстрее доставил, тем больше очков получил. Если не успел доставить заказ за указанное время, то получил 0 очков. Это соревнование проводилось на платформе Яндекс.Контест. Топ N участников по очкам попадали на митап.
Как решать задачу? Для начала нужно представить поле в виде графа. А дальше уже дело техники. Проблема была в том, что из библиотек был только pandas и numpy и ничего для графов. Не было у них библиотеки networkx или аналога. Нужно было писать самому. Пришлось залезть в исходники networkx и по их мотивам реализовать граф и поиск кратчайшего пути. В итоге я написал свой mini-networkx и реализовал свой бейзлайн для движения ровера. Проходили не все тест кейсы, где-то падал по времени, где-то алгоритм ломался при нескольких одновременных заказах. Но где-то в топе я оказался. Кто написал мне на почту с предложением купить этот код. Но я не продался.
В итоге я попал в заветные топ N, но не смог пойти на митап, так как уехал в Сочи.
Заключалась она в следующем. Есть “игра” или “среда”, которая представляет собой двумерное поле из клеток. Есть клетки, по которым можно двигаться, есть стены, через которые нельзя двигаться. В этом пространстве двигается ровер - робот доставщик. На поле спавнятся заказы. Эти заказы нужно было быстро доставлять. Чем быстрее доставил, тем больше очков получил. Если не успел доставить заказ за указанное время, то получил 0 очков. Это соревнование проводилось на платформе Яндекс.Контест. Топ N участников по очкам попадали на митап.
Как решать задачу? Для начала нужно представить поле в виде графа. А дальше уже дело техники. Проблема была в том, что из библиотек был только pandas и numpy и ничего для графов. Не было у них библиотеки networkx или аналога. Нужно было писать самому. Пришлось залезть в исходники networkx и по их мотивам реализовать граф и поиск кратчайшего пути. В итоге я написал свой mini-networkx и реализовал свой бейзлайн для движения ровера. Проходили не все тест кейсы, где-то падал по времени, где-то алгоритм ломался при нескольких одновременных заказах. Но где-то в топе я оказался. Кто написал мне на почту с предложением купить этот код. Но я не продался.
В итоге я попал в заветные топ N, но не смог пойти на митап, так как уехал в Сочи.
👍3🔥2
Вы наверняка знаете про компания X5 Retail Group. В нее входят Пятерочка и Перекресток. Но не все знают, что раньше этой компании принадлежала торговая сеть “Карусель”. Сейчас эта сеть закрыта, а часть магазинов переделали в Перекресток. Но когда “Карусель”, еще не объявила о своем закрытии я там работал DS’ом в управлении, которое отвечало за целевой маркетинг. Но речь пойдет не про то, как там работалось.
Я как-то лазил по корпоративному порталу и наткнулся на интересную страницу. На ней были регулярно обновляющие фотографии из столовой. По сути это было видео с fps один кадр в 2-3 секунды, но реализовано это было в виде обновляющихся фотографий.
Это была еще доковидная эпоха. Поэтому я ходил в офис, обедал в столовой. В столовой были очереди. Неплохо было бы иметь телеграм бот, который бы информировал об очередях.
Тогда я написал скрипт, который забирает эти картинки с корпоративного портала. Я взял готовую модель, распознающую людей на фото. Все это запустил в бесконечном цикле и добавил сохранения в postgres. Потом я добавил график в Tableau и все готово. До прогноза очередей я не добрался. В телегу из корпоративной сети просто так писать нельзя поэтому я остановился только на сборе данных.
Особо интересных инсайдом не было. Самый большой пик посещаемости был в обед. Еще один поменьше - утром. От погоды зависимости я не обнаружил.
Я как-то лазил по корпоративному порталу и наткнулся на интересную страницу. На ней были регулярно обновляющие фотографии из столовой. По сути это было видео с fps один кадр в 2-3 секунды, но реализовано это было в виде обновляющихся фотографий.
Это была еще доковидная эпоха. Поэтому я ходил в офис, обедал в столовой. В столовой были очереди. Неплохо было бы иметь телеграм бот, который бы информировал об очередях.
Тогда я написал скрипт, который забирает эти картинки с корпоративного портала. Я взял готовую модель, распознающую людей на фото. Все это запустил в бесконечном цикле и добавил сохранения в postgres. Потом я добавил график в Tableau и все готово. До прогноза очередей я не добрался. В телегу из корпоративной сети просто так писать нельзя поэтому я остановился только на сборе данных.
Особо интересных инсайдом не было. Самый большой пик посещаемости был в обед. Еще один поменьше - утром. От погоды зависимости я не обнаружил.
🔥3❤1👍1
Когда я искал работу, я, как и положено, много ходил по собеседованиям. И заметил что очень многие спрашиваю следующие вопросы.
- Чем отличается случайный лес от градиентного бустинга
- Что такое bias-variance tradeoff
- И как следствие двух предыдущих вопросов: где больше bias и variance в градиентном бустинге или случайном лесе
Причем спрашивали настолько часто, что я уже началинал все это рассказывать как только речь заходила про бустинг или случайный лес. Даже если меня не спрашивали.
- Чем отличается случайный лес от градиентного бустинга
- Что такое bias-variance tradeoff
- И как следствие двух предыдущих вопросов: где больше bias и variance в градиентном бустинге или случайном лесе
Причем спрашивали настолько часто, что я уже началинал все это рассказывать как только речь заходила про бустинг или случайный лес. Даже если меня не спрашивали.
Недавно в Сочи открылся новый ресторан под названием Lino. На 14 февраля он объявил конкурс с на лучшую фотографию. Фото нужно было выложить в инстаграме, отметить аккаунт ресторана. Мы с женой участвовали. Голосование проходило на сайте ресторана. Голосование не требовало регистрации, но проголосовать можно было только один раз. Не сложно догадаться, что очистка кэша позволяла проголосовать еще раз. Призы были существенные. Приз за первое место - отдых в люкс глэмпинге.
Естественно у нас возникла идея накрутить голоса.
- берешь selenium
- открываешь вкладку в режиме инкогнито, чтобы не нужно было очищать кэш
- голосуешь
- закрываешь вкладку
- повторить))
Наши голоса начали прирастать. Мы накрутили больше сотни голосов. Но голоса начали появляться не только у нас. Не я один айтишник среди участников конкурса)). У некоторых аккаунтов количество голосов перевалило за тысячу. Перегнать их реально. Можно накрутить голоса в 10 потоков и набить и 100 тысяч, если потребуется. Но в реальность таких голосов никто не поверит.
Пришлось выбрать другую тактики. Мы можем доказать, что наши соперники накручивали голоса. Для этого я каждые 5-10 минут делал скриншот сайта. Если у аккаунта за 10 минут не было ни одного голоса, потома за 5 минут появилось 3000 голосов, а потом снова тишина, то понятно что это накрутка. Если предположить, что в конкурсе участвует какой-то мега-блогер, который выложил у себя пост с просьбой поддержать, то всплески голосов объяснимы. Но голоса не могут резко прекратиться. Не все подписчики увидят пост сразу. Кто-то проголосует через 5 минут, 10 минут, час, два часа после публикации. Хвост еще долго должен тянуться. У наших же накрутчиков голоса обрывались и не переставали увеличиваться.
Я начал готовить скриншоты, чтобы с ними прийти к организаторам и забанить читеров. Но тут я увидел, что у нашей фотографии количество голосов появилось 7000 тысяч голосов. На всякий случай я проверил свой скипт. Это точно не я. Кто-то ошибся и добавил голоса нам. Проблема в том, что теперь и мы попадаем под критерий читерства.
Я начал думать что с этим делать. Потом в очередной раз обновил страницу с результатами. И увидел сообщние:
Естественно у нас возникла идея накрутить голоса.
- берешь selenium
- открываешь вкладку в режиме инкогнито, чтобы не нужно было очищать кэш
- голосуешь
- закрываешь вкладку
- повторить))
Наши голоса начали прирастать. Мы накрутили больше сотни голосов. Но голоса начали появляться не только у нас. Не я один айтишник среди участников конкурса)). У некоторых аккаунтов количество голосов перевалило за тысячу. Перегнать их реально. Можно накрутить голоса в 10 потоков и набить и 100 тысяч, если потребуется. Но в реальность таких голосов никто не поверит.
Пришлось выбрать другую тактики. Мы можем доказать, что наши соперники накручивали голоса. Для этого я каждые 5-10 минут делал скриншот сайта. Если у аккаунта за 10 минут не было ни одного голоса, потома за 5 минут появилось 3000 голосов, а потом снова тишина, то понятно что это накрутка. Если предположить, что в конкурсе участвует какой-то мега-блогер, который выложил у себя пост с просьбой поддержать, то всплески голосов объяснимы. Но голоса не могут резко прекратиться. Не все подписчики увидят пост сразу. Кто-то проголосует через 5 минут, 10 минут, час, два часа после публикации. Хвост еще долго должен тянуться. У наших же накрутчиков голоса обрывались и не переставали увеличиваться.
Я начал готовить скриншоты, чтобы с ними прийти к организаторам и забанить читеров. Но тут я увидел, что у нашей фотографии количество голосов появилось 7000 тысяч голосов. На всякий случай я проверил свой скипт. Это точно не я. Кто-то ошибся и добавил голоса нам. Проблема в том, что теперь и мы попадаем под критерий читерства.
Я начал думать что с этим делать. Потом в очередной раз обновил страницу с результатами. И увидел сообщние:
Из-за подозрительной активности голосование на сайте остановлено.
Конкурс переносится в социальные сети Lino😁8❤1🔥1
Картинки о том как вам может пригодиться функиця
pd.qcut при анализе данных❤4
Чем плохи фильтры в пандасе?
Казалось бы - ничем. Нужно вот так фильтровать
Тут нет ничего плохого. Но начинаются мелкие неудобства, например когда нужно сделать group by, а потом что-то отфильтровать. Тут уже нужно две строки
Вторая бесячая вещь - это group by
Есть проблема с множественными агрегация
Так работает, но появляется мультииндекс. И хз что с ним делать. Нужно как-то избавляться от мультииндекса - переименовывать колонки.
Перед тем как писать пост я погуглил. Оказывается можно еще использовать
И получиться что-то в духе
Выглядит уже громоздко. А что если нам нужно название новой колонки получить из переменной? Тогда все будем совсем страшно.
Но выход есть - библиотека polars. Она создана для того чтобы заменить pandas. Главная фишка polars в том, что он работает сильно быстрее пандаса. Но мне больше всего нравиться его API, который сильно напоминает API pyspark.
В поларсе фильтр это метод. Это позволяет фильтровать сразу после group by в одну строку.
Если у нас много фильтром и в процессе исследования данных мы хотим их постоянно включать и выключать, то можно сделать так
В пандасе так тоже можно. Но когда потребуется больше.
Посчитать несколько агрегация тоже можно с помощью меньшего количества кода
Бонус. В функцию len не нужно передавать имя поля. Для этой функции не важно какое поле передать, но меня всегда смущало когда я не могу просто посчитать число объектов. То есть в polars. Вместо
Казалось бы - ничем. Нужно вот так фильтровать
df = df[df[col_name]==value] Тут нет ничего плохого. Но начинаются мелкие неудобства, например когда нужно сделать group by, а потом что-то отфильтровать. Тут уже нужно две строки
gb = df.group_by(“key”, as_index=False)[“sales”].mean()
gb[gb[“sales”]>100.0]Вторая бесячая вещь - это group by
Есть проблема с множественными агрегация
df.groupby("key").agg({"value":["min", "mean", "max", “size”]})Так работает, но появляется мультииндекс. И хз что с ним делать. Нужно как-то избавляться от мультииндекса - переименовывать колонки.
Перед тем как писать пост я погуглил. Оказывается можно еще использовать
pd.NamedAgg, но тогда нужно городить огородИ получиться что-то в духе
df.groupby("key").agg(
value_min=pd.NamedAgg(column="value", aggfunc="min"),
value_mean=pd.NamedAgg(column="value", aggfunc="mean"),
value_max=pd.NamedAgg(column="value", aggfunc="max"),
)Выглядит уже громоздко. А что если нам нужно название новой колонки получить из переменной? Тогда все будем совсем страшно.
df.groupby("key").agg(**
{
value_min_name: pd.NamedAgg(column="value", aggfunc="min"),
value_mean_name: pd.NamedAgg(column="value", aggfunc="mean"),
value_max_name: pd.NamedAgg(column="value", aggfunc="max"),
size_name: pd.NamedAgg(column="value", aggfunc="size"),
}
)Но выход есть - библиотека polars. Она создана для того чтобы заменить pandas. Главная фишка polars в том, что он работает сильно быстрее пандаса. Но мне больше всего нравиться его API, который сильно напоминает API pyspark.
В поларсе фильтр это метод. Это позволяет фильтровать сразу после group by в одну строку.
df.group_by(“key”).agg(pl.mean(“sales”)).filter(pl.col(“sales”)>100.0)Если у нас много фильтром и в процессе исследования данных мы хотим их постоянно включать и выключать, то можно сделать так
(
df
.filter(pl.col(“value1”)==value1)
# .filter(pl.col(“value2”)==value2)
.filter(pl.col(“value3”)>value3)
.filter(pl.col(“value4”)<value4)
)В пандасе так тоже можно. Но когда потребуется больше.
Посчитать несколько агрегация тоже можно с помощью меньшего количества кода
(df.group_by(“key”)
.agg(pl.min(“value”).alias(min_value_name),pl.mean(“value”).alias(mean_value_name)pl.max(“value”).alias(max_value_name)pl.len().alias(size_name),)
)
Бонус. В функцию len не нужно передавать имя поля. Для этой функции не важно какое поле передать, но меня всегда смущало когда я не могу просто посчитать число объектов. То есть в polars. Вместо
{“value”:”size”} илиpd.NamedAgg(column="value", aggfunc="size") нужно писать просто pl.len()👌1
Интересно мне одному не нравится слово айтишник? Это же не самоназвание. Ни один айтишник не представиться, айтишником. Он представиться тестировщиком, разработчиков, дата саентистом или кем-то ещё. Ни одна компания не размещает вакансию с названием айтишник.
Если мне нужно рассказать кто я человеку, который совсем не в теме. То я говорю примерно следующее.
"Слышали ли ты слова АI, искусственный интеллект, data science, машинное обучение, big data, большие данные? Вот этим всем я занимаюсь"
Меня удивляет, что есть люди которые отвечают нет. Тогда приходиться смириться с "айтишник"
Если мне нужно рассказать кто я человеку, который совсем не в теме. То я говорю примерно следующее.
"Слышали ли ты слова АI, искусственный интеллект, data science, машинное обучение, big data, большие данные? Вот этим всем я занимаюсь"
Меня удивляет, что есть люди которые отвечают нет. Тогда приходиться смириться с "айтишник"
❤2
Я живу в Сочи. Меня часто спрашивают, куда тут можно сходить. А если не спрашивают, то мне обязательно хочется рассказать. Рассказать развернуто, а не просто перечислить список заведений. Чтобы не повторяться, я составил подборку баров. В каждом из них я был не один раз.
❤2👍1
Напомню почему коэффициент Стьюдента так называется. Выдержка из Википедии.
Довольно известная и забавная история. Но если задуматься, то все выглядит безумно. Чувак работал на компанию. Придумал крутую штуку. Хотел про нее рассказать, но ему запрещало NDA. И тогда он опубликовал свою работу под псевдонимом!
Представьте если бы сейчас какой-нибудь сотрудник Open AI опубликовал, например, архитектуру GPT 4. А чтобы никто ничего не понял взял бы псевдоним Школьник. Вообще было бы не подозрительно.
Данный критерий был разработан Уильямом Госсетом для оценки качества пива в компании Гиннесс. В связи с обязательствами перед компанией по неразглашению коммерческой тайны (руководство Гиннесса считало таковой использование статистического аппарата в своей работе), статья Госсета вышла в 1908 году в журнале «Биометрика» под псевдонимом «Student» (Студент).Довольно известная и забавная история. Но если задуматься, то все выглядит безумно. Чувак работал на компанию. Придумал крутую штуку. Хотел про нее рассказать, но ему запрещало NDA. И тогда он опубликовал свою работу под псевдонимом!
Представьте если бы сейчас какой-нибудь сотрудник Open AI опубликовал, например, архитектуру GPT 4. А чтобы никто ничего не понял взял бы псевдоним Школьник. Вообще было бы не подозрительно.
❤3
когда рекомендации начали шуметь
В телеге можно посмотреть похожие телеграм каналы. Хз как они их считают. Скорее всего что-то на основе пересечений групп подписчиков. Я часто заглядывают в "похожие" каналы. Обычно там все понятно. Похожие каналы - это часто сайд проекты, либо друзья авторов, которые друг друга репостят и пиарят.
Но вот с похожими каналами ИТ-пикника получилось веселее. Тут на первом месте новости UFC. А на втором и третьем месте блоги про котов и собак.
В телеге можно посмотреть похожие телеграм каналы. Хз как они их считают. Скорее всего что-то на основе пересечений групп подписчиков. Я часто заглядывают в "похожие" каналы. Обычно там все понятно. Похожие каналы - это часто сайд проекты, либо друзья авторов, которые друг друга репостят и пиарят.
Но вот с похожими каналами ИТ-пикника получилось веселее. Тут на первом месте новости UFC. А на втором и третьем месте блоги про котов и собак.
❤1