segunda-feira, 4 de maio de 2020

Comandos mágicos para edição rápida de arquivos txt em Shell

Estes comandos são apenas para recordar a sintaxe rápida pois a explicação depende de muita leitura, recomendo os livros do Verde (Aurélio Jargas) https://aurelio.net/ em especial https://aurelio.net/sed/sed-howto/#conhecendo-o-sed

# insere o texto "begin transation" na primeira linha do arquivo
# focos_terrama2q.sql
sed -i '1s/^/begin transaction; /' focos_terrama2q.sql 


# insere o texto na linha específica (linha 29322846)
sed -i '29322846s/^/commit; /' focos_terrama2q.sql

# insere o texto na ultima linha
echo "commit; " >> focos_terrama2q.sql

# insere algum texto a cada 100000 linhas
sed '0~100000 s/$/\ncommit;\nbegin;/g' < focos_terrama2q.sql > focos.sql



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