有 n 天的数据,每天的数据在一个excel文件中,每天都有新激活的设备,达标率的定义是:
激活的四十天之内,任意连续十天(包括连续5天每天投件率达30%以上)平均投件率达30% 及以上定义为达标
先选取 60-70天之前的那些激活设备,所有的设备数据都在total.csv 这个文件中。
第一:选取激活时间在 60-70天之前的那些设备
#two 读取 并选择 在 70天-80天前激活的设备 并将这些设备保存
two = pd.read_csv(r'E:\total\total.csv')
two['首次激活时间']=two['首次激活时间'].apply(lambda x:str(x).split(' ')[0]) #将激活时间正常字符串
two = two.loc[two['首次激活时间'].apply(lambda x:True if '2018-10-22'< x < '2018-11-02'else False) ,]
two.to_csv(r'E:\total\total1.csv')
第二:将这些激活的设备进行判断,选择那些达标的设备ID选择出来
#three 将这些激活设备中达标的(激活四十天内任意连续10天(包括连续5天每天投件率达30%以上)平均投件率达30%及以上定位达标
three = pd.read_csv(r'E:\total\total1.csv')[['日期','设备ID','设备类型','首次激活时间','投件率']]
print(three.head())
def choose(x):
list_ = [] #用来存储达标的那些 设备ID
# print(random.random())
index_ = x.index.levels[0] #将最外层的索引存在这里(设备ID)
for i in index_:
lone = x.loc[i] #选取当个设备ID的每日投件率
if lone.count() > 35:
for j in range(30): #选择那些连续10天的投件率平均值大于0.3的设备ID
if lone[j:j+10].mean() >= 0.3:
list_.append(i)
break
for z in range(35):
if (lone[z:z+5] >= 0.3).all(): #选择那些 连续五天每天投件率都大于0.3的设备ID
list_.append(i)
break
else:
print(list(set(list_)),'\n',len(list(set(list_))))
# exit(0)
print('执行到这里了')
# pd.Series(list(set(list_))).to_csv(r'E:\total\test.csv')
return list(set(list_))
a = three.groupby(['设备ID','日期']).sum().apply(choose) #加一个sum函数将整个筛选出来的Dataframe传给了apply中的函数中去了
#如果不加函数的话 传进apply函数中去的就是一个个拆开的
#a 是一个含有达标设备ID列表 的一个Series(只有一个元素,且是一个列表)
print('这是a:%s %s'%(a,type(a)))
for i in a:
pd.DataFrame({'设备ID': i}).to_excel(r'E:\total\three.xlsx')
第三:将这些达标的设备ID和激活设备进行匹配,得到这些的设备ID所对应的每日数据
# four 将这些达标的设备ID和设备匹配出来
three = pd.read_csv(r'E:\total\total1.csv')[['日期','设备ID','设备类型','首次激活时间','投件率']] #所有合适的时间段内激活的设备
three_ = pd.read_excel(r'E:\total\three.xlsx') #所有达标的设备ID
four = pd.merge(three_,three)
four.to_excel(r'E:\total\four.xlsx')
第四:观察这些达标设备,对着设备新设立了两个指标(70天内大于20%的天 ,激活的40天内是否有35天投件率大于20% ,进行统计
# Five观察这些达标数据
five = pd.read_excel(r'E:\total\four.xlsx')
def func1_(x):
count_total = x.count()
return count_total
def func1(x): #70天内大于20%的天数
# print(x.count())
count_ = 0 #汇总大于20%的个数
for i in x:
if i > 0.2:
count_ += 1
else:
return count_
def func2(x): #70天内大于20%的天数占比
count_1 = x.count()
count_ = 0 #汇总大于20%的个数
for i in x:
if i > 0.2:
count_ += 1
else:
return count_/count_1
def func3(x): #如果天数大于是否有任意连续35天大于20%
# print(x[:20])
# exit()
count_1 = x.count()
if count_1 > 35:
# for j in [i for i in range(count_1)][:-35]:
# if (x[j:j+35] >= 0.2).all():
x_ = x.dropna()[:40] #去掉那些为空的数据(不去掉为空的数据可能含有大量的空数据)
if x_[x_>0.1].count() >=35:
return '是'
else:
return '否'
else:
return '数据有缺失'
# 不在原有的DataFrame表格上进行修改 另外新弄一个表格进行统计
new = five.groupby(['设备ID','日期'])['投件率'].sum().unstack()
six = five.groupby(['设备ID','日期'])['投件率'].sum().unstack()
six['激活40天是否有35天大于20%'] = new.apply(lambda x:func3(x),axis =1).values #是否有任意连续35天大于20%
print(six.head())
six['总天数'] = new.apply(lambda x: func1_(x), axis=1).values # 返回总天数
six['投件率大于0.2的天数'] = new.apply(lambda x:func1(x),axis =1).values #返回投件率大于0.2的天数
six['投件率大于0.2的天数的占比'] = new.apply(lambda x:func2(x),axis =1).values #返回投件率大于0.2的天数的占比
if os.path.exists(r'E:\total\six.xlsx'): #判断文件是否存在
os.remove(r'E:\total\six.xlsx') #如果存在文件则删除
six[['激活40天是否有35天大于10%','总天数','投件率大于0.2的天数','投件率大于0.2的天数的占比']].to_excel(r'E:\total\six.xlsx')