AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77978208
Accepted
kejtos
kejtos
Asked: 2024-02-12 03:54:38 +0800 CST2024-02-12 03:54:38 +0800 CST 2024-02-12 03:54:38 +0800 CST

Como contar linhas acima da atual com base nas condições polares?

  • 772

Vamos ter um polars df:

df = pl.DataFrame(
    {
    'date': ['2022-01-01', '2022-01-02', '2022-01-07', '2022-01-17', '2022-03-02', '2022-06-05', '2022-06-07', '2022-07-02'],
    'col1': [4, 4, 2, 2, 2, 3, 2, 1],
    'col2': [1, 2, 3, 4, 1, 3, 3, 4],
    'col3': [2, 3, 4, 4, 3, 2, 2, 1]
    }
)
data col1 col2 col3
01/01/2022 1 1 2
2022-01-02 1 2 3
07/01/2022 2 3 4
17/01/2022 2 4 1
02/03/2022 3 1 3
05/06/2022 3 2 2
07/06/2022 4 3 4
02/07/2022 4 4 1

O df é classificado por data. Gostaria de criar uma coluna que me desse uma contagem de todas as linhas anteriores (data inferior) com todas as 3 colunas tendo um valor maior ou igual ao valor da linha atual. Ou em outras palavras:

Count rows
    where row_index < current_row_index &
          col1[row_index] >= col1[current_row_index] &
          col2[row_index] >= col2[current_row_index] &
          col3[row_index] >= col3[current_row_index]
)

O resultado deve ficar assim:

data col1 col2 col3 ge
01/01/2022 4 1 2 0
2022-01-02 4 2 3 0
07/01/2022 2 3 4 0
17/01/2022 2 4 4 0
02/03/2022 2 1 3 3
05/06/2022 3 3 2 0
07/06/2022 2 3 2 3
02/07/2022 1 4 1 1

Eu tentei várias combinações de ,,,, etc. shift, mas não consegui descobrir. Também não consegui encontrar uma pergunta semelhante o suficiente para adotar sua resposta com êxito. Existe uma maneira de conseguir isso usando Polars? Agradeço antecipadamente.qeoverwhencum_count

python
  • 2 2 respostas
  • 58 Views

