Задать вопрос
  • Как посчитать и вывести уникальные значения колонок dataframe, которые имеют тип коллекции/списка?

    Maksim_64
    @Maksim_64
    Data Analyst
    С помощью цикла однозначно не придется. Встроенный инструмент есть, даже много.
    чтобы мне достать из этих столбцов уникальные значения
    Вот это не совсем понятно, может имелось ввиду из списков, уникальные, и что значит достать.

    Если у тебя твои данные в списках то можно использовать explode.
    (
        pd.DataFrame({
            'ID':[1,2],
            'genres':[['Strategy'],['Fightening','Adventure','Arcade']]
        })
        .explode('genres')
    )
    Затем unique (уникальные) value_counts (посчитать каких и сколько у тебя там) или все что угодно, опций огромное количество. Обрати внимание структура фрейма не рушится (поведение колонки ID).

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

    Maksim_64
    @Maksim_64
    Data Analyst
    Ты перепутал, производную и касательную линию (tangent line). Графический калькулятор похож на desmos загугли tangent line desmos. Полно видео как построить. Ну и почитай про взаимоотнношения касательной и первой производной.
    Ответ написан
    1 комментарий
  • Как улучшить выводимый граф?

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

    Подобная история весьма распростронена для python экосистемы, например stasmodels (статистические модели) тоже имеет визуализацию и тоже matplotlib в качестве бэкенда, sympy крутейшая библиотека для работы с математическими выражениями тоже имеет в дополнение визуализацию и тоже matpltolib в качестве бэка.

    У подобных кейсов возможности визуализаций крайне ограничены.

    Тебе нужно организовывать визуализацию самостоятельно, то есть получить данные как структуры данных и визуализировать их. Посмотри в сторону networkx + plotly.

    plotly из коробки имеет огромное количество эффектов которые улучшат читабельность графа, зум можно будет легко добавить и иные эффекты. Matplotlib все это тоже позволяет, просто с позиции реализации это на много сложнее.

    гугли примеры networkx + plotly и стратегия твоя это визуализация не средствами networkx а средствами сторонней библиотеки, я предложил plotly с позиции временных затрат на реализацию.
    Ответ написан
    1 комментарий
  • Какую ошибку выдаёт код для тг бота?

    Maksim_64
    @Maksim_64
    Data Analyst
    По совету из форума вот отсюда https://community.openai.com/t/typeerror-openai-in...
    OpenAI(api_key="Your API Key")

    Ну а по смыслу ошибки, идет инициализация класса первым аргументом там self, второй твой позиционный который не предусмотрен, согласно совету из форума должен быть именованный. Для примера попытка инициализировать вот такой кастомный класс выдаст точно такую же ошибку.
    class A:
    
        def __init__(self,*, key=None):
            self.key = key
    
    a = A('12345')
    Ответ написан
    Комментировать
  • Какую нейросеть можно использовать для позиционирования стикера на макете упаковки товара?

    Maksim_64
    @Maksim_64
    Data Analyst
    Безнадежные вводные.
    1. Никто не будет делать и предоставлять в открытом доступе нейронные сети столь узкой направленности. Это не имеет ни какого коммерческого смысла.

    2. Здесь речь идет о профессиональном софте работы с изображениями который поддерживает скриптинг (для автоматизации процесса).

    Какой именно понятия не имею, я в этом не разбираюсь.
    Ответ написан
    6 комментариев
  • Что означает запись в скобках сразу после инициализации?

    Maksim_64
    @Maksim_64
    Data Analyst
    Действительно, все очень просто.
    namedtuple - это функция которая возвращает объект класса namedtuple, который является подсклассом встроенного tuple. Где первый параметр, это имя типа данных. Второй это параметры.
    from collections import namedtuple
    Point = namedtuple("Point", ['x','y'])
    point = Point(2,4)
    print(point)

    Теперь представим есть некий словарь и просто перепишем в одну строчку, с распаковкой параметров '*'.
    d = {
        'x':2,
        'y':4
    }
    
    print(namedtuple('Point',d.keys())(*d.values()))

    d.keys() это коллекция ключей строк, как в пошаговом примере, *d.values() это распакованная последовательность значений.
    Ответ написан
    Комментировать
  • Как инициализировать переменную раньше функции в Python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Что то ты с кодом ты напутал. Список может быть изменен из функции. Внутри функции python работает следующим образом.
    1. Первым делом python смотрит есть ли ключевое слово global

    2. Вторым есть ли ключевое слово nonlocal

    3. Третьим в параметрах, если там имя есть то переменная становится локальной.

    4. Если переменная упоминалась (но не было определена) то python смотрит на нелокальную область видимости.

    5. Если переменная упоминалась (но не было определена) и не найдено в нелокальной области видимости то смотрит в модуле

    6. Если и там не нашел то в встроенных пример max,min и т.д.

    a = 1
    b = 2
    c = 3
    
    def func():
        print(a,b,c)
    
    if __name__ == "__main__":
        func()
    Работает, как ожидается, а теперь маленькое изменение
    a = 1
    b = 2
    c = 3
    
    def func():
        print(a,b,c)
        c = 100
        print(c)
    
    if __name__ == "__main__":
        func()
    И все ошибка даже print(a,b,c) не выполнится. Потому что с находится в локальной области видимости функции python ее находит и также он находит ее упоминание (print(a,b,c)) до ее определения.

    def func():
        global c
        print(a,b,c)
        c = 100
        print(c)
    
    if __name__ == "__main__":
        func()


    Вся это проблема актуальна только для НЕ мутабельных типов например
    a = [0]
    b = [0]
    c = [0]
    
    def func():
        print(a,b,c)
        c.append(100) 
        print(c)
    
    if __name__ == "__main__":
        func()

    Все работает как и ожидается. Ну и пару слов об использовании global. Я персонально не сторонник утверждения никогда не используй global Но безусловно данная конструкция актуальна для не локальной области видимости то есть вот так.
    def func():
        total = 0
        def inner():
            nonlocal total
            total +=1
            return total
        return inner
    
    
    if __name__ == "__main__":
        add = func()
        print(add())
        print(add())
        print(add())
    Если убрать ключевое слово nonlocal то мы получим ошибку.
    Ответ написан
    Комментировать
  • Почему не инициализируется экземпляр класса?

    Maksim_64
    @Maksim_64
    Data Analyst
    def __int__(self): Внимательно надо быть. __init__
    Ответ написан
    1 комментарий
  • Как в pandas объединить непрерывную последовательность событий одного типа в интервал?

    Maksim_64
    @Maksim_64
    Data Analyst
    Давай по порядку пандас запрос который решает вопрос.
    (
        df
        .assign(
            groups=(df['EventType'] != df['EventType'].shift())
            .cumsum()
        )
        .groupby('groups'
        )
        .agg(
            first= pd.NamedAgg(column='EventTime',aggfunc=lambda x: np.min(x)),
            last= pd.NamedAgg(column='EventTime',aggfunc=lambda x: np.max(x)),
            EventType= pd.NamedAgg(column='EventType',aggfunc=lambda x: set(x).pop()),
            user_id=pd.NamedAgg(column='user_id',aggfunc=lambda x: set(x).pop()),
            )
        .reset_index(drop=True)
        .loc[:,['user_id','EventType','first','last']]
    )


    Ключевая история это группировка с последовательно повторяющимися значениями. Вот этот запрос по сути решает весь вопрос
    (
        df
        .groupby(
            (df["EventType"] != df["EventType"].shift())
            .cumsum()
        )
        .agg({"EventTime" : ["min", "max"]})
    )
    Остальное это манипуляции для идентичного твоему вывода (писал на скорую руку совместил агрегации с трансформациями) что не есть хорошо, я бы поработал и сделал лучше. В целом сработает и для строк, но лучше привести EventTime к типу данных datetime64[ns]. Сделать это можно
    (
        df.assign(
            EventTime=lambda x: pd.to_datetime(x['EventTime'],format='%Y-%m-%d %H:%M:%S')
        )
       ... 
    )
    Ответ написан
    4 комментария
  • Почему вместо значения в print выводит function at 0x?

    Maksim_64
    @Maksim_64
    Data Analyst
    Потому что ты выводишь объекты своих методов, а надо их вызвать () - скобки потерял.
    def chet(kva):
        print("Площадь квадрата:", kva.Plohad())
        print("Периметр квадрата", kva.Perimetr())
    chet(kva)
    Ответ написан
    Комментировать
  • Pandas, может ли он задавать ширину столбца при записи в excel таблицу?

    Maksim_64
    @Maksim_64
    Data Analyst
    Пандас использует различные "writer's" для записи файлов. Говоря об xlsx файлах, по умолчанию это XlsxWriter (это не единственный ты можешь использовать другие, у методов по типу to_excel, есть параметр engine).

    Как осуществляется взаимодействие и настройка вывода там в принципе все что угодно можно читать здесь https://xlsxwriter.readthedocs.io/working_with_pan...

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

    Maksim_64
    @Maksim_64
    Data Analyst
    Добавь классу Card идентичный методу __str__, метод __repr__.
    Ответ написан
  • Можете порекомендовать книги для практических заданий Python Data Science?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. От создателя pandas 3-е издание его легендарной книги Python for Data Analysis, 3E Веб версию, книги он сделал бесплатной. Для новичков шикарно, основные библиотеки плюс jupyter.

    2. От профессоров стенфорда, класика по DS с 2023 python edition (с лабараториями и сложными упражнениями). Так же доступна бесплатно. An Introduction to Statistical Learning
    Ответ написан
    3 комментария
  • Что делать, если при учете константы в регрессионном анализе r-квадрат ужасен, но нет оснований не учитывать её?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Теоретически это возможно иметь такую разницу в r-squared. Но довольно редкий кейс, я бы перепроверил данные.

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

    3. Посмотри на другие метрики например среднюю абсолютную ошибку, медианную абсолютную ошибку. Все они имеют хорошую бизнес интерпретацию с которой легко работать. Сам по себе r_squared это количество вариативности (дисперсии) объяснено моделью. 0.19 (19 процентов) вариативности объяснено моделью. Что очень мало и я назвал бы такую модель негодной. В то время как 0.99 (99 Процентов) очень много это учебные показатели, но это еще не все это не означает все супер. Посмотри на вышеупомянутые метрики они измеряются в единицах твоего таргета. Как они себя ведут.

    4. RSS, ESS, TSS - далековато от бизнеса. Это значения которые нужны для F статистики. А она у тебя говорит сама за себя 4314 и 5. Первая модель (где 5) совершенно не пригодна. Вторую перепроверяй, и мысли категориями интерпретации. Это сама суть регрессивного анализа.
    Ответ написан
    2 комментария
  • Почему функция возвращает None?

    Maksim_64
    @Maksim_64
    Data Analyst
    Потому что у тебя в рекурсивном кейсе отсутствует return Когда функция не имеет return python возвращает None
    ...
    else:
        return player_input()
    Ответ написан
    1 комментарий
  • Сохраняется ли куда-то скриншот в Pyautogui?

    Maksim_64
    @Maksim_64
    Data Analyst
    Какую память? В текущем виде pyautogui.screenshot() Это объект который хранится в памяти (оперативной). image Это именованный указатель на этот объект. Если ты хочешь сохранить на диск, то нужно указывать путь.
    Ответ написан
  • Какая есть литература полезная и понятная по Data Science на русском?

    Maksim_64
    @Maksim_64
    Data Analyst
    Data Science довольно широкий термин. Насчет Deep Learning посмотри недавно советовал хорошую книгу Ну а насчет Data Science слишком широко берешь, вышеупомянутый Deep Learning относится к DS, статистические тесты, вероятностное моделирование и т.д. также относится к DS, при этом они требуют углубления в совершенно разные разделы математики.
    Ответ написан
    1 комментарий
  • Как применить функцию для всего датафрейма pandas?

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

    2. Как следствие ты должен привести свой фрейм к такому типу данных с которым может работать твоя функция метод astype

    3. Есть три направления для применения твоей функции. Основной это метод apply он применяется к каждой строке или каждой колонке параметр axis, то есть когда ты пишешь свою кастомную функцию на вход она будет получать либо numpy массив либо pandas Series. Вообще apply для фрейма имеет довольно много интересных параметров почитай доки этого метода он реально мощный.

    4. Ты также можешь использовать pipe он работает как с Series так и с фреймаим я их часто по цепочке использую очень удобно. То есть пишешь функцию где на вход тебе фрейм приходит, оперируешь так как хочешь им. И потом ориганальный фрейм pipe(func, *args, **kwargs) и тебе приходит копия оригинального фрейма с твоими изменениями описанными в func, это очень хорошая практика.

    5. Ну и последнее самое простенькое это map применяет функцию по элементно к твоему фрейму. То есть свою кастомную функцию ты пишешь, не для numpy массива, не для pandas Series, а для каждого элемента фрейма.
    Ответ написан
    Комментировать
  • Можно ли с ChatGPT создать отчеты и графики на основе GoogleSheets?

    Maksim_64
    @Maksim_64
    Data Analyst
    На сколькой я знаю с gpt, ты не можешь взаимодействовать с google sheets, только вопросы задавать как сделать то или иное. А вот с Gemini ты можешь взаимодействовать, с google workspace и как следствие с google sheets. На сколько это все качественно там не знаю, но начиная от официальной поддержки, ютуб мануалов, да и сам Gemini может подсказать, как с этим делом взаимодействовать.

    Не думаю что google даст api для выполнения скриптов от LLM для своих сервисов. Так что предполагаю что только gemini.
    Ответ написан
    3 комментария
  • Memory Error при определении кодировки как чинить?

    Maksim_64
    @Maksim_64
    Data Analyst
    используй для чтения csv pandas, на случай если они там огромные, то с параметром chunksize=количество строк (по простому чтение по частям) и encoding=то что chardet вернул. Далее поставь колонку с номерами телефона в индекс (для пандас не уникальные индексы это совершенно нормально) и верни csv файл с совпадениями. Код будет что то вроде этого. Предположим это твой csv файл
    Номер Телефона,Имя,Фамилия
    333,Иван,Петров
    333,Василий,Сидоров
    444,Петр,Прямой
    333,Федор,Кривой

    import pandas as pd
    phone_numbers = pd.read_csv('test.csv',index_col='Номер Телефона')
    numbers_of_interset = [777,333]
    index = phone_numbers.index.intersection(numbers_of_interset)
    not_found = pd.Index(numbers_of_interset).difference(phone_numbers.index)
    (
        phone_numbers.loc[index,:]
       .to_csv('result.csv')
    )

    Читаем в фрейм и устанавливаем номер телефона в индекс, numbers_of_interest это те номера которые ты хочешь вернуть в качестве выборки если они есть в файле, делаем intersection с индексом фрейма, также находим те что не нашлись. Записываем файл только с теми что есть. При необходимости выводим те что не нашлись хранятся в not_found.

    Если они очень большие и требуют чтения по частям обратись к докам pandas ну или вот пример использования https://www.geeksforgeeks.org/how-to-load-a-massiv...

    Ну и если тебе не нужна вся выборка а только количество совпадений мне это не очевидно из твоего вопроса, то в контексте моего примера
    print(phone_numbers.loc[index,:].shape[0]) Даст тебе количество.
    Ответ написан
    5 комментариев