{"id":2432,"date":"2021-02-09T12:16:10","date_gmt":"2021-02-09T15:16:10","guid":{"rendered":"https:\/\/www.ufrgs.br\/gespla\/?p=2432"},"modified":"2021-03-18T11:50:44","modified_gmt":"2021-03-18T14:50:44","slug":"o-gespla-toolbox","status":"publish","type":"post","link":"https:\/\/www.ufrgs.br\/gespla\/2021\/02\/09\/o-gespla-toolbox\/","title":{"rendered":"O GESPLA Toolbox"},"content":{"rendered":"\r\n<p>Recentemente desenvolvemos uma caixa de ferramentas em python para facilitar nossas atividades de pesquisa no grupo de pesquisa em Gest\u00e3o e Planejamento de Recursos H\u00eddricos (GESPLA). O prop\u00f3sito da caixa de ferramentas, que vamos chamar aqui de <strong><code>GESPLA Toolbox<\/code><\/strong>, \u00e9 providenciar um conjunto de rotinas na forma de m\u00f3dulos de python. As rotinas dispon\u00edveis s\u00e3o opera\u00e7\u00f5es unit\u00e1rias que podem ser acopladas em qualquer c\u00f3digo python. Assim, o objetivo do post \u00e9 anunciar a ferramenta e descrever suas funcionalidades. Entendemos que o advento de ferramentas computacionais abertas, facilmente dispon\u00edveis por reposit\u00f3rios e oper\u00e1veis em plataformas de computa\u00e7\u00e3o de nuvem, como o Google Colab, s\u00e3o inevit\u00e1veis. Esperamos estar contribuindo para esse progresso, n\u00e3o (re)inventando a roda, mas participando desse movimento.<\/p>\r\n<p>Por <strong>Ipor\u00e3 Possantti<\/strong> (possantti@gmail.com), Engenheiro Ambiental, Doutorando em Recursos H\u00eddricos e Saneamento Ambiental (IPH\/UFRGS)<\/p>\r\n<p><!--more--><\/p>\r\n<p>Ah, antes de ler o post, saiba que \u00e9 poss\u00edvel acompanhar o post executando exemplos no Google Colab no seguinte link:<\/p>\r\n\r\n\r\n\r\n<p><a href=\"https:\/\/colab.research.google.com\/drive\/1CtwL3KSqGCxJqCu0TSM5BtFrc4ay3N3w?usp=sharing\">https:\/\/colab.research.google.com\/drive\/1CtwL3KSqGCxJqCu0TSM5BtFrc4ay3N3w?usp=sharing<\/a><\/p>\r\n\r\n\r\n\r\n<h1 class=\"wp-block-heading\">Uma caixa de ferramentas<\/h1>\r\n\r\n\r\n\r\n<p>Recentemente desenvolvemos uma caixa de ferramentas em python para facilitar nossas atividades de pesquisa no grupo de pesquisa em Gest\u00e3o e Planejamento de Recursos H\u00eddricos (GESPLA). O prop\u00f3sito da caixa de ferramentas, que vamos chamar aqui de <strong><em><code>GESPLA Toolbox<\/code><\/em><\/strong>, \u00e9 providenciar um conjunto de rotinas na forma de m\u00f3dulos de Python. As rotinas dispon\u00edveis s\u00e3o opera\u00e7\u00f5es unit\u00e1rias que podem ser acopladas em qualquer c\u00f3digo python. Os m\u00f3dulos dispon\u00edveis (at\u00e9 agora) s\u00e3o separados pelas seguintes classes de funcionalidades:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Download de dados e metadados hidrometeorol\u00f3gicos da ANA;<\/li>\r\n<li>Importa\u00e7\u00e3o de dados e metadados do disco para o c\u00f3digo;<\/li>\r\n<li>Processamento de s\u00e9ries temporais;<\/li>\r\n<li>An\u00e1lise de s\u00e9ries temporais;<\/li>\r\n<li>Visualiza\u00e7\u00e3o de s\u00e9ries temporais;<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>\u00c9 bom ressaltar que n\u00e3o estamos inventando a roda aqui: existem diversas formas de executar as opera\u00e7\u00f5es dispon\u00edveis, com outras ferramentas. Inclusive ocorreu recentemente o lan\u00e7amento pelo grupo de pesquisa de Hidrologia de Grande Escala (HGE) de um complemento para o QGIS para baixar dados da ANA, chamado <a href=\"https:\/\/www.ufrgs.br\/hge\/ana-data-acquisition\" target=\"_blank\" rel=\"noreferrer noopener\">ANA Data Acquisition<\/a>. Assim com a nossa caixa de ferramentas, o complemento tamb\u00e9m \u00e9 de c\u00f3digo aberto.<\/p>\r\n\r\n\r\n\r\n<p>O diferencial dessas ferramentas consiste na reprodutibilidade e facilidade de distribui\u00e7\u00e3o, pois a est\u00e3o codificadas de forma aberta (python) e dispon\u00edvel (sob licensa open source) em um reposit\u00f3rio p\u00fablico de c\u00f3digos chamado GitHub.<\/p>\r\n\r\n\r\n\r\n<p>Link para acessar o reposit\u00f3rio: <a href=\"https:\/\/github.com\/gespla-iph-ufrgs\/gespla\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/gespla-iph-ufrgs\/gespla<\/a>.<\/p>\r\n\r\n\r\n\r\n<p>Como antes mencionado, uma vantagem adicional do <code>GESPLA Toolbox<\/code> \u00e9 que as rotinas dispon\u00edveis podem ser acoplados (literalmente inseridas) em <em>outros<\/em> c\u00f3digos. Ou seja, se voc\u00ea, por exemplo, precisa obter um <code>DataFrame<\/code> da an\u00e1lise de frequ\u00eancias ou exportar um gr\u00e1fico, a nossa ferramenta faz isso.<\/p>\r\n\r\n\r\n\r\n<h1 class=\"wp-block-heading\">Depend\u00eancias necess\u00e1rias<\/h1>\r\n\r\n\r\n\r\n<p>Como qualquer biblioteca de \u201calto n\u00edvel\u201d (isto \u00e9, que executa tarefas espec\u00edficas) o <code>GESPLA Toolbox<\/code> est\u00e1 apoiado sobre outras bibliotecas, ou <em>depend\u00eancias<\/em>. Uma delas \u00e9 a <strong><a href=\"https:\/\/github.com\/wallissoncarvalho\/hydrobr\" target=\"_blank\" rel=\"noreferrer noopener\">hydrobr<\/a><\/strong>, uma biblioteca de grande valia. Eventualmente voc\u00ea pode gostar mais dessa biblioteca que a nossa. Mas garanto que a nossa biblioteca \u00e9 mais simples, pois \u00e9 baseada apenas em <em>fun\u00e7\u00f5es<\/em>, n\u00e3o em <em>objetos<\/em> (como \u00e9 o caso da <code>hydrobr<\/code>). Programa\u00e7\u00e3o orientada a objetos pode ser um exagero no caso de processamento de dados.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\">\r\n<div id=\"attachment_2451\" style=\"width: 561px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/fig.jpg\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2451\" class=\"wp-image-2451\" src=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/fig-1024x537.jpg\" alt=\"\" width=\"551\" height=\"289\" srcset=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/fig-1024x537.jpg 1024w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/fig-300x157.jpg 300w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/fig-768x403.jpg 768w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/fig.jpg 1051w\" sizes=\"(max-width: 551px) 100vw, 551px\" \/><\/a><p id=\"caption-attachment-2451\" class=\"wp-caption-text\">Onde o GESPLA Toolbox est\u00e1 na &#8220;pir\u00e2mide de bibliotecas&#8221; de python<\/p><\/div>\r\n<\/figure>\r\n\r\n\r\n\r\n<p>Como mostra a figura acima, al\u00e9m do <a href=\"https:\/\/www.python.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">python 3<\/a>, \u00e9 preciso instalar as seguintes depend\u00eancias:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>numpy<\/code><\/li>\r\n<li><code>pandas<\/code><\/li>\r\n<li><code>matplotlib<\/code><\/li>\r\n<li><code>scipy<\/code><\/li>\r\n<li><code>statsmodels<\/code><\/li>\r\n<li><code>tdqm<\/code><\/li>\r\n<li><code>hydrobr<\/code><\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Todas as depend\u00eancias (com exce\u00e7\u00e3o da <code>hydrobr<\/code>) s\u00e3o bibliotecas plenamente consolidadas no ecossistema python. Por isso, se voc\u00ea estiver no <a href=\"https:\/\/colab.research.google.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Google Colab<\/a>, s\u00f3 \u00e9 necess\u00e1rio instalar a hydrobr.<\/p>\r\n\r\n\r\n\r\n<p>No Google Colab, uma boa forma de come\u00e7ar \u00e9 criar um arquivo python (.py) e executar os comandos de importa\u00e7\u00e3o das depend\u00eancias. Depois disso, voc\u00ea precisa fazer upload dos m\u00f3dulos na plataforma.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code># importar depend\u00eancias b\u00e1sicas\r\nimport pandas as pd\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nimport scipy\r\n\r\n# instalar a Hydrobr\r\n!pip install hydrobr<\/code><\/pre>\r\n\r\n\r\n\r\n<h1 class=\"wp-block-heading\">Os m\u00f3dulos e fun\u00e7\u00f5es<\/h1>\r\n\r\n\r\n\r\n<p>O segundo passo \u00e9 carregar na mesma pasta os m\u00f3dulos do <code>GESPLA Toolbox<\/code>. Por enquanto s\u00e3o os seguintes arquivos:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>download.py<\/code> \u2013 para download de dados e metadados;<\/li>\r\n<li><code>load.py<\/code> \u2013 para importa\u00e7\u00e3o de dados e metadados;<\/li>\r\n<li><code>resample.py<\/code> \u2013 para processamento de s\u00e9ries temporais;<\/li>\r\n<li><code>tsa.py<\/code> \u2013 para an\u00e1lise de s\u00e9ries temporais;<\/li>\r\n<li><code>visuals.py<\/code> \u2013 para visualiza\u00e7\u00e3o de s\u00e9ries temporais;<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Mas o que s\u00e3o esses m\u00f3dulos? Cada m\u00f3dulo \u00e9 um arquivo python (.py) com <em>fun\u00e7\u00f5es<\/em>. Os m\u00f3dulos s\u00e3o <em>independentes entre si<\/em>, portanto voc\u00ea pode usar apenas o que for necess\u00e1rio. As fun\u00e7\u00f5es internas de cada m\u00f3dulo, contudo, <em>podem ter depend\u00eancias locais<\/em> de outras fun\u00e7\u00f5es. Isso significa que copiar e colar um trecho do m\u00f3dulo em outro c\u00f3digo pode resultar em problemas. Sempre use o m\u00f3dulo inteiro como uma nova depend\u00eancia do seu projeto, importando as fun\u00e7\u00f5es.<\/p>\r\n\r\n\r\n\r\n<p>As fun\u00e7\u00f5es (e seus relativos retornos e par\u00e2metros) est\u00e3o completamente documentados por <code>docstrings<\/code>. Uma docstring \u00e9 um coment\u00e1rio com a fun\u00e7\u00e3o de documenta\u00e7\u00e3o no cabe\u00e7alho da fun\u00e7\u00e3o. Voc\u00ea pode ler uma <code>docstring<\/code> de v\u00e1rias formas:<\/p>\r\n\r\n\r\n\r\n<ol class=\"wp-block-list\" type=\"1\">\r\n<li>Simplesmente leia ela no pr\u00f3prio c\u00f3digo;<\/li>\r\n<li>Execute o comando <code>help()<\/code> passando como argumento o nome da fun\u00e7\u00e3o. Exemplo:<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code># importa a fun\u00e7\u00e3o metadata_ana_flow do m\u00f3dulo download\r\nfrom download import metadata_ana_flow  \r\n# convoque a docstring pelo comando help():\r\nhelp(metadata_ana_flow)<\/code><\/pre>\r\n\r\n\r\n\r\n<p>3. ou imprima na tela o atributo <code>.__doc__<\/code> . Exemplo:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code># importa a fun\u00e7\u00e3o metadata_ana_flow do m\u00f3dulo download\r\nfrom download import metadata_ana_flow  \r\n# impress\u00e3o do atributo .__doc__:\r\nprint(metadata_ana_flow.__doc__)<\/code><\/pre>\r\n\r\n\r\n\r\n<p>No caso acima, a <code>docstring<\/code> da fun\u00e7\u00e3o <code>metadata_ana_flow<\/code> \u00e9 seguinte:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>\"\"\"\r\nThis function downloads metadata for all flow stations registered in the  Brazilian  National Agency of Water (ANA).\r\nFile is saved in .txt format \r\nTo the file name is attached the date of download in format: 'YYYY-MM-DD'\r\n     Dependencies:\r\n    * HydroBr as hb\r\n    * Pandas as pd\r\n\r\n:param folder: [optional] string of output directory (ex: 'C:\/Datasets\/Hydrology' )\r\n\r\n:param suff: [optional] string suffix for file name\r\n\r\n:return: string of file path (ex: 'C:\/Datasets\/Hydrology\/metadata_ANA-flow_2020-10-19.txt' )\r\n\"\"\"<\/code><\/pre>\r\n\r\n\r\n\r\n<h1 class=\"wp-block-heading\">M\u00f3dulo <code>download<\/code> &#8211; baixando dados e metadados para arquivos txt<\/h1>\r\n\r\n\r\n\r\n<p>O m\u00e9todo convencional de baixar dados hidrometeorol\u00f3gicos \u00e9 simplesmente ir no <a href=\"http:\/\/www.snirh.gov.br\/hidroweb\" target=\"_blank\" rel=\"noreferrer noopener\">Hidroweb<\/a>, digitar o c\u00f3digo da esta\u00e7\u00e3o de monitoramento desejada e clicar no \u00edcones de download.<\/p>\r\n\r\n\r\n\r\n<p>O primeiro problema do m\u00e9todo convencional \u00e9 que voc\u00ea precisa saber previamente o c\u00f3digo da esta\u00e7\u00e3o de monitoramento. E isso n\u00e3o necessariamente \u00e9 \u00f3bvio. O SNIRH disponibiliza um <a href=\"http:\/\/www.snirh.gov.br\/hidroweb\/mapa\" target=\"_blank\" rel=\"noreferrer noopener\">SIGWeb<\/a>, \u00e9 verdade. Mas melhor que isso \u00e9 obter todos os metadados da Rede Nacional Hidrometeorol\u00f3gica em um arquivo txt e inspecionar o banco de metadados com seus pr\u00f3prios crit\u00e9rios, incluindo visualizar em ambiente SIG a distribui\u00e7\u00e3o espacial das esta\u00e7\u00f5es.<\/p>\r\n\r\n\r\n\r\n<p>O segundo problema \u00e9 que os dados baixados do Hidroweb nunca est\u00e3o alinhados em uma s\u00e9rie temporal, mas em uma matriz de m\u00eas-ano por dias do m\u00eas. Como o n\u00famero de dias em um m\u00eas varia, \u00e9 preciso fazer muita gin\u00e1stica em alguma planilha eletr\u00f4nica para extrair do arquivo do Hidroweb uma s\u00e9rie temporal.<\/p>\r\n\r\n\r\n\r\n<p>Assim, o m\u00f3dulo <code>download<\/code> resolve todos esses problemas. Este m\u00f3dulo armazena fun\u00e7\u00f5es para download de dados e metadados. Os arquivos s\u00e3o salvos no formato de texto (.txt, separado por ponto e v\u00edrgulas) em um diret\u00f3rio especificado no par\u00e2metro <code>folder=<\/code> das fun\u00e7\u00f5es. Se n\u00e3o for especificado, o diret\u00f3rio padr\u00e3o \u00e9 a pasta atual do arquivo python que est\u00e1 convocando a fun\u00e7\u00e3o. Todas as fun\u00e7\u00f5es retornam a <em>string<\/em> do caminho do arquivo salvo.<\/p>\r\n\r\n\r\n\r\n<p>As depend\u00eancias gerais do m\u00f3dulo s\u00e3o:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>pandas<\/code><\/li>\r\n<li><code>tdqm<\/code><\/li>\r\n<li><code>hydrobr<\/code><\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Lista das fun\u00e7\u00f5es atuais do m\u00f3dulo:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>.metadata_ana_flow(folder)<\/code> &#8211; baixa os metadados de todas as esta\u00e7\u00f5es de vaz\u00e3o da ANA.<\/li>\r\n<li><code>.metadata_ana_prec(folder)<\/code> &#8211; baixa os metadados de todas as esta\u00e7\u00f5es de precipita\u00e7\u00e3o da ANA.<\/li>\r\n<li><code>.metadata_inmet(folder, opt)<\/code> &#8211; baixa metadados de todas as esta\u00e7\u00f5es clim\u00e1ticas do INMET, definidas por tipo.<\/li>\r\n<li><code>.metadata_ana_telemetry(folder)<\/code> &#8211; baixa metadados de todas as esta\u00e7\u00f5es telem\u00e9tricas da ANA.<\/li>\r\n<li><code>.metadata_ana_rhn_inventory(folder)<\/code> &#8211; baixa os metadados do invent\u00e1rio completo das esta\u00e7\u00f5es da ANA.<\/li>\r\n<li><code>.ana_flow(code, folder)<\/code> &#8211; baixa dados de vaz\u00e3o de uma \u00fanica esta\u00e7\u00e3o de vaz\u00e3o de ANA.<\/li>\r\n<li><code>.ana_stage (code, folder)<\/code> &#8211; baixa os dados de cota de uma \u00fanica esta\u00e7\u00e3o de vaz\u00e3o de ANA.<\/li>\r\n<li><code>.ana_prec(code, folder)<\/code> &#8211; baixa os dados de precipita\u00e7\u00e3o de uma \u00fanica esta\u00e7\u00e3o de precipita\u00e7\u00e3o da ANA.<\/li>\r\n<li><code>.inmet_daily(code, folder)<\/code> &#8211; baixa dados clim\u00e1ticos di\u00e1rios de uma \u00fanica esta\u00e7\u00e3o clim\u00e1tica do INMET. Veja docstring para vari\u00e1veis.<\/li>\r\n<li><code>.inmet_hourly(code, folder)<\/code> &#8211; baixa dados clim\u00e1ticos por hora de uma \u00fanica esta\u00e7\u00e3o clim\u00e1tica do INMET. Veja docstring para vari\u00e1veis.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h1 class=\"wp-block-heading\">M\u00f3dulo <code>load<\/code> &#8211; importar os dados para um <code>DataFrame<\/code><\/h1>\r\n\r\n\r\n\r\n<p>Este m\u00f3dulo armazena fun\u00e7\u00f5es para importar dados armazenados em arquivos criados pelo m\u00f3dulo <code>download<\/code>. A maior parte do download tem uma contrapartida em <code>load<\/code>.<\/p>\r\n\r\n\r\n\r\n<p>Os dados nos arquivos s\u00e3o carregados em um objeto <strong><code>DataFrame<\/code><\/strong>. Esse objeto \u00e9 o cora\u00e7\u00e3o da biblioteca <code>pandas<\/code> e permite praticamente todas as manipula\u00e7\u00f5es poss\u00edveis com os dados. O <code>DataFrame<\/code> \u00e9 o Santo Graal da an\u00e1lise de dados com python.<\/p>\r\n\r\n\r\n\r\n<p>Depend\u00eancias gerais:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>pandas<\/code><\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Lista das fun\u00e7\u00f5es atuais:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>.ana_flow(file)<\/code> &#8211; carrega em um <code>DataFrame<\/code> os dados de vaz\u00e3o de uma \u00fanica esta\u00e7\u00e3o de vaz\u00e3o de ANA.<\/li>\r\n<li><code>.ana_stage(file)<\/code> &#8211; carrega em um <code>DataFrame<\/code> os dados de cota de uma \u00fanica esta\u00e7\u00e3o de vaz\u00e3o de ANA.<\/li>\r\n<li><code>.ana_prec(file)<\/code> &#8211; carrega em um <code>DataFrame<\/code> os dados de precipita\u00e7\u00e3o de uma \u00fanica esta\u00e7\u00e3o de precipita\u00e7\u00e3o da ANA.<\/li>\r\n<li><code>.inmet_daily(file)<\/code> &#8211; carrega em um <code>DataFrame<\/code> os dados clim\u00e1ticos di\u00e1rios de uma \u00fanica esta\u00e7\u00e3o clim\u00e1tica do INMET. Veja docstring para vari\u00e1veis.<\/li>\r\n<li><code>.inmet_hourly(file)<\/code> &#8211; carrega em um <code>DataFrame<\/code> os dados clim\u00e1ticos hor\u00e1rios de uma \u00fanica esta\u00e7\u00e3o clim\u00e1tica do INMET. Veja docstring para vari\u00e1veis.<\/li>\r\n<li><code>.metadata_ana_flow(file)<\/code> &#8211; carrega em um <code>DataFrame<\/code> os metadados das esta\u00e7\u00f5es de vaz\u00e3o \/ cota da ANA.<\/li>\r\n<li><code>.metadata_ana_prec(file)<\/code> &#8211; carrega em um <code>DataFrame<\/code> os metadados das esta\u00e7\u00f5es de precipita\u00e7\u00f5es da ANA.<\/li>\r\n<li><code>.metadata_inmet(file)<\/code> &#8211; carrega em um <code>DataFrame<\/code> os metadados das esta\u00e7\u00f5es clim\u00e1ticas do INMET.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h1 class=\"wp-block-heading\">M\u00f3dulo <code>resample<\/code> \u2013 reamostrando os dados em diferentes escalas de tempo<\/h1>\r\n\r\n\r\n\r\n<p>Este m\u00f3dulo armazena fun\u00e7\u00f5es para reamostrar s\u00e9ries temporais, como de di\u00e1rio para mensal. Os dados de entrada s\u00e3o passados \u200b\u200bcomo um objeto <code>DataFrame<\/code> para que as fun\u00e7\u00f5es os processem e retornem um novo objeto <code>DataFrame<\/code> contendo a nova s\u00e9rie temporal. As vari\u00e1veis \u200b\u200bagregadas retornadas s\u00e3o:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Periods count &#8211; n\u00famero de per\u00edodos agregados<\/li>\r\n<li>Count &#8211; n\u00famero de registros v\u00e1lidos agregados<\/li>\r\n<li>Sum<\/li>\r\n<li>Mean<\/li>\r\n<li>Min<\/li>\r\n<li>Min<\/li>\r\n<li>Max<\/li>\r\n<li>Q25 &#8211; quantil 25<\/li>\r\n<li>Q50 &#8211; quantil 50 (mediana)<\/li>\r\n<li>Q75 &#8211; quantil 75<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Depend\u00eancias gerais:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>pandas<\/code><\/li>\r\n<li><code>numpy<\/code><\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Lista das fun\u00e7\u00f5es atuais:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>.d2m_prec(dataframe)<\/code> &#8211; reamostrando as s\u00e9ries temporais de precipita\u00e7\u00e3o de di\u00e1rio para mensal.<\/li>\r\n<li><code>.d2m_flow(dataframe)<\/code> &#8211; reamostrando a s\u00e9rie temporal do vaz\u00e3o de di\u00e1rio para mensal.<\/li>\r\n<li><code>.d2m_stage(dataframe)<\/code> &#8211; reamostrando as s\u00e9ries temporais do est\u00e1gio de di\u00e1rio para mensal.<\/li>\r\n<li><code>.d2m_clim(dataframe)<\/code> &#8211; reamostrando as s\u00e9ries temporais das vari\u00e1veis \u200b\u200bclim\u00e1ticas de di\u00e1rio para mensal.<\/li>\r\n<li><code>.d2y_prec(dataframe)<\/code> &#8211; reamostrando as s\u00e9ries de tempo de precipita\u00e7\u00e3o de di\u00e1rio para anual.<\/li>\r\n<li><code>.d2y_flow(dataframe)<\/code> &#8211; reamostrando a s\u00e9rie temporal de vaz\u00e3o de di\u00e1rio para anual.<\/li>\r\n<li><code>.d2y_stage(dataframe)<\/code> &#8211; reamostrando as s\u00e9ries temporais do est\u00e1gio de di\u00e1rio para anual.<\/li>\r\n<li><code>.d2y_clim(dataframe)<\/code> &#8211; reamostrando as s\u00e9ries temporais das vari\u00e1veis \u200b\u200bclim\u00e1ticas de di\u00e1rio para anual.<\/li>\r\n<li><code>.insert_gaps(dataframe)<\/code> &#8211; insere registros nulos em intervalos de data ausentes da s\u00e9rie temporal.<\/li>\r\n<li><code>.interpolate_gaps(dataframe)<\/code> &#8211; interpola intervalos definidos por tamanho de registros nulos em uma s\u00e9rie temporal.<\/li>\r\n<li><code>.clear_bad_months(dataframe)<\/code> &#8211; remove da s\u00e9rie temporal os meses que possuem registros nulos (falhas).<\/li>\r\n<li><code>.clear_bad_years(dataframe)<\/code> &#8211; remove dos anos da s\u00e9rie temporal que possuem registros nulos (falhas).<\/li>\r\n<li><code>.resampler(dataframe)<\/code> &#8211; esta fun\u00e7\u00e3o \u00e9 a fun\u00e7\u00e3o utilit\u00e1ria de reamostragem do m\u00f3dulo.<\/li>\r\n<li><code>.group_by_month(dataframe)<\/code> &#8211; esta fun\u00e7\u00e3o agrupa uma s\u00e9rie temporal di\u00e1ria em 12 s\u00e9ries temporais para cada m\u00eas do ano. As 12 s\u00e9ries retornam em um objeto <code>dictionary<\/code>.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Assim, o m\u00f3dulo permite uma an\u00e1lise estat\u00edstica em m\u00faltiplas escalas temporais, como mostra a figura abaixo. A figura abaixo mostra claramente que a temperatura m\u00e9dia di\u00e1ria est\u00e1 aumentando nos \u00faltimos 50 anos nessa Esta\u00e7\u00e3o do INMET (83423 &#8211; Goi\u00e2nia).<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2450 aligncenter\" src=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/resample-1024x655.jpg\" alt=\"\" width=\"605\" height=\"387\" srcset=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/resample-1024x655.jpg 1024w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/resample-300x192.jpg 300w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/resample-768x491.jpg 768w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/resample.jpg 1197w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/>\r\n<figcaption>An\u00e1lise estat\u00edstica em multiescalas temporais com as fun\u00e7\u00f5es do m\u00f3dulo resample<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<h1 class=\"wp-block-heading\">M\u00f3dulo <code>tsa<\/code> \u2013 an\u00e1lise de s\u00e9ries temporais<\/h1>\r\n\r\n\r\n\r\n<p>Este m\u00f3dulo armazena fun\u00e7\u00f5es para an\u00e1lise de s\u00e9ries temporais (<em>tsa = time series analysis<\/em>), como an\u00e1lise de frequ\u00eancia e decomposi\u00e7\u00e3o ETS. Os dados de entrada s\u00e3o passados como um objeto <code>DataFrame<\/code> para que as fun\u00e7\u00f5es os processem e, em seguida, retornem um novo objeto <code>DataFrame<\/code> contendo as novas s\u00e9ries \/ objetos temporais.<\/p>\r\n\r\n\r\n\r\n<p>Depend\u00eancias gerais:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>pandas<\/code><\/li>\r\n<li><code>numpy<\/code><\/li>\r\n<li><code>statsmodels<\/code><\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Lista das fun\u00e7\u00f5es atuais:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>.frequency(dataframe)<\/code> &#8211; Obtenha um <code>DataFrame<\/code> com percentis, probabilidade de exced\u00eancia, frequ\u00eancia e probabilidade emp\u00edrica de uma s\u00e9rie temporal.<\/li>\r\n<li><code>.sma(dataframe)<\/code> &#8211; Obtenha a s\u00e9rie de tempo da m\u00e9dia m\u00f3vel simples de uma janela de tempo definida.<\/li>\r\n<li><code>.ewma(dataframe)<\/code> &#8211; Obtenha a m\u00e9dia m\u00f3vel de pondera\u00e7\u00e3o exponencial de uma janela de tempo definida.<\/li>\r\n<li><code>.ets_decomposition(dataframe)<\/code> &#8211; fun\u00e7\u00e3o executa a decomposi\u00e7\u00e3o ETS (Error, Trend, Seasonality) sobre uma s\u00e9rie temporal.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>A fun\u00e7\u00e3o <code>.ets_decomposition()<\/code>\u00e9 particularmente interessante, pois decomp\u00f5e a s\u00e9rie nas componentes estoc\u00e1sticas, sazonais e tendenciais, como ilustra a figura abaixo:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\">\r\n<div id=\"attachment_2448\" style=\"width: 583px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/ETS.jpg\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2448\" class=\"wp-image-2448\" src=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/ETS-1024x541.jpg\" alt=\"\" width=\"573\" height=\"303\" srcset=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/ETS-1024x541.jpg 1024w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/ETS-300x158.jpg 300w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/ETS-768x406.jpg 768w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/ETS.jpg 1297w\" sizes=\"(max-width: 573px) 100vw, 573px\" \/><\/a><p id=\"caption-attachment-2448\" class=\"wp-caption-text\">Decomposi\u00e7\u00e3o ETS com a fun\u00e7\u00e3o tsa.ets_decomposition()<\/p><\/div>\r\n<\/figure>\r\n\r\n\r\n\r\n<h1 class=\"wp-block-heading\">M\u00f3dulo <code>visuals<\/code> \u2013 visualiza\u00e7\u00e3o de dados<\/h1>\r\n\r\n\r\n\r\n<p>Este m\u00f3dulo ainda est\u00e1 sendo desenvolvido e objetiva armazenar fun\u00e7\u00f5es para visualiza\u00e7\u00e3o de dados. \u00c9 comum gastar bastante tempo bolando os gr\u00e1ficos para an\u00e1lise, o que pode ser reduzido com um conjunto de fun\u00e7\u00f5es pr\u00e9-definidas. As fun\u00e7\u00f5es ser\u00e3o programadas para exportar uma figura em .png com resolu\u00e7\u00e3o de 300 dpi para um diret\u00f3rio especificado pelo par\u00e2metro <code>folder=<\/code>.<\/p>\r\n\r\n\r\n\r\n<p>Depend\u00eancias gerais:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><code>pandas<\/code><\/li>\r\n<li><code>numpy<\/code><\/li>\r\n<li><code>matplotlib<\/code><\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Temos j\u00e1 uma fun\u00e7\u00e3o operativa, que exporta um painel de an\u00e1lise referente a uma \u00fanica s\u00e9rie temporal, fun\u00e7\u00e3o <code>pannel_singlets()<\/code>.<\/p>\r\n\r\n\r\n\r\n<p>Al\u00e9m do <code>DataFrame<\/code> da s\u00e9rie, \u00e9 preciso fornecer para a fun\u00e7\u00e3o outros objetos produzidos por fun\u00e7\u00f5es dos m\u00f3dulos anteriores, tais como o <code>DataFrame<\/code> da fun\u00e7\u00e3o <code>tsa.frequency()<\/code> e da fun\u00e7\u00e3o <code>resample.group_by_month()<\/code>.<\/p>\r\n\r\n\r\n\r\n<p>O resultado s\u00e3o pain\u00e9is tais como esses:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\">\r\n<div id=\"attachment_2445\" style=\"width: 540px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelFlow-2.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2445\" class=\"wp-image-2445\" src=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelFlow-2.png\" alt=\"\" width=\"530\" height=\"318\" srcset=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelFlow-2.png 1000w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelFlow-2-300x180.png 300w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelFlow-2-768x461.png 768w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/a><p id=\"caption-attachment-2445\" class=\"wp-caption-text\">Painel das vaz\u00f5es &#8211; Esta\u00e7\u00e3o ANA 20200000 (em Goi\u00e1s)<\/p><\/div>\r\n<\/figure>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\">\r\n<div id=\"attachment_2446\" style=\"width: 532px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelPrec-1.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2446\" class=\"wp-image-2446\" src=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelPrec-1.png\" alt=\"\" width=\"522\" height=\"313\" srcset=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelPrec-1.png 1000w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelPrec-1-300x180.png 300w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelPrec-1-768x461.png 768w\" sizes=\"(max-width: 522px) 100vw, 522px\" \/><\/a><p id=\"caption-attachment-2446\" class=\"wp-caption-text\">Painel da precipita\u00e7\u00e3o &#8211; Esta\u00e7\u00e3o INMET 83423 (Goi\u00e2nia)<\/p><\/div>\r\n<\/figure>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\">\r\n<div id=\"attachment_2447\" style=\"width: 540px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelTemp-1.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2447\" class=\"wp-image-2447\" src=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelTemp-1.png\" alt=\"\" width=\"530\" height=\"318\" srcset=\"https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelTemp-1.png 1000w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelTemp-1-300x180.png 300w, https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/PannelTemp-1-768x461.png 768w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/a><p id=\"caption-attachment-2447\" class=\"wp-caption-text\">Painel da Temperatura &#8211; Esta\u00e7\u00e3o INMET 83423 (Goi\u00e2nia)<\/p><\/div>\r\n<\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\r\n\r\n\r\n\r\n<p>Com isso, conclu\u00edmos que o advento de ferramentas computacionais abertas, facilmente dispon\u00edveis por reposit\u00f3rios e oper\u00e1veis em plataformas de computa\u00e7\u00e3o de nuvem, como o Google Colab, s\u00e3o inevit\u00e1veis. Esperamos estar contribuindo para esse progresso, n\u00e3o (re)inventando a roda, mas participando desse movimento.<\/p>\r\n\r\n\r\n\r\n<p>Atualiza\u00e7\u00f5es das ferramentas ser\u00e3o notificadas pelo blog.<\/p>\r\n\r\n\r\n\r\n<p>Bom uso!<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>Recentemente desenvolvemos uma caixa de ferramentas em python para facilitar nossas atividades de pesquisa no grupo de pesquisa em Gest\u00e3o e Planejamento de Recursos H\u00eddricos (GESPLA). O prop\u00f3sito da caixa de ferramentas, que vamos chamar aqui de GESPLA Toolbox, \u00e9 providenciar um conjunto de rotinas na forma de m\u00f3dulos de python. As rotinas dispon\u00edveis s\u00e3o<\/p><\/div>\n<div class=\"blog-btn\"><a href=\"https:\/\/www.ufrgs.br\/gespla\/2021\/02\/09\/o-gespla-toolbox\/\" class=\"home-blog-btn\">Ler mais<\/a><\/p>\n","protected":false},"author":3,"featured_media":2455,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","ngg_post_thumbnail":0,"footnotes":""},"categories":[39],"tags":[42,40,41],"class_list":["post-2432","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ferramentas","tag-ferramentas","tag-programacao","tag-python"],"uagb_featured_image_src":{"full":["https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/capa.jpg",1210,657,false],"thumbnail":["https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/capa-150x150.jpg",150,150,true],"medium":["https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/capa-300x163.jpg",300,163,true],"medium_large":["https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/capa-768x417.jpg",696,378,true],"large":["https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/capa-1024x556.jpg",696,378,true],"1536x1536":["https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/capa.jpg",1210,657,false],"2048x2048":["https:\/\/www.ufrgs.br\/gespla\/wp-content\/uploads\/2021\/02\/capa.jpg",1210,657,false]},"uagb_author_info":{"display_name":"Ipor\u00e3 Possantti","author_link":"https:\/\/www.ufrgs.br\/gespla\/author\/ipora-possantti\/"},"uagb_comment_info":0,"uagb_excerpt":"Recentemente desenvolvemos uma caixa de ferramentas em python para facilitar nossas atividades de pesquisa no grupo de pesquisa em Gest\u00e3o e Planejamento de Recursos H\u00eddricos (GESPLA). O prop\u00f3sito da caixa de ferramentas, que vamos chamar aqui de GESPLA Toolbox, \u00e9 providenciar um conjunto de rotinas na forma de m\u00f3dulos de python. As rotinas dispon\u00edveis s\u00e3oLer&hellip;","_links":{"self":[{"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/posts\/2432"}],"collection":[{"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/comments?post=2432"}],"version-history":[{"count":22,"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/posts\/2432\/revisions"}],"predecessor-version":[{"id":2536,"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/posts\/2432\/revisions\/2536"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/media\/2455"}],"wp:attachment":[{"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/media?parent=2432"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/categories?post=2432"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ufrgs.br\/gespla\/wp-json\/wp\/v2\/tags?post=2432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}