2 respostas

  • Voted
  1. Best Answer
    Roman Pekar
    2024-02-12T04:17:57+08:002024-02-12T04:17:57+08:00

    Essencialmente, a ideia é reunir todas as informações necessárias cumulative_evalem listas e, em seguida, explodir as listas resultantes em linhas e levar em consideração apenas as linhas onde todos os valores da lista são verdadeiros:

    import polars.selectors as cs
    
    (
        df
        .with_columns(
            cs.starts_with('col').cumulative_eval(
                (pl.element() >= pl.element().last()).implode()
            ).name.prefix('_')
        )
        .explode(cs.starts_with('_col'))
        .with_columns(
            pl.all_horizontal(cs.starts_with('_col')).alias('ge')
        )
        .group_by('date','col1','col2','col3').agg(pl.col('ge').sum() - 1).sort('date')    
    )
    
    ┌────────────┬──────┬──────┬──────┬─────┐
    │ date       ┆ col1 ┆ col2 ┆ col3 ┆ ge  │
    │ ---        ┆ ---  ┆ ---  ┆ ---  ┆ --- │
    │ str        ┆ i64  ┆ i64  ┆ i64  ┆ u32 │
    ╞════════════╪══════╪══════╪══════╪═════╡
    │ 2022-01-01 ┆ 4    ┆ 1    ┆ 2    ┆ 0   │
    │ 2022-01-02 ┆ 4    ┆ 2    ┆ 3    ┆ 0   │
    │ 2022-01-07 ┆ 2    ┆ 3    ┆ 4    ┆ 0   │
    │ 2022-01-17 ┆ 2    ┆ 4    ┆ 4    ┆ 0   │
    │ 2022-03-02 ┆ 2    ┆ 1    ┆ 3    ┆ 3   │
    │ 2022-06-05 ┆ 3    ┆ 3    ┆ 2    ┆ 0   │
    │ 2022-06-07 ┆ 2    ┆ 3    ┆ 2    ┆ 3   │
    │ 2022-07-02 ┆ 1    ┆ 4    ┆ 1    ┆ 1   │
    └────────────┴──────┴──────┴──────┴─────┘
    

    Você também pode usar duckdbpara fazer isso, graças à integração perfeita com polares :

    import duckdb
    
    duckdb.sql("""
        select
            d.*,
            (
                select count(*)
                from df as tt
                where
                    tt.date < d.date and
                    tt.col1 >= d.col1 and
                    tt.col2 >= d.col2 and
                    tt.col3 >= d.col3
            ) as ge
        from df as d
    """).pl()
    
    ┌────────────┬──────┬──────┬──────┬─────┐
    │ date       ┆ col1 ┆ col2 ┆ col3 ┆ ge  │
    │ ---        ┆ ---  ┆ ---  ┆ ---  ┆ --- │
    │ str        ┆ i64  ┆ i64  ┆ i64  ┆ i64 │
    ╞════════════╪══════╪══════╪══════╪═════╡
    │ 2022-01-01 ┆ 4    ┆ 1    ┆ 2    ┆ 0   │
    │ 2022-01-02 ┆ 4    ┆ 2    ┆ 3    ┆ 0   │
    │ 2022-01-07 ┆ 2    ┆ 3    ┆ 4    ┆ 0   │
    │ 2022-01-17 ┆ 2    ┆ 4    ┆ 4    ┆ 0   │
    │ 2022-03-02 ┆ 2    ┆ 1    ┆ 3    ┆ 3   │
    │ 2022-06-05 ┆ 3    ┆ 3    ┆ 2    ┆ 0   │
    │ 2022-06-07 ┆ 2    ┆ 3    ┆ 2    ┆ 3   │
    │ 2022-07-02 ┆ 1    ┆ 4    ┆ 1    ┆ 1   │
    └────────────┴──────┴──────┴──────┴─────┘
    
    • 1
  2. jqurious
    2024-02-12T12:03:28+08:002024-02-12T12:03:28+08:00

    Você também pode usar uma struct para colocar toda a lógica condicional dentro.cumulative_eval()

    cols = "col1", "col2", "col3"
    
    df.with_columns(ge =
       pl.struct(cols).cumulative_eval(
           pl.all_horizontal(
              pl.element().struct[col] >= pl.element().struct[col].last()
              for col in cols
           )
           .sum() - 1 # subtract 1 as we compare each row against itself
       )
    )
    
    shape: (8, 5)
    ┌────────────┬──────┬──────┬──────┬─────┐
    │ date       ┆ col1 ┆ col2 ┆ col3 ┆ ge  │
    │ ---        ┆ ---  ┆ ---  ┆ ---  ┆ --- │
    │ date       ┆ i64  ┆ i64  ┆ i64  ┆ u32 │
    ╞════════════╪══════╪══════╪══════╪═════╡
    │ 2022-01-01 ┆ 4    ┆ 1    ┆ 2    ┆ 0   │
    │ 2022-01-02 ┆ 4    ┆ 2    ┆ 3    ┆ 0   │
    │ 2022-01-07 ┆ 2    ┆ 3    ┆ 4    ┆ 0   │
    │ 2022-01-17 ┆ 2    ┆ 4    ┆ 4    ┆ 0   │
    │ 2022-03-02 ┆ 2    ┆ 1    ┆ 3    ┆ 3   │
    │ 2022-06-05 ┆ 3    ┆ 3    ┆ 2    ┆ 0   │
    │ 2022-06-07 ┆ 2    ┆ 3    ┆ 2    ┆ 3   │
    │ 2022-07-02 ┆ 1    ┆ 4    ┆ 1    ┆ 1   │
    └────────────┴──────┴──────┴──────┴─────┘
    
    • 1

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve