[PITCH] reportwiz: gerador de relatórios baseados em gráficos e tabelas / Python

Buenas piazada.

No meu trabalho eu tenho uma necessidade de produzir relatórios que contenham basicamente gráficos e tabelas de dados. Atualmente eu faço alguns no Excel, outros no Jupyter Notebook. Acontece que em vários relatórios, eu uso os mesmos gráficos/tabelas que eu tenho em outros relatórios. Então eu estou pensando em desenvolver um sistema com Python que busca os dados num banco de dados (que eu já tenho) ou em outras fontes (tenho bastante coisa no Excel), prepara esses dados em pandas dataframe, cria gráficos com o matplotlib e gera os relatórios necessários (em html que posso facilmente converter para pdf se quiser) a partir de templates jinja. Eis um rascunho da ideia. Sugestões são bastante bem vindas.

# reportwiz

O **reportwiz** gera relatórios em html compostos prioritariamente de gráficos e tabelas de dados.

A organização é a seguinte:

- `reportwiz.provider`: provedor dos dados. O produto é um *pandas dataframe*:
  - `reportwiz.provider.postgresql`: provedor de dados do *postgresql*.
- `reportwiz.table`: recebe os dados de `reportwiz.provider` e salva um *pandas dataframe* com os dados que serão exibidos em tabelas.
- `reportwiz.plot`: recebe os dados de `reportwiz.provider` e cria gráficos com *matplotlib*.
- `reportwiz.report`: usa as tabelas de `reportwiz.table` e os gráficos de `reportwiz.plot` e gera um relatório usando templates *jinja*.

`reportwiz.table` é composta por classes abstratas que, na implementação devem ser estendidas para criara classes concretas,
uma para cada tabela desejada.

`reportwiz.plot` é composta por classes abstratas que devem ser implementadas em classes concretas, uma para cada gráfico desejado.

`reportwiz.provider` são classes abstratas que devem ser implementadas em classes concretas, uma para cada conjunto de dados a ser
utilizado. Um mesmo *provider* pode ser utilizado para vários *plots* e *tables*, mesmo que alguns campos do *provider* não 
sejam utilizados para determinado *plot* ou *table*.

Cada *report* deve ser gerado por uma classe concreta que estende uma classe abstrata de `reportwiz.report`.

A criação de relatórios deve ser feito em um pacote apartado que utiliza `reportwiz` como caixa de ferramentas.

`reportwiz.plot` tem classes para vários tipos de gráficos com opções pré-definidas. Isso quer dizer que em nome da facilidade 
e padronização, abre-se mão, em primeiro momento, da flexibilidade. Entretanto, talvez seja possível expor o objeto do *matplotlib*
possibilitando uma personalização pela classe concreta.

```python

class AreaChart(ABC):
  def __init__(self, ...):
    ...
  def expose_obj(self) -> matplotlib.pyplot:
    return self.plt

Muito interessante o teu projeto, fiz algo mais ou menos parecido há tempos atrás usando VBA. Fui acrescentando novas análises que eu escolhia dependendo da aplicação. Em certo momento eu gerava muitos gráficos crashados, então criei um formulário que me permitia escolher quais gráficos gerar. Próximo passo era trazer isso pro python com uma interface web, como um gerador de relatórios mesmo.

Uma coisa legal que implementei foi uma análise da consistência dos dados, como nulls e outliers. Raras vezes tinham problemas, mas quando tinham isso ajudava.