Coder Social home page Coder Social logo

Comments (64)

xmnlab avatar xmnlab commented on July 24, 2024 1

Você deve querem dizer menos de 1 segundo, né?

Desculpe a confusão, isso, menos de 1 segundo.

Puxei aqui a última versão do develop, e está muito mais rápido. Diria que
está muito bom, especialmente se considerarmos que está rodando sob o
servidor de desenvolvimento.

Ótimo.

Alguma observações:

  • Bug: quando de-seleciono todos ainda aparecem 88075 casos
    selecionados. Deveria ser 0

Estava com um bug com a categoria 60+ anos ... ele estava chegando como 60 anos ... mas isso já arrumei. Em relação a comportamento, eu tentei seguir a ideia do episat: quando é de-selecionado todas categorias, ele ativa todas novamente. Estou revisando mais uma vez, pois me parece que ainda tem alguma falha.

  • é preciso aumentar a transparência dos municípios não selecionados,
    pois não dá para perceber a diferença entre os selecionados e os não
    selecionados.

Ok, está feito aqui no meu ambiente local.

  • é preciso desabilitar os popups no mapa.

Ok, está feito aqui no meu ambiente local.

Hoje até o fim do dia eu mando um PR.

Acho que já podemos nos encaminhar para uma versão beta do site 2.0 assim
que este últimos issues estiverem resolvidos.

OK!

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024 1

from alertadengue.

flavioamieiro avatar flavioamieiro commented on July 24, 2024 1

Então, nós não temos um lugar em que as mudanças no banco estão documentadas. Isso é um problema sério. Seria bom fazermos (provavelmente eu, mas eu realmente estou precisando fazer outras tarefas além do AlertaDengue) um script de criação do banco a partir do que temos em produção hoje e depois criarmos para cada mudança um arquivo .sql novo com as migrações.

