Ответы пользователя по тегу Python
  • Как сделать оформление словаря в txt файле и вычитывание значений из этого файла?

    Maksim_64
    @Maksim_64
    Data Analyst
    Когда мы храним информацию в файлах, то эта информация имеет определенную структуру. Вот это RPG = Dragon_Age, The_Elder_Scrolls_Skyrim Плохая структура, которая потребует парсинга, сами себе создаем проблемы.

    Мы можем использовать например json для создания хранения.
    import json
    data = {
        "RPG": ["Dragon_Age", "The_Elder_Scrolls_Skyrim"],
        "Action": ["Grand_Theft_Auto_V", "Watch_Dogs"],
        "MMORPG": ["Lineage_2", "Aion"],
        "Shooter": ["Bulletstorm", "Splinter_Cell"],
        "Racing":["Need_For_Speed_Payback", "Blur"]
    }
    
    with open("data.json", "w") as f:
        json.dump(data, f)

    Здесь, мы создаем файл определенной структуры. Из которого нам будет легко извлекать информацию.

    with open('data.json', 'r') as f:
        json_object = json.load(f)

    Все вся наша информация в словаре. С которым нам удобно работать.

    Теперь по поводу случайного выбора. Вы мало информации представили, по этому поводу. Выборка может происходить с заменой Выбрав элемент, я его возвращаю обратно и он может быть выбран снова. без замены Выбрав элемент он больше не может быть выбран снова. Информации как вы хотите осуществлять выборку вы дали мало. Например я могу использовать shuffle (перемешать элементы) и выбирать элемент c нулевым индексом всегда.
    from random import shuffle
    genres = list(json_object.keys())
    shuffle(genres)
    genre = genres[0]
    print(f'Вам выпал жанр: {genre}')
    games = json_object[genre]
    shuffle(games)
    game = games[0]
    print(f'Вам выпала игра: {game}')

    Это будет выборка с заменой. Мы можем использовать вместо выборки по индексу метод pop у списка и получим эффект выборки без замены (Но надо понимать объект json_object будет изменяться). Можно пойти и вашим путем. Осуществлять выборку индекса и выбирать по индексу, тоже нормальное решение.

    В общем основная проблема это не верно выбранная структура.
    Ответ написан
    Комментировать
  • Какие проекты можно сделать для повышения уровня в Пайтоне?

    Maksim_64
    @Maksim_64
    Data Analyst
    Знание данных функций (при чем ставить их в один ряд не стоит lambda это инструкция для объявления безымянной функции, в то время как другие имеют вполне конкретные предназначения) вряд ли приблизит вас к освоению python, map, zip возвращают итераторы. Уметь применить zip или map это одно, а вот понимать это уже совершенно другое.

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

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

    Maksim_64
    @Maksim_64
    Data Analyst
    Пример: На изображении изображен: roses с вероятностью 1.00
    Если мы уверены в чем то на 100 процентов это не вопрос статистики, как следствие любая правильно натренированная модель не может выдавать "с вероятностью сто процентов". И это пожалуй самое интересное в твоем вопросе.

    Ну а по кусочку кода от gpt и комментировать, что то тяжело. Если допустить что results содержит что то толковое, то потом просто происходит итерация с бессмысленным перезаписыванием переменных.
    Ответ написан
  • Ошибка программы на пайтон, как исправить?

    Maksim_64
    @Maksim_64
    Data Analyst
    У тебя model это словарь, да и все, а ты ожидаешь модель. Разбирайся с torch api, откуда ты этот пример взял. Возможно там есть какой-нибудь ключ 'model'. То есть, как то так
    model = torch.load("best.pt", map_location=torch.device("cpu"))['model']

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

    torch я не пользуюсь, его api не знаю, могу ошибаться,но predictions = model(image) вот это выглядит странно, даже если бы model был бы не словарь, а модель. Потому что у модели по идее должен быть метод predict.
    Ответ написан
    Комментировать
  • Как правильно преобразовать при помощи python данные с json в таблицу mysql (формат db)?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну и нагородил ты тут. При чем здесь mysql если ты в конце используешь sqlite. В общем проблема в том что по всей видимости у тебя твой твой датафрейм содержит питоновский объект dict, а не должен. во первых pandas имеет метод pd.read_json() во вторых есть метод json_normalize() если json содержит "вложенные словари". Приведи в порядок свой датафрейм, и данные запишутся в базу. Не знаешь, как привести датафрейм в порядок, показывай его и отдельным вопросом.
    Ответ написан
  • Как в Python получить список открытых позиций в Binance?

    Maksim_64
    @Maksim_64
    Data Analyst
    Обычно для работы с различными финансовыми данными используют такую структуру данных, как pandas датафрейм (некоторые api даже имеют параметр что то типа returned_type = 'dataframe' ). Там легко выбрать все что нужно, привести типы данных, ответить на любые вопросы например по какой монете самая большая открытая позиция и т.д, в общем все возможные манипуляции там есть + визуализации.

    Например представим нам прислали структуру как у тебя, я сократил (количество ключей для читабельности, а так не важно сколько их там)
    import pandas as pd
    import numpy as np
    data = [
        {'symbol': 'FTTBUSD', 'positionAmt': '0.001', 'entryPrice': '0.0', 'markPrice': '0.00000000'},
        {'symbol': 'ETHUSDT', 'positionAmt': '0.003', 'entryPrice': '1912.07', 'markPrice': '1911.37031373'},
        {'symbol': 'ALPHAUSDT', 'positionAmt': '0.002', 'entryPrice': '0.0', 'markPrice': '0.00000000'}
        ]
    df = pd.DataFrame(data=data, columns=['symbol','positionAmt'])
    df['positionAmt'] = df['positionAmt'].astype(float)
    print(df)

    Все мы выбрали только те ключи которые нам интересны параметр columns, если нужны все просто не указываем его. Теперь мы имеем таблицу с которой, мы можем делать все что угодно, начиная от любых расчетов, записей в различные форматы файлов или бд и даже визуализаций, например код df.plot(kind='bar', x='symbol', y='positionAmt'); Выведет вот такой график64b90126736ad454204003.png
    Это для демонстрации что всего в пару строк мы проходим путь от того что нам прислал binance до анализа.
    C датафреймом, будет легко и быстро задавать все интересующие вопросы.
    Ответ написан
    2 комментария
  • Как получить атрибут linestyle из объекта класса clicer()?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну что то ты совершенно не то пытаешься делать. Если же конечно твоя цель не покопаться в ооп. Стиль линий находится в классе LIne2D. Ты можешь вызвать print(klicker.__dict__) и там увидишь вот такую строчку '_lines': {'event': matplotlib.lines.Line2D at 0x7fe0e34a1a50}, далее если глянуть документацию класса Line2D то мы увидим что 'linestyle' это property.
    Итого что бы решить твой вопрос получаем
    klicker._lines['event']._linestyle Это даст тебе стиль линии. Изменить его можно (но это property) защищенный атрибут то есть можно но не нужно, так или иначе.
    klicker._lines['event']._linestyle = '-' его изменит.
    Ответ написан
    1 комментарий
  • Как вызвать метод класса без вызова экземпляра?

    Maksim_64
    @Maksim_64
    Data Analyst
    Обычно методы класса используются для объявления альтернативных конструкторов класса, так называемые factory methods. То есть класс метод обычно возвращает cls(*args, **kwargs) Вызывается просто MyClass.classmeth(*args, **kwargs)
    Вот например в pandas (у тебя был вопрос, значит используешь библиотеку) есть класс DataFrame. Ты можешь создать экземпляр класса DataFrame(data) А можешь использовать методы класса для альтернативного метода создания экземпляра (из другой структруры) DataFrame.from_dict(some_dict) так вот from_dict это метод класса.
    Метод класса он оперирует на уровне класса и не имеет доступа к экземпляру класса. Есть еще статические методы, это по сути python функция которая "связана с классом" но не имеет доступа не экземпляру не к классу.

    В чем у тебя здесь смысл попытки использовать методы класса лично мне не понятно. Потому что обычно вызвав метод класса мы инициализируем экземпляр с динамически измененным (данным методом) состоянием класса. Например мы можем поменять значение атрибута класса. Вот тебе на скорую руку бесполезный пример.
    class MyClass:
        currency = 'Dollar'
        
        def __init__(self, amaunt):
            self.amaunt = amaunt
            
        def __str__(self):
            return f'MyClass({self.amaunt, self.currency})'
        
        @classmethod
        def euro(cls, amount):
            cls.currency = 'Euro'
            return  cls(amount)
    dollar = MyClass(100)
    print(dollar)
    euro = MyClass.euro(100)
    print(euro)

    Если снова вызовешь print(dollar), то он тебе выведет euro. Потому что атрибут класса общий для всех экземпляров оказался измененным.
    Ответ написан
  • Почему возникает исключение AttributeError при запросе текущего состояния FSM?

    Maksim_64
    @Maksim_64
    Data Analyst
    добавь в конструктор класса super().__init__() Что бы инициализировать атрибуты родительского класса.
    def __init__(self):
        self.command = ""
        super().__init__()
    Ответ написан
    1 комментарий
  • Возникла ошибка Type Error в Python при изучении классов. Где и что в коде не правильно?

    Maksim_64
    @Maksim_64
    Data Analyst
    потерял скобки при создании экземпляра класса. deck = Deck(), Я скопировал, твой код и запустил у себя, там следом еще ошибка, вот в этой строе
    elf.cards[i], self.cards[j] = self.cards[j], self.cards[i]
    говорит list index out of range по всей видимости вот в этой строке j = random.randint(i, num_cards-1) Нужно, добавить -1, что я и сделал тогда все работает.
    Ответ написан
    1 комментарий
  • Рекуррентная нейросеть для прогнозирования на keras?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну в целом в плане решейпинга, все не правильно. Посмотри размерности своего labels. Это должен быть одномерный массив, длинной соответствующий количеству рядов в массиве features (ты его назвал training data). Потом а на чем ты тренируешься 15 рядов 11 колонок, я про training_data. Это абсурд. Этот код не поправить. Тебе нужен туториал и по нему адаптируюй под свои данные.

    Например вот там google colab c предсказаниями акций с использованием kears.Sequential, ну и комментарии кое какие имеются.

    Также на медиуме есть туториалы с объяснениями (на английском). В общем гугли keras sequential stock prices example и разбирайся по примерам. Это мертвый код, весь решейпинг переписывать надо. Плюс там надо будет тестовые данные хитро готовить, двигать и подавать в модель в цикле. В общем тебе нужен пример.
    Ответ написан
    7 комментариев
  • Как с помощью python загружать данные на страницу?

    Maksim_64
    @Maksim_64
    Data Analyst
    "нажимать" это нужен эмулятор браузера selenium.
    Ответ написан
    5 комментариев
  • Как добавить явное условие при обучении модели AI?

    Maksim_64
    @Maksim_64
    Data Analyst
    Явные условия (детерминистические) это не про машинное обучение. Сама суть машинного обучения это обучение без задания явных инструкций.

    Твоя проблема, большая называется "несбалансированные классы". 5 в одном 100 в другом это безнадега, модель по умолчанию имеет большую предрасположенность, что мешает обучению.

    Это распространенная проблема и к сожалению простого решения (не имеет). Существуют разные стратегии, как с этим бороться, и надо пробовать, что будет работать.

    Советую изучить вот эту статью на эту тему внимательно, и запастись терпением. Вот эта статья с медиума (открывается только через vpn) по крайней мере у меня, там тоже BERT и тоже решается проблема с не сбалансированным классами. Есть код. Но повторю проблема решается разными стратегиями препроцессинга (первая статья).
    Ответ написан
    1 комментарий
  • Как исправить ошибку Scikit-learn?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну код писал не ты, просто взял откуда-то да и все. Ошибка элементарная. У тебя где то он должен подсветить не совпадают размерности массивов. (1,4901) - это матрица с одним рядом и 4901 колонкой, а второй массив одномерный. Предположу что ошибка происходит при рисовании графика, это matplotlib выдает такую ошибку.
    Я тебе сделал маленький пример с идентичной ошибкой.
    X = np.arange(0,4901)
    y = 1.2 * X + 3
    X = X.reshape(1,4901)
    plt.plot(X,y)

    Вот мой код выдаст такую же ошибку. Как поправить нужно привести размерности массивов, к виду при котором с ними можно работать. ну например либо plt.plot(X.reshape(-1,1),y) сработает либо распрямить X сработает plt.plot(X.ravel(),y). И так и так сработает. Ищи на каком plot'e у тебя ошибка и приводи размерности к подходящему виду.
    Ответ написан
    Комментировать
  • В чем проблема random.uniform?

    Maksim_64
    @Maksim_64
    Data Analyst
    При распаковке time_range у тебя 12 элементов а должно быть два. По всей видимости вот это 43200, 50400 это массив строк, а не два числа в массиве. Вот он тебе и распаковывает их в uniform("4","3","2"..,"0"). А должен распаковывать, в виде uniform(43200,50400). time_range приходит не в том виде в котором ты его ожидаешь.

    Пишет он takes 3 потому что он еще и self считает. И пишет он 13 по факту в time_range у тебя 12 их также self учитывает. Так и выходит 43200, 50400 - 10 цифр + 1 запятая + пробел = 12 + self = 13 элементов.
    Ответ написан
    Комментировать
  • Как правильно импортировать таблицу excel в бд postgre?

    Maksim_64
    @Maksim_64
    Data Analyst
    Я бы в принципе рекомендовал использовать pandas для таких целей.
    1. Читаем excel в pandas dataframe псевдокод будет такой.

    import pandas as pd
    df =pd.read_excel(data.xlsx,sheet_name=’Ткани’)

    у функции read_excel много параметров, в том числе header, index_col которые возможно придется настраивать.

    2. Глянул бы на него что таблица в порядке (это как фрейм запишется в базу), глянул бы на типы данных, df.dtypes что бы все типы колонок, были в том виде как их ожидает база. Если надо изменил бы их. Проверил бы есть ли пропущенные значения (nan, NA). Если есть провел бы работу с ними.

    3. Затем бы отправлял в базу методом to_sql(). Псевдо код будет такой.
    df.to_sql('table_name', connection, if_exists='replace')

    Параметр if_exists (если таблица существует) имеет также метод append просто весь фрейм добавит новыми строками, и fail тогда будет ошибка.

    У pandas хорошая документация и он силен в чтениях фалов любых форматов, так что если что то не получается, это почти всегда поправимо, ну и как писать в базу тоже конфигурируется очень удобно, так что если в этом будут проблемы то тоже решается.
    Ответ написан
    1 комментарий
  • Как определить, где запущен код python - в PyCharm или в Google Colab?

    Maksim_64
    @Maksim_64
    Data Analyst
    from tqdm.auto import tqdm
    И все для терминала будет обычное, а для notebook'a специальное.
    Ответ написан
    2 комментария
  • Почему Jupyter noteboor не видит torch?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ты когда команду запускаешь, !pip3 show torch там тебе должно выдать в том числе и location (Путь). Ты не упомянул, у тебя стоит анаконда или ты просто jupyter поставил. Судя по всему анаконду ты не установил. Создай окружение посредством conda в терминале, активируй его conda activate environment name. Затем запусти, jupyter и тогда устанавливай torch.

    Еще в jupyter посмотри у тебя есть разные окружающие среды ты можешь сменить kernel? если нет установи ipykernel. И проделай то что я написал выше.

    Вот по ссылке пример, что бы с ipykernel не запутался https://www.geeksforgeeks.org/using-jupyter-notebo... . Это на случай если проблема в том что ipykernel не установлен. А так не забудь активировать свое окружение а не просто его установить.
    Ответ написан
  • Почему не работает скрипт на python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну разные они, строка из файла и твоя строка, да и все. Возможно пробелы лишние, когда из файла читаешь, там специальные символы могут быть, например \n, когда ты выводишь строку с помощью print, ты его не видишь и тебе зрительно кажется, что они одинаковые. Посмотри на print(repr(list_of_names[0])) и на свою строку, приведи их к одному виду, что бы list_of_names[0] == 'Абакус Прайм, СЭ' возвращал True. И будет работать.
    Ну и ошибка то наверное общего характера соответственно проведи работу над всеми строками, которые ты получаешь из файла.
    Ответ написан
    2 комментария
  • Как работать в ООП стиле в matplotlib - производить операции с графиками как с объектами?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну что ты имеешь ввиду под ООП стилем, не очень ясно из твоего примера. Во первых matplotlib имеет два интерфейса один matlab интерфейс а второй как раз таки ООП интерфейс.

    например
    import matplotlib.pyplot as plt
    import numpy as np
    X = np.linspace(-3,3,100)
    fig, ax = plt.subplots(2,1, figsize=(12,6))
    ax[0].plot(X, np.sin(X))
    ax[0].set_title('sin(x)')
    ax[1].plot(X,np.cos(X))
    ax[1].set_title('cos(x)')
    plt.show();

    Вот это пример двух графиков (поменять количество очень легко), на одной фигуре расположение и все остальное легко конфигурируется, вместо например xlabel и им подобным set_xlabel. Я продемонстрировал с title как устанавливать свой title для каждого графика отдельно. В документации этот подход упомянут, как explicit API еще его называют Объектно-ориентированный интерфейс. ax - это коллекция твоих графиков. a[0] - первый график и.т.д

    Так, как ты пытаешься ничего не получится. У тебя объект у которого ты пытаешься вызвать метод ylabel это список, а не то что ты думаешь.

    В matplotlib есть фигура и на ней ты можешь разместить столько графиков столько захочешь, в такой системе координат в которой захочешь и разместить их на этой фигуре так как захочешь.

    ДОПОЛНЕНИЕ К ОТВЕТУ.

    На случай, если OOP имелся ввиду python'вский а не OOP как интерфейс matplotlib.
    Смотри, если же тебе хочется создать свою структуру данных и на этой структуре запускать метод plot со всеми matplotlib возможностями, например pandas так делает. У pandas series или фрейма есть метод plot, если его запустить он тебе нарисует график напрммер.

    import pandas as pd
    
    df = pd.DataFrame({
        'Stock A':100 * np.cumprod(1 +  np.random.normal(0.01,0.05,30)),
        'Stock B':100 * np.cumprod(1 + np.random.normal(-0.01,0.05,30))
    }, index = pd.date_range('2023-01-01',freq='1D',periods=30))
    df.plot();

    Я сделал фрейм две фейковых акции обе стартуют со 100 рублей стоимости и затем одна имеет ожидание случайное нормальное распределение с одним процентом роста другая с одним процентом снижения в день. И вызвал метод plot. И он построит график, так вот если ты хочешь ПРИКРУТИТЬ метод plot для своего класса то можно сделать вот так.

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    class plotCreator:
    
        def __init__(self, x, y,**kwargs):
            self.x = x
            self.y = y
            self.axes_kwargs = kwargs
        def plot(self, ax=None, **kwargs):
            if ax is None:
                ax = plt.gca()
            ax.plot(self.x, self.y, **kwargs)
            ax.set(**self.axes_kwargs)
            return ax
            
    
    X = np.linspace(-2*np.pi,2*np.pi,100)
    y1 = np.cos(X)
    y2 = np.sin(X)
    
    img1 = plotCreator(X, y1,xlabel='X',title='cos(X)',ylabel='cos(X)')
    img1.plot().figure.savefig('cos.png');
    
    plt.cla()
    
    img2 = plotCreator(X, y2,xlabel='X',title='sin(X)',ylabel='sin(X)')
    img2.plot().figure.savefig('sin.png');


    Вообщем, работает, надо конечно до ума доводить (код мягко говоря так себе) ну это уже сам, конечно. Тут имей ввиду, после каждого создания экземпляра класса и вызова метода plot нужно чистить фигуру plt.cla() вот этим методом а то он естественно рисовать на одном и том axes будет. Остальное kwargs экземпляра класса это методы axes, (xlabel, ylabel) и им подобные, kwargs метода plot, это как рисовать, стили линии, толщина, цвет и т.д. (color, lw, alpha, и.т.д)

    В общем в виде черновика можно вот так. А так придется вчитываться в доки, как все это по уму обставить и привести код к приличному виду в общем время придется потратить.
    Ответ написан
    Комментировать