• Как записать все данные в 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. что бы имена колонок не записывал.
    Ответ написан
    Комментировать
  • Как зациклить парсинг в selenium?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну в таком то виде он и вовсе будет ругаться, что не знает что такое data. А так при условии что там все парсится ну и что в orgs > 1 элемента, все сводится к изучении самых самых основ python.
    вот код по вашей аналогии (пример я привел свой)
    data = []
    for i in range(5):
        result = i**2
    
    data.append(result)

    а вот как это должно выглядеть
    data = []
    for i in range(5):
        result = i**2
        data.append(result)


    Посмотрите разницу и подправьте сами.
    Ответ написан
    Комментировать
  • Можно ли как-то найти все элементы через 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
    Хороший или отличный процент точности в контексте данной проблемы будет определятся бизнесом (при помощи специалистов разумеется). То есть "Приносит ли прибыль модель распознавания". Он же бизнес (опять же при помощи специалистов) установит порог для точности и ИНТЕРВАЛ (процент будет в интервале). при котором данная модель прибыльна.

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

    Maksim_64
    @Maksim_64
    Data Analyst
    Довольно известное сообщение о предупреждении. На самом деле сейчас ведется разработка и в будущих версиях pandas это поведение должно принять более последовательный характер, потому что на данный момент оно непоследовательно. Что бы не повторять материал из свежей pydata. Вот ссылка Видео на видео где один из текущих разработчиков pandas объясняет все в деталях с примерами где будет это предупреждение а где нет почему оно возникает что с этим делать сейчас и что будет дальше.

    Если же в двух словах (Что плохо для данного вопроса, он глубже чем кажется), то предупреждение предупреждает о том что в вашем во фрейме из которого получен подсет данных могут произойти изменения при изменении значения в подсете.

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

    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
    soup.find_all('div',class_ = 'BNeawe iBp4i AP7Wnd')

    Возможно вы не отключили JavaScript в инспекторе и видите элемент который не видит парсер. Вот код у меня он возвращает список из которого легко извлечь числовое значение. У меня работает.
    Ответ написан
  • Почему возникает ошибка при записи в базу данных(serial)?

    Maksim_64
    @Maksim_64
    Data Analyst
    Как поправить запрос, что бы у меня айдишники автоматически заполнялись по мере их увеличения в бд, а не приходилось руками хардкодить цифры


    На то он и serial что бы при вставлении не указывать это поле, оно будет автоматически увеличиваться на один при добавлении новой записи.
    Ответ написан
    1 комментарий
  • Какой тип нейронной сети лучше подходит для работы с числовыми входными параметрами разной длины?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Все сети работают с числами, если входные данные не числа то они кодируются (разными методами в зависимости от типа).
    2. А почему не использовать стандартные алгоритмы классификации? Multinomial Logistic Regression, Random Forest Classifier и.тд. Основная работа она все равно ляжет трансформации и манипуляции с данными.
    3. Что касается размера входного вектора. То я бы работал с фиксированным размером. Потому что чем больше предикторов ввел пользователь тем точнее должен быть результат. Насчет заполнения нулями не уверен. Я бы провел анализ важности предикторов установил бы веса и заполнял бы не нулями а например вес умножить на среднее значение по предиктору в тренировочном сете. (Но это как один из возможных сценариев) Заполнение данных большая работа особенно для такой задачи, где они по условию будут. Просто нулями где максимум 12 а минимум три. Что может алгоритм предсказать если у него будет вектор где в худшем случае только 3 компонента не нули. Каким образом это будет работать? Я бы однозначно заполнял данные не введенные пользователем. ВЕС предиктора * на какую нибудь агрегирующую статистику по предиктору.

    Я бы использовал, scikit-learn здесь.
    1. Провел бы анализ важности предикторов каждого в отдельности. (получил бы веса).
    2. Посмотрел бы что за дистрибуции у каждого предиктора в отдельности (что бы понимать какой статистикой заполнять когда на входе этот предиктор отсутствует).
    3. Возможно нормализовал или стандартизировал предикторы. (по выбору)
    4. Затем начал бы работать с моделями (смотрел бы что получается)
    5. Если что то получается тюнил бы параметры если нет менял бы трансформации данных.

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

    И да пункты не воспринимай буквально (там нету разбиения на тренировочную выборку и тестировочную выборку ) И много чего еще нету. Это не инструкция (конкретики мало), а общая картинка возможного решения проблемы.
    Ответ написан
    Комментировать
  • Можно ли запросить в NASA данные?

    Maksim_64
    @Maksim_64
    Data Analyst
    https://svs.gsfc.nasa.gov/cgi-bin/details.cgi?aid=4768 прям под таблицей такой же как у вас есть ссылка json или текстовый файл, со всей инфой как у вас за весь год. Загружайте.
    json - https://svs.gsfc.nasa.gov/vis/a000000/a004700/a004...

    txt - https://svs.gsfc.nasa.gov/vis/a000000/a004700/a004...
    Ответ написан
    1 комментарий
  • Можно ли эмулировать нажатие на кнопку на сайте библиотекой Бютифул суп?

    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()])
    Ответ написан
  • Как скачать файл без репозитория?

    Maksim_64
    @Maksim_64
    Data Analyst
    ! wget ну и дальше путь к файлу.
    Ответ написан
    Комментировать
  • Как исправить 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 комментарий
  • Какой тут критерий подойдет для аб тестирования?

    Maksim_64
    @Maksim_64
    Data Analyst
    A_p - пропорция НЕ отмененных в контрольной 0%
    B_p - пропорция не отменных в тестовой группе
    Нулевой гипотезой будет A_p = B_p
    Альтернативной гипотезой A_p не равно B_p

    Находите p-value (вероятности увидеть B_p при условии A_p истина) если p-value меньше заранее установленного уровня например в 5% то отвергаете нулевую гипотезу и делаете вывод ЕСТЬ статистическая разница, если нет то мы не имеем достаточно доказательств для отвергания нулевой гипотезы.

    в итоге что тут может подойти ztest чтобы я узнал:

    ztest - тут не подойдет. Вам нужен тест Фишера на различие двух пропорций. Гуглите Fisher's exact test for two proportions. И там пошагово найдите p-values. И решите вашу задачу.
    Ответ написан
  • Как обратиться к данным из 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
    А вы уверенны что тюните правильно, при тюнинге вы не должны сравнивать с тестовым сетом, это приведет к классической ошибке утечке тестовых данных. Нужно создавать либо либо третий сет валидации либо использвать кросс-валидацию но с осторожностью (там можно то же набедакурить и получить утечку и на практике никаких 0.7 вы не увидите).

    Если у вас есть алгоритм который например в течении следующих торговых 252 дней, покажет точность 0.7 то вы богаты. 0.7 вероятность успеха при экспонентом росте хватит с головой. (Помните что речь о последовательности) а не а классической классификации или регрессии. Возможно вы учите модель на данных которых у вас не будет в момент прогноза, (классическая ошибка). То есть все ваши данные должны быть: это различные индикаторы (оконные функции, которые с агрегировали статистику за определенное время), например какой нибудь скользящее среднее с окном 10, скользящее среднее с окном 21 и.т.д. Ваши вход X это набор индикаторов, статистик которые будут вам доступны в момент предсказания.

    Там временная последовательность, кросс-валидация делается специальным классом для этого в документации sklearn есть про это в разделе кросс-валидации.

    Ну и наконец про алгоритм лучший алгоритм не существует. Даже если вам удастся создать модель которая зацепит текущее положение дел, и будет КАКОЕ ТО время хорошо работать потом она перестанет никакого универсального хорошего алгоритма не существует. Потому что на ценообразование в разное время в мире влияют разные факторы. В одно время это факторы настроения а все фундаментальные работают слабо, в другое в точности наоборот и т.д. Не ищете лучший алгоритм.
    Ответ написан