python筛选处理天线暗室数据,得到1. 增益随频率变化 2.指定频点E面H面的主极化,交叉极化 的数据
应用场景
从天线暗室中获取的数据一次完整测试约有44万行数据,手动筛选出需要数据较为困难。暗室中的软件可以选择需要数据进行拷贝,但是一是在暗室的时间非常宝贵(学校其他课题组资源,5元/分钟收费)二是在暗室中筛选后的数据是不完整数据,后续处理中如果发现有遗漏数据后续补数据非常麻烦。所以不如一次性拷走所有数据通过代码筛选出所需要的数据,再用origin画图。
其他说明
本代码主要考虑实用性,实现相似功能的代码重复率较高(未将重复代码抽出复用)
所需数据材料格式
从天线暗室导出的初始数据即可。格式为.csv文件(如果是.xlsx或者.xls文件另存为.csv即可)。表头如下:
- 第一行的表头固定为’Frequency’ ,‘Phi’ ,‘Theta’ ,‘Gain Phi. dB’,‘Gain Theta. dB’(后续数据处理的识别中使用)
- 本文中暗室所用数据的Phi和Theta的单位为弧度
处理数据步骤
一、Python目录结构
示例中该项目名为antenna,需要处理的初始文件(xx.csv)放在antenna下的files文件夹中
--antenna
--files
--xx.csv
--xx
--筛选后的文件.csv
--set.py
--selectphi0.py
--selectphi90.py
--selectallgain.py
--selectfrequencyphi0.py
--selectfrequencyphi90.py
--selectfrequencytheta0.py
--selectfrequencytheta90.py
二、设置待处理文件名和需筛选的频点的集合
"set.py"文件设置需要处理的文件名和需要被筛选的频点
#需要处理的原始文件
origincsv = 'files/xx.csv'
#需要输出的采样频点 单位:GHz
used_frequency = ['2.15','2.45','2.9','3.45','3.85']
三、分别筛选出所有phi=0 theta=0的数据和phi=90 theta=90的数据
数据初处理:分别筛选出所有phi=0和phi=90的数据,方便后续筛选出所需要频点的方向图所需数据,每次从44万行数据中筛选时间较久,故做一次初筛。
其对应的文件分别为:selectphi0.py 和 selectphi90.py
- 需要安装pandas扩展
selectphi0.py代码如下
import pandas as pd
import math
import os
from set import *
#初始数据表格
print(os.path.exists(origincsv))
#显示当前工作目录
originfilename = os.path.splitext(origincsv)[0]
#df = pd.concat(map(pd.read_csv, ['wlj11.csv', 'gainphi.csv','gaintheta.csv']))
df1 = pd.read_csv(origincsv)
contents1 = [['Frequency','Phi','Theta','Gain Phi. dB']]
contents2 = [['Frequency','Phi','Theta','Gain Theta. dB']]
for index, row in df1.iterrows():
frequency, phi, theta, gainphi, gaintheta = row['Frequency'], row['Phi'], row['Theta'], row['Gain Phi. dB'], row['Gain Theta. dB']
if(phi != 0):
print(index)
else:
#print(gainphi)
contents1.append([frequency,phi,theta,gainphi])
contents2.append([frequency,phi,theta,gaintheta])
folder = os.path.exists('./'+ originfilename)
if not folder: #判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs('./'+ originfilename)
gainphi = pd.DataFrame(contents1)
gainphi.to_csv(originfilename + "/gainphi0.csv",index=False,header=False)
gaintheta = pd.DataFrame(contents2)
gaintheta.to_csv(originfilename + "/gaintheta0.csv", index=False,header=False)
phi90与phi0代码相似。上述代码中的if判断改为:
if(round(phi,2) != 1.57):
print(index)
- 90度对应的弧度值为1.57
四、筛选出增益随频率变化曲线所需的数据
- 默认所需增益数据为phi=0和theta=0。其他需要数据可以按照自己需求做更改。
对应文件为:selectallgain.py
import pandas as pd
import math
import os
from set import *
#初始数据表格
print(os.path.exists(origincsv))
#显示当前工作目录
#print("current working directory",os.getcwd())
originfilename = os.path.splitext(origincsv)[0]
df1 = pd.read_csv(origincsv)
contents = [['Frequency','Phi','Theta','Gain Theta. dB']]
for index, row in df1.iterrows():
frequency, phi, theta, gainphi, gaintheta = row['Frequency'], row['Phi'], row['Theta'], row['Gain Phi. dB'], row['Gain Theta. dB']
if(phi == 0 and int(math.degrees(theta)) == 0 ):
contents.append([frequency,phi,theta,gaintheta])
else:
print(index)
folder = os.path.exists('./'+ originfilename)
if not folder: #判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs('./'+ originfilename)
gaintheta = pd.DataFrame(contents)
gaintheta.to_csv(originfilename + "/allgain.csv", index=False,header=False)
五、筛选所需频点方向图需要数据
- 需要被筛选的频点配置在set.py
对应文件为:
--selectfrequencyphi0.py
--selectfrequencyphi90.py
--selectfrequencytheta0.py
--selectfrequencytheta90.py
代码相似,筛选条件不同。以selectfrequencyphi0.py为例:
import pandas as pd
import math
import os
import numpy as np
from set import *
#初始数据表格
#origincsv = 'files/w12.csv'
#显示当前工作目录
#print("current working directory",os.getcwd())
originfilename = os.path.splitext(origincsv)[0]
dealcsv = originfilename+ "/gainphi0.csv"
print(os.path.exists(originfilename+ "/gainphi0.csv"))
print(used_frequency)
#df = pd.concat(map(pd.read_csv, ['wlj11.csv', 'gainphi.csv','gaintheta.csv']))
df1 = pd.read_csv(dealcsv)
contents1 = [['Frequency','Phi','Theta','Gain Phi. dB']]
#判断是否存在文件夹如果不存在则创建为文件夹
folder = os.path.exists('./'+ originfilename)
if not folder:
os.makedirs('./'+ originfilename)
for item in used_frequency:
itemdata = []
for index, row in df1.iterrows():
frequency, phi, theta, gainphi = row['Frequency'], row['Phi'], row['Theta'], row['Gain Phi. dB']
dealfre = frequency/10E8
if(str(dealfre) == item):
itemdata.append([frequency,phi,theta,gainphi])
else:
print(dealfre)
#print(itemdata)
#sys.exit()
gain_data = pd.DataFrame(itemdata)
gain_data.to_csv(originfilename + "/"+ item + "gainphi0.csv",index=False,header=['Frequency','Phi','Theta','Gain Phi. dB'])
该筛选数据对应的论文中的频点方向图为这种: