Задать вопрос
  • Почему меняется словарь?

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


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

    Maksim_64
    @Maksim_64
    Data Analyst
    Такого графика нет. Были дискуссии на эту тему, администрация опасается, отмены соревнования, с их слов бывает что у них все готово к старту и что то срывается, ну и соответственно они опасаются за свою репутацию.

    На практике большинство участников используют kaggle на ежедневной основе и ничего не пропускают, да многие не заходят в первый день, почитают дискуссии, посмотрят работы других участников EDA анализ например, посмотреть нотебук, который сабмитит результаты, что бы не заморачиваться с кагловским апи и.т.д

    А так ты можешь себе уведомление поставить о новом соревновании. Но графика планируемых соревнований нет.
    Ответ написан
    Комментировать
  • Почему не работает условие?

    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
    Ответ написан
  • Как интерпретировать результат теста Шапиро-Уилка и Колмагорова - Смирнова?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну все ли вы делаете правильно это совершенно неизвестно, (Это большой вопрос как сделана выборка, что за данные и т.д. вообщем соблюдены ли все условия) и так сходу не ответишь Это надо сидеть и разбираться (иметь ваши данные и время (сразу скажу делать я этого не буду)). А вот на остальное ответить вполне себе можно.

    1. График о чем говорит? Нормальное распределение подразумевает, крайне маленькие вероятности у "хвостов" распределения, то есть если вы отклонились более 2 стандартных отклонений то там 5 процентов всего по 2.5 с каждого края, на вашем же графике далекие от среднего значения НЕ являются маловероятными событиями. В статистике это называется fat tails. То есть это не НОРМАЛЬНОЕ распределение не будет такого что 95 процентов лежат в пределах двух стандартных отклонений, это значение будет меньше (Экстремальные величины не являются маловероятными).

    2. По поводу теста тут все просто. Что такое p-value? Это вероятность тестовой статистики при условии НУЛЕВАЯ Гипотеза ИСТИННА. Поговорим о логике эксперемента. Допустим мы говорим средний рост прохожего (мужского) пола 175см. Это ПАРАМЕТР популяции который мы хотим затестить посредством СЛУЧАЙНОЙ выборки. Мы выходим на улицу берем 500 (например дизайн эксперемента я опускаю) мужчин измеряем их рост и берем среднее значение это ТЕСТОВАЯ статистика, далее мы нормализуем (трансформируем наши ТЕСТОВУЮ статистику после чего она измерятся не в см а в стандартных отклонениях) ну и находим вероятность ТЕСТОВОЙ статистике из такого распределения где ПАРАМЕТР истинен. Если это вероятность ниже установленного заранее порога, мы отвергаем нулевую гипотезу. Потому что мы говорим это очень маловероятно видеть такую ТЕСТОВУЮ статистику при условии нулевой гипотезы истинной. Это общая направление ИДЕЯ. Частные имплементации могут отличаться в зависимости сколько данных у нас есть что мы знаем о распределении популяции и .т.д. Это была общая логика.

    У теста Колмагорова-Смирнова есть своя формула для ТЕСТОВОЙ Статистики которая показывает своего рода "дистанцию" между распределением выборки и в данном случае нормальным распределением (Упрощенно читайте подробнее) и вычисляет ее вероятность. В вашем случае он вам показал что вероятность равна нулю. (То есть уверенно отвергаем нулевую гипотезу).

    Это что можно понять из предоставленной вами информации, повторюсь ответить правильно ли вы все сделали возможности нет.
    Ответ написан
    Комментировать
  • Как удалить похожие строки из таблицы в Pandas, Python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну смотрите первое мы имеем str акссесор который позволяет нам осуществить для каждой ячейки как будто она строка в python. Там огромное количество методов и можно даже сложный regex написать если нужно, и на основании его оставить только нужные строки. Второе у pandas есть метод drop_duplicates(), он удаляет все не уникальные строки для одной колонки или даже для комбинации. По желанию можно задать ему параметры и оставить только первое пявление из неуникальных значений или последнее.

    Способов для решение вашей задачи на самом деле много. Ну вот парочку на основании той информации что
    вами представлена. То есть для представленного вами примера они сработают. Если же это не сработает для всех строк я то не знаю их всех и ориентируюсь на то что представленно вами, то суть, как решать на изменится просто возможно нужно будет добавить какое то условие или какой нибудь regex. Но суть решения не изменится.

    df = pd.DataFrame({
        'urls':['123.ru','lalala.ru','lalala.ru/qwe','lalala.ru/12rwse','bebe.ru'],
        'other data':[1,1,1,1,1]
    })
    # Первый способ 
    new_df = df.loc[df['urls'].str.split('/').str[0].drop_duplicates().index]
    print(new_df)
    # Второй способ
    new_df = df[~df['urls'].str.contains('/')].drop_duplicates()
    print(new_df)


    Первый способ более общий мы разделяем по слешу берем первый элемент (домен), и избавляемся от всех повторяющихся строк. (Более надежно)

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

    Если же оба примера не покрывают всех случаев (ЧТО скорее всего) то по этому же принципу нужно писать более сложное условие, и все.

    Ну вот автор уже и вопрос подредактировал что делает второй способ решения не рабочим да и первый надо менять тоже.
    df = pd.DataFrame({
        'urls':['http://123.ru/','http://lalala.ru','http://lalala.ru/qwe',
                'http://lalala.ru/12rwse','http://bebe.ru'],
        'other data':[1,1,1,1,1]
    })
    new_df = df.loc[df['urls'].str.split('//').str[1].str.split('/').str[0].drop_duplicates().index]
    print(new_df)
    Ответ написан
    Комментировать
  • Какие библиотеки для добавления данных в гугл таблицы вы знаете?

    Maksim_64
    @Maksim_64
    Data Analyst
    pandas, гуглите pandas dataframe to google sheets. Открывайте туториалы и вперед. Для уточнения pandas + gspread + gspread-dataframe, полный setup ну например вот этой статье есть. https://codesolid.com/google-sheets-in-python-and-...
    Ответ написан
    2 комментария
  • Как доработать код в 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 маленькое число. В общем разберетесь и доведете до желаемого результата.
    Ответ написан
    Комментировать
  • Как добавить словарь в существующий датафрейм pandas?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну во первых append метод запрещен и будет удален, так что его не используем. Если в двух словах то преобразовать во фрейм и конкатенировать, ну а если не в двух то вот.
    Сначала разберем как добавить новую строку. Используем метод concat для этого. Откроете документацию посмотрите все довольно просто. В вашим случае немножечко сложнее потому что ваш словарь простой
    {key1: value, key2:value}, что бы создать фрейм из словаря он должен быть такого вида some_dict = {'key1':[value],'key2':[value]}. Тогда мы можем просто создать фрейм командой pd.DataFrame(some_dict). Ничего особо переделывать не придется, просто использовать дополнительный метод from_records.
    shapka = {'Кадастровый № ОКС':[],'Вид ОКС':[],'Назначение':[],'Адрес ОКС':[],'Площадь':[],'Вид права':[],'ФИО':[],'Номер рег. записи':[]}
    df = pd.DataFrame(shapka)
    
    slovar = {'Кадастровый № ОКС': 'тут текст', 'Вид ОКС': 'тут текст', 'Назначение': 'тут текст', 'Адрес ОКС': 'тут текст', 'Площадь': 'тут текст', 'Вид права': 'тут текст', 'ФИО': 'тут текст', 'Номер рег. записи': 'тут текст'}
    new_df = pd.concat([df, pd.DataFrame.from_records([slovar])] ,ignore_index=True)


    Все вот так все заработает, как вы хотите, добавляйте новую строку к вашему фрейму. Ну а про concat почитаете в документации, что то будет не понятно спросите.

    И еще на что хотел бы обратить внимание это метод from_records.
    d1 = {'A':1,'B':2}
    d2 = {'A':3,'B':4}
    df = pd.DataFrame.from_records([d1,d2])
    print(df)

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

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну информации вы даете мало, а сделать для увеличения точности можно много всего.
    1. Трансформации, кейс ваш простой, все входные данные числовые. (Нормализация, Стандартизация), как делать смотрите https://scikit-learn.org/stable/modules/preprocess... там хорошие примеры как правильно применять StandardScaller min_max_scalar в общем приведение ваших входных данных к единой шкале.

    2. Увеличение сложности модели здесь мы говорим о bias vs variance компромисс Мы имеем простую модель или сложную модель. Например поведение простой модели слабая точность на тренировочном сете и еще более слабая точность на тестовом сете, такое поведение называется underfitting или говорят еще high bias. В свою очередь high variance или overfitting это высокие показатели на тренировочном сете и значительно более низкие на тестовом сете. Что делать читаем и изучаем https://scikit-learn.org/stable/modules/generated/... это трансформатор и затем https://scikit-learn.org/stable/auto_examples/mode... это кривая валидации в интернете полно примеров как применять. Через них находится оптимальная сложность модели.

    3. Тюнинг гиперпарматров https://scikit-learn.org/stable/modules/grid_searc... это как осуществить правильный подбор параметров эстиматора (когда уже сделаны нужные трансформации и выбрана модель).

    Перед этим сделайте ну хоть какое то подобие EDA используйте seaborn и функцию pairplot хоть глянуть может какие то корреляции есть. По гуглите другие методы EDA для задач регрессии это задаст направление для лучшего понимания датасета что у вас есть.

    Начните делать появятся более конкретные вопросы и будут более конкретные ответы.
    Ответ написан
    2 комментария
  • Как использовать оператор 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 комментария
  • Почему не обновляет значение переменной при перезапуске скрипта BS4?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну если вы зайдете в инспектора щелкаете правой кнопкой мыши inspect затем settings (иконка в правом верхнем углу инспектора) затем поставите галочку Disable JavaScript и обновите страницу вы увидите что стоимость перестала обновляться (так как это осуществлялось javascript'ом). Вообще это надо делать всегда когда парсишь странички средствами bs4, потому что при отключенном javascript это то как будет видеть bs4 твою страничку так как он НЕ работает c javascript.

    Это ответ почему, как поправить средствами bs4 ответ никак.
    Ответ написан
  • Почему pandas выдает ошибку?

    Maksim_64
    @Maksim_64
    Data Analyst
    metrics_df[[
        "same_intervals_between_requests"

    пропущена запятая, посмотрите внимательнее. Если же причина не в этом (ошибка то очевидна), может ваше исключение до этого выскакивает, то опубликуйте задачу (что вы хотите сделать.). Возьмите маленький фрейм и во что он должен превратится. По тому что как можно поправлять код? Без задачи (что вы хотите что бы этот код делал).

    Потом вот здесь тоже ошибка
    df[["time_local", "id_session"]].groupby("id_session").apply(count_metric_using_shift)

    вы выбираете сабсет и потом группируете, откуда ему взять колонки на которых запускать вашу функцию (весьма сомнительную).

    Вот я на маленьком фрейме сконструировал такую же ошибку, как у вас
    вот так будет ошибка потому что колонок где запускать функцию нет
    df = pd.DataFrame({
        'Cat':['A','A','B','A','B'],
        'Num1':[1,2,3,4,5],
        'Num2':[6,7,8,9,10]
    })
    df[['A','B']] = df[['Cat']].groupby('Cat').apply('mean')

    да ее можно убрать просто оставив df[['A','B']] =df.groupby('Cat').apply('mean') Но естествеено смысла в этом нет. Оно nan вернет. Нужно все переписывать, по этому и спрашиваю, какая задача.
    Ответ написан
  • Как разбить временной столбец на интервалы?

    Maksim_64
    @Maksim_64
    Data Analyst
    Смотрите если уж хочется разбивать на интервалы и создавать столбец с категориями то есть несколько стратегий но в целом для этого используется функция pd.cut, вот для вашей задачи я написал код.
    df= pd.DataFrame({'time':pd.date_range('2023-03-22', periods=48, freq='H')})
    bins = [0,5,11,16,22,24]
    labels = ['Ночь', 'Утро','День','Вечер','Ночь']
    df['session'] = pd.cut(df['time'].dt.hour, bins=bins, labels=labels, include_lowest=True,ordered=False)
    df

    Как вы увидите он создает столбец с желаемыми интервалами, вы можете поработать с параметрами на случай если это не совсем желаемое поведение (так как вопрос не совсем ясно сформулирован), в целом это вот такой подход.

    Имейте ввиду да для определенных задач это имеет смысл, создавать категориальную переменную для интервала времени, но для многих случаев объекты работающие с временем и датой достаточны умны и вы можете осуществлять группы для временной последовательности это не обязательно GroupBy есть специальный метод resample. Для выборки вы можете установить вашу временную последовательность в индекс и затем использовать удобный метод between_time, и многие, многие другие. И в целом временная последовательность имеет dt атрибут и затем можно к ней обращаться day, hour, year и.т.д.
    Ответ написан
    1 комментарий
  • Как реализовать классификатор на датасете рукописных цифр?

    Maksim_64
    @Maksim_64
    Data Analyst
    По этой ссылке репозитарий с реализацией вашей задачи на чистом numpy (python библиотека), которая предоставляет векторизованный массив. (все функции написаны вручную) не каких ML алгоритмов из коробки не используется.

    Реализуйте на том языке на котором вам необходимо. Я думаю иметь готовый код без ML библиотек это хорошее начало для решения вашей проблемы.

    Так же автор репозитария написал статью на https://towardsdatascience.com/ вы можете зарегистрироваться там они дают по моему три бесплатные статьи в месяц и изучить его статью, как весь процесс организовать и т.д. Название статьи "MNIST Handwritten digits classification from scratch using Python Numpy".
    Ответ написан
    Комментировать
  • Как создать список на два элемента с заполнением 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 комментарий