transparencia-mg / dpckan

MIT License
5 stars 4 forks source link

Carga de data packages no Datastore com tipos corretos especificados no table schema #41

Open fjuniorr opened 3 years ago

fjuniorr commented 3 years ago

O diagrama abaixo representa am alto nível o relacionamento entre os seguinte componentes

20210706T164224

O datapusher é atualmente a conexão entre os nossos dados entre o FileStore a o DataStore e

automatically downloads any tabular data files like CSV or Excel from a CKAN site's resources when they are added to the CKAN site, parses them to pull out the actual data, then uses the DataStore API to push the data into the CKAN site's DataStore.

No entanto, o processo de inferência realizado nas colunas dos arquivos não consegue reconhecer os tipos e formatos que podem ser descritos via table schema.

Um exemplo é uma variável fieldNumeric descrita como

{
"name": "fieldNumeric",
"type": "number",
"format": "default",
"groupChar": ".",
"decimalChar": ",",
"missingValues": ["NA"]
}

que possui um csv correspondente

number
6.696.973,31
-7.904.077
NA
897
87,87

Essa coluna seria interpretada pelo datapusher como um campo texto, o que estaria incorreto.

Além do reconhecimento do tipo e formatono nível de metadado, também é necessário a conversão dos dados em si para um tipo que seja aceito pela PostgreSQL (ie. PostgreSQL não vai aceitar o valor NA em uma coluna numeric, e, portanto, o mesmo precisa ser convertido).

Enquanto não conseguirmos conceber e implementar uma solução definitiva para esse problema vamos utilizar o artifício de carregar todas as colunas no DataStore como texto (parcialmente implementado no commit https://github.com/dados-mg/dpckan/pull/40/commits/146e9258afd27f6981c5bfc4942684588e1ec192).

Já esbarramos nesse problema antes nos issues https://github.com/dados-mg/issues/issues/18 e https://github.com/dados-mg/issues/issues/30, mas sem a clareza conceitual de como seguir.

[^1]: A inferência é atualmente feita pelo pacote messytables que foi descontinuado em favor do tabulator-py que por sua vez foi descontinuado em favor do frictionless-py

Links

Alguns links de referência relevantes para o futuro

Andrelamor commented 3 years ago

o pacote pandas do python também não interpreta um campo descrito como numérico, tanto para arquivo do PdA, quanto para o arquivo hospedado no git:

image

ao contrário do que aponta o esquema das colunas numéricas desse arquivo:

    {
      "name": "REPASSE_PREVISTO",
      "type": "number",
      "format": "default",
      "title": "Repasse Previsto",
      "description": "Valor total de recursos previstos para a execução da parceria, por ano.",
      "groupChar": ".",
      "decimalChar": ","
    },
    {
      "name": "REPASSE_ATUALIZADO",
      "type": "number",
      "format": "default",
      "title": "Repasse Atualizado",
      "description": "Valor total de recursos efetivamente disponibilizados para a execução da parceria",
      "groupChar": ".",
      "decimalChar": ","
    },

entretanto, quando se usa . como decimalChar, como exemplificado em alteração do mesmo arquivo acima, a interpretação do tipo da variável ocorre corretamente: image

fjuniorr commented 3 years ago

@Andrelamor se você ler diretamente o csv usando o pandas ele não "sabe" dos metadados que existem no datapackage.json. O processo pra ele fazer isso de forma adequada é tipo isso

from frictionless import Package
dp = Package('https://raw.githubusercontent.com/dados-mg/termos-parceria-contratos-gestao/master/datapackage.json')
resource = dp.get_resource('repasses')
df = resource.to_pandas()
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 181 entries, 0 to 180
Data columns (total 5 columns):
 #   Column              Non-Null Count  Dtype  
---  ------              --------------  -----  
 0   ID_INSTRUMENTO      181 non-null    object 
 1   ANO                 181 non-null    int64  
 2   REPASSE_PREVISTO    181 non-null    float64
 3   REPASSE_ATUALIZADO  181 non-null    float64
 4   OBSERVACOES         0 non-null      object 
Andrelamor commented 3 years ago

@fjuniorr então teremos de considerar ofertar esse 'combo' frictionless+pandas para a comunidade em geral, para minimizar o custo de transformação da notação dos números

gabrielbdornas commented 2 years ago

Lembrar de ler este comentário sobre o assunto em questão.