Задать вопрос
  • Как на pandas получить подобие оконной функции SQL?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну много способов есть, но самый верный смотреть в сторону groupby.
    (
        df.
        assign(latest=lambda x:x
        .groupby("some_name")["date_time"]
        .transform(pd.Series.nlargest, 1)
              )
        .loc[lambda x: x['date_time'] == x['latest'],:]
    )
    Ответ написан
  • Как скорректировать запрос для поиска подстроки?

    Maksim_64
    @Maksim_64
    Data Analyst
    Во первых ==True здесь совершенно лишнее, contains вернет массив длинной ff['B'], где True, будет означать берем данную строку, ок он не выдаст ошибку, но он тут абсолютно лишний и ничего не делает.

    Во вторых, обычно str.contains обычно используют вместе с регуляркой. Предоставляют выражения также используют flags для установки различных параметров, например осуществить поиск не чувствительным к регистру, для примера.
    import re
    searchstr=(
        ff.loc[ff['B']
        .str.contains(r'строка',regex=True,flags=re.IGNORECASE),['А','B']
        ]
    )
    Выберет подсет датафрейма ff (колонки 'A' и 'B'), где в 'В' содержится 'строка'.
    Ответ написан
    Комментировать
  • Что учить дальше?

    Maksim_64
    @Maksim_64
    Data Analyst
    Твоя задача получать опыт. Опыт приходит на проектах, соответственно, учи все что необходимо для проекта. И не расплескивайся особенно как начинающий специалист. Сильный чистый python + доменные знания в области применения, и то и то оттачивается на реализованных проектах.
    Ответ написан
    Комментировать
  • Автоматизация гостиницы — реальность или фантазия?

    Maksim_64
    @Maksim_64
    Data Analyst
    Безотносительно законодательных аспектов, экономически не рентабельно, только на продажу (возможно какая нибудь инновационная компания может его купить в целях саморекламы). Как бизнес такой проект будет работать в убыток.
    Ответ написан
  • В США в объявлениях на job-бордаха чистая зарплата указывается или размер без вычета налога?

    Maksim_64
    @Maksim_64
    Data Analyst
    Цифры в вакансии крайне редко соответствуют реальности, после череды собеседований обсуждаются, это более реальный сценарий и то надо учитывать нюансы из каких составляющих состоит месячный доход. Сейчас требуется в основном разрешение на работу и с этим стало куда строже чем даже несколько лет назад.
    Ответ написан
    4 комментария
  • Мне использовать те же параметры нормализации, что были на обучающем или нормализовать данные с нуля?

    Maksim_64
    @Maksim_64
    Data Analyst
    Хороший вопрос. Есть правило никогда не использовать метод fit на тестовом сете. Иными словами будьто нормализация, скалинг, стандартизация или другие трансформации, ты никогда не находишь никакие параметры в тестовом наборе - это грубая ошибка. А всегда используешь только тренировочный набор. По этому все свои mean, std и прочее ты берешь только из тренировочного набора.

    В scikit-learn есть трансформаторы, к примеру StandardScaler так вот у него есть методы fit, transform и fit_transform. Так вот для тестового дата сета ты используешь только transform и никогда fit или fit_transform. Что означает применить трансформацию к тестовому сету с параметрами посчитанными на тренировочном сете.

    С нейронными сетями абсолютно тоже самое без каких либо исключений.
    Ответ написан
  • Что не так с рекурсией?

    Maksim_64
    @Maksim_64
    Data Analyst
    если у рекурсивного кейса отсутствует return то , базовый кейс останавливает рекурсию, но не завершает функцию. То есть после return int(answer) выхода из функции не происходит (только рекурсивный вызов остановлен). python идет дальше, пропускает else, затем у функции отсутствует return и он возвращает None.

    Что бы пофиксить надо добавить return к рекурсивному кейсу то есть return gen_nums(stop_n, number)
    Ответ написан
    Комментировать
  • Почему python возвращает существующий объект, вместо создания нового?

    Maksim_64
    @Maksim_64
    Data Analyst
    Надо же, выглядит все это крайне сомнительно. Сеты мутабельные объекты и оптимизация, как c int или str тут не при чем. При том такое поведение только если я создаю объект налету. К примеру если я соберу их в список
    empty_sets = []
    for _ in range(3):
        empty_sets.append(set())
    
    for obj in empty_sets:
        print(id(obj))

    То работает как и ожидается.
    Или
    a = set()
    b = set()
    a is b
    Тоже как и ожидается.

    Пока экспериментировал вот что обнаружил
    for _ in range(3):
        print(id([]))

    Тоже самое при этом
    for _ in range(3):
        print(id(list()))

    Как и ожидается объекты разные.

    Мое мнение крайне сомнительное поведение.
    Ответ написан
    Комментировать
  • Как создать новый массив, объединив каждый элемент 1го с каждым 2 ого?

    Maksim_64
    @Maksim_64
    Data Analyst
    Выглядит как декартово произведение только где элементы это массивы с последующим распремлением.

    На питоне что то вроде этого
    import itertools
    [list(itertools.chain.from_iterable(x)) for x in (list(itertools.product(A,B)))]

    Прямой функции в numpy нету плюс у тебя данные не однородные то есть тебе при создании numpy массива придется указать параметр dtype='object', что означает python объект (до свидания скорость). Посмотри реализации в интернете, но массивы не однородные, так что толку по скорости не будет.
    Ответ написан
    Комментировать
  • Как вытащить из текста эмоджи?

    Maksim_64
    @Maksim_64
    Data Analyst
    В целом тебе нет необходимости для "удаления" вытаскивать в отдельную колонку. Обычно из фрейма ничего не удаляют, его не изменяют, а извлекают из него подсеты которые отвечают твоим требованиям. Код придется картинкой опубликовать а то форматирование не поддерживает эмоджи.
    6580990e822cb151482037.png

    Если ты не знаешь всех своих эмоджи то есть библиотеки получи все юникоды своих эмоджи и проверяй строку не содержит ли она юникод эмоджи, это будет очень медленно. лучше выбрать их несколько я думаю там их не много и как у меня в примере просто пусть их там десятка два будет а не два. Можно также попробовать простенькой регуляркой отловить что то типа такого
    df[df['comment_text'].str.contains(r'[^\w\s,]', regex=True)]
    Для моего примера работает, сработает ли в целом неизвестно.
    Ответ написан
    4 комментария
  • Почему результат выполнения функции сохраняется между вызовами?

    Maksim_64
    @Maksim_64
    Data Analyst
    Потому что объект список мутабельный объект rez = []. Ты ожидаешь, что при каждом новом вызове функции у тебя создается пустой список res, а это не так почитай к чему ведет мутабельные типы в качестве значений по умолчанию у параметров функции.

    1. В первом случае ты вызываешь первый раз работает как ожидаешь, но но список res уже создан и существует.
    2. В втором ты оставляешь без изменения свой дефолтный параметр (список), а он то уже заполнен, и он просто добавляет в него.
    3. В третьем случе ты передаешь новый список (новый объект). По этому работает нормально.

    Общий кейс для решения таких проблем как то так.
    def test(n, rez = None):
        if rez is None:
            rez = []
        for i in range(n):
            rez.append(i)
        return rez
    Ответ написан
    Комментировать
  • Как оценить напрямую результаты классификации и регрессии?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну у твоей модели есть метод predict. Что то вроде этого.
    df['predictions'] = (
        model
       .predict(X)
       .replace({0:'Метка ассоциируема с 0', 1:'Метка ассоциируемая с 1'})
    )

    Где, X это входные данные массив фич.

    Все самые лучшие примеры лежат в доках scikit-learn это вообще где брать примеры относительно ML, а это классический классификатор распознаватель цифр, твой пример куда проще так как у тебя бинарная классификация.
    Ответ написан
    Комментировать
  • Почему удаление отклоненных значений удаляет так много данных?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну если у тебя одинаковых значений много, на приграничных значениях (low, upper) возможно ты все удаляешь такие значения.

    Если тебе надо отфильтровать фрейм по возрасту (5 персентиль 95 персентиль). Используй что нибудь вроде такого.
    low = df['Age'].quantile(0.05)
    upper = df['Age'].quantile(0.95)
    
    df[df['Age'].between(low, upper)]


    Ну и не забудь про параметры метода quantile, например задать interpolation (интерполяцию). По у молчанию там линейная среднее между двумя значения, можешь например поставить 'nearest' и будет идентичное поведение np.percentile()
    Ответ написан
    Комментировать
  • Как показать подписи промежуточных делений в matplotlib?

    Maksim_64
    @Maksim_64
    Data Analyst
    https://matplotlib.org/stable/api/_as_gen/matplotl...
    xticks. Устанавливаешь два массива, один это ticks локации, второй это (опционально) это ассоцируемые метки с этими локациями. Например для этого графика. plt.xticks(range(2006,2023)) Второй параметр в данном случае тебе не нужен. Глянь пример из доков, также. Да и имей ввиду если ты используешь ооп апи, работаешь с объектами axes, то там set_xticks и set_xticklabels. То есть на два метода этот функционал разбит, например https://www.geeksforgeeks.org/matplotlib-axes-axes...
    Ответ написан
    Комментировать
  • Как вызвать функцию, название которой записано в переменной?

    Maksim_64
    @Maksim_64
    Data Analyst
    eval(func_name)()
    Ответ написан
    Комментировать
  • Как youtube детектирует использование нейросети при создании видеоконтента?

    Maksim_64
    @Maksim_64
    Data Analyst
    Путем другой нейросети, которую обучали различать контент созданный нейросетью или человеком. Как создавали такую сеть? Да также как и другие, создали множество контента средствами AI и дали обычный контент созданный людьми и поставили метки AI not AI, бинарная классификация. И обучили, все.
    Ответ написан
    Комментировать
  • Как правильно обработать данные и записать их снова?

    Maksim_64
    @Maksim_64
    Data Analyst
    for i in time:
        data = change_data(i)
    Ну ты перезаписываешь свои данные да и все. То есть в data у тебя остается последний результат вызова функции для последнего i.
    Затем ты присваеваешь benz_df['time'] = data колонке time, значение data. Он его броадкастит на всю колонку да и все. Ты ожидаешь что data это массив c данными, а это одно значение.

    По коду сделай data вне цикла пустым списком и добавляй туда результат вызова своей функции. То есть вот так
    data= []
    for i in time:
        data.append(change_data(i))


    Ну а вообще так делать не правильно, все эти операции надо производить средствами pandas
    хотя бы как то так.
    benz = pd.read_xml(benz_xml_file, xpath='.//filling')
    benz_df = pd.DataFrame(benz)
    benz_df['time'] = benz_df['time'].apply(change_data)
    benz_df['time'][:50]
    Ответ написан
  • (Pandas) Почему не работает df.dropna()?

    Maksim_64
    @Maksim_64
    Data Analyst
    df = df.dropna() Ну на всякий случай проверь после этой строчки df.isnull().sum() Должны быть нули, далее там же проверь не попало ли строковое значение (df == 'NaN').sum()
    Если же нет значит в результате в от этой операции
    df = df.where(df['area_name'].apply(lambda x: x in used_cities))
    появляется NaN, что собственно логично, ты предоставляешь , булевый массив True, False. где pandas оставит оригинальное значение где состояние True и заменит на твое (которое ты не предоставил) где значение False. То есть вторым параметром ты должен был предоставить значение, (по умолчанию оно NaN).
    df = df.where(df['area_name'].apply(lambda x: x in used_cities), 'Твое значение')
    Ответ написан
    Комментировать
  • Как убрать наложения на графике?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Используй pandas для чтения из csv не забудь про параметр decimal. Потому что у тебя вместо плавающей точки запятая.
    2. Если надо почисти данные (удали пустую колонку) метод drop, возможно перведи единицы измерения времени в те в которых значения будут поменьше например если оно в нано секуднах в секунды.
    3. Рисуй свой график.
    Псевдо код будет такой.
    df = pd.read_csv('myfile.csv', sep=';', decimal=',')
    df = df.set_index('time')
    df.plot()

    Глянь на свой фрейм, и работай с ним это лучше чем собирать данные в списки, по скольку он создан для подготовки данных, и все библиотеки визуализации ожидают pandas фрейм, в качестве данных для визуализации.
    Ответ написан
    Комментировать
  • Почему в моем коде cpu быстрее gpu?

    Maksim_64
    @Maksim_64
    Data Analyst
    GPU не всегда быстрее CPU.

    1. Если будет много вызовов к памяти с небольшими объемами данных, CPU будет быстрее.
    2. Если операция не может исполнятся параллельно то эффективность GPU падает.

    В первом примере, у тебя даже тренировки модели нет, ты ее загружаешь., то есть основное место где gpu сильно быстрее cpu это операции с тензорами во время тренировки модели, его нет. Во втором примере есть тренировка модели, (операции с тензорами), то там GPU должен быть быстрее.
    Ответ написан
    Комментировать