Repository navigation
Colunas de entrada polars saem do DataFrame original - #217
Conversation
Com entrada polars, a saída inteira era convertida de volta do pandas, e as colunas que a execução não escreve voltavam com outro tipo: Int64 com nulo virava Float64 e arredondava ids acima de 2**53, Date virava Datetime, e Enum, Decimal, Array, Null e o inteiro dentro de Struct e List também mudavam. Uma coluna Object levantava ArrowInvalid depois das chamadas. A conversão guarda o DataFrame polars de entrada. Na saída, as colunas do usuário que não são campo do modelo saem dele, e só os campos do modelo e as colunas de controle são convertidos do pandas. A família de cada coluna vem de _column_rank, que _reorder_columns também usa. Na ida, o inteiro com nulo vira inteiro anulável do pandas, para que o campo inteiro do modelo numa saída interrompida não seja arredondado na retomada. Closes #195 Co-authored-by: mayuriphad <mayuriphad656@gmail.com>
- A coluna _trace do agente único entra na família de trace. Classificada como coluna do usuário, ela saía do DataFrame polars de entrada, e a retomada ou o reprocessamento de uma saída com save_trace perdia o trace das linhas novas. - Na ida, o inteiro com nulo vem como int do Python numa coluna de objetos, e não como inteiro anulável do pandas. É a forma em que a execução guarda o campo do modelo: a validação strict aceita de volta o inteiro acima de 2**53, um validador before recebe int, e a coluna de tokens aceita o valor que o provider devolver. - _reorder_columns seleciona por posição, e um rótulo repetido no pandas não traz a coluna mais de uma vez. - O CHANGELOG diz que a coluna Object trocava de tipo ou levantava ArrowInvalid, conforme o objeto. Testes novos: cada família de coluna de controle presente na entrada polars, tokens na retomada, modelo strict com inteiro grande, rótulo repetido e a posição de _trace.
Com o inteiro com nulo sempre em objetos, um campo bool cuja coluna chega do polars como Int64 0/1, como a lida de SQLite, deixava de ser reconhecido na retomada: as linhas processadas ficavam 1 e 0, a nova vinha True, e a conversão final falhava depois da chamada. A coluna inteira com nulo fica em float64, como o to_pandas() a entrega, enquanto todo valor cabe exato no float. É a forma que o pandas daria ao mesmo dado lido de arquivo e a que a retomada reconhece em campo int e bool. Só a coluna com valor que o float arredondaria vem como objetos. O CHANGELOG registra que _trace passa a ficar com as colunas de trace na ordem da saída.
A conversão do inteiro com nulo na ida saía do escopo da issue e, nas três formas tentadas, piorava algum caso de retomada: campo bool sobre coluna Int64 0/1, campo float sobre coluna com inteiro acima de 2**53, e inteiro acima do Int64, que passavam a falhar depois das chamadas. A ida fica como na main, e o PR trata só da volta: as colunas que a execução não escreve saem do DataFrame polars de entrada. Numa matriz de 8.844 combinações de campo do modelo, coluna já presente e modo de retomada, a única diferença em relação à main é a coluna de entrada voltar com o tipo e os valores originais.
Revisão independente antes do mergeTrês subagentes novos, um por rodada e sem acesso ao raciocínio da implementação, revisaram o branch em worktrees descartáveis, com suíte, mutações e comparação contra a Rodada 1, sobre
|
O quê
Com entrada polars, a saída inteira era convertida de volta do pandas, e as colunas que a execução não escreve voltavam diferentes do que entraram. Um
Int64com nulo voltavaFloat64, e um id como 9007199254740993 voltava 9007199254740992.0, de modo que um join da saída com a entrada pela coluna de id perdia linhas. UmDatevoltavaDatetime[ms]. Medindo os demais tipos,UInt64com nulo,Enum,Decimal(10, 2),Array,Nulle o inteiro dentro deStructeListtambém mudavam, e uma colunaObjecttrocava de tipo ou levantavaArrowInvaliddepois das chamadas.Como
to_pandasguarda o DataFrame polars de entrada emConversionInfo.polars_frame. Na saída, as colunas do usuário que não são campo do modelo saem desse frame, sem passar pelo pandas, e só os campos do modelo e as colunas de controle são convertidos. O tipo e os valores ficam os da entrada para qualquer tipo, sem regra por tipo.from_pandasrecebemodel_columns, e os dois retornos dedataframeit()que gravam campos do modelo o passam. A família de cada coluna (usuário, trace, busca, tokens, status) vem de_column_rank, que_reorder_columnstambém usa. A coluna_tracedo agente único entra na família de trace, e a reordenação seleciona por posição.A ida do polars para o pandas não muda. O campo do modelo que já está na entrada, numa retomada ou num reprocessamento, segue pelo mesmo caminho de antes.
Testes
resume.intparafloate retomada de saída interrompida comUnion[int, float],Optional[int]e campoboolgravado comoInt640/1._trace,_trace_*,_search_credits, tokens, status,_error_details) e os tokens das linhas novas na retomada.main, 20 dos testes deste branch falham.ruff,ty,vultureedeptrypassam.Os testes de inteiro com nulo e de
Datepartem do trabalho de mayuriphad no #215.Closes #195