segunda-feira, 20 de abril de 2020

Time Zone no Banco de Dados PostgreSQL


Neste post estou preocupado como a definição de tempo do meu banco de dados. Pois quando o sistema for instalado em usuários de outros fusos o sistema pode apresentar erro. Com os comandos SQL abaixo direitamente no PGSQL você poderá saber o que está definido e como fazer a devida conversão.
-- Show timezone of current session.
show timezone;

 -- Set timezone of current session.
set time zone 'Brazil/East';

 -- Identify or remembering timezone.
select * from pg_timezone_names;


Uma dica de como manter o fuso definido está em:

https://kb.objectrocket.com/postgresql/postgresql-set-time-zone-1064


Para definir definitivamente nas configuração do Banco e não na seção devem ser utilizado os seguintes comandos:

sudo -u postgres pg_conftool 11 main set timezone "UTC" 
sudo -u postgres pg_conftool 11 main set log_timezone "UTC" 
service postgresql restart

sexta-feira, 27 de março de 2020

Como combinar todos os arquivos CSV de uma mesma pasta para um pandas dataframe automaticamente


Muitas vezes temos que ler vários arquivos idênticos, por exemplo focos por dia, para depois analisar todos os registros juntos. Uma maneira de fazer isto muito rápido foi publicado por Kade Killary
 em:

https://medium.com/@kadek/elegantly-reading-multiple-csvs-into-pandas-e1a76843b688

Resumindo o texto o que deve ser realizado está apresentado nas 3 linhas abaixo

import glob
import pandas as pd
df = pd.concat([pd.read_csv(f) for f in glob.glob('data*.csv')], ignore_index = True)

A explicação disto pode ser interpretada por partes da seguinte maneira

# glob.glob('data*.csv') - returns List[str]
# pd.read_csv(f) - returns pd.DataFrame()
# for f in glob.glob() - returns a List[DataFrames]
# pd.concat() - returns one pd.DataFrame()

sexta-feira, 16 de agosto de 2019

Como criar ambiente virtual de Python com o CONDA

Para controlar as versões de python e bibliotecas que são utilizadas é muito interessante fazer o gerenciamento de virtual envs. Uma excelente introdução foi escrita por Gilberto Queiróz e está disponível em https://github.com/gqueiroz/ser347/blob/master/2018/aula-12/anaconda.ipynb

Para listar os ambientes:
conda info -e

quinta-feira, 20 de setembro de 2018

Trigger no PostgreSQL


Abaixo está um exemplo dos comandos PL/SQL utlizados para criar um gatilho no banco de dados de tal maneira que ao inserir ou atualizar uma linha de registro serão populadas duas colunas concatenando dados já existentes no registro.

Neste caso estão sendo concatenados numeros com zeros a direita para compor um atributo do tipo varchar. Este exemplo foi escrito pelo Dr. Gilberto Queiroz Ribeiro


CREATE OR REPLACE FUNCTION focos_bdq_c2_insert()
RETURNS trigger AS $$
BEGIN
NEW.complete_id_state := concat(lpad(NEW.id_0::character varying::text, 4, '0'::text),
lpad(NEW.id_1::character varying::text, 3, '0'::text))::varchar;

NEW.complete_id_munic := concat(lpad(NEW.id_0::character varying::text, 4, '0'::text),
lpad(NEW.id_1::character varying::text, 3, '0'::text),
lpad(NEW.id_2::character varying::text, 8, '0'::text))::varchar;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER focos_bdq_c2_insert BEFORE INSERT OR UPDATE ON focos_bdq_c2 FOR EACH ROW EXECUTE PROCEDURE focos_bdq_c2_insert();

quinta-feira, 27 de abril de 2017

Processamento de Imagens utilizando python e GDAL



Neste Exemplo são apresentados métodos de leitura de arquivos matriciais fazendo uma varredura em  uma pasta para então processar todos os arquivo. Um ponto importante é que os dados foram lidos como array multidimensional, portanto sem informação espacial, porém o arquivo de saída foi  transformado em um Geotiff.


import glob, os, sys
import numpy as np
import osgeo.gdal as gdal
from osgeo import osr


path_in_aqm = r"c:\Projetos\AQM_Renata\Area_Queimada_modis_americadosul\aqm"  #2005_01_AQM.bin
path_in_foco = r"c:\Projetos\AQM_Renata\Area_Queimada_modis_americadosul\focos" #2005_01_grd_focos.bin
path_out = r"c:\Projetos\AQM_Renata\Area_Queimada_modis_americadosul\aqm_focos_tif"

anos = range(2005,2016)
meses = ["%02d"%a for a in range(1,13)]
#ano = 2014
#mes = "06"

for ano in anos:
    for mes in meses:

        arq_aqm = os.path.join(path_in_aqm,"%s_%s_AQM.bin"%(ano,mes))
        arq_foco = os.path.join(path_in_foco,"%s_%s_grd_focos.bin"%(ano,mes))
        arq_saida = os.path.join(path_out,"%s_%s_aqm_focos.tif"%(ano,mes))

        img_aqm = np.fromfile(arq_aqm,dtype=np.int16,count=-1)
        img_foco = np.fromfile(arq_foco,dtype=np.int16,count=-1)

        img_aqm = np.resize(img_aqm,(6300,5000))
        img_foco = np.resize(img_foco,(6300,5000))

        idx_aqm = np.where(img_aqm==1,20,0)
        idx_foco = np.where(img_foco>0,40,0)

        nova_area = (idx_aqm+idx_foco).astype("uint8")

        #nova_area.tofile(path_in_aqm + "/comparacao_%s_%s_uint8.bin"%(ano,mes))

        # definicioes para gravar um aquivo no formato envi usando gdal
        spatialRef = osr.SpatialReference()
        spatialRef.SetWellKnownGeogCS( "EPSG:4326" )
        geotransform = ( -83.005, 0.01 , 0 , 13.005, 0 , -0.01)

        driver = gdal.GetDriverByName("GTIFF")

        ds = driver.Create(arq_saida, 5000,6300,1,gdal.GDT_Byte , ['COMPRESS=LZW'])
        ds.GetRasterBand(1).WriteArray(nova_area)

        ds.SetProjection(spatialRef.ExportToWkt())
        ds.SetGeoTransform(geotransform)

        ds=None

print "Final do Processamento"
print "-"*10

domingo, 23 de abril de 2017

Como criar uma crosstable utilizando Python Pandas?

Um exemplo de como utilizar o Pandas para formatar os dados criando uma tabela de referência cruzada:

import pandas as pd

dados = pd.read_csv("arquivo.csv")

dados.describe()

nfocos_ref  nfocos_atnpp  nf_aqua_terra  julianday  ano
count  366.000000  366.000000  366.000000  366.000000  366.0
mean  6.344262  52.486339  11.292350  183.500000  2016.0
std  11.279588  88.889148  18.364328  105.799338  0.0
min  0.000000  0.000000  0.000000  1.000000  2016.0
25%  0.000000  0.000000  0.000000  92.250000  2016.0
50%  0.000000  8.500000  2.000000  183.500000  2016.0
75%  8.000000  62.750000  15.000000  274.750000  2016.0
max  68.000000  546.000000  117.000000  366.000000  2016.0

pv=dados.pivot_table(index='ano', columns='julianday', values='nfocos_atnpp',aggfunc='sum')

ano/julianday  1  2  3  4  5  6  7  8  9  10
1998    NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1999    0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
2009    0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  2.0  2.0 
 
O links para a documentação oficial é:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.crosstab.html
 

terça-feira, 27 de dezembro de 2016

Formatação de data na listagem de arquivos

Para saber a data dos arquivos utilizando a linha de comando de um terminal linux com o parâmetro -l teremos uma lista longa formatada da seguinte maneira:


