Instalação
Como parte dessa lib utiliza código c compilado com Cython
, é preciso que um compilador C
esteja instalado. É recomendado a criação de um ambiente virtual para que a instalação das dependências não interfira com o a instalação base do python. Para tal é recomendamos o uso do conda. A seguir é mostrado instruções para a criação do ambiente virtual, com todas as dependências utilizando o conda.
Instale o miniconda. Com o conda instalado e disponível no seu PATH
ou através do Anaconda Prompt
, execute os comando:
Linux:
Em Linux normalmente o sistema já possui o compilador gcc
instalado.
conda create -n rfpye pip python=3.7 gcc -c intel -c conda-forge -y
conda activate rfpye
python -m pip install rfpye
Windows
É preciso ter o compilador Microsoft Visual C++ 2015-2019 Redistributable x64
Versão 14.x instalado.
conda create -n rfpye pip python=3.7 libpython m2w64-toolchain -c intel -y
conda activate rfpye
python -m pip install rfpye
O comando acima cria um ambiente virtual com o mesmo nome da biblioteca rfpye
, instala as dependências básicas necessárias para a compilação, em seguida ativa o ambiente virtual e instala o módulo.
Depois disso basta instalar normalmente a lib:
python -m pip install rfpye
Precisamos necessariamente de um diretório de entrada, contendo um ou mais arquivos .bin
Mude os caminhos abaixo para suas pastas locais
from fastcore.xtras import Path
from rfpye.utils import get_files
from rich import print
A função abaixo baixa alguns arquivos de exemplo:
path = Path(r'binfiles')
if not path.exists() or not len(get_files(path, extensions=['.bin'])):
path = Path('.')
!wget --header 'Host: raw.githubusercontent.com' --user-agent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0' --header 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' --header 'Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3' --referer 'https://github.com/EricMagalhaesDelgado/SpecFiles/blob/main/Combo3%20(CRFS%20Bin%20-%20DataTypes%204%2C%207%2C%208%2C%2060-65%20e%2067-69)/rfeye002092_210208_T202310_CRFSBINv.5.bin' --header 'DNT: 1' --header 'Upgrade-Insecure-Requests: 1' 'https://raw.githubusercontent.com/EricMagalhaesDelgado/SpecFiles/main/Combo3%20(CRFS%20Bin%20-%20DataTypes%204%2C%207%2C%208%2C%2060-65%20e%2067-69)/rfeye002092_210208_T202310_CRFSBINv.5.bin' --output-document 'rfeye002092_210208_T202310_CRFSBINv.5.bin'
!wget --header 'Host: raw.githubusercontent.com' --user-agent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0' --header 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' --header 'Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3' --referer 'https://github.com/EricMagalhaesDelgado/SpecFiles/blob/main/Combo3%20(CRFS%20Bin%20-%20DataTypes%204%2C%207%2C%208%2C%2060-65%20e%2067-69)/rfeye002092_210208_T203131_CRFSBINv.2.bin' --header 'DNT: 1' --header 'Upgrade-Insecure-Requests: 1' 'https://raw.githubusercontent.com/EricMagalhaesDelgado/SpecFiles/main/Combo3%20(CRFS%20Bin%20-%20DataTypes%204%2C%207%2C%208%2C%2060-65%20e%2067-69)/rfeye002092_210208_T203131_CRFSBINv.2.bin' --output-document 'rfeye002092_210208_T203131_CRFSBINv.2.bin'
!wget --header 'Host: raw.githubusercontent.com' --user-agent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0' --header 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' --header 'Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3' --referer 'https://github.com/EricMagalhaesDelgado/SpecFiles/blob/main/Combo3%20(CRFS%20Bin%20-%20DataTypes%204%2C%207%2C%208%2C%2060-65%20e%2067-69)/rfeye002292_210208_T202215_CRFSBINv.4.bin' --header 'DNT: 1' --header 'Upgrade-Insecure-Requests: 1' 'https://raw.githubusercontent.com/EricMagalhaesDelgado/SpecFiles/main/Combo3%20(CRFS%20Bin%20-%20DataTypes%204%2C%207%2C%208%2C%2060-65%20e%2067-69)/rfeye002292_210208_T202215_CRFSBINv.4.bin' --output-document 'rfeye002292_210208_T202215_CRFSBINv.4.bin'
!wget --header 'Host: raw.githubusercontent.com' --user-agent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0' --header 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' --header 'Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3' --referer 'https://github.com/EricMagalhaesDelgado/SpecFiles/blob/main/Combo3%20(CRFS%20Bin%20-%20DataTypes%204%2C%207%2C%208%2C%2060-65%20e%2067-69)/rfeye002292_210208_T203238_CRFSBINv.3.bin' --header 'DNT: 1' --header 'Upgrade-Insecure-Requests: 1' 'https://raw.githubusercontent.com/EricMagalhaesDelgado/SpecFiles/main/Combo3%20(CRFS%20Bin%20-%20DataTypes%204%2C%207%2C%208%2C%2060-65%20e%2067-69)/rfeye002292_210208_T203238_CRFSBINv.3.bin' --output-document 'rfeye002292_210208_T203238_CRFSBINv.3.bin'
A função parse_bin
é a função principal que encapsula o processamento dos arquivos bin.
Vamos listar arquivos da última versão do script Logger, CRFS Bin - Versão 5
files = get_files(r'binfiles/v5', extensions=['.bin'])
file = files.shuffle()[0]
%%time
dados = parse_bin(file)
print(dados)
A saída da função é um dicionário, com os metadados do arquivo.
Se você imprimir a classe retornada pela chave gps
é retornado um resumo dos seus atributos:
print(dados['gps'])
Para extrair os atributos em si de dado objeto e retorná-los todos num dicionário, o módulo utils tem a função auxiliar
getattrs
print(getattrs(dados['gps']))
Os atributos listados são os valores consolidados por meio da mediana dos diversos blocos de GPS do arquivo.
dados['gps'][0] , dados['gps'][-1]
for coords in dados['gps']:
lat, long, alt, num = coords
print(f'{lat:.6f} {long:.6f} {alt:.6f} {num}')
break
Para saber quantos dados brutos existem, basta utilizar a função len
:
len(dados['gps'])
fluxos = dados['spectrum']
print(len(fluxos))
Vamos investigar um deles:
fluxo = fluxos[0]
Ao imprimir um fluxo é mostrado informações mínimas sobre o seu conteúdo:
print(fluxo)
A função repr
retorna uma representação com todos os metadados do fluxo:
print(repr(fluxo))
Qualquer um dos atributos listados podem ser acessados diretamente:
print(fluxo.description) , print(fluxo.bw)
No entanto o principal atributo de um fluxo de espectro são os valores de nível medidos, os valores medidos são retornados por meio do atributo levels
:
print(fluxo.levels)
print(f'Formato da matriz com os níveis: {fluxo.levels.shape}')
O nº de linhas da matriz nos dá o número de pontos medidos naquele dado fluxo e as colunas o número de traços no qual o Span ( Stop - Start ) foi dividido. O número de traços pode ser retornada também por meio da função len
print(len(fluxo))
A classe Spectrum
é iterável, ou seja, pode ser acessada como uma lista, é retornada uma tupla com o timestamp e os pontos daquele traço:
for time, traço in fluxo:
print(time)
print(traço)
break
O atributo anterior retorna uma numpy.ndarray
, que é um formato eficiente para processamento.
Medidas de nível como pandas dataframe
No entanto temos adicionalmente o método .matrix()
que retorna a matriz de dados como um Pandas Dataframe formatada com o tempo da medição de cada traço como índice das linhas e as frequências de cada traço como coluna.
Vamos mostrar as cinco primeiras e cinco últimas linhas e colunas.
fluxo.matrix().iloc[:5, :5]
fluxo.matrix().iloc[-5:, -5:]
Novamente, caso desejado acessar todos os atributos de um fluxo no formato de dicionário, basta utilizar a função getattrs
print(getattrs(fluxo))
file = r'binfiles\Comprimidos\rfeye002290_210922_T204046_MaskBroken.bin'
%%time
compressed = parse_bin(file)
print(compressed)
fluxo = compressed['spectrum'] ; fluxos
fluxo = fluxos[0]
fluxo.matrix().iloc[:5, [0, 1, 2, -3, -2, -1]]
print(len(fluxo))
file = r'binfiles\v4\rfeye002292_210208_T202215_CRFSBINv.4.bin'
blocks = parse_bin(file)
print(blocks)
blocks['spectrum'][0].matrix().iloc[:5, [0, 1, 2, -3, -2, -1]]
file = r'binfiles\v3\rfeye002292_210208_T203238_CRFSBINv.3.bin'
blocks = parse_bin(file)
print(blocks)
blocks['spectrum'][0].matrix().iloc[:5, [0, 1, 2, -3, -2, -1]]
from rfpye.parser import parse_bin
file = r'binfiles\v2\rfeye002092_210208_T203131_CRFSBINv.2.bin'
blocks = parse_bin(file)
print(blocks)
blocks['spectrum'][0].matrix().iloc[:5, [0, 1, 2, -3, -2, -1]]
from rfpye.parser import parse_bin
file = r'binfiles\occ\rfeye002090-VCP_FM_occ15min_191221_085803.bin'
blocks = parse_bin(file)
print(blocks)
blocks['spectrum'][-1].matrix().iloc[:5, 1003:1010]