Ответы пользователя по тегу Python
  • Как оценить напрямую результаты классификации и регрессии?

    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 комментарий
  • Каким образом можно обучить ИИ распознавать лицо python?

    Maksim_64
    @Maksim_64
    Data Analyst
    То как ты задаешь вопрос, говорит о том что написать с нуля это тебе не под силу.

    tensorflow - это прежде всего векторизованные операции с тензорами + возможность выполнить эти операции на GPU + очень важный плюс (есть подсчет градиента для любого математического выражения). Если его сравнивать с numpy то основное отличие будет отсутствие подсчета градиента и не возможность из коробки выполнять numpy на GPU, это возможно через numba например.

    Распознавание лиц с нуля такого проекта ты не найдешь, все что можно найти и в изобилии это создание нейронной сети с нуля (реализованные как на чистом numpy, так и на tensorflow без использования моделй).

    гугли neural networks from scratch python. Например вот https://www.geeksforgeeks.org/implementation-of-ne... Но ничего близкого к распознаванию лиц и эмоций с нуля ты не найдешь.
    Ответ написан
    Комментировать
  • Когда надо использовать инстанс методы и когда класс методы?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ты не совсем понял их назначение.

    В python у тебя есть атрибуты класса и атрибуты экземпляра класса. Атрибутами называют как методы так и атрибуты в обычном смысле.

    1. Методы экземпляра класса, имеют доступ, и могут изменять, как атрибуты класса, так и атрибуты экземпляра класса.

    2. Методы класса не имеют доступа к атрибутам экземпляра класса, как следствие не могут изменять его состояние.

    3. Статические методы не имеют доступа к атрибутам, экземпляра класса или объекта класса. Обычная функция которая "привязана к классу" для внутренних нужд.

    Если говорить о применении методов класса, то самое основное это создание альтернативного конструктора.

    class MyClass:
    
        def __init__(self, items):
            self.items = items
            initial_total_value = self.total()
    
        def total(self):
            return sum(self.items)
    
        @classmethod
        def from_str(cls, string):
            return cls([int(i) for i in string])
    a = MyClass([1,2,3])
    print(a.total())
    
    b = MyClass.from_str('123')
    print(b.total())
    То есть смотри мой класс метод возвращает изменный объект класса, на котором без проблем сработает конструктор экземпляра класса.
    Ответ написан
  • Как ускорить работу с большими таблицами данных?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Сделай дашборд plotly + dash, он может работать, как с базой данных, так и pandas фреймом. Там же есть объект таблица для красивого вывода, + огромное количество графиков, пользователь будет вводить, что он хочет вывести, ты будешь делать запрос к фрейму и выводить. Все доки в принципе ориентированы на работу с фреймами, бд как пример берется, возможности огромные. plotly+dash

    2. Есть в принципе отдельная библиотека pandasgui Функционал слабенький, но фильтрацию поддерживает.

    Не знаю поможет ли это тебе в твоей проблеме, но раз речь в том числе и о скорости pandas то упомянуть об этом следует, пару недель как nvidia выпустила расширение, которое очень серьезно ускоряет pandas (GPU acceleration). читать здесь
    Ответ написан
    5 комментариев
  • Почему не работает код?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну разбей свою задачу на две части
    1. Парсинг ввода пользователя и запись в подходящую структуру данных (словари)
    2. Расчеты

    Потом все будет просто, например.
    words = {
        'm': 2,
        'a': 3,
        'l': 1,
        'i': 1,
        'n': 2,
        's': 1,
        'o': 5,
        'r': 1,
        'd': 1
    }
    
    jams = {
        'smorodina': 1,
        'malina': 2
    }
    
    total = 0
    
    for jam, amount in jams.items():
        jam_time = 0
        for letter in jam:
            jam_time += words[letter]
        total += jam_time * amount
    
    print(total)

    Получи, вот такие словари. И потом просто обойди это дело циклами. Возможно, можно это как то оптимизировать. Надо дальше думать.
    Ответ написан
    2 комментария
  • Почему текстовый редактор и консоль по-разному присваивают ссылки на переменные Python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну смотри, здесь вся история про оптимизацию. В целях оптимизации str, int, и float. Указывают на один и тот же объект. Так как это не мутабельные типы данных, то сторонних эффектов нет.

    Так вот когда, ты запускаешь все это дело скриптом, то эту оптимизацию, проще проводить, поскольку весь скрипт сначала парсится в строку, и на этом этапе python понимает что он может что то оптимизировать. А в интерактивном python каждая строка запускается по отдельности, и данный процесс на много сложнее осуществить.

    Если ты сделаешь числа по меньшее, то он тебе и в интерактивном и если запускать через один и тот же скрипт выдаст один и тот id. например 11.
    Ответ написан
    Комментировать
  • При выводе users_cards выводится [, ...] как это исправить?

    Maksim_64
    @Maksim_64
    Data Analyst
    self.users_cards[i] = keys.pop Ну так ты добавляешь в свой список, метод pop. Вызывай его. keys.pop() Ну и если keys это словарь, то ты должен сопроводить key.pop(ключ), тогда данный ключ будет удален и его значение запишется в твой self.user_cards.
    Ответ написан
    Комментировать
  • Как правильно трансформировать данные к нормальному распределению?

    Maksim_64
    @Maksim_64
    Data Analyst
    Правильного способа не существует в природе. Надо пробовать все трансформеры.

    Пробуй Power Transformer (Он все таки самый универсальный) с обоими методами Box-Cox и Yeo-Johnwon . И делай тоже самое визуализацию распределение до и после. На всякий случай перепроверь свой код визуализации.

    Держи kaggle notebook из коллекции на эту тему. Где детально разобраны все трансформеры и визуализация хорошо выполнена, QQ график из statsmodels используется, плюс KDE в общем очень советую читать notebook и пробовать на своих данных.
    Ответ написан
    Комментировать
  • Увеличение списка до нужной длинны в pyhon?

    Maksim_64
    @Maksim_64
    Data Analyst
    Обычно когда мы имеем дело с множеством списков разной длинны и нужно выбрать из каждого по индексу то zip_longest из itertools решает проблему. Способов применения может быть много, простейший выглядит вот так
    from itertools import zip_longest 
    x = [1, 2, 3, 4, 5, 6, 7] 
    y = [8, 9, 10] 
    z = [9, 3, 4, 5]
    list(zip_longest(x,y,z))
    Ну а там в зависимости от того как эти списки получаются и что на выходе можно по разному реализовать. zip_longrst имеет параметр fillvalue, чем заполнять по умолчанию None. Ну и надо помнить про распаковку, то есть если все эти списки собраны ну например в какой то один список то можно использовать так.
    data = [x,y,z]
    list(zip_longest(*data))
    Ответ написан
    Комментировать
  • Насколько приемлема такая проверка на четность (делимость) в Python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Все три нормальные, используй какой нравится. Ничего из твоих примеров не является плохой практикой.
    Ответ написан
    Комментировать
  • Как сделать так чтобы данные перезаписывались, а не добавлялись новые?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ты используешь pandas датафрейм, потом начинаешь чего то изобретать. Pandas фрейм имеет метод to_sql https://pandas.pydata.org/docs/reference/api/panda.... Ему надо передать имя таблицы, объект соединения, так же у него есть параметр if_exists, которому можно присвоить значение replace. И будет перезапись.

    Раз уж у тебя есть фрейм то и оставайся в рамках датафрема сформируй необходимый подсет. И без cursor.execute отправляй в любую базу в том числе и в sqlite.
    Ответ написан
    8 комментариев
  • Что сделать что бы при print списка выводились нормальные данные а не что то непонятное?

    Maksim_64
    @Maksim_64
    Data Analyst
    То что ты положил то он тебе и выводит.
    self.add.pares.append(Create(token, link)) Вот здесь ты добавил в свой список объект типа Create. Твой класс не имеет не метода __str__, не метода __repr__ То есть строковое представление объекта Create ты не создал. В таком случае python выводит просто адрес в памяти объекта Create. Определи что ты хочешь что бы там было.
    Ну например
    class Create:
        def __init__(self, token1, link1):
            self.token1 = token1
            self.link1 = link1
            self.pares = []
        def info(self):
            print(str(self.pares))
    
        def __str__(self):
            return f'Create({self.token1}, {self.link1})'
    
        def __repr__(self):
            return f'Create({self.token1}, {self.link1})'

    Вот так он будет выводить объект и его параметры. Раз классы изучал, лекцию какой для чего метод читать не буду, сам почитаешь. Ну и определи свое какое ты имеешь ввиду для них строковое представление.
    Ответ написан
    Комментировать
  • Не понимаю, почему программа "тяжелая"?

    Maksim_64
    @Maksim_64
    Data Analyst
    Потому что вызовов рекурсивной функции происходит больше раз чем ты ожидаешь, и растет все это дело не линейно с увеличением n. Нужно оптимизировать рекурсивную функцию.
    from functools import lru_cache
    @lru_cache
    def F(n):
        print(n)
        if n <= 1:
            return n
        if n>1: 
            return F(n-1)+F(n-2)
    F(8)
    Вот твоя функция в точности, я добавил кеширование результатов, и print(n). Запусти с ним и без него и посмотри сколько лишних вызовов происходит. Если владеешь английским вот хорошая статья почитай как сделать своими руками, без встроенного декоратора, различные стратегии и т.д. https://realpython.com/lru-cache-python/
    Ответ написан
    1 комментарий
  • Почему переопределяются имена __slots__ при наследовании объектов?

    Maksim_64
    @Maksim_64
    Data Analyst
    Убери двойной подчеркивание, оставь одинарное. Если ты создаешь атрибут с двойном подчеркиванием, то python хранит атрибут в __dict__ добавляя одно нижнее подчеркивание затем имя класса, то есть вот так _ClassName__attrname. Если ты в __slots__ уберешь двойной подчеркивание перед именем оставишь одинарное, то имена атрибутов будут хранится, как ты ожидаешь.
    Ответ написан
    Комментировать