コード例 #1
0
ファイル: main.py プロジェクト: klmtldh/python_oas
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 )
コード例 #2
0
ファイル: main.py プロジェクト: klmtldh/python_oas
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
コード例 #3
0
ファイル: main.py プロジェクト: klmtldh/python_oas
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
コード例 #4
0
ファイル: main.py プロジェクト: klmtldh/python_oas
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 )
コード例 #5
0
ファイル: main.py プロジェクト: klmtldh/python_oas
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')
コード例 #6
0
ファイル: km_ss_person.py プロジェクト: klmtldh/python_oas
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
コード例 #7
0
ファイル: test.py プロジェクト: klmtldh/python_oas
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")
    )
コード例 #8
0
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