pandas 检查疑似刷达标率的那些网点

  有 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')

 

 

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值