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

    Maksim_64
    @Maksim_64
    Data Analyst
    from bs4 import BeautifulSoup
    import re
    text = '''
    <input id="ctl00_ContentPlaceHolder1_grdProducts_ctl00_ctl05_EditFormControl_tbValidityPeriod"/> # подходит
    <input id="ctl00_ContentPlaceHolder1_grdProducts_ctl00_ctl07_EditFormControl_tbValidityPeriod"/> # подходит
    <input id="ctl00_ContentPlaceHolder1_grdProducts_ctl02_ctl11_EditFormControl_tbValidityPeriod"/> # не подходит
    <input id="ctl00_ContentPlaceHolder1_grdProducts_ctl00_ctl09_EditFormControl_tbValidityPeriod"/> # подходит
    <input id="ctl00_ContentPlaceHolder1_grdProducts_ctl00_ctl11_EditFormControl_tbValidityPeriod"/> # подходит
    <input id="ctl00_ContentPlaceHolder1_grdProducts_ctl01_ctl11_EditFormControl_tbValidityPeriod"/> # не подходит
            '''
    substring = 'ctl00_ContentPlaceHolder1_grdProducts_ctl00_ctl' # подстрока
    soup = BeautifulSoup(text, 'html.parser')
    result = soup.find_all('input',{'id':re.compile(substring)}) 
    print(result)
    Ответ написан
    Комментировать
  • Как достать из строки все что между скобок?

    Maksim_64
    @Maksim_64
    Data Analyst
    import re
    pattern1 = r"\[([0-9]+)\]"
    pattern2 = r'\[(.*?)\]'
    st = "1, 43, qweqwe [123] = [f]"
    result  = re.findall(pattern2,st)
    print(result)


    Если нужны только цифры внутри квадратных скобок используйте pattern1, если нужен любой текст внутри скобок используйте pattern2.
    Ответ написан
    Комментировать
  • Можно ли эмулировать нажатие на кнопку на сайте библиотекой Бютифул суп?

    Maksim_64
    @Maksim_64
    Data Analyst
    beatifulsoup это парсер для html и xml документов. И к нажатиям кнопок не имеет никакого отношения от слова совсем.
    Ответ написан
    1 комментарий
  • Как авторизоваться на сайте?

    Maksim_64
    @Maksim_64
    Data Analyst
    import requests
    from requests.auth import HTTPBasicAuth
    username = 'ваш username'
    password = 'ваш пароль' 
    url = 'Адресс'
    response = requests.get(url,
                auth = HTTPBasicAuth(username, password))


    либо есть разные формы авторизации. Там же есть классы
    from requests.auth import HTTPDigestAuth и другие.
    Ответ написан
  • Как цифру в строке преобразовать в числовой формат?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну если не трогать весь ваш код и оставлять все как есть, то просто добавить float(value). Имейте ввиду вы получите строковое представление float. Можно еще с помощью форматирования добавить сколько например знаков после запятой вы хотите отображать.
    res = ', '.join([f"{key}={float(value)}" for key, value in d.items()])
    Ответ написан
  • Как исправить TypeError: Products() takes no arguments?

    Maksim_64
    @Maksim_64
    Data Analyst
    Код то верный а вот из-за того что вы не сделали отступ для функции __init__ вам и выдает вашу ошибку.
    class Products:
        id = 1
    
        def __init__(self, name: str, firma: str, category: str, price: int) -> None:
            self.id = Products.id
            self.name = name
            self.firma = firma
            self.category = category
            self.price = price
            Products.id += 1
    
        def __str__(self) -> str:
            return f'''
    Id: {self.id}
    
    Name: {self.name}
    
    Firma: {self.firma}
    
    Category: {self.category}
    
    Price: {self.price}'''
        
    technic = [
    Products('Холодильник', 'LG', 'кухонная техника', 70600),
    Products('Утюг', 'HIER', 'гладильная техника', 53450)
    ] + [
    Products('Посудомоечная машина', 'LERAN', 'кухонная техника', 22000) for i in range (5)
    ]

    Вот так все работает.
    А у вас функция def __init__ это не метод класса а отдельная функция.
    Ответ написан
    1 комментарий
  • Как обратиться к данным из csv таблицы?

    Maksim_64
    @Maksim_64
    Data Analyst
    Первое я почти все оставлю как у вас что бы вашу логику не нарушать, внесу небольшие изменения.
    def read_csv(filename):   #зачем у вас в оригинале параметр data если вы его не используете логичнее передавать имя файла.
        with open(filename, encoding='utf-8') as file:
            reader = csv.reader(file)
            data = list(reader)
            return data

    далее используем вашу функцию для чтения получаем вложенный список в ответ, а нам он не нужен вложенный нам обычный нужен по этому распрямляем его.
    data = read_csv('urls.csv')
    flat_list = [item for sublist in data for item in sublist]


    далее по все видимости вы собираетесь использовать эти ссылки для парсинга
    пишете функцию которая будет парсить проходитесь циклом по списку flat_list и передаете в функцию по одной ссылке и все. Ваша функция будет принимать параметр url, затем делать request, затем beatifulsoup будет парситьи отдавать результат. Сделайте функцию которая делает это все для одного url, потом циклом по списку внутри цикла вызывайте функцию с параметром url.

    А теперь общие соображения.
    Зачем csv? когда читаешь csv он возвращает список под каждую строку, с обычного txt, мы бы этого избежали, я бы использовал бы вообще для записи json. Где ключом было бы название товара, а значением ссылка. Потому что если что не будет работать, то будет известно какой товар не удается спарсить.

    Нужно создавать log file и писать туда что отдал сервер при запросе и туда же писать различные исключения а то потом ума не дашь где ошибка.

    В коде много лишнего, параметр data в обоих случаях нужно заменить на filename. И много других погрешностей.
    Ответ написан
  • Как добавить элемент в двумерный список?

    Maksim_64
    @Maksim_64
    Data Analyst
    result = [[i+5 for i in row] for row in l]
    print(result)

    где l - это ваш список.
    Ответ написан
    Комментировать
  • Как высунуть из for и элемент и номер?

    Maksim_64
    @Maksim_64
    Data Analyst
    l = ['a', 'b', 'c']
    for num, value in enumerate(l):
        print(num, value)
    Ответ написан
    Комментировать
  • Как проверить, находится ли время в нужном диапазоне?

    Maksim_64
    @Maksim_64
    Data Analyst
    обрати внимание у тебя старт 23 часа вечера а end час ночи. а сейчас например около 9 утра по москве, в общем вот
    import datetime
    
    start = datetime.time(6, 30)    # 6:30 утра
    end = datetime.time(13, 30)  # 13:30 дня
    now = datetime.datetime.now().time() 
    
    if (start <= now <= end):
        print("Work!")

    все работает.
    Ответ написан
    Комментировать
  • Как настроить ML-модель?

    Maksim_64
    @Maksim_64
    Data Analyst
    То что вы пытаетесь сделать это называется тюнинг гиперпараметров. Так не делается конечно. в sklearn есть решения из коробки. При чем это целый этап в машинном обучении по этому целый раздел документации этому посвящен. https://scikit-learn.org/stable/modules/grid_searc...
    Там не только представлены классы но и различные методики которые используются. Изучайте там примеры есть, так что решите свой вопрос.
    Ответ написан
    Комментировать
  • Как перебрать все аргументы из функции и их обработать?

    Maksim_64
    @Maksim_64
    Data Analyst
    def is_prime(*args):
        result = []
        for num in args:
            if num == 1:
                result.append(False)
            elif num > 1:
                for i in range(2,num):
                    if (num % i) == 0:
                        result.append(False)
                        break
                else:
                    result.append(True)
            else:
                result.append(False)
        return result
    Ответ написан
    Комментировать
  • Как сделать, чтобы данные, которые я ввожу с клавиатуры, вводились в базу данных?

    Maksim_64
    @Maksim_64
    Data Analyst
    Вместо
    users = [(surname), (name), (patronymic), (number)]


    users = [(surname, name, patronymic, number)]
    Ответ написан