def analysis_noarrange(sql): dfsql = kl_class.dfMysql() df = dfsql.select_mysql(sql) df_section_noarrange = df[(df['开始时间'].isnull())|(df['结束时间'].isnull())] df_section_noarrange = df_section_noarrange.fillna('未填写') pdf = kl_class.parsingDf() return pdf.df_iter( df_section_noarrange )
def analysis_item(sql,item): dfsql = kl_class.dfMysql() df = dfsql.select_mysql(sql) df=df.applymap(str) pdf = kl_class.parsingDf() df_item, df_item_text = pdf.df_item(df,item) pdf.df_fig(df_item,'bar') return df_item,df_item_text
def analysis_null(sql): dfsql = kl_class.dfMysql() df = dfsql.select_mysql(sql) columns_list = list(df) pdf = kl_class.parsingDf() df_null, df_null_text = pdf.null_item(df) pdf.df_fig(df_null,'bar') return len(df),columns_list,df_null,df_null_text
def analysis_section(sql,flag,s_date,e_date=datetime.date.today()): dfsql = kl_class.dfMysql() df = dfsql.select_mysql(sql) start_date = pd.to_datetime(s_date).date() end_date = pd.to_datetime(e_date).date() df_section_end = df[(df['开始时间'] >= start_date) & (df['结束时间'] <= end_date) & (df['是否完成整改'] == flag) ] df_section_end = df_section_end.fillna('未填写') pdf = kl_class.parsingDf() return pdf.df_iter( df_section_end )
def write_docx(sql): doc = kl_class.oas_docx() doc.hd('立行立改问题库', font_size=22) correct_tex = "昆明供电局安全监管部(应急指挥中心)立行立改问题库共有{0}条数据,以下数据不完善:{1}"\ .format(analysis_null(sql)[0], analysis_null(sql)[3]) doc.par('一、总体情况') doc.par(correct_tex) if kl_class.get_pc_name()=='LAPTOP-HF9P6H1P': #个人 doc.pic(r'D:\JGY\600-Data\003-out输出文件\工作\fig.png', wth=6) os.unlink(r'D:\JGY\600-Data\003-out输出文件\工作\fig.png') else: #单位 doc.pic(r'D:\out\fig.png', wth=6) os.unlink(r'D:\out\fig.png') columns_list=analysis_null(sql)[1] columns_list.remove('问题编号') columns_list.remove('发现问题') columns_list.remove('整改措施') columns_list.remove('发现时间') columns_list.remove('开始时间') columns_list.remove('结束时间') columns_list.remove('整改情况及进度') columns_list.remove('备注') for item in columns_list: try: df_item,df_item_text=analysis_item(sql, item) doc.par('{0}:{1}'.format(item,df_item_text)) if kl_class.get_pc_name() == 'LAPTOP-HF9P6H1P': # 个人 doc.pic(r'D:\JGY\600-Data\003-out输出文件\工作\fig.png', wth=6) os.unlink(r'D:\JGY\600-Data\003-out输出文件\工作\fig.png') else: # 单位 doc.pic(r'D:\out\fig.png', wth=6) os.unlink(r'D:\out\fig.png') except Exception as e: print(e) doc.par('二、未安排事项') noarrange_list=analysis_noarrange(sql) i=1 for item in noarrange_list: doc.par('({0})未安排{0}'.format(kl_class.digital_to_chinese(i))) x=item.split('\n') for y in x: doc.par(y) i+=1 doc.par('三、周期事项事项') analysis_list=analysis_section(sql,'否','2020-1-1') #print(analysis_list) i=1 for item in analysis_list: doc.par('({0})本周事项{0}'.format(kl_class.digital_to_chinese(i))) x=item.split('\n') for y in x: doc.par(y) i+=1 doc.par('四、个人未完成事项') dfsql = kl_class.dfMysql() df = dfsql.select_mysql(sql) duty_name = list(set(df['整改责任人'].tolist())) duty_name.sort() j=1 for name in duty_name: analysis_name_list = analysis_name(sql, name, '否', '2020-1-1') doc.par('({0}){1}'.format(kl_class.digital_to_chinese(j), name)) if analysis_name_list==[]: doc.par('无异常') else: i = 1 for item in analysis_name_list: doc.par('{0}.未完成事项{0}'.format(i)) x = item.split('\n') for y in x: doc.par(y) i += 1 j+=1 if kl_class.get_pc_name()=='LAPTOP-HF9P6H1P': # 个人 doc.save_docx(r'D:\JGY\600-Data\003-out输出文件\工作\立行立改问题库.docx') else: #单位 doc.save_docx(r'Z:\200业务管理\206问题收集与处置\2061纠正与预防问题库\立行立改问题记录表\立行立改问题库.docx')
def redundant_vacancies(sql_person, sql_value): # 连接数据库,读取人员信息和人员配置信息 dfsql = kl_class.dfMysql() df_person = dfsql.select_mysql(sql_person) df_person['年龄'] = pandas_age(df_person['出生年月(2020-1-1)']) df_person['工龄'] = pandas_age(df_person['参加工作起始年(2020-1-1)']) df_value = dfsql.select_mysql(sql_value) # 统一人员配置数据 df_value = df_value[['单位', '机构名称', '科室', '岗位', '定编']] df_value.rename(columns={'机构名称': '部门'}, inplace=True) # 解决告警问题,一是要copy,二是要用loc引用 df_value1 = df_value.copy() df_value1.loc[:, ['定编']] = df_value1.loc[:, ['定编']].astype('int') # 对人员表进行透视 for i in range(len(df_person)): if pd.isna(df_person.loc[i, '所队(县区级单位)']): df_person.loc[i, '单位'] = df_person.loc[i, '地市级单位'] else: df_person.loc[i, '单位'] = df_person.loc[i, '所队(县区级单位)'] df_person.fillna('无', inplace=True) df_person_talbe = pd.pivot_table( df_person, index=['单位', '部门', '科室', '岗位'], values=['姓名'], aggfunc=len, fill_value=0, margins=True, # margins_name='总数' ) df_person_talbe.reset_index(inplace=True) df_person_talbe.columns = ['单位', '部门', '科室', '岗位', '在岗数'] df_value1.fillna('无', inplace=True) df_person_talbe.fillna('无', inplace=True) df_table = pd.merge(df_value1, df_person_talbe, how='left', on=['单位', '部门', '科室', '岗位']) df_table.fillna(0, inplace=True) df_table['缺员'] = df_table['定编'] - df_table['在岗数'] text = "昆明供电局安全监管部(应急指挥中心)定编{0}人,\ 实际{1}人,缺员{2}人。".format(df_table['定编'].sum(), df_table['在岗数'].sum(), df_table['缺员'].sum()) pdf = kl_class.parsingDf() # 党员 # df_person_party=df_person['政治面貌'].value_counts() # df_person_party = kl_class.sort_list(df_person_party, ['党员', '群众']) # text_person_party = pdf.series_tex(df_person_party, '名') # 性别 df_person_sex = df_person['性别'].value_counts() df_person_sex = kl_class.sort_list(df_person_sex, ['男', '女']) text_person_sex = pdf.series_tex(df_person_sex, '名') # 年龄 df_person_age = pd.cut(df_person['年龄'].astype('int'), bins=[0, 30, 40, 50, 100], labels=["30岁以下", "30-39岁", "40-49岁", "50岁以上"]) df_person_age_count = df_person_age.value_counts() df_person_age_count = kl_class.sort_list( df_person_age_count, ["30岁以下", "30-39岁", "40-49岁", "50岁以上"]) text_person_age_count = pdf.series_tex(df_person_age_count, '名') #工龄 df_person_wage = pd.cut( df_person['工龄'].astype('int'), bins=[0, 5, 10, 20, 30, 50], labels=["5年以下", "5-9年", "10-19年", "20-29年", "30年以上"]) df_person_wage_count = df_person_wage.value_counts() df_person_wage_count = kl_class.sort_list( df_person_wage_count, ["5年以下", "5-9年", "10-19年", "20-29年", "30年以上"]) text_person_wage_count = pdf.series_tex(df_person_wage_count, '名') # 文化程度 text_list = [] list_columns = ['初始学历', '所学专业(初始)', '职称'] s_list = [ '男', '女', '党员', '群众', '研究生', '本科', '大专', '高级工程师', '工程师', '助理工程师', '经理', '副经理', '主管', '安全监察专责(A)', '安全监察专责(B)', '风险体系管理专责(A)', '风险体系管理专责(B)', '应急管理专责', '班长', '安全监察员' ] for item in list_columns: df_person_x = df_person[item].value_counts() df_person_x = kl_class.sort_list(df_person_x, s_list) text_person_x = pdf.series_tex(df_person_x, '名') text_list.append(text_person_x) text = text + text_person_sex + text_person_age_count + '工龄:' + text_person_wage_count + ''.join( text_list) df_person = df_person[['姓名', '单位', '部门', '科室', '岗位', '性别', '年龄']] df_person.fillna('无', inplace=True) df_person = kl_class.sort_list(df_person, s_list, '岗位') list_d = [ '昆明供电局', '官渡供电局', '五华供电局', '盘龙供电局', '西山供电局', '呈贡供电局', '东川供电局', '昆明安宁供电局', '云南电网有限责任公司昆明晋宁供电局', '云南电网有限责任公司昆明宜良供电局', '云南电网有限责任公司昆明富民供电局', '云南电网有限责任公司昆明嵩明供电局', '云南电网有限责任公司昆明石林供电局', '云南电网有限责任公司昆明寻甸供电局', '云南电网有限责任公司昆明禄劝供电局', ] list_b = [ '安全监管部(应急指挥中心)', '系统运行部', '科技创新及数字化中心', '规划建设管理中心(质监分站)', '供电服务中心', '综合服务中心(涉电分中心)', '物流服务中心', '带电作业中心', '通信管理所', '输电管理所', '变电运行一所', '变电运行二所', '变电修试所', '安全监管部', ] list_k = [ '无', '安全监察科', '应急与保供电管理科', '安全督查大队', '安全监察班', '综合室', '安生室', '计划安全室', '质量安全室', '科技室', ] list_sort = [list_d, list_b, list_k] column = ['单位', '部门', '科室'] for i in range(len(column)): cat_order = CategoricalDtype(list_sort[i], ordered=True) df_person[column[i]] = df_person[column[i]].astype(cat_order) df_person = df_person.sort_values(column, axis=0, ascending=[True, True, True]) df_person.reset_index(drop=True, inplace=True) return df_table, text, df_person
def to_echarts(sql): from pyecharts import options as opts from pyecharts.charts import Gauge dfsql = kl_class.dfMysql() df = dfsql.select_mysql(sql) #删除重复值 df.drop_duplicates(inplace=True) #删除缺失值 #print(len(df)) df.dropna(axis=0, how='all', inplace=True) #print(len(df)) #填充缺失值 #df.fillna('未填写',inplace=True) #删除空格 df['是否完成整改']=df['是否完成整改'].map(str.strip) start_date='2020-1-1' end_date = pd.to_datetime(datetime.date.today()).date() df= df[(df['开始时间'] >= pd.to_datetime(start_date).date()) & (df['结束时间'] <= end_date) ] df_doing=df[df['是否完成整改']=='否'] df_split = df_doing.to_dict(orient='split') tb = table_base(df_split['columns'], df_split['data']) tb.render("doing.html") zg=df['是否完成整改'].value_counts() rat=round(100*(zg['是']/len(df)),2) ajk_name=['李黎','陈虹伍','杨和俊','陈斌','何艳琪','郭晶晶','杨建平'] yjk_name=['洪永健','和定繁','王玺','周浩然','高璐'] df_split1=kl_class.split_record(df, '整改责任人', '、') df_ajk=df_split1[df_split1['整改责任人'].isin(ajk_name)] zg_ajk=df_ajk['是否完成整改'].value_counts() rat_ajk=round(100*(zg_ajk['是']/len(df_ajk)),2) df_yjk=df_split1[df_split1['整改责任人'].isin(yjk_name)] zg_yjk=df_yjk['是否完成整改'].value_counts() rat_yjk=round(100*(zg_yjk['是']/len(df_yjk)),2) #交叉表 ct=pd.crosstab(index=df_split1['整改责任人'], columns=df_split1['是否完成整改'], margins=True) #ct.columns=[] ct['rat']=round(100*(ct['是']/ct['All']),2) ct.sort_values('rat',ascending=False,inplace=True) t=[] for column in ct.iteritems(): if column[0]=='rat': for i in range(len(ct)): if column[1].index[i]!='All': t.append(column[1].index[i]+str(column[1].values[i])+'%\n') tn=''.join(t) # a = df[''].str.split('、', expand=True).stack().value_counts() # print(a) text = "安全监管部完成率{0}%\n\n安全监察科完成率{1}%:\n\n应急管理科完成率{2}%:\n\n{3}".format(rat, rat_ajk, rat_yjk, tn) c = ( # Gauge(init_opts=opts.InitOpts(width="1200px", height="600px"))#设置画布尺寸 Gauge(init_opts=opts.InitOpts( js_host=r"D:\JGY\600-Data\004-auxiliary辅助文件\\", width="1200px", height="600px", renderer="RenderType.SVG", page_title="立行立改问题库", theme="white") ) .add( series_name="安全监管部", data_pair=[("安全监管部", rat)], is_selected=True, min_=0, max_=100, split_number=10, axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts( color=[(0.3, "#FF0033"), (0.7, "#FF6600"), (1, "#009900")], width=30 ) ), radius="80%", start_angle=150, end_angle=30, is_clock_wise=True, title_label_opts=opts.GaugeTitleOpts( font_size=20, color="blue", font_family="Microsoft YaHei", offset_center=[0, "-55%"], ), detail_label_opts=opts.GaugeDetailOpts( is_show=True, background_color='red', border_width=0, border_color='blue', offset_center=[0, "-40%"], color="white", font_style="oblique", font_weight="bold", font_family="Microsoft YaHei", font_size=26, border_radius=120, padding=[4, 4, 4, 4], formatter="{value}%" ), pointer=opts.GaugePointerOpts( # 是否显示指针。 is_show=True, # 指针长度,可以是绝对数值,也可以是相对于半径的半分比。 length="80%", # 指针宽度。 width=12, ), ) .add( series_name="安全监察科", data_pair=[("安全监察科", rat_ajk)], is_selected=True, min_=0, max_=100, split_number=10, axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts( color=[(0.3, "#FF0033"), (0.7, "#FF6600"), (1, "#009900")], width=30 ) ), radius="80%", start_angle=265, end_angle=155, is_clock_wise=True, title_label_opts=opts.GaugeTitleOpts( font_size=20, color="blue", font_family="Microsoft YaHei", offset_center=[-100, "25%"], ), detail_label_opts=opts.GaugeDetailOpts( is_show=True, background_color='red', border_width=0, border_color='blue', offset_center=[-100, "40%"], color="white", font_style="oblique", font_weight="bold", font_family="Microsoft YaHei", font_size=26, border_radius=120, padding=[4, 4, 4, 4], formatter="{value}%" ), pointer=opts.GaugePointerOpts( # 是否显示指针。 is_show=True, # 指针长度,可以是绝对数值,也可以是相对于半径的半分比。 length="50%", # 指针宽度。 width=8, ), ) .add( series_name="应急管理科", data_pair=[("应急管理科", rat_yjk)], is_selected=True, min_=0, max_=100, split_number=10, axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts( color=[(0.3, "#FF0033"), (0.7, "#FF6600"), (1, "#009900")], width=30 ) ), radius="80%", start_angle=385, end_angle=275, is_clock_wise=True, title_label_opts=opts.GaugeTitleOpts( font_size=20, color="blue", font_family="Microsoft YaHei", offset_center=[100, "25%"], ), detail_label_opts=opts.GaugeDetailOpts( is_show=True, background_color='red', border_width=0, border_color='blue', offset_center=[100, "40%"], color="white", font_style="oblique", font_weight="bold", font_family="Microsoft YaHei", font_size=26, border_radius=120, padding=[4, 4, 4, 4], formatter="{value}%" ), pointer=opts.GaugePointerOpts( # 是否显示指针。 is_show=True, # 指针长度,可以是绝对数值,也可以是相对于半径的半分比。 length="50%", # 指针宽度。 width=8, ), ) .set_global_opts( title_opts=opts.TitleOpts( title="立行立改问题库完成率", title_link="https:www.163.com", title_target="self", subtitle=text, subtitle_link="doing.html", subtitle_target="blank", pos_left="left", ) ) .render("gauge_lxlxwtk.html") )
def redundant_vacancies(sql_person, sql_value): #连接数据库,读取人员信息和人员配置信息 dfsql = kl_class.dfMysql() df_person = dfsql.select_mysql(sql_person) df_value = dfsql.select_mysql(sql_value) #统一人员配置数据 df_value = df_value[['科室或班组名称', '岗位名称', '职数']] df_value.rename(columns={'科室或班组名称': '科室', '岗位名称': '工作岗位'}, inplace=True) #df_value['职数']=df_value['职数'].astype('int') df_value1 = df_value.copy() df_value1.loc[:, ['职数']] = df_value1.loc[:, ['职数']].astype('int') #对人员表进行透视 df_person_talbe = pd.pivot_table(df_person, index=['科室', '工作岗位'], columns=['岗位状态'], values=['姓名'], aggfunc=len, fill_value=0, margins=True, margins_name='总数') df_person_talbe.reset_index(inplace=True) df_person_talbe.columns = ['科室', '工作岗位', '借入', '借出', '在岗', '总数'] df_table = pd.merge(df_value1, df_person_talbe, how='left', on=['科室', '工作岗位']) df_table['缺员'] = df_table['职数'] - df_table['总数'] text = "昆明供电局安全监管部(应急指挥中心)定员{0}人,\ 实际{1}人,缺员{2}人,其中:在岗{3}人,借入{4}人,借出{5}人。".format( df_table['职数'].sum(), df_table['总数'].sum(), df_table['缺员'].sum(), df_table['在岗'].sum(), df_table['借入'].sum(), df_table['借出'].sum()) pdf = kl_class.parsingDf() #党员 df_person_party = df_person['政治面貌'].value_counts() df_person_party = kl_class.sort_list(df_person_party, ['党员', '群众']) text_person_party = pdf.series_tex(df_person_party, '名') #性别 df_person_sex = df_person['性别'].value_counts() df_person_sex = kl_class.sort_list(df_person_sex, ['男', '女']) text_person_sex = pdf.series_tex(df_person_sex, '名') #年龄 df_person_age = pd.cut(df_person['年龄'].astype('int'), bins=[0, 30, 40, 50, 100], labels=["30岁以下", "30-39岁", "40-49岁", "50岁以上"]) df_person_age_count = df_person_age.value_counts() df_person_age_count = kl_class.sort_list( df_person_age_count, ["30岁以下", "30-39岁", "40-49岁", "50岁以上"]) text_person_age_count = pdf.series_tex(df_person_age_count, '名') #工龄 df_person_wage = pd.cut( df_person['工龄'].astype('int'), bins=[0, 5, 10, 20, 30, 50], labels=["5年以下", "5-9年", "10-19年", "20-29年", "30年以上"]) df_person_wage_count = df_person_wage.value_counts() df_person_wage_count = kl_class.sort_list( df_person_wage_count, ["5年以下", "5-9年", "10-19年", "20-29年", "30年以上"]) text_person_wage_count = pdf.series_tex(df_person_wage_count, '名') #文化程度 text_list = [] list_columns = ['民族', '文化程度', '职称'] s_list = [ '男', '女', '党员', '群众', '研究生', '本科', '大专', '高级工程师', '工程师', '助理工程师', '经理', '副经理', '主管', '安全监察专责(A)', '安全监察专责(B)', '风险体系管理专责(A)', '风险体系管理专责(B)', '应急管理专责', '班长', '安全监察员' ] for item in list_columns: df_person_x = df_person[item].value_counts() df_person_x = kl_class.sort_list(df_person_x, s_list) text_person_x = pdf.series_tex(df_person_x, '名') text_list.append(text_person_x) text=text+text_person_party\ +text_person_sex+text_person_age_count\ +'工龄:'+text_person_wage_count+''.join(text_list) df_person = df_person[[ '姓名', '科室', '工作岗位', '兼任职务', '联系电话', '政治面貌', '工号', '性别', '岗位状态' ]] df_person.fillna('无', inplace=True) df_person = kl_class.sort_list(df_person, s_list, '工作岗位') df_person.reset_index(drop=True, inplace=True) return df_table, text, df_person