Ответы пользователя по тегу Python
  • Как исправить ошибку TypeError: 'type' object is not subscriptable?

    Maksim_64
    @Maksim_64
    Data Analyst
    Версии python разные, по всей видимости на сервере более ранняя. Либо попробуй
    from typing import List
    def GetAllWorker(db_name: str) -> List[WorkerInformation]:

    либо обнови python до более поздней, например на 3.10 может и 3.9 (не уверен) твой код должен работать. Если тебе конечно вообще нужны аннотации типов, на выполнения скрипта они влияния не имеют (в том смысле если не соответствие то ошибок не выдаст), а существуют лишь для специальных type checker'ов типа mypy.
    Ответ написан
    1 комментарий
  • Как агрегировать данные по элементам вложенного массива?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну пустяковая для pandas проблема.

    import pandas as pd
    import numpy as np
    
    data = [{ "customer_id": "5f9d7b0a100400c6f00ad1cb",
      "customer_pet": "cat",
      "customer_cat_color": "gold",
      "customer_cat_name": "",
      "timestamp": "2023-05-15 12:22:22.111241 UTC",
      "list_cart": [
        "cart_1",
        "cart_2",
        "cart_3" ]},
      {"customer_id": "5f9d7b0a100400c6f00ad1cb",
      "customer_pet": "cat",
      "customer_cat_color": "gold",
      "customer_cat_name": "",
      "timestamp": "2023-05-15 13:33:33.111241 UTC",
      "list_cart": [
        "cart_3",
        "cart_7",
        "cart_1" ]}
    ]
    
    df = pd.DataFrame(data)
    print(df['list_cart'].explode().value_counts())


    Все результат как ты хотел, ну и вдобавок глянь на фрейм колонку list_cart можно, распарсить, как надо под любые нужды. Для других операций группировок и т.д.
    Ответ написан
    1 комментарий
  • Почему переменная изменяет значение?

    Maksim_64
    @Maksim_64
    Data Analyst
    Когда вы выбираете подсет фрейма и ИЗМЕНЯЕТЕ этот подсет то может меняться и сам фрейм из которого этот подсет был выбран. Это известная особенность pandas, причина которых лежит в numpy. Как поправить, для этого используют копию и уже от этой копии и берется подсет. В вашем коде comtraders2 = df_segment вот это строчку нужно заменить на comtraders2 = df_segment.copy() И тогда будет работать, как вы ожидаете.

    помните подобные операции, могут приводить к изменению оригинального фрейма.
    df = pd.DataFrame({
        'A':[1,2,3],
        'B':[4,5,6]
    })
    
    subset = df['A'] 
    subset[0] = 100
    print(df)

    И вы увидите ваш оригинальный df изменился. Существует несколько кейсов, при определенных он выдаст предупреждение, при таком как я привел выше и вовсе все произойдет молча.
    поправить также, использовать копию.
    df = pd.DataFrame({
        'A':[1,2,3],
        'B':[4,5,6]
    })
    
    subset = df['A'].copy() 
    subset[0] = 100
    print(df)

    Ну и немножко, не в тематику вашего вопроса, я не знаю какую задачу вы пытаетесь решить, но pandas код так не пишут (колонки со списками внутри это очень плохо), задача должна решаться по другому.
    Ответ написан
  • Как отсортировать os.listdir по возрастанию?

    Maksim_64
    @Maksim_64
    Data Analyst
    sorted(mylist, key=lambda x: int(x.split('.')[0]))
    Ответ написан
    Комментировать
  • Изменили выходные параметры в fitted.forecast в Python - как его теперь использовать в моем случае?

    Maksim_64
    @Maksim_64
    Data Analyst
    В общем ради интереса, получил модель как на графике в статье. Из тех данных что у вас есть.
    1. Модель имеет тренировочный сет 130 плюс предполагает предсказание на 39 дней то есть конечное количество это 169. В коде же об этом не слова и он берет его до конца временной последовательности
    2. Задана неправильная вариация параметра order. Что бы его задавать правильно требуется понимание.
    3. По мелочи поправили остальное.
    4. Самое главное, практическая ценность данной модели близка к нулю. Он предсказывает средние значения и как мы видим он "зацепил" ТРЕНД, кстати его параметром конечно же автор статьи тоже не указал, но я поправил.

    В общем хотели рабочий код, который из данного датасета строит и визуализирует авторегрессивную модель то вот.

    df = pd.read_csv("https://hands-on.cloud/wp-content/uploads/2022/02/catfish_sales_1986_2001.csv")
    train = df.Total[:130]
    test = df.Total[130:170]
    
    model = ARIMA(train, order=(1, 0, 0),trend='ct').fit()
       
    
    fc = model.get_forecast(39, alpha=0.05) 
    
    fc_series = pd.Series(fc.predicted_mean, index=test.index)
    lower_series = pd.Series(fc.conf_int().iloc[:, 0], index=test.index)
    upper_series = pd.Series(fc.conf_int().iloc[:, 1], index=test.index)
    
    plt.figure(figsize=(12,5), dpi=100)
    plt.plot(train, label='training')
    plt.plot(test, label='actual')
    plt.plot(fc_series, label='forecast')
    plt.fill_between(lower_series.index, lower_series, upper_series, color='k', alpha=.15)
    plt.title('Forecast vs Actuals')
    plt.legend(loc='upper left', fontsize=8)
    plt.show()
    Ответ написан
    Комментировать
  • Почему меняется словарь?

    Maksim_64
    @Maksim_64
    Data Analyst
    потому что словарь это мутабельный тип данных. А ваш словарь имеет вложенную структуру, состоящую из мутабельных типов данных. Метод copy который вы используете он касается только копии внешнего словаря, но НЕ затрагивает вложенные мутабельные типы. Как результат data и temp это два разных объекта, а вот их вложенные структуры НЕТ. Что бы создавать копии c учетом вложенных структур нужно использовать deepcopy из модуля copy.
    import copy
    temp = copy.deepcopy(data)


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

    Maksim_64
    @Maksim_64
    Data Analyst
    Программа, как я понял должна проверять закрыты ли все скобки в строке. Почему методы класса ты пытаешься вызываешь без скобок например tack.get_elem, где скобки потерял? оператор () где потерял? и так у тебя в трех местах включая if stack.get_stack == []:
    Ответ написан
    Комментировать
  • Почему условие выполняется не корректно?

    Maksim_64
    @Maksim_64
    Data Analyst
    while True:
        password = input('Придумайте пароль: ')
        crit1 = len(password) >= 8
        crit2 = sum(s.isnumeric() for s in password) >=3
        crit3 = sum(s.isupper() for s in password) >=1
    
        if not (crit1 & crit2 & crit3):
            print('Вы ввели не надежный пароль')
        else:
            print('Пароль надежный')
            break
    Ответ написан
  • Как доработать код в matplotlib для рисования фигур над свечным графиком?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну задача ваша довольно простая нужно добавить scatter plot и нарисовать его маркерами для low и high и проверять event я так понял 0 продавать 1 покупать . В общем кода то тут всего ничего вот.
    plt.scatter(up[up.event == 0].index , up[up.event == 0].low, marker='^',color='green')
    plt.scatter(up[up.event == 1].index, up[up.event == 1].high, marker='v',color='red')
    
    plt.scatter(down[down.event == 0].index, down[down.event == 0].low, marker='^',color='green')
    plt.scatter(down[down.event == 1].index, down[down.event == 1].high, marker='v',color='red')


    Кастомизируйте если надо с цветами там размерами, может еще микро отступы сделать можно вычитать от low и прибавлять к high маленькое число. В общем разберетесь и доведете до желаемого результата.
    Ответ написан
    Комментировать
  • Почему график отображается без вызова метода plt.show()?

    Maksim_64
    @Maksim_64
    Data Analyst
    График как раз таки должен отображаться потому что вы используете Jupyter (IPython). В Jupyter нет необходимости вообще в команде plt.show(), ее просто нет. plt.plot уже рисует график внутри нотебука, любые дальнейшие команды просто обновляют ваш plot. И все.

    Можно поменять ему mode. plt.ioff() и тогда через plt.show() (Может и проблемы какие будут настраивать придется) вот нужная вам ссылка на раздел документации. https://matplotlib.org/stable/users/explain/intera...

    Главный аргумент, здесь что по умолчанию plt.show() (ничего не делает) в notebooke.
    Ответ написан
    Комментировать
  • Как использовать оператор else в циклах Python?

    Maksim_64
    @Maksim_64
    Data Analyst
    В первом случае else принадлежит к if flag is True: к вот этому условию тут все просто думаю комментарии излишне.

    Во втором случае else проверяется условие n != 0: Если оно истинно то выполняется то что в теле цикла, ну а если ложно то выполнится else.
    Важным нюансом является наличие break в теле цикла. если цикл завершится инструкцией break то else НЕ выполнится. Если же break не случилось а n != 0: перестало быть истинно (или не было изначально истинно) выполнится else.
    Ответ написан
    Комментировать
  • Как перебрать значения кортежа нужным мне образом?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну циклом делаете да и все,
    regions = ['Томская область', 'Московская область', 'Ленинградская область']
    cities = ['Томск', 'Москва', 'Санкт-Петербург']
    pop = [1051, 8594, 2027]
    for region, city, population in zip(regions, cities, pop):
        print(f'{region}: столица {city}, население {population} тыс. человек')
    Ответ написан
  • Почему не работает код?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну что бы ваш код заработал, (почти ничего не меняя) то вот так должно заработать (избавляемся от \ используя replace и берем первый с конца элемент, а не первый как у вас) по крайней мере на том кусочке файла что есть он работает.
    for vivod in city.split():
        if vivod.startswith('G') and int(city.strip().replace('\\','').split(" ")[-1])>500000:
            print(vivod)


    Ну а так по серьезней парсинг бы написать следовало бы.
    Ответ написан
    2 комментария
  • Как создать список на два элемента с заполнением None?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну если исходит из того что вы показываете как вам хотелось бы видеть ваш testList
    то вот так сработает
    from itertools import zip_longest
    print(list(zip(*zip_longest(*testList, fillvalue=None))))
    Ответ написан
    5 комментариев
  • Как в pandas искать по двум фразам и более?

    Maksim_64
    @Maksim_64
    Data Analyst
    И так вы создаете фрейм из csv файла, затем присваиваете имена колонкам. Это первое место распечатайте фрейм и посмотрите что выглядит так как вы ожидаете.

    Затем исходя из вашего кода вы хотите ВЫБРАТЬ подсет данных по критерию наличия в поле колонки name подстроки 'i3' или 'oem'. То есть если любая из этих подстрок находится в поле колонки name вы выбираете весь этот ряд.

    И так код ваш в принципе верный, если задача это та которую я указал. Вы конечно можете импортировать re, и добавить параметр, flags=re.IGNORECASE. Но в целом на сколько я помню нюансы разницы между case=False нет работать должно и так и так.

    https://pandas.pydata.org/docs/reference/api/panda... вот ссылка на документацию (возможно вы ее открывали), там есть пример на поиск одной или более подстрок, и он естественно работает (но вы все так и сделали).

    Подумайте эту ли задачу вы решаете, может другую, и приходит ли фрейм в том виде в котором вы ожидаете.

    df[df.name.str.contains('i3|oem', regex=True, case=False)])

    Вот это ваш код выберет все строки у которых в колонке name поле содержит подстроку 'i3' ИЛИ 'oem' и не важно в каком регистре (нижнем или верхнем).
    вот слепил игрушечный маленький фрейм
    df = pd.DataFrame({
        'name':['23i3f','dOemf','25','s2f5','df5'],
        'amount':[1,2,3,4,5]
    })
    
    print(df[df.name.str.contains('i3|oem',regex=True,flags=re.IGNORECASE)])

    И он работат, как и ожидается.
    Ответ написан
    1 комментарий
  • Как записать Словарь в CSV по СТОЛБЦАМ в Python?

    Maksim_64
    @Maksim_64
    Data Analyst
    в модуле csv есть класс DictWriter.
    Ну я бы использовал pandas потому что проще. Из той структуры данных что у вас есть легко создать dataframe и писать куда захочется хоть в csv, хоть в базу, хоть в excel и т.д.
    предварительно установив pandas
    import pandas as pd
    df = pd.DataFrame(data)
    df.to_csv('file.csv')

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

    Maksim_64
    @Maksim_64
    Data Analyst
    Гуглил, находил информацию только уже через собранные данные в словаре/массиве, а не циклично дописывались постоянно
    Ну так правильно у данных должна быть структура соответствующая что бы в excel писалось по столбцам. еще удобнее это создавать новый pandas фрейм в цикле (для каждых новых данных) и добавлять через него в excel. У него есть метод to_excel у него есть параметр mode там можно поставить 'a' что бы файл не перезаписывался а строки добавлялись туда, а также параметр header его можно поставить в False что бы имена столбцов не писались и других куча что бы проблем не возникло. Примеров документация статьи в интернете.
    Ответ написан
  • Как настроить пакет psycopg2 в VsCode для jupyter notebook на macOS M1?

    Maksim_64
    @Maksim_64
    Data Analyst
    Нажимаем ctrl+shift+p далее Python: Select Interpreter. Выбираете из тех окружений которые есть (там версии Python и пути к нему в списке.) которое вы будете использовать. После того как вы это сделаете ОБЯЗАТЕЛЬНО закрываете свой терминал (открытый внутри vs code (если конечно же он был открыт)) и cоздаете новый ctrl+shift+` и затем в этом терминале устанавливаете все ваши пакеты и они будут устанавливаться именно в это окружение. Не забудьте ОБЯЗАТЕЛЬНО создать новый терминал, он автоматически не меняет окружение в терминале после выбора Interpreter.
    Ответ написан
    2 комментария
  • Как вывести в строке только числа?

    Maksim_64
    @Maksim_64
    Data Analyst
    import re
    text = '1456gtefd14696'
    for number in re.findall(re.compile(r'\d+'), text):
        print('Число',number, end=' ')
    Ответ написан
    Комментировать
  • Как записать все данные в csv файл?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну если в консоли все работает, а в файл записал только один результат, то причина в том что файл все время перезаписывается.
    df.to_csv(r'C:\pythonProject5\my_data.csv',mode='a',header=False)

    Это если файл уже существует, если же нет. То первый раз вне цикла один раз запишите пустой csv. c именами ваших колонок.
    то есть
    columns = df.columns
    empty_df = pd.DataFrame(columns=columns)
    empty_df.to_csv(r'C:\pythonProject5\my_data.csv')

    и потом как я привел выше будет работать.

    Ну а вообще так не делается все собирается в один датафрейм и потом пишется в файл.
    ваш псевдо код будет иметь вид
    dfs = []
    for i in range(длина):
        Здесь вы сравниваете и создаете датафрефм но вместо записи его в файл добавляете в список
        dfs.append(df)
    final_df = pd.concat(dfs,ignore_index=True)
    final_df.to_csv()

    Вот така структура псевдо кода предпочтительнее чем каждый раз писать в файл. Опять же если все храните в файлах и они уже существует то mode='a' и header=False. что бы имена колонок не записывал.
    Ответ написан
    Комментировать