- #!/usr/bin/envpython
- #-*-coding:cp936-*-
- #===============================================================================
- #开发需求:与数据分离工具共同使用,该程序主要用来分析单位时间的单表入库平均值
- #1.设定一个分析时间片,单位为分钟,AnalyseTimeArea
- #2.可设定需要分析数据库表所在字段,AnalyseField
- #===============================================================================
- importthreading,os,time
- classReadConfig():
- defBase_Config(self):
- #配置话单路径
- TelPath=os.getcwd()+"\\Analyse"
- #printTelPath
- returnTelPath
- classGetPath(ReadConfig):
- defGet_Path(self):
- #获取路径下分析文件,建立字典
- dict={}
- dir_temp=[]
- file_temp=[]
- basepath=self.Base_Config()
- #printbasepath
- forroot,dirs,filesinos.walk(self.Base_Config()):
- #获取文件夹节点,获取文件夹对应文件
- fordirindirs:
- dir_temp.append(dir)
- dir_temp.sort()
- foriindir_temp:
- #printself.Base_Config()+"\\"+str(i)
- forroot,dirs,filesinos.walk(self.Base_Config()+"\\"+str(i)):
- #获取对应文件夹下的数据
- file_temp.append(files)
- foriinrange(len(dir_temp)):
- #建立数据字典
- dict[dir_temp[i]]=file_temp[i]
- returnbasepath,dict
- classThreadMain(threading.Thread,GetPath):
- def__init__(self):
- #设定一个分析时间片,单位为秒级滑动,如小于1分钟(30秒:0.5分钟)
- #self.AnalyseTimeArea=1.0,后续分析使用float型
- self.AnalyseTimeArea=30
- #需要分析数据库表所在字段
- self.AnalyseField=9
- basepath,dict=self.Get_Path()
- #printbasepath,dict
- self.dict=dict
- self.basepath=basepath
- defThread_Contorl(self):
- #读取字典的索引,索引为文件夹节点self.dict.keys()[i]
- self.Add_Tel_Path_temp2=[]
- #printself.dict.keys()
- foriinrange(len(self.dict.keys())):
- self.Add_Tel_Path_temp1=[]
- #printself.dict.keys()[i],self.dict[self.dict.keys()[i]]
- foryinrange(len(self.dict[self.dict.keys()[i]])):
- #printself.dict.keys()[i],self.dict[self.dict.keys()[i]]
- #printlen(self.dict[self.dict.keys()[i]])
- self.Add_Tel_Path=self.basepath+"\\"+self.dict.keys()[i]+"\\"+self.dict[self.dict.keys()[i]][y]
- self.Add_Tel_Path_temp1.append(self.Add_Tel_Path)
- #printAdd_Tel_Path_temp1
- self.Add_Tel_Path_temp2.append(self.Add_Tel_Path_temp1)
- #Add_Tel_Path_temp2得到已文件夹节点分类数组,格式如下[[2008-3-8],[2008-3-10],[2008-3-9]]
- returnself.Add_Tel_Path_temp2
- #================================================================================
- #已文件夹为单位进行时间分割计算每日的话单总流量
- #MethodName:AnalyseMethod_Countdayflow
- #Author:xinkaiAdd:2008-3-10
- #================================================================================
- defAnalyseMethod_Countdayflow(self):
- self.CountFlow=0
- #由线程类获得分析数组
- self.AnalyseList=self.Thread_Contorl()
- #printAnalyseList
- foriinrange(len(self.AnalyseList)):
- #printself.dict.keys()[i],AnalyseList[i]
- #===============================================================================
- #此处需要加判断日期以及有效话单
- #===============================================================================
- foryinrange(len(self.AnalyseList[i])):
- #printAnalyseList[i][y]
- self.AnalyseData=open(self.AnalyseList[i][y],'r')
- #self.CountFlow+=len(self.AnalyseData.readlines())
- print"执行过程[%s]:第%s文件大小为%s文件"%(self.dict.keys()[i],y,len(self.AnalyseData.readlines()))
- self.CountFlow+=len(self.AnalyseData.readlines())
- self.AnalyseData.close()
- #printself.dict.keys()[i]+str(len(AnalyseData.readlines()))+"\n"
- #print"[",self.dict.keys()[i]+"]当日数据总流量为:"+str(self.CountFlow)
- #================================================================================
- #已文件夹为单位进行时间分割按照划定的时间片对每日话单分时流量进行统计
- #MethodName:AnalyseMethod_CountTimeFlow
- #Author:xinkaiAdd:2008-3-10
- #================================================================================
- defAnalyseMethod_CountTimeFlow(self):
- #Analyse_CountTimeFlow=open('Analyse_CountTimeFlow.log','w')
- #由线程类获得分析数组
- self.AnalyseList=self.Thread_Contorl()
- foriinrange(len(self.AnalyseList)):
- temp=[]
- self.AnalyseStack=[]
- self.AnalyseStackSend=[]
- foryinrange(len(self.AnalyseList[i])):
- #已时间文件夹为分割点,分类读取话单进行分析
- #用来计算每个文件中每个话单记录的时间堆栈
- self.AnalyseData=open(self.AnalyseList[i][y],'r')
- self.AnalyseStackSend.append(self.AnalyseData.readlines())
- #用来计算基础时间轴的堆栈AnalyseStack
- self.AnalyseData=open(self.AnalyseList[i][y],'r')
- self.AnalyseStack.append(self.AnalyseData.readlines()[0])
- #已文件夹时间点分割,获取基础时间轴
- self.BaseTimeCenter=self.AnalyseStack[0].split(',')[self.AnalyseField]
- #转化话单发送时间为整数
- count=0
- self.ChangeBaseTime=self.ChageTime(self.BaseTimeCenter)
- forhinrange(len(self.AnalyseList[i])):
- forzinself.AnalyseStackSend[h]:
- self.TelTime=self.ChageTime(z.split(',')[self.AnalyseField])
- #printstr(self.TelTime)+"//\\"+str(self.ChangeBaseTime)
- importmath
- #获得已基础时间为轴的时间差值
- #printint(math.fabs(self.TelTime-self.ChangeBaseTime))/60
- #print"TelTime",self.TelTime
- print"ChangeBaseTime",self.ChangeBaseTime
- #if(self.TelTime-self.ChangeBaseTime)==0:
- #count+=1
- #print"count",count
- temp.append((int(math.fabs(self.TelTime-self.ChangeBaseTime)))/self.AnalyseTimeArea)
- #Analyse_CountTimeFlow.writelines("话单时间:%s\n初始时间片时间片分时流量\n"%(self.dict.keys()[i]))
- #Analyse_CountTimeFlow.close()
- printself.BaseTimeCenter[1:11]
- forjinrange(86400/self.AnalyseTimeArea):
- iftemp.count(j)<>0:
- #Analyse_CountTimeFlow=open('Analyse_CountTimeFlow.log','a')
- #printj%self.AnalyseTimeArea
- print"分析日期,%s,分析时间片,%s,秒钟,第,%s,时间片,分时流量为,%s,条,"%(self.BaseTimeCenter[1:11],self.AnalyseTimeArea,j,temp.count(j))
- #Analyse_CountTimeFlow.writelines("%s%s%s\n"%(self.AnalyseTimeArea,j,temp.count(j)))
- #print"总计分析时间片=",self.AnalyseTimeArea*(j+1)
- time.sleep(1000)
- defChageTime(self,datatime):
- #初始化变量
- self.YearMD=""
- self.TimeCS=""
- #引用时间参数
- self.datatime=datatime
- self.SplitDataTime2=self.datatime[1:11].split('-')
- self.SplitDataTime3=self.datatime[12:20].split('.')
- #分割结果['2008','03','10']['11','18','18']
- #组合分割数据转换时间为整数
- foriinself.SplitDataTime2:
- self.YearMD+=i
- forhinself.SplitDataTime3:
- self.TimeCS+=h
- self.newTime=self.YearMD+self.TimeCS
- returnint(self.newTime)
- def__del__(self):
- pass
- classControlThread(ThreadMain):
- def__init__(self):
- basepath,dict=self.Get_Path()
- self.dict=dict
- self.basepath=basepath
- defControl_Thread(self):
- #控制使用分析线程
- print"-----------------------------------------"
- ObjectThread=ThreadMain()
- print"开始计算每日流量:"
- ObjectThread.AnalyseMethod_Countdayflow()
- print"计算结束"
- print"-----------------------------------------"
- importtime
- time.sleep(0.01)
- print"开始计算分时流量:"
- ObjectThread.AnalyseMethod_CountTimeFlow()
- print"计算结束"
- print"-----------------------------------------"
- if__name__=="__main__":
- ObjectControl=ControlThread()
- ObjectControl.Control_Thread()
- #path=ReadConfig(path)
一段程序代码的修改,将原来按分钟活动的方式改为秒级滑动,可以提供数据分析的精度...
本文介绍了一种话单流量分析系统的设计与实现。系统能够计算指定时间内的单表入库平均值,包括每日总流量及分时流量统计。通过读取指定路径下的文件,按日期和时间片进行话单流量分析。

被折叠的 条评论
为什么被折叠?



