• Как в pandas объединить непрерывную последовательность событий одного типа в интервал?

    Иван Мельников,
    (
        df
        .assign(
            EventTime=lambda x: pd.to_datetime(x['EventTime'],format='%Y-%m-%d %H:%M:%S')
        )
        .assign(
            groups=(df['EventType'] != df['EventType'].shift())
            .cumsum()
        )
        .groupby(['user_id','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()
        .loc[:,['user_id','EventType','first','last']]
    ) Будет вот так. Все Идентично, только теперь группировка будет по двум колонкам.
    Написано
  • Как в pandas объединить непрерывную последовательность событий одного типа в интервал?

    Иван Мельников, Я его вообще не учитывал, это было не очевидно из твоего вопроса. Можно учесть это вообще не проблема. Нужно точно видеть что ты хочешь на выходе с учетом разных ID, ну а так то группировка по двум или более колонкам не проблема, там где groupby просто ([user_id, groups]) а из агригации его выкинуть и отреглуировать reset_index по скольку он будет многоуровненвый.
    Написано
  • Можете порекомендовать книги для практических заданий Python Data Science?

    Reyfli, Поверь, я занимаюсь коммерческой разработкой в DS - это клад а не книги, еще если будешь интересовать нейронками то глянь этот мой ответ Это лучшее по нейронным сетям.
    Написано
  • Как работает замыкание в python?

    Почитай Fluent Python, 9 глава Decorators and Closures, тема раскрыта шикарно.
    Написано
  • Что делать, если при учете константы в регрессионном анализе r-квадрат ужасен, но нет оснований не учитывать её?

    Kusmaus, Ерунду ты полную прочитал, на "зарубежных" форумах.
    rss = sum(y_true - y_pred)^2, так что ошибаться там ему негде.
    Написано
  • Правильная ли теория?

    Алексей 〒., Ну ты даешь, в любом курсе по теории вероятности, при чем обычно в начале данный кейс известен как gambler's ruin problem. Если играть в игру с негативной ожидаемой величиной то стратегия не важна, закончишь в минусе. Проблема известна уже не одно столетие.
    Написано
  • Почему Jupiter Notebook ругается на mglearn, даже после установки (через !pip install mglearn): "No module named 'mglearn'"?

    Перезапуск restart kernel пробовал? Или даже заново перезапустить jupyter. Иногда это может быть необходимо после установки пакета из блокнота.
    Написано
  • Сохраняется ли куда-то скриншот в Pyautogui?

    Kllklok, Когда python создает объект он хранит его в оперативной памяти, если на объект не будет указывать не одна именованная ссылка, то сборщик мусора удалит объект.
    Написано
  • Можно ли с ChatGPT создать отчеты и графики на основе GoogleSheets?

    Vitaly Karasik, Ну я по pandas/polars специалист. Там смысла в них нет, по скольку надежность очень слабая. То есть LLM может написать иногда очень крутой запрос, а может заблудится в трех соснах. По скольку при работе с таблицами вопрос не в том работает/не работает, а корректны ли циферки, то я LLM в принципе не использую. А так использую иногда правда не gemini и не chatgpt, а phind (мое мнение насчет кода она лучшая) у меня прям в vscode расширением она установлена и я ей в качестве контекста файл из рабочей папки указываю, иногда помогает, полюс я ее использую при работе с докер, там хорошо прям помогает.
    Написано
  • Memory Error при определении кодировки как чинить?

    zisho, Попробуй, две вещи первая вот такое напраление чтение по частям
    phone_numbers = pd.read_csv('test.csv',index_col='Номер Телефона',chunksize=1)
    dfs = []
    counts = 0
    numbers_of_interset = [777,333]
    for data in phone_numbers:
        index = data.index.intersection(numbers_of_interset)
        res = data.loc[index,:]
        dfs.append(res)
        counts+=res.shape[0]
    
    (
        pd.concat(dfs)
        .to_csv('result.csv')
    )
    print(f'found {counts} mutches')


    Второе encoding = chardet.detect(data)['encoding'] смотри тебе не обязательно определять у всего файла, там можно по не которому количеству символов. Естественно, chunksize=1, должно быть не 1 а ну согласно своей оперативке. Если файл весит 2.2 гб в озу он может и больше весить. при чем и в два раза больше может весит, то есть дели общее количество строк в файле на несколько частей. 1 это я для своего примера сделал, и он их прочитал по частям.

    Декомпозируй задачу больше. То есть на каком моменте виснет, на чтении, в фрейм, на chrdet. или на какой операции. вообще 2.2 это ерунда работать будет еще и быстро работать будет.
    Написано
  • Memory Error при определении кодировки как чинить?

    zisho, Ну будет работать, какой размер csv и код скинь как он у тебя там зависает.
    Написано
  • Стоит ли уходить в Data Science?

    math13, Для Российского рынка однозначно python, у нас по R вакансий очень мало.
    Как вы считаете, нужно пристально в Python уходить вначале, параллельно изучая всю подноготную DS?
    Просто в python без подноготной DS. Насчет математики 4 дисциплины.
    1. Линейная алгебра (операции с матрицами и векторами на языке DS тензорами определенных порядков и их геометрические свойства играют большую роль).
    2. Интегрирование дифференцирование функции с несколькими переменными (самое главное)
    3. Теория вероятности
    4. Статистика (что бы ее освоить на достойном уровне первые три должны на высоком уровне). По скольку это то с чем ты имеешь дело (У тебя есть наблюдения) а ты задаешься вопросом какой процесс сгенерировал эти данные.

    Но на старте чистый python. Ты же математик (1 + 0.01)^n сам знаешь как работает. Сильное программирование это основание твоего будущего экспонентного роста. А оно требует времени постоянной практики, что бы ты привык мыслить как программист. Потом на это дело DS подтянешь.
    Написано
  • Как убрать пробел между символами?

    Gojo_Satoru, Нет, sep это сокращенно separator (разделитель). Если ты сделаешь print(1,2,3) то он их напечатает через пробел, по скольку значение по умолчанию для параметра sep=' '. Открой доки по функции print. Если ты например туда запятую поставишь то через запятую и т.д.
    Написано
  • В чём ошибка данных поиска href TypeError: 'NoneType' object is not subscriptable?

    dieneri, find('a') Возвращает None у тебя.
    Ты можешь сделать print(type(item.find(class_="link").find('a'))) и увидишь NoneType.
    Написано
  • Как добавить данные в Series через ссылку на объект?

    Feor_slen, Конечно же есть. доки.pandas доки можно вполне читать как книгу. Куча хороших примеров.
    Написано
  • Как на pandas получить подобие оконной функции SQL?

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

    2. изучи из доков .pipe()

    3. налегай на chaining ты можешь комментировать раскомментировать строки внутри chain это экономит тьму времени, когда нужно смотреть двигаешься ты в нужном направлении или нет.

    Иотого твоя большая pandas проблема делится декомпозируется на подпроблемы, оборачивается в функции и затем ты это дело выстраиваешь в pipeline методом pipe. Псевдо код будет такой.

    original_frame = pd.DataFrame(data=some_data)
    def first_function(df:pd.DataFrame,*args,**kwargs)->pd.DataFrame:
        pass
    
    def second_function(df:pd.DataFrame,*args,**kwargs)->pd.DataFrame:
        pass
    
    def third_function(df:pd.DataFrame,*args,**kwargs)->pd.DataFrame:
        pass
    
    result = (
        original_frame
        .pipe(first_function,*args, **kwargs)
        .pipe(second_function,*args, **kwargs)
        .pipe(third_function,*args, **kwargs)
        ...
        ...
        .pipe(last_function,*args,**kwargs)
    )

    Вот таким образом твой pandas код не превратится во что то нельзя поддерживать улучшать и т.д. И ты будешь иметь доступ к каждому уровню своей декомпозированной большой проблемы.

    Удачного кодинга.
    Написано
  • Как на pandas получить подобие оконной функции SQL?

    Сергей c0re, Выглядит как два вопроса. Если нужна сортировка по префиксу то можно так. Хотя опций много
    df = pd.DataFrame({
        'A':['first_sometext','second_some_text','first_numbers','third_text','second_something'],
        'B':[100,4,2,45,23]
    })
    result = (
        df.assign(
            prefix = lambda x: pd.Categorical(x['A'].str.split('_').str[0],categories=['first','second','third'])
        )
        .sort_values(by='prefix')
        .drop(columns=['prefix'])
    )
    print(result)

    lambda не поддерживает конструкции по типу swith case. как в SQL case when then, на уровне lambda нету.
    Реализуется это приблизительно многими способами.
    result = (
        df.assign(
            prefix = lambda x: pd.Categorical(x['A'].str.split('_').str[0],categories=['first','second','third'])
        )
        .sort_values(by='prefix')
        .assign(conditions='default')
        .assign(conditions= lambda x:x['conditions'].where(~(x['prefix']=='first'),'Первый'))
        .assign(conditions= lambda x:x['conditions'].where(~(x['prefix']=='second'),'Второй'))
        .assign(conditions= lambda x:x['conditions'].where(~(x['prefix']=='third'),'Третий'))
        .drop(columns=['prefix'])
    )
    print(result)


    Это общий кейс если нужно реализовать сложные булевые выражеия в моем случае они простые но ты можешь впихнуть туда сложные выражения для многих колонок.

    Формально туже самую замену что я сделал можно сделать проще. replace и там словарь ключ значение. Где ключ что меняем значение на что заменяем. Но мой вариант выше позволяет организовыть сколь угодно сложные замены.
    Написано
  • Как на pandas получить подобие оконной функции SQL?

    Сергей c0re,
    делает какую-то дичь и выводит что-то непонятно странное... !???

    .loc[lambda x: x['date_time'] == x['latest'],:] выбирает те строки где твоя дата равна последней дате, довольно понятно. Четко сформулируй что ты хочешь. 46 строк по количеству твоих групп. У тебя file_name содержит 46 групп. Я сейчас глянул на данные там у тебя более чем одна строка может быть (в последней дате). Если ты хочешь оставлять все значения опять таки опций много можно rank использовать например как то так
    result = (
        df.
        assign(
        latest=lambda x:x
        .groupby("file_name")["date_time"]
        .rank(method='dense')
              )
        .loc[lambda x: x['latest'] == 1,:]
    )
    
    result
    Возможно надо будет, поменять параметр, потому что точно что ты хочешь получить ты не говоришь. Все я тебе достаточно помог.
    Написано