Repository navigation
Conversation
… gravados Texto vazio: o CSV e o XLSX gravam "" e None na mesma célula vazia. Na retomada pelo checkpoint, cuja assinatura garante o mesmo modelo, a célula vazia de linha processada num campo que só aceita texto, não admite None, não tem None por padrão e sai no model_dump volta "", salvo quando a condição do campo é falsa na linha. O checkpoint carregado à mão e o campo que admite None ficam como estavam. XLSX: o texto que começa com "=" é gravado como texto, e não como fórmula, que o pandas relia vazia. O engine fica fixo no openpyxl, que o checkpoint .xlsx já exige. Coleções: is_complex_type reconhece Sequence, AbstractSet, Mapping e as mutáveis, set, frozenset e as subclasses de dict e tuple, como TypedDict e NamedTuple. Esses campos entram nas estruturas do checkpoint, gravadas em JSON, e a retomada os devolve ao tipo do campo. O conjunto vai ao JSON em ordem fixa, também dentro de dict e de modelo aninhado. Literal com None: accepts_only_text ignora o None dos argumentos, e o "NA" de Literal["NA", "deferido", None] é relido como texto. Aviso do reprocessamento interrompido: diz que repetir a chamada com reprocess_columns refaz todas as linhas, inclusive as já reprocessadas.
…e e coleções O guia de desempenho e a referência da API, nas duas árvores, descrevem os campos de estrutura que o checkpoint grava em JSON, o texto vazio que a retomada pelo checkpoint devolve ao campo de texto que não admite None, o texto que começa com "=" no XLSX e o custo de repetir o reprocessamento interrompido.
…ir a lista A enumeração entre parênteses copiava o conteúdo da constante definida logo acima.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problema
Em quatro casos, a retomada pelo checkpoint recusava uma linha já paga ou devolvia um valor diferente do que tinha sido gravado. No caso da issue, um campo
obs: strrespondido""numa execução com checkpoint CSV interrompida pela cota faz a segunda chamada levantarValueError: O DataFrame contém linhas processadas incompatíveis com o modelo atual: campos incompatíveis ['obs']. Inclua-os em reprocess_columns=['obs'], e seguir a sugestão reprocessaria a coluna inteira.Na
mainde agora (b48bd03), depois do #246, do #248 e do #251, os quatro itens ainda reproduzem. A mesma medição mostrou dois casos da mesma classe que a issue não lista:Mapping[str, int]é recusado como oTypedDict, e no parquet oSequence[str]também é recusado, enquantoset[str]eTypedDictvoltam como array do numpy e como dict com2024.0no lugar de2024.O que muda
Texto vazio no CSV e no XLSX. Os dois formatos gravam
""eNonena mesma célula vazia, e o leitor do pandas devolve as duas ausentes. Na retomada pelocheckpoint_path, a assinatura garante que o checkpoint foi gravado com o mesmo modelo, e nele um campo que só aceita texto, não admiteNone, não temNonepor padrão e sai nomodel_dumpsó ficaNonequando a condição dele é falsa. Para esses campos, a validação da linha processada passa a ler a célula vazia como"", salvo quando a condição do campo é falsa na linha, caso em que ela continuaNone. Ostrobrigatório e ostr = "padrão"respondidos""voltam"", em vez de serem acusados (o primeiro) ou trocados pelo default (o segundo).A correção não segue a forma literal da proposta, que relê com
keep_default_na=Falsedentro doread_df. Feito ali, o""apareceria também na linha com erro e na linha pendente, que guardamNone, e no campo condicional pulado, que a validação aceitaria como""válido. Oread_dfpúblico não sabe qual é a coluna de status nem avalia condições. A restauração ficou na validação da retomada, que conhece as duas coisas, e oread_dfcontinua devolvendo ausente a célula vazia.Fórmula no XLSX. O openpyxl toma por fórmula todo texto que começa com
=, e o pandas relê vazia a fórmula que nunca foi calculada. O checkpoint.xlsxpassa a ser gravado pelo openpyxl, que ele já exige, e toda célula marcada como fórmula volta a ser texto, em qualquer coluna.Coleções.
is_complex_typereconhece as origens abstratasSequence,AbstractSeteMappinge as versões mutáveis, e as classessetefrozenset, além das subclasses delist,tuple,dicteBaseModel, o que incluiTypedDicteNamedTuple. A busca pelas abstratas é por identidade, porquestrebytestambém sãoSequencepara ocollections.abc. Esses campos entram nas estruturas do checkpoint, gravadas em JSON, e a retomada os devolve ao tipo declarado. O conjunto vai ao JSON em ordem fixa, a do texto JSON de cada item, também dentro de dict e de modelo aninhado: a ordem em que um set de textos é percorrido muda de um processo para outro, e a lista relida só diz o mesmo que o conjunto validado quando os dois saem na mesma ordem.LiteralcomNone.accepts_only_textignora oNoneentre os argumentos doLiteral, e o"NA"deLiteral["NA", "deferido", None]é relido como texto, como já acontecia comOptional[Literal["NA", "deferido"]].Reprocessamento interrompido. Só o aviso muda. Ele diz que repetir a chamada com
reprocess_columnsrefaz todas as linhas, inclusive as já reprocessadas, que é o que acontece: numa execução de 4 linhas interrompida depois de 2, a repetição faz as 4 chamadas.Itens da issue
strobrigatórioNoneNone, porque o arquivo não distingue""deNone; o parquet guarda a diferença. A documentação diz isso=no XLSXSequence[str],set[str],AbstractSeteTypedDictLiteralque incluiNoneDecisões
read_dfe passado como entrada continua acusando o""do campo obrigatório, como o testetest_texto_obrigatorio_vazio_em_csv_continua_acusadojá fixava. Sem a assinatura, com outro modelo a célula vazia pode ser oNonede um campo que o admitia.Mapping,MutableMapping,MutableSequence,MutableSeteNamedTupleentram junto, porque o defeito é o mesmo e omodel_dumpos devolve como lista, conjunto, dict ou tupla. Odequefica de fora: omodel_dumpo devolve comodeque, que a gravação não serializa.exclude=Truefica de fora da restauração do texto vazio, porque omodel_dumpnão o traz e a célula dele guarda oNoneque a execução pôs ao criar a coluna."{'a'}") continua sem ser lido como conjunto. Aceitá-lo emnormalize_valuemudaria também oread_dfsem modelo, que normaliza toda coluna com cara de JSON.Closes #196