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

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

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну смотри, я так понимаю задача сделать это на чистом python, если что у numpy массива имеется reshape() метод, который делает все это прекрасно, просто введешь размерности и если операция возможна n*m должно давать длинна массива он выполнит преобразование.

    На чистом python задача указать количество колонок, это будет размер внутреннего списка. То есть ну как то так
    l = [int(i) for i in '1 2 3 4 5 6 7 8 9'.split()]
    m=3
    result = [l[i:i+m] for i in range(0, len(l), m)]
    Ответ написан
    4 комментария
  • В чём у меня ошибка в данной задаче?

    Maksim_64
    @Maksim_64
    Data Analyst
    Странно, вроде занимаешься машинным обучением где-то взял код, а не вопрос нормально задать не можешь, не подправить в двух местах, ошибки которые и к машинному обучение то отношения не имеют.
    print((f'accuracy:{accuracy_score(y_perd,y_test) :.3}'))
    вот в этой строчке, ты не смог подправить не правильно написанное имя переменной, y_pred должно быть.
    вот в этой строчке ты не смог правильно написать название колонки
    sns.scatterplot(x='petal_width', y='petal_lenght',data=iris,hue = 'species', s=70)
    должно быть y='petal_length'

    Код запустится, и начнет работать. Ты вводишь гипер параметр количество соседей для своего классификатора, он фиттит его, и рисует график в котором показывает правильно и не правильно классифицированные точки, код работает.

    А ну и закомментируй лишнее в общем вот рабочая версия
    код
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    import seaborn as sns
    from matplotlib import pyplot as plt
    import numpy as np
    import pandas as pd
    from sklearn import datasets
    
    iris= sns.load_dataset('iris')
    #iris
    x_train, x_test, y_train, y_test= train_test_split(
        iris.iloc[:,:-1],
        iris.iloc[:,-1],
        test_size= 0.15
    )
    
    def init_model(k, x_train, y_train, x_test):
      model = KNeighborsClassifier(n_neighbors=k)
      # print(model)
      model.fit(x_train,y_train)
    
      y_pred = model.predict(x_test)
      return y_pred
    
    def grath(y_test,x_test,y_pred):
      plt.figure(figsize=(10, 7))
      sns.scatterplot(x='petal_width', y='petal_length',data=iris,hue = 'species', s=70)
      plt.xlabel('Длина лепестка,см')
      plt.ylabel('Ширина лепестка,см')
      plt.legend(loc=2)
      plt.grid()
      for i in range(len(y_test)):
          if np.array(y_test)[i] != y_pred[i]:
              plt.scatter(x_test.iloc[i,3],x_test.iloc[i,2],color = 'red', s = 150)
    
    
    
    # x_train.shape, x_test.shape, y_train.shape, y_test.shape
    
    # x_train.head()
    # y_train.head()
    
    k = int(input('Чему равно k? '))
    
    y_pred = init_model(k,x_train,y_train,x_test)
    print((f'accuracy:{accuracy_score(y_pred,y_test) :.3}'))
    grath(y_test,x_test,y_pred)
    Ответ написан
    1 комментарий
  • Как распарсить этот XML?

    Maksim_64
    @Maksim_64
    Data Analyst
    С твоей библиотекой не работал, но с BeautifulSoup все работает как надо.
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(data, 'xml')
    name = soup.find('ns2:Name').text
    surname = soup.find('ns2:Surname').text
    email = soup.find('ns2:Email').text
    birthday = soup.find('ns2:Birthday').text
    Ответ написан
    2 комментария
  • Не могу решить задачу на python?

    Maksim_64
    @Maksim_64
    Data Analyst
    На вот тебе вот такое решение, доводи до ума.
    text = 'Я есть Грут.Ты нет.'
    print(
        '.'.join(' '.join(reversed(item.split(' '))).capitalize() for item in text.split('.'))
    )
    Ответ написан
  • Как хранить константы в python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Вот большой гайд о константах, Там в принципе описаны все возможные способы создания констант, а их много. И самое главное, есть раздел Handling Your Constants in a Real-World Project, то что тебе и нужно, а не просто "знакомство". Ресурс в python среде пользуется репутацией, его даже в продвинутых книгах упоминают.
    https://realpython.com/python-constants/
    Ответ написан
    4 комментария
  • Как исправить AttributeError: 'NoneType' object has no attribute?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну у тебя метод apples не имеет инструкции return соответственно возвращает None. То есть вот в этой строчке tree.apples().total() после выполнения apples() у тебя в результате объект None. А объект None не имеет метода total. О чем и говорит ошибка. Метод total это метод экземпляра класса Tree. tree.total() Соответственно, что бы изменить атрибут экземпляра класса и затем вывести его на печать, согласно твоему объявлению класса, то вот так.
    tree = Tree()
    tree.apples()
    tree.total()
    Ответ написан
    7 комментариев
  • Как параметр в лямбде соотносится с параметром в функции?

    Maksim_64
    @Maksim_64
    Data Analyst
    lambda - это безымянные функции.
    например
    f = lambda x: x**2
    print(f(4))
    выведет 16. f - это указатель на безымянную функцию с одним параметром.
    Тоже самое и в твоем коде твоя функция myfunc, возвращает безымянную функцию, твой n подставит выражение и вернет функцию. lambda a:a*2 дальше как в пример выше ты вызываешь свою функцию с аргументом a=11 и получаешь 22.

    Эта лямбда стоит после оператора return функции myfunc, то есть myfunc возвратит то, что вычислится в результате выполнения лямбды.
    Вот здесь ошибка в твоей логике. Он вернет функцию а не вычислит ее только вместо n ,будет параметр из myfunc.
    Ответ написан
    1 комментарий
  • Ошибка NameError: name 'np' is not defined?

    Maksim_64
    @Maksim_64
    Data Analyst
    Попробуй установить если не установлен numpy и импортировать его import numpy as np
    Ответ написан
    Комментировать
  • Обучение модели машинного обучения прерывается без ошибки. Что может быть причиной и как это решить?

    Maksim_64
    @Maksim_64
    Data Analyst
    Я тоже читал эту книгу, класс книга. В colab запускал? У тебя там не заглушены сообщения об ошибках или предупреждениях? Ну а так остается только экспериментировать попробуй learning rate ему поменять. Попробуй optimizer поменять. Например увеличил вдвое batch_size, увеличь вдвое и learning rate. Скорее всего схождения не происходит, точнее происходит но слишком медленно, ну и видимо, notebook подвисает или там какая нибудь остановка предусмотрена. Одназначно увеличивай learning rate (линейно с увеличением batch), после того как в colab попробуешь, конечно.
    Ответ написан