Задать вопрос
  • Как интерпретировать результат теста Шапиро-Уилка и Колмагорова - Смирнова?

    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 комментарий
  • Как поменять пароль к pgadmin4?

    Maksim_64
    @Maksim_64
    Data Analyst
    когда вошли в pgadmin в правом верхнем углу щелкаете по панельке (авторизованный юзер), и там есть сменить пароль, добавить двухуровневую аутентификацию. Там же в меню есть Users (пользователи) заходите в него нажимаете крестик добавить и заполняете данные нового пользователя.
    Ответ написан
    Комментировать
  • Как записать Словарь в 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 что бы имена столбцов не писались и других куча что бы проблем не возникло. Примеров документация статьи в интернете.
    Ответ написан
  • Как повысить точность модели машинного обучения?

    Maksim_64
    @Maksim_64
    Data Analyst
    Features, предоставленные мне для этой задачи, как я уже написал, обезличенные, поэтому они все нужные

    Данные могут быть числовые или категориальные. В свою очередь категориальные делятся на nominal и ordinal из чего следует что во первых если они присутствуют их надо закодировать и второе закодировать правильно, в sklearn есть OrdinalEncoder и OneHotEncoder. О том сделали ли вы это (и правильно ли сделали) вы нам конечно же не сообщаете, это действие относится к этапу Preprocessing data, там же Standard Scaler и другие возможно очень полезные трансформаторы вплоть до создания своего кастомного трансформатора.
    Просто данные не в один алгоритм не запихивают. Их приводят к такому виду (трансформируют) на которых алгоритм хорошо работает, а потом уже имеет смысл тюнить. Вам нужен результат. пожалуйста https://scikit-learn.org/stable/data_transforms.html . Вот это та глава в документации (а документация у sklearn как учебник) которая поправит дело. Результат достигается посредством трансформаций данных и в этой области лежит решение. Глава 6 что я вам скинул большая и за несколько часов или даже дней ее не осилить (если конечно же учится а не кусочки кода запускать). Начните с того что бы научится пользоваться объектом Pipeline (он не так прост как кажется) И с применением хотя бы простого трансформера StandardScaler и что бы без ошибок. Чтобы метод fit_transform вызывался на тренировочном сете а на тестовом только transform и т.д. или с правильным использованием Pipeline он это сам сделает. И приходите с кодом где вы перед тренировкой трансформируете данные.

    На данный момент у вас нет ничего 0.6 - 0.65 точность, у вас 300 / 500 = 0.6 то есть абсолютно случайно без какого либо обучения в среднем на длинной дистанции в 60% случаях можно угадывать статус 1.

    Мне нужно построить модель, которая будет предсказывать будущий статус.
    Что значит будущий речь идет о временной последовательности, а не о классической классификации?. Тогда препроцессинг должен быть сделан совершенно другой начиная от сплитов и т.д. В таком случае все данные нужно агрегировать разными функциями в пределах окна и на них учить, обязательно это проясните.
    Ответ написан