自己玩转QAR数据
Ronald H. Coase
数据量大,QAR通常几百列几万行,Excel处理小规模数据还可以,多了就不行。 空数据处理,QAR不是每个数据都同步采样,有的1秒1次,有的1秒多次,造成很多空格没有数据,这样一来很难把多个字段数据画到一张图上对比分析。 对于发现的细节,需要重新取样画图。
# designed by Ubuntu330from openpyxl import load_workbook #调用操作excel的库openpyxl 版本3.0.5import matplotlib.pyplot as plt #调用绘图库matplotlib 版本3.3.2import timeplt.figure(figsize=(8,4.5),facecolor='black') #定义窗口大小颜色plt.style.use('dark_background') #选择图表配色风格print('Loading data......pls wait......',time.strftime('%H:%M:%S',time.localtime()) ) #安慰式提示wb = load_workbook('data\qar.xlsx') #从文件夹data中装入QAR原始数据qar.xlsxws = wb.active #打开数据表print('Data loaded...',time.strftime('%H:%M:%S',time.localtime()) ) #载入数据完成# 设计单列图形化函数def qaritem(column,name,style,width,color): listx = [] listy=[] list = [] for cell in ws[column]: c=(cell.value) if isinstance(c,int) or isinstance(c,float): #找出数字,去除非数字格 list.append(c) x=cell.row listx.append(x)
ma=max(list) #数据尺度格式化:为避免各列数值相差太大导致显示混乱,统一缩放到0-100 mi=min(list) for y in list: y=(y-mi)*100/(ma-mi) listy.append(y)
#print(listx, listy) #去掉注释后用于纠错 plt.plot(listx, listy, label=name, linestyle=style,linewidth=width,color=color) return# 单列图形化函数结束
# 以下为用户根据需要编辑qaritem(column='N',name='ALT_STDC',style='-',width=1,color='coral') #调用单列图形化函数,下同qaritem(column='W',name='IASC',style='-',width=1,color='lightgreen')qaritem(column='AX',name='VRTG',style='-',width=1,color='orchid')qaritem(column='U',name='IVVR',style='--',width=1,color='steelblue')#qaritem(column='AZ',name='N11',style=':',width=1,color='salmon')
# 显示绘图结果plt.title('QAR-items Chart') #图标标题plt.legend(loc='best') #图例参数plt.show() #显示图表
wb.close() #关闭数据表
# designed by Ubuntu330
# 为QAR的xlsx文件减肥,提高运算效率
from openpyxl import load_workbook #调用操作excel的库openpyxl 版本3.0.5
import time #调用时间库,用于显示清洗进度
print('Loading data......pls wait......',time.strftime('%H:%M:%S',time.localtime()) ) #安慰式提示
wb = load_workbook('data\qar.xlsx') #从文件夹data中装入QAR原始数据qar.xlsx
ws = wb.active #打开数据表
print('Data loaded...',time.strftime('%H:%M:%S',time.localtime()) ) #载入数据完成
kill=[] #定义要清除的列表
cols=ws.max_column #获取数据表列数
rows=ws.max_row #获取数据表行数
i=0
print('collect empty column from ',cols,' columns:',end=' ')
while i <= cols:
i = 1
print(i,end=' ') #用户等待时间长,显示翻查进展
j=1
k=False
v1 = ws.cell(row=j, column=i).value
while j <= rows:
j = 1
v=ws.cell(row=j, column=i).value #遍历每列单元格值
if v != None: #寻找第一个非空值
v1=v
break
while j <= rows:
j = 1
v=ws.cell(row=j, column=i).value #遍历每列单元格值
if v != None and v != v1: #找出全列为空或者数值无变化的列
k=True
break
if k == False:
kill.append(i) #找出来的空列放入清除列表
print()
print('deleting:')
kill.reverse() #列表反转,从后向前删除列,目的是删除时避免指针错乱
if len(kill)>1: #如果存在空列,则开始删除,否则结束运行
kill1=kill[0]
kill2=kill[1:]
killpair=[]
k=1
for i in kill2: #逐列删除太慢,将连续列转为组合进行删除,提高清理速度
if i==kill1-1:
k = 1
kill1=i
else:
killpair.append([kill1,k])
kill1=i
k=1
killpair.append([kill1,k])
pairs=len(killpair)
kk=0
for i in killpair: #遍历删除组合列
a=i[0]
b=i[1]
ws.delete_cols(a,b) #删除该组合列
pairs -= 1 #计算剩余组合列数
print(a,'-',a b-1, 'deleted','at',time.strftime('%H:%M:%S',time.localtime()),pairs,'left') #显示删除进展
#kk = 1 #!!如果数据太大,清洗期间需要关机,建议将这五行代码激活
#if kk==50: #!!决定删除多少次保存一次,不宜太频繁,保存大文件也很耗时
# wb.save('data\qar.xlsx') #!!保存文件
# print('saved at',time.strftime('%H:%M:%S',time.localtime()))
# kk=0 #!!五行代码结束
wb.save('data\qar.xlsx') #保存清理后的最终数据
wb.close() #关闭数据表