ls -l *2016_12_26*
-rw-r--r-- 1 2008 2008  39907961 Dez 26 06:49 NOAA_19_HRPT_2016_12_26.05_05_16_CP1.tar.gz
-rw-r--r-- 1 2008 2008  41229371 Dez 26 05:40 NOAA_19_HRPT_2016_12_26.05_06_33_CB1.tar.gz
-rw-r--r-- 1 2008 2008  80397350 Dez 26 07:12 NOAA_19_HRPT_2016_12_26.06_44_15_CB1.tar.gz
-rw-r--r-- 1 2008 2008  34416052 Dez 26 07:05 NOAA_19_HRPT_2016_12_26.06_47_10_CP1.tar.gz
-rw-r--r-- 1 2008 2008 124668738 Dez 26 17:58 NOAA_19_HRPT_2016_12_26.17_37_26_CP1.tar.gz
-rw-r--r-- 1 2008 2008  90894824 Dez 26 18:48 NOAA_19_HRPT_2016_12_26.17_41_19_CB1.tar.gz
-rw-r--r-- 1 2008 2008 101945845 Dez 26 19:42 NOAA_19_HRPT_2016_12_26.19_19_03_CP1.tar.gz
-rw-r--r-- 1 2008 2008 121555056 Dez 26 19:52 NOAA_19_HRPT_2016_12_26.19_20_41_CB1.tar.gz




Porém possível modificar veja este exemplo:

ls -l --time-style=long-iso *2016_12_26*

-rw-r--r-- 1 2008 2008 39907961 2016-12-26 06:49 NOAA_19_HRPT_2016_12_26.05_05_16_CP1.tar.gz
-rw-r--r-- 1 2008 2008 41229371 2016-12-26 05:40 NOAA_19_HRPT_2016_12_26.05_06_33_CB1.tar.gz
-rw-r--r-- 1 2008 2008 80397350 2016-12-26 07:12 NOAA_19_HRPT_2016_12_26.06_44_15_CB1.tar.gz
-rw-r--r-- 1 2008 2008 34416052 2016-12-26 07:05 NOAA_19_HRPT_2016_12_26.06_47_10_CP1.tar.gz
-rw-r--r-- 1 2008 2008 124668738 2016-12-26 17:58 NOAA_19_HRPT_2016_12_26.17_37_26_CP1.tar.gz
-rw-r--r-- 1 2008 2008 90894824 2016-12-26 18:48 NOAA_19_HRPT_2016_12_26.17_41_19_CB1.tar.gz
-rw-r--r-- 1 2008 2008 101945845 2016-12-26 19:42 NOAA_19_HRPT_2016_12_26.19_19_03_CP1.tar.gz
-rw-r--r-- 1 2008 2008 121555056 2016-12-26 19:52 NOAA_19_HRPT_2016_12_26.19_20_41_CB1.tar.gz



Maiores informações sobre cada arquivo podem ser obtidas com o comando stat:

stat *2016_12_26*


File: ‘NOAA_19_HRPT_2016_12_26.05_05_16_CP1.tar.gz’
Size: 39907961 Blocks: 78272 IO Block: 65536 regular file
Device: 3fh/63d Inode: 70646391 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 2008/ UNKNOWN) Gid: ( 2008/ UNKNOWN)
Access: 2016-12-26 07:08:03.013374000 +0000
Modify: 2016-12-26 06:49:04.332533000 +0000
Change: 2016-12-26 06:49:04.332533000 +0000
Birth: -

File: ‘NOAA_19_HRPT_2016_12_26.05_06_33_CB1.tar.gz’
Size: 41229371 Blocks: 80856 IO Block: 65536 regular file
Device: 3fh/63d Inode: 70646390 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 2008/ UNKNOWN) Gid: ( 2008/ UNKNOWN)
Access: 2016-12-26 05:40:19.257489000 +0000
Modify: 2016-12-26 05:40:14.862559000 +0000
Change: 2016-12-26 05:40:14.862559000 +0000
Birth: -