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.
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:
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
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
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:
Porém possível modificar veja este exemplo:
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.gzPoré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: -
Assinar:
Postagens (Atom)