Задать вопрос
Ответы пользователя по тегу Python
  • Почему при замене значения в DataFrame на pandas происходит ошибка, но значение меняется?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Это не ошибка, а предупреждение которому сто лет в обед, более того в зависимости от твоей версии pandas, ты можешь видеть не одно а сразу два предупреждения. В pandas давно уже целый раздел документации посвящен этому copy_on_write

    2. Детали про copy_on_write прочтешь в документации, там все расписано не хочу повторяться. Собираешься работать с pandas, ты должен знать что это такое.

    3. Правильный способ безопасно осуществить операцию, которую ты хочешь (что бы не было предупреждений и работало, как ты ожидаешь.
    pd.options.mode.copy_on_write = True
    info = {'color': ['blue', 'green', 'yellow', 'red', 'white'],
    'object': ['ball', 'pen', 'pencil', 'paper', 'mug'],
    'price': [1.2, 1.0, 0.6, 0.9, 1.7]}
    frame = pd.DataFrame(info)
    frame.loc[2,'price'] = 100 
    print(frame)

    Ну и обнови на всякий случай pandas по скольку copy_on_write будет по умолчанию установлен в True в будущих версиях.
    Ответ написан
    Комментировать
  • Как получить данные колонки Pandas?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну у тебя не много колонок, а всего одна. Элементы массива (имена колонок) идут через запятую. А все что ты заскринил, это одна строка, как следствие один элемент массива.

    Как пофиксить, ну я не знаю что у тебя там в файле, но предположу что у тебя в файле разделение на колонки происходит сивволом ';'. Как следствие тебе нужно указать параметром при чтении.
    df = df.read_csv(filename, sep=';') Ну и остальные параметры которые ты там указываешь. Решит ли это все проблемы неизвестны. Надо видеть в каком состоянии файл. Чтение файлов иногда может быть серьезной проблемой, которая потребует написания функций для проблемной части парсинга.
    Ответ написан
    1 комментарий
  • Как исправить ошибку invalid literal for int() with base 10: '0 из 90'?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ты пытаешься преобразовать строку в число. А именно где то ты вот эту строку пытаешься преобразовать в число '0 из 90', ожидая что там '90' ну или '0'. То есть в буквальном смысле у тебя где то в коде происходит. int('0 из 90') Что выдаст точно такую же ошибку. Отлаживай что бы там было строковое представление целого числа.
    Ответ написан
    Комментировать
  • Как лучше построить архитектуру ML-сервиса?

    Maksim_64
    @Maksim_64
    Data Analyst
    Мало информации, конечно. Я обычно использую dash. Он позволяет создать полноценное веб приложение. Для взаимодействия с пользователем. Есть большое коммунити например я использую компоненты для создания красивого интерфейса и взаимодействия. Насчет одновременного доступа не проблема, каждая сессия пользователя изолирована. В доках есть раздел галерея там большие и крутые проекты выложены на github, то есть можно много чего подсмотреть. Есть и платные компоненты. Все что по ссылкам это бесплатно и для продакшен уровня достаточно.

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

    А так в небольшие сроки можно крутое приложение, как по дизайну (фронт) так и по функционалу сделать. И все в рамках одного языка даже фронт.
    Ответ написан
    Комментировать
  • Как в сделать Pandas объединение строк группирую по определнному столбцу?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну на сам деле задачка на 5 минут, есть определенные методы заполнения пропущенных значений, 'ffill' forward fill и 'bfill' backward fill. Они и есть ключ к решению, далее группировка происходит без проблем, и дальнешее дело техники, при чем многими способами, например так.
    f = pd.DataFrame({
        'A':['a',np.NaN,np.NaN,'b',np.NaN,np.NaN,np.NaN,'v',np.NaN,np.NaN,'d',np.NaN,np.NaN],
        'B':['foo','foo','bar','bar','bar','foo','bar','foo','bar','foo','bar','foo','bar']
    })
    result = (
        df
        .groupby(df['A']
        .fillna(method='ffill'))['B']
        .apply(lambda x: ','.join(x))
        .reset_index()
    )
    result
    Ответ написан
  • Как добавить данные в Series через ссылку на объект?

    Maksim_64
    @Maksim_64
    Data Analyst
    Вообще так с pandas не работают.
    1. pandas имеет мощный I/O как следствие эксель в том числе читают прямо в фрейм. Есть функции read_excel и другие, дополнительно перед этим установив различные reader's writer's например openpyxl и др.

    2. Если ты собираешься создать series из python объекта, с числовыми индексами то это list. Если с именованными индексами но это словарь. То есть собирай в словарь или лист. Seires это однородный массив и с именованными индексами, и for циклами их не процессируют.
    Ответ написан
    2 комментария
  • Как сделать таблицу с возможностью скачать выбранные строки html/js?

    Maksim_64
    @Maksim_64
    Data Analyst
    Тебе нужна библиотека dash+plotly Там и таблицы и графики и приблизительно все что угодно. В качестве хранилища данных может быть, как pandas датафрейм так и база данных. Таблицу как в примере сделать довольно просто. Документация очень большая и очень толковая, там элементарно найдешь полный пример запросов к фрейму и отображения в виде таблиц, график и т.д.
    Ответ написан
    1 комментарий
  • Как на 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
    Хороший вопрос. Есть правило никогда не использовать метод 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()))

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

    Мое мнение крайне сомнительное поведение.
    Ответ написан
    Комментировать
  • Как вытащить из текста эмоджи?

    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, а это классический классификатор распознаватель цифр, твой пример куда проще так как у тебя бинарная классификация.
    Ответ написан
    Комментировать
  • Как показать подписи промежуточных делений в 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)()
    Ответ написан
    Комментировать
  • (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 должен быть быстрее.
    Ответ написан
    Комментировать
  • Как включить разделитель в данное выражение на Python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну вообще print(f"{1127:016_b}") Но есть проблема 016 означает длинна 16 символов, что не хватает, заполнять нулями. А у тебя получается добавка три символа '_' . По этому надо добавлять 3 к 16.
    print(f'{1127:019_b}')
    Ответ написан
    1 комментарий