接着进入主程序的开发。
#coding=utf-8
import os,time,sys,re,datetime
import csv #处理CSV文件
import scipy
import numpy as np
from matplotlib.font_manager import FontProperties
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator,DateFormatter,AutoDateLocator
import MyStatis as MS
#读取目录下所有CSV文件
def Open_Csv(Dist):
Array_List =[]
Code_List= []
Code_Name_List = {}
for item inos.listdir(Dist): # 遍历指定目录
if os.path.isfile(Dist+item) and item.endswith('.csv'):
f = open((Dist+item),'rb') # 打开文件
Code_List = Code_List + [str(item)[0:6]]
reader = csv.reader(f)
Array = []
count = 0
for line in reader:
if count > 0:
Array.append([line[0],float(line[3])])
if count == 1:
Code_Name_List[str(item)[0:6]] =line[2].decode('gb2312')#这里的编码解码其实非常复杂,经常搞出乱码##
count = count + 1
f.close()
Array = Handle_Zero(Array)#处理0值
Array_List.append(Array)
return(Array_List,Code_List,Code_Name_List)
defHandle_Zero(Array):#处理0值---------------------------------------
ifArray[0][1] == 0:
Array[0][1] = Array[1][1]
ifArray[1][1]==0:
Array[1][1] = Array[2][1]
ifArray[(len(Array)-1)][1] == 0:
Array[(len(Array)-1)][1] = Array[(len(Array)-2)][1]
for i inrange(2,(len(Array)-1)):
if float(Array[i][1]) == 0:
if Array[i+1][1]>0.001:
Array[i][1] = round((Array[i-1][1] +Array[i+1][1] )/2,2)
else:
Array[i][1] = round((Array[i-1][1] +Array[i-2][1] )/2,2)
return Array
defGenerate_Diff(Dist,Array,Code_List,Code_Name_List,Min):#生成股票价格差的数组
Array_Temp =[]
Array_Diff =[]
Two_Code_List = []
Array_Len =len(Array)#总的数目
Array_Short= []
for i inrange(0,Array_Len):
Array_Temp = Array_Temp +[len(Array[i])]
MinLen =min(np.min(Array_Temp),Min) ############################
MinIndex =MS.Get_MinIndex(Array_Temp)#找到最晚上市的是哪一个
Temp_Array =[]
for i inrange(0,MinLen):#考虑修改,以便调整前后顺序
Temp_Array = Temp_Array + [Array[MinIndex][MinLen-i-1][0]]
Array_Diff.append(Temp_Array)#第一行的时间
Array_Short.append(Temp_Array)
for i inrange(0,(Array_Len-1)):
for j in range((i+1),(Array_Len)):
Temp_Array = []
for k in range(0,MinLen):#考虑修改,以便调整前后顺序
Temp_Array = Temp_Array +[round((Array[i][MinLen-k-1][1]-Array[j][MinLen-k-1][1]),2)]
Array_Diff.append(Temp_Array)
Two_Code_List = Two_Code_List + [(Code_List[i]+''+Code_Name_List[Code_List[i]].encode('gb2312') +' -'+Code_List[j]+' '+Code_Name_List[Code_List[j]].encode('gb2312'))]
for i inrange(0,Array_Len):
Temp_Array = []
for k inrange(0,MinLen):
Temp_Array = Temp_Array + [Array[i][MinLen-k-1][1]]
Array_Short.append(Temp_Array)
return(Array_Diff,Two_Code_List,Array_Short)
defStatis_Normal(Array_Diff):#常规统计
Temp_Array =[]
Statis_List= []
for i inrange(1,len(Array_Diff)):
#Statis_List 1均值 2标差 3最小值 25% 50% 75% 7最大 8总数 1sigma 2sigma 3sigma共11位数字
mean = round(np.mean(Array_Diff[i]),2)
Temp_Array.append(mean)
std = round(np.std(Array_Diff[i]),2)
Temp_Array.append(std)
Temp_Array.append(round(np.min(Array_Diff[i]),2))
Temp_Array.append(MS.Proportion(Array_Diff[i],0.25))
Temp_Array.append(MS.Proportion(Array_Diff[i],0.5))
Temp_Array.append(MS.Proportion(Array_Diff[i],0.75))
Temp_Array.append(round(np.max(Array_Diff[i]),2))
Temp_Array.append(len(Array_Diff[i]))
Temp_Array.append(MS.Percent_Sigma(Array_Diff[i],mean,std))
Temp_Array.append(MS.Percent_Sigma(Array_Diff[i],mean,(2*std)))
Temp_Array.append(MS.Percent_Sigma(Array_Diff[i],mean,(3*std)))
Statis_List.append(Temp_Array)
Temp_Array = []
returnStatis_List
#统计差值大于mean+std或者小于mean-std,持续时长>=T的数量,日期,持续时长
defStatis_Trend(Array_Diff,Statis_List,Two_Code_List,t,T):
for m inrange(0,(len(Array_Diff)-1)):
i = 0
mean = Statis_List[m][0]
std = round(float(t)*Statis_List[m][1],2)
Urange = mean + std
Lrange = mean - std
Utimes = 0 #次数
Ltimes = 0
Unum = 0.00 #总天数
Lnum = 0.00
Temp_Array =[]
Temp_Array.append(Two_Code_List[m])
#Statis_List 每行的后续增加 大于Urange的次数,总天数,比例,小于Lrange的次数,总天数,比例
while i <(len(Array_Diff[m+1])-T):
if ( Array_Diff[m+1][i+T-1]- Lrange) > 0.0001 and(Array_Diff[m+1][i+T-1]- Urange)<-0.0001:
i = i+T
elif (Array_Diff[m+1][i+T-1] - Urange)>=-0.0001:
if (Array_Diff[m+1][i] - Urange)>=-0.0001:
j = i+1#注意长度是2的时候
while j<(i+T-1) :