进度校验多维度

import pandas as pd
import os
import numpy as np
import datetime
today=str(datetime.date.today())


filepath='/Users/kangyongqing/Documents/kangyq/202311/班均及合班储备/最后校验/'
file1='组班明细(添加标签版)特殊已删除全量的副本2去英文及非C2.xlsx'
file2='04新班级已排课明细含版本进度2023-12-12.xlsx'
# file3='02新班级已排课明细2023-12-12.xlsx'

df1=pd.read_excel(filepath+file1,sheet_name='组班明细',dtype='object')
# print(df1.info())
df2=pd.read_excel(filepath+file2,dtype='object')

df1.loc[df1['动作二排课次数']>0,'连排周']=df1['动作二排课次数']/df1['频率']
# df1.loc[df1['动作二特殊处理']=='12月25日那周放假,不上课','连排周']=df1['连排周']+1
df1.loc[df1['动作二排课次数']>0,'动作二辅助日期']=df1['连排周']*7
df1.loc[df1['动作二排课次数']>0,'排课截止']=df1['动作二开课时间(周)']+pd.TimedeltaIndex(df1['动作二辅助日期'],unit='D')
# df1.loc[df1['动作一排课次数']>0,'排课截止1']=df1['动作一开课时间(周)']+pd.to_timedelta(df1['动作一辅助日期'],unit='D')
# print(df1.columns)
# df3=pd.DataFrame(df1.loc[(df1['动作一特殊处理']=='12月25日那周放假,不上课')|(df1['动作一特殊处理'].isnull()&df1['动作一开课时间(周)'].notnull()),:])
df3=pd.DataFrame(df1.loc[df1['动作二开课时间(周)'].notnull(),:])
print(df3['排课截止'].values.max())
print(df3['动作二开课时间(周)'].values.min())

#小提示,做处理取的数据集需要为dataframe类型,否则会报错
df3['动作二开课时间(周末)']=df3['动作二开课时间(周)']+datetime.timedelta(7)
# df3['动作一开课时间(周末)']=df3['动作一开课时间(周)']+pd.to_timedelta(7,unit='D')

df3['动作二课程内容']=df3['动作二课程内容'].str.replace(' ','')  #替换常规空格符号
df3['动作二课程内容']=df3['动作二课程内容'].str.replace(' ','')  #替换网页空格符号
#版本空格统一处理,避免不规范导致的错误
df3.loc[df3['动作二课程内容']=='我的中华名人课C1','动作一课程内容']='我的中华名人故事课C1'
#统一命名版本名称
df3['计划lesson']=df3['动作二开始课程'].str.slice(start=-2)
df3['计划lesson']=df3['计划lesson'].astype(int)
df3['计划级别']=df3['迁移后版本预测Level'].str.slice(14)
df3['计划级别']=df3['计划级别'].astype(int)
df3.loc[df3['动作二开始课程'].str.contains('同级别'),'级别要求']=1
print('动作二涉及学生数:',df3.shape[0])
# df3.to_excel(filepath+'ceshi.xlsx')

df2=df2.rename(columns={'版本':'动作二课程内容'})
print(df2.columns)
df4=pd.merge(df2,df3,on=('学员id','动作二课程内容'),how='inner')
df41=df4.loc[df4['开课时间'].between(df4['动作二开课时间(周)'],df4['排课截止'],inclusive='left')]
# df41['动作一课程内容']=df41['动作一课程内容'].str.replace(' ','')
df41.loc[:,'首课序号']=df41.groupby('学员id')['开课时间'].rank(method='dense')