Enquanto não temos isso, acho que seria uma boa a criação dessa view entrar em algum arquivo nesse branch (algo como create_uf_total_chik_view.sql). Assim pelo menos a criação dessa view já fica documentada e eu posso usar esse arquivo pra rodar em produção quando for o momento.

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024 1

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho, no começo vc começa falando de 3 colunas, porém em seguida comenta sobre linhas. Poderias detalhar um pouco mais?

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho ... acho que entendi. vou começar a desenhar o layout!

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho será exibido as informações para todos os estados de uma só vez, ou haverá um seletor de estados?

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho, dos itens que vc mencionou acima (nos cards), o que será apresentado em cada um? apenas números? algum vai apresentará gráficos?

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho fiz uma primeira versão do layout da primeira página .. não alterei nada da identidade visual .. apenas coloquei a ideia dos cards. to pensando em usar os mesmos painéis que foram usados no fludashboard (http://keen.github.io/dashboards/)

incio

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho, segue segundo rascunho:

incio

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

é isso aí!

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho acho que seria legal usar um branch para trabalhar com o redesenho da página.

vi que tem um branch chamado new_design ... não sei se foi feito pra isso .. mas talvez seria legal ter um branch para desenvolvimento. Assim colocamos no master só a versão que for pra produção.

o que vc acha?

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

Atualmente, a página principal do site desenha os polígonos de todos os municípios participantes do projeto. Com o número de municípios se aproximando de 1000, o tempo de carregamento da página torna-se muito grande.

@fccoelho quanto a tempo de carregamento .. isso também é por outros fatores.

Deixei só o código para montar o gráfico de serie temporal .. e estava levando 57 s no meu ambiente .. refatorei ele e caiu para 3.6 s

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

O que leva mais tempo é sem dúvida, a construção do mapa, que é uma combinação do tempo de download do geoJSON, com o desenho dos municípios.

Acho estranho o gráfico da série levar 57s. você pode me mandar um link para o commit com a sua refatoração?

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

Encontrei este commit, mas não identifiquei qual das modificações pode ter sido a responsável pela redução deste tempo.

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

from alertadengue.

flavioamieiro avatar flavioamieiro commented on July 24, 2024

@xmnlab vou entrar aqui rapidinho na discussão, mais pra acompanhar ela mesmo. O @fccoelho com certeza conhece o código melhor que eu.

  • A ideia é sempre criar um branch novo mesmo, a gente só faz o merge no master na hora de colocar em produção. Normalmente é só do master que eu faço deploy. Isso mudou um pouco agora por que a gente tá com uma funcionalidade que está em fase de testes com os usuários e eu não terminei ela de fato, então estou (temporariamente, mesmo) fazendo deploy do branch dbf_upload. Nesse branch eu tô tomando o cuidado de só mexer em código que não afeta em nada a funcionalidade atual (o código em que estou mexendo é numa app do django diferente).
    Quando eu fizer o merge desse branch com o master, a estrutura do banco de dados da app django vai ter melhorado também, mas talvez introduza 'breaking changes'. Eu quero remover o postgis como dependência totalmente, pra isso talvez eu faça um 'squash' das migrações, por que do jeito que tá hoje, as migrações dependem do postgis pra poderem ser compatíveis com versões anteriores do banco. De qualquer jeito, fique tranquilo que eu vou documentar o processo pra deixar o banco do jeito que precisa estar, e também te aviso. De qualquer jeito, o banco com os dados propriamente ditos (que não é gerenciado pelo django) continua do jeito que está, sem mudanças. Não precisa se preocupar muito com isso.

  • muito obrigado por ter feito essa mudança na query. Pelo que me lembro, enquanto a gente usava os dados pra montar o mapa a gente precisava das cidades individualmente, por isso precisávamos fazer as queries individualmente. Era isso @fccoelho ? Lembro de termos discutido isso aquele dia que sentamos para otimizar as queries (quando criamos a materialized view), e acho que essa era a conclusão em que chegamos, mas agora tô na dúvida. De qualquer jeito, que bom que você resolveu esse problema!

  • Acho que é tranquilo manter a conexão com o banco. Uma desvantagem de não estarmos usando o django pra gerenciar a conexão com o banco é que a gente não tá usando o conection pool do postgres. Talvez seja interessante começar a usar, mas não sei se vale a pena o esforço. Podemos avaliar isso.

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@flavioamieiro !!

  • Bacana!! a documentação certeza vai ajudar hehe ainda to aprendendo como está a estrutura do projeto 👍
  • eu não alterei a função anterior, para não acabar gerando erros de compatibilidade, apenas fiz um "fork" da função .. como ainda não conheço bem a estrutura do projeto to cauteloso rs
  • talvez iria ser bacana ter uma pool connection, mas uma forma, se necessário, de fazer isso de forma mais pontual é permitir que a função possa receber a conexão já (opcional, podendo ser criada se a conexão for None), assim a conexão poderia ser criada na view e ser compartilhada pelas funções. Mas pode ser que eu tenha já começado num caso muito específico onde a função era chamada mais de 500 vezes e sempre abria uma conexão nova.

@flavioamieiro muito obrigado pela atenção e explicações, pouco a pouco vou entendendo a estrutura do projeto 👍

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

@xmnlab e @flavioamieiro ,

Esta coisa de passar a conexão de chamada em chamada, é uma solução, mas pode gerar um timeout da conexão que a verificação if conexao is None não vai pegar. (eu acho)

Tínhamos tentado mitigar o problema das conexões através de cache, mas esta solução só economizava tempo ao se carregar novamente uma cidade já carregada. Acho que a solução de pooling sugerida pelo @flavioamieiro mais robusta e elegante. Além disso não é nada complicada de criar. Poderiamos ter um pool global a nível do módulo que seria reutilizado por todas as funções que precisam se comunicar com o Banco.

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho vai haver mudança na identidade visual também?

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

OK!

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

Vou procurar não mexer (muito) então no layout principal. Alterei só um pouco o rodapé (parceiros), colocando dentro de um painel. No meu branch eu tirei a caixa de texto do menu, mas no próximo commit eu volto ele.

Segue a primeira versão da página.

dengue-main-v1

Os cards ainda estão com dados fixos. Próximo passo será pegar os dados da base.

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho o que sería "Previsão de casos para as próximas semanas"?

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho , desculpa a pergunta newbie, mas como tratar a "Variação em relação à semana anterior" quando o valor da semana anterior for = 0? retorno infinito?

**a equação que estou usando é ((v2-v1)/v1)*100

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

flavioamieiro avatar flavioamieiro commented on July 24, 2024

@xmnlab eu tive que aplicar a mudança no jeito que a gente usa no master pra tentar estabilizar um pouco o site do jeito que ele está. Dei uma olhada na documentação sobre conexões do sqlalchemy e vi que a função create_engine que já usávamos retorna um objeto Engine que já funciona como uma Pool. Esse objeto é feito para ter uma vida longa, basicamente só ser criado uma vez por processo (pra cada banco, claro).

Eu fiz essas modificações no commit 1fe269b e já coloquei no ar. Se quiser, dá uma olhada lá, acho que rola de fazer um cherry-pick desse commit pro teu branch (ou, como teu branch de desenvolvimento já existe há um bom tempo, talvez valha a pena fazer um merge do master nele pra trazer todas as mudanças, você que sabe o que é melhor).

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024
  1. Acho que devíamos desativar os popups no mapa (nesta view apenas),

Ok!

  1. Seria interessante explicar um pouco melhor a seleção (no texto acima da série temporal)

Poderias dar um exemplo?

  1. ainda está bastante lento no servidor de desenvolvimento, não sei se é o caso de carregar em background o máximo de dados possíveis para o dashboard do estado de maneira a agilizar a interface.

Fora os shapefiles todos os dados sao armazenados de uma soh vez numa variável js.

O carregamento inicial demora mais, pq carrega os shapefilea, o csv e monta os gráficos. Mas depois aqui cada alteração de filtro leva em torno de 7 segundos. Quanto tempo leva ai?

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@flavioamieiro muito obrigado! Vou fazer os testes!

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

flavioamieiro avatar flavioamieiro commented on July 24, 2024

@xmnlab Fiz um merge de teste do master no seu branch, só pra ver se ia tudo rolar bem, e parece ok. Teve poucos conflitos, a maioria no dbdata.py por causa do que eu comentei aí em cima.

Só como referência, a solução dos conflitos de merge foi essa aqui embaixo.

Rodei o servidor pra ver como tudo ficou e tô gostando muito do resultado.

Sobre a demora, é o javascript processando os filtros que tá fazendo demorar esse tempo todo (7 a 10 segundos, pelo que vocês falaram)?

diff --cc .gitignore
index 4550a70,c0f8476..3627a80
--- a/.gitignore
+++ b/.gitignore
@@@ -4,6 -4,17 +4,19 @@@
  local_settings.py
  .idea/*
  settings.ini
 +.env
  *.sw[po]
 +docker_shared_files
+ /bin
+ /include
+ /lib
+ /AlertaDengue/geodjango.db
+ /AlertaDengue/static_files/*
+ /AlertaDengue/static/geojson/*.json
+ pip-selfcheck.json
+ /shapely
+ /share
+ .ipynb_checkpoints
+ geodjango.db
+ *.dbf
+ chunked_uploads
diff --cc AlertaDengue/dados/dbdata.py
index 95fdf3d,b1b931b..206a5a6
--- a/AlertaDengue/dados/dbdata.py
+++ b/AlertaDengue/dados/dbdata.py
@@@ -6,25 -6,18 +6,25 @@@ Este módulo contem funções para inte
  from sqlalchemy import create_engine
  from django.conf import settings
  from django.core.cache import cache
+ from collections import defaultdict
+ 
  import pandas as pd
  import numpy as np
- from collections import defaultdict
- import datetime
- from time import mktime
- from functools import lru_cache
  
- CID10 = {'dengue': 'A90',
-          'zika': 'U06',
-          'chikungunya': 'A92'
-          }
+ CID10 = {
+     'dengue': 'A90',
+     'zika': 'U06',
+     'chikungunya': 'A92'
+ }
+ 
  
 +db_engine = create_engine("postgresql://{}:{}@{}/{}".format(
 +    settings.PSQL_USER,
 +    settings.PSQL_PASSWORD,
 +    settings.PSQL_HOST,
 +    settings.PSQL_DB
 +))
 +
  def get_all_active_cities():
      """
      Fetch from the database a list on names of active cities
@@@ -46,22 -46,38 +47,28 @@@ def get_alerta_mrj()
      Fetch the alert table for the city of Rio de janeiro
      :return: pandas dataframe
      """
 -    conexao = create_engine(
 -        "postgresql://{}:{}@{}/{}".format(
 -            settings.PSQL_USER,
 -            settings.PSQL_PASSWORD,
 -            settings.PSQL_HOST, settings.PSQL_DB))
 -    dados_alerta = pd.read_sql_query(
 -        'select * from "Municipio".alerta_mrj;', conexao, index_col='id'
 -    )
 +    with db_engine.connect() as conexao:
 +        dados_alerta = pd.read_sql_query('select * from "Municipio".alerta_mrj;', conexao, index_col='id')
      return dados_alerta
  
+ 
  def get_city(query):
      """
-     Fetch city geocode, name and state from the database, matching the substring query
+     Fetch city geocode, name and state from the database,
+     matching the substring query
      :param query: substring of the city
      :return: list of dictionaries
      """
 -    conexao = create_engine(
 -        "postgresql://{}:{}@{}/{}".format(
 -            settings.PSQL_USER,
 -            settings.PSQL_PASSWORD,
 -            settings.PSQL_HOST, settings.PSQL_DB))
 -    sql = (
 -        'SELECT distinct municipio_geocodigo, nome, uf ' +
 -        'from "Municipio"."Historico_alerta" inner JOIN' +
 -        ' "Dengue_global"."Municipio" on ' +
 -        '"Historico_alerta".municipio_geocodigo="Municipio".geocodigo ' +
 -        'WHERE nome ilike(%s);'
 -    )
 -
 -    result = conexao.execute(sql, ('%' + query + '%',))
 +    with db_engine.connect() as conexao:
-         sql = 'SELECT distinct municipio_geocodigo, nome, uf from "Municipio"."Historico_alerta" inner JOIN' \
-               ' "Dengue_global"."Municipio" on "Historico_alerta".municipio_geocodigo="Municipio".geocodigo ' \
-               'WHERE nome ilike(%s);'
++        sql = (
++            'SELECT distinct municipio_geocodigo, nome, uf ' +
++            'from "Municipio"."Historico_alerta" inner JOIN' +
++            ' "Dengue_global"."Municipio" on ' +
++            '"Historico_alerta".municipio_geocodigo="Municipio".geocodigo ' +
++            'WHERE nome ilike(%s);'
++        )
 +
-         result = conexao.execute(sql, ('%'+query+'%',))
++        result = conexao.execute(sql, ('%' + query + '%',))
  
      return result.fetchall()
  
@@@ -74,14 -91,20 +82,15 @@@ def get_series_by_UF(doenca='dengue')
      """
      series = cache.get('get_series_by_UF')
      if series is None:
 -        conexao = create_engine(
 -            "postgresql://{}:{}@{}/{}".format(
 -                settings.PSQL_USER,
 -                settings.PSQL_PASSWORD,
 -                settings.PSQL_HOST,
 -                settings.PSQL_DB))
 -        series = pd.read_sql(
 -            'select * from uf_total_view;', conexao, parse_dates=True)
 -        cache.set('get_series_by_UF', series, settings.QUERY_CACHE_TIMEOUT)
 +        with db_engine.connect() as conexao:
-             series = pd.read_sql('select * from uf_total_view;', conexao, parse_dates=True)
++            series = pd.read_sql(
++                'select * from uf_total_view;', conexao, parse_dates=True)
 +            cache.set('get_series_by_UF', series, settings.QUERY_CACHE_TIMEOUT)
  
- 
      return series
  
- def load_series(cidade, doenca='dengue'):
+ 
+ def load_series(cidade, doenca='dengue', conn=None):
      """
      Monta as séries do alerta para visualização no site
      :param cidade: geocodigo da cidade desejada
@@@ -91,30 -114,48 +100,41 @@@
      cache_key = 'load_series-{}-{}'.format(cidade, doenca)
      result = cache.get(cache_key)
      if result is None:
 -        if conn is None:
 -            conn = create_engine(
 -                "postgresql://{}:{}@{}/{}".format(
 -                    settings.PSQL_USER,
 -                    settings.PSQL_PASSWORD,
 -                    settings.PSQL_HOST,
 -                    settings.PSQL_DB))
 -
 -        ap = str(cidade)
 -        cidade = add_dv(int(str(cidade)[:-1]))
 -
 -        dados_alerta = pd.read_sql_query((
 -            'select * from "Municipio"."Historico_alerta" ' +
 -            'where municipio_geocodigo={} ORDER BY "data_iniSE" ASC'
 -        ).format(cidade), conn, 'id', parse_dates=True)
 -
 -        if len(dados_alerta) == 0:
 -            raise NameError((
 -                "Não foi possível obter os dados " +
 -                "do Banco para cidade {}"
 -            ).format(cidade))
 -
 -        series = defaultdict(lambda: defaultdict(lambda: []))
 -        series[ap]['dia'] = dados_alerta.data_iniSE.tolist()
 -        series[ap]['casos_est_min'] = np.nan_to_num(
 -            dados_alerta.casos_est_min).astype(int).tolist()
 -        series[ap]['casos_est'] = np.nan_to_num(dados_alerta.casos_est).astype(
 -            int).tolist()
 -        series[ap]['casos_est_max'] = np.nan_to_num(
 -            dados_alerta.casos_est_max).astype(int).tolist()
 -        series[ap]['casos'] = np.nan_to_num(dados_alerta.casos).astype(
 -            int).tolist()
 -        series[ap]['alerta'] = (
 -            dados_alerta.nivel.astype(int) - 1
 -        ).tolist()  # (1,4)->(0,3)
 -        series[ap]['SE'] = (dados_alerta.SE.astype(int)).tolist()
 -        series[ap]['prt1'] = dados_alerta.p_rt1.astype(float).tolist()
 -        series[ap] = dict(series[ap])
 -        # conexao.close()
 -        result = dict(series)
 -
 -        cache.set(cache_key, result, settings.QUERY_CACHE_TIMEOUT)
 +        with db_engine.connect() as conexao:
 +            ap = str(cidade)
 +            cidade = add_dv(int(str(cidade)[:-1]))
-             dados_alerta = pd.read_sql_query('select * from "Municipio"."Historico_alerta" where municipio_geocodigo={} ORDER BY "data_iniSE" ASC'.format(cidade), conexao, 'id', parse_dates=True)
++
++            dados_alerta = pd.read_sql_query((
++                'select * from "Municipio"."Historico_alerta" ' +
++                'where municipio_geocodigo={} ORDER BY "data_iniSE" ASC'
++            ).format(cidade), conn, 'id', parse_dates=True)
++
 +            if len(dados_alerta) == 0:
-                 raise NameError("Não foi possível obter os dados do Banco para cidade {}".format(cidade))
++                raise NameError((
++                    "Não foi possível obter os dados " +
++                    "do Banco para cidade {}"
++                ).format(cidade))
 +
-             # tweets = pd.read_sql_query('select * from "Municipio"."Tweet" where "Municipio_geocodigo"={}'.format(cidade), parse_dates=True)
 +            series = defaultdict(lambda: defaultdict(lambda: []))
 +            series[ap]['dia'] = dados_alerta.data_iniSE.tolist()
-             # series[ap]['tweets'] = [float(i) if not np.isnan(i) else None for i in tweets.numero]
-             # series[ap]['tmin'] = [float(i) if not np.isnan(i) else None for i in G.get_group(ap).tmin]
-             series[ap]['casos_est_min'] = np.nan_to_num(dados_alerta.casos_est_min).astype(int).tolist()
-             series[ap]['casos_est'] = np.nan_to_num(dados_alerta.casos_est).astype(int).tolist()
-             series[ap]['casos_est_max'] = np.nan_to_num(dados_alerta.casos_est_max).astype(int).tolist()
-             series[ap]['casos'] = np.nan_to_num(dados_alerta.casos).astype(int).tolist()
-             series[ap]['alerta'] = (dados_alerta.nivel.astype(int)-1).tolist()  # (1,4)->(0,3)
++            series[ap]['casos_est_min'] = np.nan_to_num(
++                dados_alerta.casos_est_min).astype(int).tolist()
++            series[ap]['casos_est'] = np.nan_to_num(dados_alerta.casos_est).astype(
++                int).tolist()
++            series[ap]['casos_est_max'] = np.nan_to_num(
++                dados_alerta.casos_est_max).astype(int).tolist()
++            series[ap]['casos'] = np.nan_to_num(dados_alerta.casos).astype(
++                int).tolist()
++            series[ap]['alerta'] = (
++                dados_alerta.nivel.astype(int) - 1
++            ).tolist()  # (1,4)->(0,3)
 +            series[ap]['SE'] = (dados_alerta.SE.astype(int)).tolist()
 +            series[ap]['prt1'] = dados_alerta.p_rt1.astype(float).tolist()
-             # print(series['dia'])
 +            series[ap] = dict(series[ap])
 +            # conexao.close()
 +            result = dict(series)
++
 +            cache.set(cache_key, result, settings.QUERY_CACHE_TIMEOUT)
  
      return result
  
diff --cc Dockerfile
index 5d2fd4f,fe14f52..9ed7d58
--- a/Dockerfile
+++ b/Dockerfile
@@@ -9,25 -14,63 +9,27 @@@ RUN locale-gen pt_BR.UTF-
  RUN update-locale pt_BR.UTF-8
  ENV LC_ALL pt_BR.UTF-8
  
 -# Configure SSHd
 -#TODO: Add config file with sane configs (only publickey auth, etc) and keys
 -RUN mkdir -p /var/run/sshd
 -# https://stackoverflow.com/questions/18173889/cannot-access-centos-sshd-on-docker/18374381#18374381
 -RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
 -ADD config/sshd.conf /etc/supervisor/conf.d/sshd.conf
 -
 -# Configure nginx
 -ADD config/nginx.conf /etc/supervisor/conf.d/nginx.conf
 -RUN rm /etc/nginx/sites-enabled/default
 -RUN echo "daemon off;" >> /etc/nginx/nginx.conf
 -
 -# Configure Memcached
 -ADD config/memcached.conf /etc/supervisor/conf.d/memcached.conf
 -
  # Create deploy user
  RUN useradd --shell=/bin/bash --home=/srv/deploy/ --create-home deploy
 -RUN mkdir -p /srv/deploy/logs/
  
 -# Configure virtualenv
 -RUN pyvenv --clear --system-site-packages /srv/deploy/project/
 -ADD exec_in_virtualenv.sh /srv/deploy/exec_in_virtualenv.sh
 +# Add and install requirements.txt before we send the code so we don't have to
 +# install everything again whenever any file in this directory changes (this
 +# helps build the container a *lot* faster by using the cache.
 +ADD requirements.txt /tmp/requirements.txt
  
 -# Clone code
 -RUN git clone https://github.com/AlertaDengue/AlertaDengue.git /srv/deploy/project/AlertaDengue
 +RUN pip3 install -r /tmp/requirements.txt
  
 -# Add our local settings. This file is not versioned because it contains
 -# sensitive data (such as the SECRET_KEY).
 -ADD AlertaDengue/AlertaDengue/settings.ini /srv/deploy/project/AlertaDengue/AlertaDengue/AlertaDengue/settings.ini
 +# Send code to the container
 +ADD . /srv/deploy/AlertaDengue
  
 -# Install python deps
 -# We need --no-clean because of the way Docker.io's filesystem works. When pip
 -# tries to remove the build directory, it raises an error, saying the file was
 -# not found. After the RUN command finishes (it was commited), removing the
 -# directory works fine.
 -RUN /srv/deploy/exec_in_virtualenv.sh pip3 install --no-clean -r /srv/deploy/project/AlertaDengue/requirements.txt
 -RUN rm -r /tmp/pip_build_root/
 +WORKDIR /srv/deploy/AlertaDengue/AlertaDengue
  
 -# Migrate
 -RUN /srv/deploy/exec_in_virtualenv.sh /srv/deploy/project/AlertaDengue/AlertaDengue/manage.py migrate --run-syncdb --noinput
 -RUN /srv/deploy/exec_in_virtualenv.sh /srv/deploy/project/AlertaDengue/AlertaDengue/manage.py sync_geojson
++RUN python3 manage.py sync_geojson
+ 
  # Collectstatic
 -RUN /srv/deploy/exec_in_virtualenv.sh /srv/deploy/project/AlertaDengue/AlertaDengue/manage.py collectstatic --noinput
 -
 -# Configure supervisor job
 -ADD config/alerta_dengue.conf /etc/supervisor/conf.d/alerta_dengue.conf
 -
 -# Configure nginx
 -ADD config/alerta_dengue_nginx.conf /etc/nginx/sites-enabled/alerta_dengue
 -
 -# Copy ssh keys
 -RUN mkdir /root/.ssh/
 -ADD authorized_keys /root/.ssh/authorized_keys
 +RUN python3 manage.py collectstatic --noinput
  
 -RUN mkdir /srv/deploy/.ssh/
 -ADD authorized_keys /srv/deploy/.ssh/authorized_keys
 +RUN python3 manage.py migrate --run-syncdb --noinput
  
  # Change the permissions for the user home directory
  RUN chown -R deploy:deploy /srv/deploy/

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@flavioamieiro

Fiz um merge de teste do master no seu branch, só pra ver se ia tudo rolar bem, e parece ok. Teve poucos conflitos, a maioria no dbdata.py por causa do que eu comentei aí em cima.

Só como referência, a solução dos conflitos de merge foi essa aqui embaixo.

Muito obrigado, vou dar uma olhada!

Rodei o servidor pra ver como tudo ficou e tô gostando muito do resultado.

Que bom :)

Sobre a demora, é o javascript processando os filtros que tá fazendo demorar esse tempo todo (7 a 10 segundos, pelo que vocês falaram)?

Exato! o maior problema é que é necessário aplicar os filtros para cada gráfico ... ou seja, é feito a filtro sobre os dados completos 4 vezes. Isso porque, cada gráfico não pode aplicar seu próprio filtro, ou seja, no gráfico de idade não é aplicado o filtro de idade, pois é necessário mostrar qual categoria de idade não está selecionada e quanto, do total, ela representa.

acabei de fazer um ajuste para não reprocessar o gráfico que fez a chamada, ou seja, se foi alterado o filtro de idade, ela não precisa ser atualizada, apenas desmarcar/marcar a categoria desejada. Isso reduziu algo próximo a 2 segundos.

vou fazer o teste agora para ver se melhora fazendo esse processamento direto na base de dados (se for feito isso também sobre o dataframe acho que também pode demorar).

Claro, se os testes forem feitos nos estados com menos dados, é retornado muitíssimo mais rápido.

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@flavioamieiro na verdade, era aplicado filtros nos dados 5 vezes .. 1 era com todos os filtros ... tirei isso .. e coloquei a contagem dentro da montagem de 2 gráficos .. agora aqui está em menos 5 segundos.

Indo por "Aplicar seleção" por cidades, leva em torno de 6 segundos, porque inclui a alteração da seleção das cidades no mapa.

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

Talvez dê pra fazer algo assíncrono ... e fazer algum gatilho para quando todas os gráficos estiverem OK ocultar o modal de "Aguarde".

Parece uma boa. Obrigado! Vou trabalhar nisso!

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

vou pesquisar também formas de programação paralela em js também :)

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho @flavioamieiro

parece que vale mais a pena fazer via requisições assíncronas para cada chart e processar os dados direto na base de dados.

Se quiserem testar já subi no repositório.

Em seguida, já vou começar a refatoração.

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho @flavioamieiro

Nos meus testes locais, a atualização do filtro (fora quando é alterado a seleção de municipios) é executada em menos de um minuto.

Os agrupamentos estão sendo feitos todos no banco de dados.

Estou trabalhando na refatoração e documentação dos códigos.

Ainda falta também fazer algo, para caso for alterado as cidades ou o período dos gráficos, ser obrigatório ou confirmar ou cancelar.

Se puderem dar feedback da página inicial e da página de estados, já vou trabalhando sobre esses feedback.

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

@xmnlab , vou colocar aqui mesmo as coisas:

  • Remover o logo do 1746 do rodapé dos estados e municípios, pois é específico da cidade do rio de Janeiro.
  • Nas caixas dos estados (1ª página), adicionar a variação da quadrissemana atual em relação à quadrissemana do último ano.
  • Mudar o gráfico por faixa etária para "stacked bars", mostrando a proporção de Homens e mulheres em cada faixa etária.

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho

Remover o logo do 1746 do rodapé dos estados e municípios, pois é específico da cidade do rio de Janeiro.

vai ficar uma caixa só pra 2 logos. Não seria melhor tirar esse painel e criar um menu chamado parceiros?

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

Mantém todos parceiros no novo menú? ou só deixa UFMG e UFPR?

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho poderias explicar um pouco mais sobre:

Nas caixas dos estados (1ª página), adicionar a variação da quadrissemana atual em relação à quadrissemana do último ano.

?

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho

uma pergunta que jornalistas me fazem com frequência é de como o acumulado
em um dado mês, se compara com o mesmo mês do ano anterior. Como os meses
variam em comprimento achei interessante apresentar o agregado das últimas
4 semanas (quadrissemana) comparando-o com o mesmo período do ano anterior.

uma dúvida ... trabalhando com semanas epidemiológicas ... haverá anos com 53 semanas e anos com 52 semanas ... como será essa comparação? na comparação, utilizo a semana 1 do mesmo ano?

qndo a semana corrente for menor que 4 .. vai incluir semanas do ano anterior, correto? não ficará confuso usar "quadrissemana atual em relação à quadrissemana do último ano"?

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho

Com a inclusão da chikungunya, a página inicial talvez precisará de alteração.

Inicialmente eu estava usando o Historico_alerta para calcular os valores apresentados nos cards.

Pelo o que você comentou em #73, agora vai ter o Historico_alerta_chik, então terei que 1) juntar no select o Historico_alert_chick ou 2) pegar direto em Notificacao.

Confere?

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

Na página inicial, no título, está escrito "Situação da Dengue" .. mantém isso ou adiciona Chikungunya? ("Situação da Dengue e Chikungunya")

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

o cache que ele monta, tem como chave:

cache_key = 'load_series-{}-{}'.format(cidade, doenca)

será necessário seguir essa linha?

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho

na página inicial, para montar os gráficos de serie temporal é usada a seguinte função:

results = dbdata.load_serie_cities(geocodigos, 'dengue')

essa função usa a tabela 'Historico_alerta' porém não está filtrando pela doença.

Mesmo que no cache ele está usando como parte da chave a doença, mas existe tal filtro.

Como deve ser comportar a funcionalidade load_serie_cities?

Como deve ser o gráfico da página inicial?

from alertadengue.

fccoelho avatar fccoelho commented on July 24, 2024

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

Ok!

from alertadengue.

xmnlab avatar xmnlab commented on July 24, 2024

@fccoelho @flavioamieiro

como será feita a criação da tabela Histórico_alerta_chik?

Aqui para ir trabalhando nessas funcionalidades criei uma view chamada Historico_alerta_chik que aponta para Historico_alerta.

e criei uma view para uf_total_chik_view:

-- Materialized View: public.uf_total_chik_view

-- DROP MATERIALIZED VIEW public.uf_total_chik_view;

CREATE MATERIALIZED VIEW public.uf_total_chik_view AS 
 SELECT "Municipio".uf,
    "Historico_alerta_chik"."data_iniSE" AS data,
    sum("Historico_alerta_chik".casos) AS casos_s,
    sum("Historico_alerta_chik".casos_est) AS casos_est_s
   FROM "Municipio"."Historico_alerta_chik"
     JOIN "Dengue_global"."Municipio" ON "Historico_alerta_chik".municipio_geocodigo = "Municipio".geocodigo
  GROUP BY "Historico_alerta_chik"."data_iniSE", "Municipio".uf
  ORDER BY "Municipio".uf, "Historico_alerta_chik"."data_iniSE"
WITH DATA;

ALTER TABLE public.uf_total_chik_view
  OWNER TO administrador;
GRANT ALL ON TABLE public.uf_total_chik_view TO administrador;
GRANT SELECT, UPDATE, INSERT, REFERENCES, TRIGGER ON TABLE public.uf_total_chik_view TO "Dengue";

-- Index: public.uf_total_chik_view_data_idx

-- DROP INDEX public.uf_total_chik_view_data_idx;

CREATE INDEX uf_total_chik_view_data_idx
  ON public.uf_total_chik_view
  USING btree
  (data);

onde posso incluir a criação dessa view? o que fiz basicamente foi copiar a view para dengue e transformei na view para chikungunya.

from alertadengue.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.