Начало положено, начало неплохое. Осталось немного отполировать неточности: 1. лучше пусть код будет в среде, чтобы можно было проверить, что все работает, обойдемся без бумагастайл (это касается и sql, потратьте 5-10 минут и подготовьте игрушечную базу данных) 2. не надо обрезать/ускорять куски, интересно послушать как человек думает, и сравнивать со своими мыслями (у ютуб есть замечательная функция ускорения)
По поводу 19:42 ниже уже говорили, что решение на видео совсем неправильное во многих местах. - Многие оконные функции не принимают аргументов - в данном случае, все аргументы только в функции over(). - partition by здесь не нужен - мы не будем сегментировать по разнице - мы будем сортировать по ней - поэтому будем использовать order by - Оконные функции применяются в последнюю очередь, поэтому в where использоваться не могут. Чтобы результат оконной функции использовать в where, нужно делать подзапрос с оконной функцией, которая сформирует колонку, а потом к получившейся таблице делать внешний запрос. Если делать правильно, то должно быть как-то так (принимаются комментарии и замечания к запросу): select a1.id, a1.url, row_number() over(order by abs(UNIX_TIMESTAMP(a1.url) - UNIX_TIMESTAMP(a2.url))) as time_difference_rank from adv_syst1 as a1 join adv_syst2 as a2 on a1.id = a2.id and a1.url = a2.url Здесь мы отранжируем события, начиная с событий с минимальной разницей. Если же мы хотим найти прям только те события, у которых минимальная разница, то оконные функции не нужны - достаточно вложенным запросом найти минимальную разницу, а потом внешним запросом вывести события с минимальной разностью.
Действительно, непонятно, зачем там, вообще, нужны оконные функции. Постановка задачи говорит о сопоставлении двух записей из таблиц. Следующий запрос должен решать это: SELECT s1.id, s1.url, s1.timestamp t1, s2.timestamp t2, min(abs(s1.timestamp-s2.timestamp)) as dif FROM adv_syst1 s1 JOIN adv_syst2 s2 ON (s1.id=s2.id AND s1.url=s2.url) GROUP BY s1.id, s1.url, s1.timestamp
@@kalinin_sanjaне правильно, как минимум в group by не хватает ещё одного timestamp из селекта. Да и в целом непонятно что выводит. Надо было соединить две таблицы по минимальной разнице во времени.
Ваш запрос без partition просто ранжирует весь массив и что это нам даёт? а у нас условие соединить две таблицы по id, url по минимальной разнице во времени
Кажется (особенно в первом видео), что интервьюируемый заранее знал большинство вопросов и задач, потому что он отвечал и писал код не так, как делают, когда первый раз слышат вопрос/задачу.
Если говорить про решение усложненной задачи классификации, то standard scaling ничего не даст - как были данные расположены относительно друг друга, так и останутся, только масштаб будет другой - центры окружностей будут не в точках (0, 0) и (10, 10), а в точках (-1, -1) и (1, 1) - четыре окружности не схлопнуться в две в центре координат. Может быть я не понял что вы имели ввиду. Самое простое решение в данном случае - это свести задачу к предыдущей - сдвинуть вторую окружность на место первой и затем применить такое же преобразование (так как данные синтетические, то это получится): new_df_1 = df[(df["features_1"] 5)].copy() new_df_1["best_feature"] = new_df_1["features_1"] ** 2 + new_df_1["features_2"] ** 2 new_df_2["best_feature"] = (new_df_2["features_1"] - 10) ** 2 + (new_df_2["features_2"] - 10) ** 2 new_df = pd.concat([new_df_1, new_df_2]) И все - решили задачу с 100% качеством. Также полезно (что в первом, что во втором случае) посмотреть на новую фичу sns.stripplot(data=new_df, y="label", x="best_feature"), чтобы понять почему она позволяет нам решить эту задачу.
На взгляд начинающего DS: Видос интересный, но не оставляет чувство постановки. На простых вещах мы спотыкаемся и при этом как-то ускоряемся там, где "хотелось-бы поподробней" (причем обе стороны заинтересованы побыстрее проскочить). Очень странно, что по мнению работодателя для профоценки DS достаточно темы линейной регрессии (пибл. 1-2% от темы DS) или я пропустил как Юля билет про ЛР вытянула? Для человека, который не выполняет ежедневно эти действия Юля как то слишком бодро ориентируется. Или она устраивается на работу, которую уже выполняла минимум полгода? Так вроде где то мелькнуло, что она меняет вид деятельности?
Да и sum со строками не работает. С функцией row_number() на 26:21 вообще дичь сотворили. Минимум 3 смысловые ошибки в конструкции: не должно быть аргумента, partition неправильный, нельзя использовать в WHERE (оконные функции вычисляются движком намного позже, чем обрабатывается блок WHERE).
Таких простых задач на реальных собеседованиях, к сожалению, не бывает. Всегда попадались задачи уровня как минимум medium с leetcode. И, разумеется, требовалось максимально эффективное решение.
27:56 Господа, то что предлагается сделать - это ввести признак x1 * x2. И этот признак должен способствовать разделению такому, чтобы мы могли линией разбить точки. Но ведь это же ложь. Если у нас выборка [ (0,0), (1,0), (1,1), (0, 1) ] тогда у нас три точки уйдут в (0,0), а одна уйдет в (1,1). Объясните мне это ли предлагается?
Не совсем понятно качество решения алго задачи на такого рода вакансию. В том же Яндексе был бы автореджект. Мидл очевидно предлагает неоптимальное решение(sum доп память по сравнению с join выделяет и как будто можно решить без сортировки эту задачу просто за линию). Соответственно вопрос: вообще насколько важно качественно решать алго задача на подобных собеседованиях на дс. Понимаю что мок интервью и собеседующим может не очень интересно докапываться до оптимальности кода, но насколько за это карают на собесах в топ компании?
Спасибо за интервью, сейчас как раз сам учусь на ML, поэтому было интересно. По поводу задачи на анаграммы...я бы решал вот так: from collections import Counter letters = ['aBc', 'bcA', 'Cba', 'Ab', 'ba', 'BA'] print(Counter((''.join(sorted(i.lower())) for i in letters))) сейчас объясню че тут происходит: 1) берем из модуля Collections Counter - счетчик, который сразу нам считает кол-во элементов элементов и возвращает словарь + он очень быстрый 2) приводим все элементы к одинаковому виду через выражение-генератор. Почему генератор? Представьте, что у нас в списке миллионы строк и чтобы не загружать всю оперативу, а выгружать элементы поштучно, поэтому мы его и используем. P.s. Не стал писать через функцию, чтобы можно было посмотреть как работает код, если кому-то будет интересно.
Ваша гиперплоскость линейна, но вот в пространстве признаков х2 y2 она данные классы не сможет разделить. И в пространстве x y xy, как советует интервьюер, тоже не получится. Девушка здесь права, чтобы разделить гиперлинией, нужно переходить в 6 мерное пространство и признаками вплоть до второго порядка x y, погуглите XOR проблема, или персептрон применять. Без критики, вдруг кому то поможет
ua-cam.com/video/lEBidVsG7bk/v-deo.html можно немного подробнее объяснить, что здесь произошло? То есть, смотря на пейрплот, понятно, что одна окружность имеет центр (0 ,0), другая - (10, 10), и для признаков >5 можно вычесть центр и посчитать квадрат радиуса. Такая визуальная оценка этих параметров и предполагается или можно до них иначе дойти? И второй вопрос: не совсем понял, как поможет разделить центрирование/стандартизация и произведение f1 на f2
я знал что такой канал должен быть. И вот, нашел!
Юля молодец, отличное собеседование, удачи в поиске работы!
Спасибо за работу.
Логистическая регрессия по шести признакам для кредитного скоринга в ВТБ. Интересно.
200 признаков же
@@npc-r390 она сказала, что изначально 200, а остаётся в итоге в модели всего несколько
Если использовать все 200 или даже 50, то никому не объяснишь как это работает. И какая это будет формула с таким количеством признаков
@@ivanoleynikov7666 Формула таже самая, в векторном виде. Да и объяснить то тоже можно относительно просто.
Начало положено, начало неплохое. Осталось немного отполировать неточности:
1. лучше пусть код будет в среде, чтобы можно было проверить, что все работает, обойдемся без бумагастайл (это касается и sql, потратьте 5-10 минут и подготовьте игрушечную базу данных)
2. не надо обрезать/ускорять куски, интересно послушать как человек думает, и сравнивать со своими мыслями (у ютуб есть замечательная функция ускорения)
Спасибо🙏 Все молодцы👍
По поводу 19:42 ниже уже говорили, что решение на видео совсем неправильное во многих местах.
- Многие оконные функции не принимают аргументов - в данном случае, все аргументы только в функции over().
- partition by здесь не нужен - мы не будем сегментировать по разнице - мы будем сортировать по ней - поэтому будем использовать order by
- Оконные функции применяются в последнюю очередь, поэтому в where использоваться не могут. Чтобы результат оконной функции использовать в where, нужно делать подзапрос с оконной функцией, которая сформирует колонку, а потом к получившейся таблице делать внешний запрос.
Если делать правильно, то должно быть как-то так (принимаются комментарии и замечания к запросу):
select
a1.id,
a1.url,
row_number() over(order by abs(UNIX_TIMESTAMP(a1.url) - UNIX_TIMESTAMP(a2.url))) as time_difference_rank
from
adv_syst1 as a1
join adv_syst2 as a2 on a1.id = a2.id and a1.url = a2.url
Здесь мы отранжируем события, начиная с событий с минимальной разницей.
Если же мы хотим найти прям только те события, у которых минимальная разница, то оконные функции не нужны - достаточно вложенным запросом найти минимальную разницу, а потом внешним запросом вывести события с минимальной разностью.
Действительно, непонятно, зачем там, вообще, нужны оконные функции. Постановка задачи говорит о сопоставлении двух записей из таблиц. Следующий запрос должен решать это:
SELECT s1.id, s1.url, s1.timestamp t1, s2.timestamp t2,
min(abs(s1.timestamp-s2.timestamp)) as dif
FROM adv_syst1 s1 JOIN adv_syst2 s2 ON (s1.id=s2.id AND s1.url=s2.url)
GROUP BY s1.id, s1.url, s1.timestamp
@@kalinin_sanjaне правильно, как минимум в group by не хватает ещё одного timestamp из селекта. Да и в целом непонятно что выводит. Надо было соединить две таблицы по минимальной разнице во времени.
Ваш запрос без partition просто ранжирует весь массив и что это нам даёт? а у нас условие соединить две таблицы по id, url по минимальной разнице во времени
со второй sql задачей прям нужен пример данных. она дольше разбиралась что именно надо сделать
Круто, иногда кажется что вы много подсказываете, но возможно так и нужно, спасибо за контент)
Кажется (особенно в первом видео), что интервьюируемый заранее знал большинство вопросов и задач, потому что он отвечал и писал код не так, как делают, когда первый раз слышат вопрос/задачу.
@@Extremesarova да нет, кажется просто хорошо готов был на базовые залачи
@@Extremesarova В первом видео интервью очень простое, даже для уровня Junior
Вот такое есть компактное решение для первой задачи :)
def round_to_next5(x):
return x + (-x % 5)
Если говорить про решение усложненной задачи классификации, то standard scaling ничего не даст - как были данные расположены относительно друг друга, так и останутся, только масштаб будет другой - центры окружностей будут не в точках (0, 0) и (10, 10), а в точках (-1, -1) и (1, 1) - четыре окружности не схлопнуться в две в центре координат. Может быть я не понял что вы имели ввиду.
Самое простое решение в данном случае - это свести задачу к предыдущей - сдвинуть вторую окружность на место первой и затем применить такое же преобразование (так как данные синтетические, то это получится):
new_df_1 = df[(df["features_1"] 5)].copy()
new_df_1["best_feature"] = new_df_1["features_1"] ** 2 + new_df_1["features_2"] ** 2
new_df_2["best_feature"] = (new_df_2["features_1"] - 10) ** 2 + (new_df_2["features_2"] - 10) ** 2
new_df = pd.concat([new_df_1, new_df_2])
И все - решили задачу с 100% качеством.
Также полезно (что в первом, что во втором случае) посмотреть на новую фичу sns.stripplot(data=new_df, y="label", x="best_feature"), чтобы понять почему она позволяет нам решить эту задачу.
В уравнении окружности нужно учитывать координаты её центра. Либо 0, либо 10. А какой именно - можно посмотреть, например, на features_2.
Юля молодец. Андрей, резкий какой то (на грани ттксика)
На взгляд начинающего DS: Видос интересный, но не оставляет чувство постановки. На простых вещах мы спотыкаемся и при этом как-то ускоряемся там, где "хотелось-бы поподробней" (причем обе стороны заинтересованы побыстрее проскочить). Очень странно, что по мнению работодателя для профоценки DS достаточно темы линейной регрессии (пибл. 1-2% от темы DS) или я пропустил как Юля билет про ЛР вытянула? Для человека, который не выполняет ежедневно эти действия Юля как то слишком бодро ориентируется. Или она устраивается на работу, которую уже выполняла минимум полгода? Так вроде где то мелькнуло, что она меняет вид деятельности?
У списков нет метода sum)
Да и sum со строками не работает.
С функцией row_number() на 26:21 вообще дичь сотворили. Минимум 3 смысловые ошибки в конструкции: не должно быть аргумента, partition неправильный, нельзя использовать в WHERE (оконные функции вычисляются движком намного позже, чем обрабатывается блок WHERE).
Интересно что интервьюер в прошлом бекендер, но говорит сум по листу бахнуть
можно sum в reduce запихнуть)
@@hopelesssuprem1867 я тоже думал об этом. Но мне не кажется что он предполагал этот вариант 😅
@@stonsosedki512 да, я в курсе, прост на ходу вариант придумал)
Таких простых задач на реальных собеседованиях, к сожалению, не бывает. Всегда попадались задачи уровня как минимум medium с leetcode. И, разумеется, требовалось максимально эффективное решение.
Ну если вы только по гуглам ходите, то может быть
Так в целом, дают максимум изи с литкода, но уж точно не медиум
В сложной задаче по питону можно обойтись без сортировок, приведя строки к frozenset
А если у тебя слова с кучей одинаковых букв? Тогда твоя программа будет думать что слова meet и met являются анагрмамми
@@fungamer7140 точно.
27:56
Господа, то что предлагается сделать - это ввести признак x1 * x2. И этот признак должен способствовать разделению такому, чтобы мы могли линией разбить точки. Но ведь это же ложь. Если у нас выборка [ (0,0), (1,0), (1,1), (0, 1) ] тогда у нас три точки уйдут в (0,0), а одна уйдет в (1,1).
Объясните мне это ли предлагается?
Решение первой задачи:
def f(n):
return n - (n % 5) + (n % 5 > 0) * 5
def f(n):
return (n // 5 + 1) * 5
@@firi4737 ваше решение даёт неверный ответ в точках где число делится на 5: например (30 // 5 + 1) * 5 будет (6 + 1) * 5 = 35, а нужно давать 30
Молодцы, кандидат хорошо держалась. Мне зашла генерация признаков. Можно ли использовать для этого TSNE как альтернативу?
нормик) молодец, а то тут сеньор был))) один
Не совсем понятно качество решения алго задачи на такого рода вакансию. В том же Яндексе был бы автореджект. Мидл очевидно предлагает неоптимальное решение(sum доп память по сравнению с join выделяет и как будто можно решить без сортировки эту задачу просто за линию).
Соответственно вопрос: вообще насколько важно качественно решать алго задача на подобных собеседованиях на дс. Понимаю что мок интервью и собеседующим может не очень интересно докапываться до оптимальности кода, но насколько за это карают на собесах в топ компании?
Спасибо за интервью, сейчас как раз сам учусь на ML, поэтому было интересно.
По поводу задачи на анаграммы...я бы решал вот так:
from collections import Counter
letters = ['aBc', 'bcA', 'Cba', 'Ab', 'ba', 'BA']
print(Counter((''.join(sorted(i.lower())) for i in letters)))
сейчас объясню че тут происходит:
1) берем из модуля Collections Counter - счетчик, который сразу нам считает кол-во элементов элементов и возвращает словарь + он очень быстрый
2) приводим все элементы к одинаковому виду через выражение-генератор. Почему генератор? Представьте, что у нас в списке миллионы строк и чтобы не загружать всю оперативу, а выгружать элементы поштучно, поэтому мы его и используем.
P.s. Не стал писать через функцию, чтобы можно было посмотреть как работает код, если кому-то будет интересно.
"Можно ли разделить линейкой?" Конечно можно! Поскольку X^2 + Y^2 = К линейно относительно X^2 и Y^2.
Ваша гиперплоскость линейна, но вот в пространстве признаков х2 y2 она данные классы не сможет разделить. И в пространстве x y xy, как советует интервьюер, тоже не получится. Девушка здесь права, чтобы разделить гиперлинией, нужно переходить в 6 мерное пространство и признаками вплоть до второго порядка x y, погуглите XOR проблема, или персептрон применять. Без критики, вдруг кому то поможет
ua-cam.com/video/lEBidVsG7bk/v-deo.html можно немного подробнее объяснить, что здесь произошло? То есть, смотря на пейрплот, понятно, что одна окружность имеет центр (0 ,0), другая - (10, 10), и для признаков >5 можно вычесть центр и посчитать квадрат радиуса. Такая визуальная оценка этих параметров и предполагается или можно до них иначе дойти? И второй вопрос: не совсем понял, как поможет разделить центрирование/стандартизация и произведение f1 на f2
У list нет метода sum(), если бы у нас был np.ndarray, это сработало бы
Когда будет новое видео
Сложная задача - похожа на задачу от Яндекса по алгоритмам )
ФБМФ + MADE. Буду знать, что моя связка совсем не уникальна. Автор, почему решил уйти из биоинформатики?
list не имеет атрибут sum
Юлия очень милая)
Это пздц конечно, если они такие решения по SQL принимают
Что не так?
Да если эта руина мидл то я сеньор тогда
Жесть, это точно миддл?)
слабо или наоборот слишком круто ?
@@vladimirmanikhin7918 спустя месяц не помню именно содержание видоса, но на тот момент я бы отнёс кандидата больше к "слабо"
@@Алг-ж3дпочему не к сильно?
А чего в Лондон, а не в рассеюшки?😂😂
Канал годный!🎉