df42=df41.pivot_table(index='学员id',values='首课序号',aggfunc='count').reset_index().rename(columns={'首课序号':'排课次数'})
print(df42.head())
df43=pd.merge(df41[df41['首课序号']==1],df42,on='学员id',how='left')
df43['排课次数']=df43['排课次数'].astype(int)
df43.loc[:,'排课日期校验']=np.where(df43['开课时间'].between(df43['动作二开课时间(周)'],df43['动作二开课时间(周末)'],inclusive='left'),'一致','不一致')
df43.loc[:,'级别校验']=np.where(df43['级别要求']==1,np.where(df43['计划级别']==df43['course_level'],'一致','不一致'),'')
df43.loc[:,'lesson校验']=np.where(df43['计划lesson']==df43['lesson_no'],'一致','不一致')
df43.loc[:,'课次校验']=np.where(df43['排课次数']==df43['动作二排课次数'],'一致','不一致')
df43.loc[:,'进度二校验']=np.where((df43['级别校验']=='一致')&(df43['排课日期校验']=='一致')&(df43['lesson校验']=='一致')&(df43['课次校验']=='一致'),'一致',np.where((df43['级别校验']=='')&(df43['排课日期校验']=='一致')&(df43['lesson校验']=='一致')&(df43['课次校验']=='一致'),'一致','不一致'))
print(df43.columns)
df5=pd.merge(df3,df43.loc[:,['学员id','排课日期校验','级别校验','lesson校验','课次校验','进度二校验']],on='学员id',how='left')
df5.loc[df5['进度二校验'].isnull(),'进度二校验']='未排课'

#已排课但版本不对情形核验
df401=pd.merge(df2,df3,on='学员id',how='inner')
df402=df401.loc[df401['开课时间'].between(df401['动作二开课时间(周)'],df401['动作二开课时间(周末)'],inclusive='left')]
df403=pd.pivot_table(df402,index='学员id',values='开课时间',aggfunc='count').reset_index().rename(columns={'开课时间':'pai'})
df5=pd.merge(df5,df403,on='学员id',how='left')
df5.loc[(df5['进度二校验']=='未排课')&(df5['pai']>0),'进度二校验']='已排课但排错版本'



df6=pd.pivot_table(df5,index='进度二校验',values='学员id',aggfunc=lambda x:len(x.unique()))
df6['占比']=df6['学员id']/df6['学员id'].sum()
df6['占比']=df6['占比'].round(2)
print(df6)

df7=pd.pivot_table(df5,index='排课日期校验',values='学员id',aggfunc=lambda x:len(x.unique()))
df7['占比']=df7['学员id']/df7['学员id'].sum()
df7['占比']=df7['占比'].round(2)
print(df7)

df8=pd.pivot_table(df5,index='级别校验',values='学员id',aggfunc=lambda x:len(x.unique()))
df8['占比']=df8['学员id']/df8['学员id'].sum()
df8['占比']=df8['占比'].round(2)
print(df8)

df9=pd.pivot_table(df5,index='lesson校验',values='学员id',aggfunc=lambda x:len(x.unique()))
df9['占比']=df9['学员id']/df9['学员id'].sum()
df9['占比']=df9['占比'].round(2)
print(df9)

df10=pd.pivot_table(df5,index='课次校验',values='学员id',aggfunc=lambda x:len(x.unique()))
df10['占比']=df10['学员id']/df10['学员id'].sum()
df10['占比']=df10['占比'].round(2)
print(df10)

writer=pd.ExcelWriter(filepath+f'动作二验证{today}.xlsx',engine='openpyxl')
df5.to_excel(writer,sheet_name='明细',index=False)
df6.to_excel(writer,sheet_name='按计划排课比例')
df7.to_excel(writer,sheet_name='排课日期校验')
df8.to_excel(writer,sheet_name='级别校验')
df9.to_excel(writer,sheet_name='lesson校验')
df10.to_excel(writer,sheet_name='课次校验')

writer._save()

from openpyxl import load_workbook
from openpyxl.utils import  get_column_letter
def reset_col(filename):
    wb=load_workbook(filename)
    for sheet in wb.sheetnames:
        ws=wb[sheet]
        df=pd.read_excel(filename,sheet).fillna('-')
        df.loc[len(df)]=list(df.columns)   #把标题行附件到最后一行
        for col in df.columns:
            index=list(df.columns).index(col)   #列序号
            letter=get_column_letter(index+1)   #列字母
            collen=df[col].apply(lambda  x:len(str(x).encode())).max()    #获取这一列长度的最大值 当然也可以用min获取最小值 mean获取平均值
            ws.column_dimensions[letter].width=collen*1.2+2               #也就是列宽为最大长度*1.2  可以自己调整
        wb.save(filename)

reset_col(writer)



df11=pd.DataFrame(df1.iloc[:,[ i for i in range(79)]+[85,87,89,94,93]])选取制定列

你可能感兴趣的:(python,pandas)