1. Introdução
2. O Algoritmo de rastreio e estrutura dos dados
2.1 Algoritmo
2.2 Estrutura dos dados
3. Metodologia
3.1 Download e instalação da biblioteca
3.2 Organização dos dados
3.2.1 Função: "fam_generator()"
3.3 Trajetória
3.4 Leitura dos dados Função: “stanalyzer.read_data()
3.5 Ciclo de vida “stanalyzer.life_cycle()”
3.6 Filtro de eventos e consultas”
3.6.1 Filtro por duração Função: “stanalyzer.time_filter()”.
3.6.2 Filtro por tipo de evento “stanalyzer.fam_type(data)".
3.7 Visualização”
3.7.1 Rosa dos Ventos “stanalyzer.plot_wind()
3.7.2 Linhas “stanalyzer.plot_lines()
$ git clone https://github.com/helvecioneto/stanalyzer
$ cd stanalyzer
$ conda env create --file stanalyzer.yml
$ conda activate stanalyzer
## Importação da biblioteca
import stanalyzer as sta
## Parâmetro que indica o arquivo de saída gerado pelo algoritmo de rastreio.
PATH= '~/S201409070000_E201409100000_VDBZc_T20_L5_SPLTTrue_MERGTrue_TCORTrue_PCORFalse.zip'
## Caminho que indica os arquivos que o algoritmo utilizou para realizar o rastreio (arquivos netCDF).
DATA_PATH = '~/DADOS/sbandradar/'
## Nome da variável presente nos arquivos netCDF.
VAR_NAME = 'DBZc'
## Nível de elevação dos dados da matriz 3 dimensional referente às varreduras volumétricas de radar.
LEVEL = 5
## Limiares de rastreio.
THRESHOLD = [20,35,40]
## Diretório de saída para os novos arquivos.
OUTPUT = './output/'
NC_OUTPUT = './output/data/'
OUTPUT_FILE = './output/output_file_tracked'
## Função que inicia o processo de geração das famílias.
sta.fam_generator()
### Flags para autoreload
%load_ext autoreload
%autoreload 2
## Importação biblioteca do sistema
import sys
sys.path.append("../")
## Importação da biblioteca stanalyzer
import stanalyzer as sta
## Chamada da função read_file() e armazenamento em um DataFrame (track_frame)
track_frame = sta.read_file('../output/tracking_compressed.pkl')
## Cabeçalho do DataFrame
track_frame.head()
No DataFrame abaixo (lifes) as informações estão armazenadas de acordo com o uid (Identificador Único), times (Corresponde ao número de vezes que o cluster permaneceu ativo), begin (Data de inicio do evento), end (Data de dissipação ou fusão do cluster) e duration (Tempo de duração do evento).
## Esta função retorna a duração dos eventos
lifes = sta.life_cycle(track_frame,sort=True)
lifes
### Exemplo 4.
## PAR METROS
TIME_MIN = 2 # Tempo mínimo de duração de um evento
TIME_MAX = 4 # Tempo máximo
UNIT = 'h' # String para unidade temporal (h = hora, m = minuto)
## Uso do filtro de eventos baseado no tempo mínimo e máximo
track_frame_filtered = sta.time_filter(track_frame, TIME_MIN, TIME_MAX, UNIT)
track_frame_filtered.head()
## Esta função retorna a duração dos eventos
verification = sta.life_cycle(track_frame_filtered,sort=True)
verification.head()
## Função fam_type para eventos famílias apenas com eventos de continuidade
cont_events = sta.fam_type(track_frame,'CONT')
## Função fam_type para eventos famílias apenas com eventos de continuidade
splt_events = sta.fam_type(track_frame,'SPLT')
## Função fam_type para eventos famílias apenas com eventos de continuidade
merg_events = sta.fam_type(track_frame,'MERG')
print('Tempo médio das famílias do tipo CONT:',sta.life_cycle(cont_events,sort=True)['duration'].mean())
print('Tempo médio das famílias do tipo SPLT:',sta.life_cycle(splt_events,sort=True)['duration'].mean())
print('Tempo médio das famílias do tipo MERG:',sta.life_cycle(merg_events,sort=True)['duration'].mean())
A saída da “stanalyzer.track()” retorna uma imagem com base no último registro da coluna “timestamp” do DataFrame utilizado pela biblioteca stanalyzer. Na imagem gerada pela função é possível selecionar e visualizar características relacionadas às geometrias, clusters e a trajetória das células precipitantes rastreadas. Os botões laterais na esquerda da Figura 5. e Figura 6. possuem funções interativas que alteram as informações diretamente na imagem gerada. Além destes botões, informações relacionadas aos clusters podem ser visualizadas ao passar o indicador do mouse sobre o centróide de cada cluster. Estas informações surgem como um “balão” na tela. A Figura 6. demonstra esta funcionalidade, e também é demonstrado como estão distribuídos os clusters rastreados em 20 dBZ com o botão “Clusters 20 dBZ” selecionado.
Opções de visualização
## Nome da variável com as matrizes de dados nos arquivos netCDF.
VAR = "DBZc"
## Caso dados contenham múltiplos níveis, se não deixar vazio.
LEVEL = 5
## Operação para filtrar dados de visualização com time <= 100 (coluna time)
query_frame = track_frame.query('time <= 100')
## Função para visualização
sta.track(query_frame, var=VAR, level=LEVEL)
## Filtro no dataFrame para eventos no time <= 100.
query = track_frame.query('time <= 100')
# ## Modo gráfico para wind rose com estilo scatter (Figura 7.b).
wind_frame = sta.plot_wind(query, style = 'scatter')
Caso seja necessário trabalhar com os dados de direção e vento a função plot_wind também retorna um DataFrame.
wind_frame
Uma outra maneira de visualização dos dados de direção e velocidade de propagação dos clusters é por meio do wind_plot() como gráfico de barras. Abaixo segue um exemplo que foi aplicado filtro individual por tempo.
## Filtro no dataFrame para eventos no tempo <= 40
query2 = track_frame.query('time <= 40')
# ## Modo gráfico para wind rose com estilo bar (Figura 7.b).
wind_frame2 = sta.plot_wind(query2, style = 'bar')
## Lista dos UIDs
LIST_UIDS = [182]
## Filtro no DataFrame.
query = track_frame.query('uid == @LIST_UIDS')
## Colunas analisadas e nome do eixo y na Figura 8a.
ANALIZE_a = ['mean_ref_20','mean_total_ref_35','mean_total_ref_40']
AXIS_NAME_a = 'dBZ'
## Colunas analisadas e nome do eixo y na Figura 8b.
ANALIZE_b = ['size_20','total_size_35','total_size_40']
AXIS_NAME_b = 'Tamanho (pixels)'
## Função plot_lines da Figura 8a.
sta.plot_lines(track_frame.query('uid == @LIST_UIDS'), analyze_columns=ANALIZE_a, axis_name=AXIS_NAME_a)
## Função plot_lines da Figura 8b.
sta.plot_lines(track_frame.query('uid == @LIST_UIDS'), analyze_columns=ANALIZE_b, axis_name=AXIS_NAME_b)
O arquivo utilizado para análise corresponde eventos que ocorreram entre os dias 2014-09-07 00:00:00 e 2014-09-09 23:48:00 na área de cobertura do radar SIPAM-MANAUS.
print('Eventos rastreados entre: ',track_frame['timestamp'].min(),' e ',track_frame['timestamp'].max())
Agrupando o grupo de clusters que apresentaram apenas continuidade no seu movimento temos o seguinte caso, para refletividade média.
### Eventos Continous
sta.plot_lines(cont_events, analyze_columns=['mean_ref_20','mean_total_ref_35','mean_total_ref_40'], axis_name='Reflectivity (dBZ)')
Observando a rosa dos ventos que retrata a direção e intensidade de propagação dos sistemas, é possível observar na imagem abaixo que os sistemas deslocaram-se preferêncialmente na direção 180°, o que corresponde aos padrões de propagação para região de cobertura do Radar SIPAM-MANAUS.
wind_frame_cont = sta.plot_wind(cont_events, style = 'scatter')
wind_frame_cont
### Eventos Split
sta.plot_lines(splt_events,analyze_columns=['mean_ref_20','mean_total_ref_35','mean_total_ref_40'], axis_name='Reflectivity (dBZ)')
### Eventos Split
sta.plot_lines(merg_events,analyze_columns=['mean_ref_20','mean_total_ref_35','mean_total_ref_40'], axis_name='Reflectivity (dBZ)')
[1] JACOB, Daniel J. Introduction to atmospheric chemistry. Princeton University Press, 1999.
[2] HOUZE JR, Robert A. Structures of atmospheric precipitation systems: A global survey. Radio Science, v. 16, n. 5, p. 671-689, 1981.
[3] DE QUEIROZ, Antônio Paulo. Monitoramento e previsão imediata de tempestades severas usando dados de radar. 2009.
[4] LEAL NETO, Helvécio. B. Rastreio e previsão de sistemas precipitantes e convectivos na bacia Amazônica utilizando aprendizado de máquina não-supervisionado. 144 p. IBI: <8JMKD3MGP3W34R/44HGF8E>. Dissertação (Mestrado em Computação Aplicada) - Instituto Nacional de Pesquisas Espaciais (INPE), São José dos Campos, 2021. Disponível em: http://urlib.net/rep/8JMKD3MGP3W34R/44HGF8E. Acesso em: 20 ago. 2021.
[5] RUSSELL, Christopher T. Geophysical coordinate transformations. Cosmic Electrodynamics, v. 2, n. 2, p. 184-196, 1971.
[6] FERREIRA, Karine R.; CAMARA, Gilberto; MONTEIRO, Antônio M. V. An algebra for spatiotemporal data: From observations to events. Transactions in GIS, v. 18, n. 2, p. 253-269, 2014.
[7] MACHADO, L. A. T. et al. Life cycle variations of mesoscale convective systems over the Americas. Monthly Weather Review, v. 126, n. 6, p. 1630-1654, 1998.
[8] MACHADO, Luiz A. T.; LAURENT, Henri. The convective system area expansion over Amazonia and its relationships with convective system life duration and high-level wind divergence. Monthly weather review, v. 132, n. 3, p. 714-725, 2004.
[9] ANSELMO, Evandro M. et al. Amazonian mesoscale convective systems: Life cycle and propagation characteristics. International Journal of Climatology, 2021.
[10] MACHADO, Luiz A.T. et al. Overview: Precipitation characteristics and sensitivities to environmental conditions during GoAmazon2014/5 and ACRIDICON-CHUVA. Atmospheric Chemistry and Physics, v. 18, n. 9, p. 6461-6482, 2018.
[11] EICHHOLZ, Christiano. W. Análise cinemática e dinâmica da propagação de células de chuva e aglomerados de nuvens. 2017. 157 p. IBI: <8JMKD3MGP3W34P/3NQ5D2P>. (sid.inpe.br/mtc-m21b/2017/04.28.15.17-TDI). Tese (Doutorado em Meteorologia) - Instituto Nacional de Pesquisas Espaciais (INPE), São José dos Campos, 2017. Disponível em: http://urlib.net/rep/8JMKD3MGP3W34P/3NQ5D2P.
[12] CRUTCHER, Harold L. On the standard vector-deviation wind rose. Journal of Atmospheric Sciences, v. 14, n. 1, p. 28-33, 1957.
Variável -> Especificação
Fam_N -> Refere-se ao número da Família rastreada.
timestamp -> Um registro da hora de ocorrência de um determinado evento.
time -> Refere-se ao tempo de rastreio no algoritmo.
uid -> Identificador único, é usado para gerar as famílias.
id_t -> Identificador de cluster de referência no momento da ocorrência de rastreamento. Do algoritmo de armazenamento em cluster DBSCAN.
lat -> Refere-se ao centróide de latitude, obtido da matriz de referência dos arquivos nc originais.
lon -> Refere-se ao centróide da longitude, obtido da matriz de referência dos arquivos nc originais.
p0 -> O primeiro ponto de coordenada do centróide na matriz (clusters ou nc_file): (p0, p1) = (x, y) = (lon, lat).
p1 -> O segundo ponto de coordenada do centróide na matriz (clusters ou nc_file): (p0, p1) = (x, y) = (lon, lat).
size_%THRESHOLD -> Número total de pixels no cluster principal. Cada ponto depende da resolução espacial do sensor (tamanho do pixel): RADAR 2x2km.
mean_ref_%THRESHOLD -> Refletividade média do cluster. Valor em dBZ.
max_ref_%THRESHOLD -> Refletividade máxima do cluster. Valor em dBZ.
angle_%THRESHOLD_orig -> ngulo de deslocamento original do cluster no momento atual.
angle_%THRESHOLD_cor -> ngulo de deslocamento corrigido do cluster no momento atual.
vel_%THRESHOLD_orig -> Velocidade de deslocamento original do aglomerado no tempo atual em quilômetros por hora (km / h).
vel_%THRESHOLD_cor -> Velocidade de deslocamento corrigida do aglomerado no tempo atual em quilômetros por hora (km / h).
mean_total_ref_%THRESHOLD -> Refletividade média dos clusters internos por limite (valor em dBZ).
total_size_%THRESHOLD -> Tamanho total dos clusters internos por limite (número de pixels).
n_cluster_%THRESHOLD -> Número total de clusters internos por Limite.
avg_angle_%THRESHOLD -> ngulo médio para o cluster interno por limite (valor em graus).
avg_vel_%THRESHOLD -> Velocidade média para clusters internos por limite (valor em km / h).
status -> Estado de ocorrência, tipo: NEW> Novo cluster; CONT-> Cluster contínuo; SPLT -> Cluster dividido; MERG -> Cluster mesclado.
delta_t -> Intervalo de tempo para o ciclo de vida do cluster.
nc_file -> Caminho do arquivo netCDF.
cluster_file -> Caminho do arquivo de cluster (cluster do DBSCAN).
dsize_%THRESHOLD -> Diferença entre os tamanhos de dois clusters consecutivos (em Pixel).
dmean_ref_%THRESHOLD -> Diferença entre as refletividades médias de dois clusters consecutivos para o limite principal (em dBZ).
dmean_total_ref_%THRESHOLD -> Diferença entre as refletividades médias de todos os clusters entre duas vezes consecutivas para um limite interno (em dBZ).
dtotal_size_%THRESHOLD -> Diferença entre o tamanho total (em pixel) de todos os clusters entre duas vezes consecutivas para um limite interno (valores em pixel).