扇贝编程吧 关注:41贴子:367

回复:#编程之星|巧用Python管理企业

只看楼主收藏回复

整体填得还行,那我们开始设计目标数据表格。大体分为3个表格:

△ 设计的表格模板


16楼2021-05-20 20:52
回复
    Import pandas as pd
    import xlwings as xw
    整体架构大体上是这样的:
    class Traffic_Violation_Analyse:
    def __init__(self):
    path =r ‘最初表格.xlsx’
    Vio_file = pd.read_excel(path) # 文件读取
    self.File_creat() #创建文件(注意此处函数调用需加self)
    self.Zone_analyse() #按区域分析
    self.Contractor_analyse() #按照分包商扣分情况分析
    self.Blacklist() #看看谁扣满12分了
    self.File_write_in() #文件写入


    18楼2021-05-20 20:53
    回复
      广告
      立即查看
      具体效果如下,整个代码的骨架就出来了,非常合理、非常的人性化。


      19楼2021-05-20 20:54
      回复
        正片:拆分任务,解决问题
        好了,正片开始,编程的核心不在于代码,而在于如何拆分任务,然后逐步解决问题:


        20楼2021-05-20 20:54
        回复
          l 第一部分
          第一部分比较简单,就是单纯创建文件。我们要创建一个workbook,并在里面置入三个sheet,分别为“区域违章分析”、“分包商违章分析”、“吊销场内运输司机名单”。代码如下:
          def File_creat(self) #创建文件
          app = xw.App(visible=True, add_book=False)
          workbook = app.books.add()
          Sheets_name = ['01 区域违章分析', '02 分包商违章分析', '03 吊销场内运输司机名单']
          for i in range(3):
          sheet = workbook.sheets.add(Sheets_name[i])
          workbook.save(r’(此处填写欲保存路径)’)
          workbook.close()
          app.quit()


          21楼2021-05-20 20:55
          回复
            l 第二部分
            然后进入第二部分,按照区域进行违章分析。这部分的处理是需要一点点技巧的,首先我们需要观察哪里可以获取“区域划分”这个信息。
            从直观的表格内容来看,我们是没有办法区分“区域”的,但是我们再进一步观察可以发现,里面有“交通违章单号”一列,我们发现他们的命名规则统一都是“******-2021-****”,“2021”前的部分为4位到6位的字符串,不难发现,他们和区域是存在对应关系的。事实上你会发现,我们如果进行管理,不给下属单位制订编号规则,它们的命名规则也往往非常具有规律性(所以说程序员眼中的世界和一般人眼中的世界是两个完全不同的世界):
            West 西区
            DongQu 东区
            ZQGLB 根据排除法,只能是中区(事实上它的意思是“中区管理部”)


            22楼2021-05-20 20:56
            回复
              因为加入了数据的转换,我们需要在原有框架下再加入一个函数:
              def violation_tickets_convert(self, tickets_data)
              这种一一对应的方式,用字典来处理极为适合,该案例中,通过“交通违章单号”这列每个数据的前四个字母进行判断,如果为West就是西区,如果是Dong就是东区,如果是ZQGL就是中区,我们需要在__init__里加入以下转换代码:
              class Traffic_Violation_Analyse:
              def __init__(self):
              Path =r ‘(此处填写文件路径)’
              Vio_file = pd.read_excel(path) # 文件读取
              dep_send = [] #建立空列表,将Vio_file里的“交通违章单号”列转换为部门名后形成Series
              for tickets_data in self.data_base['交通违章单号']:
              dep_send.append(self.violation_tickets_convert(tickets_data)) # 调用函数将“交通违章单号”转换为部门名
              self.violation_tickets_convert(tickets_data)
              self.File_creat() #创建文件(注意此处函数调用需加self)
              self.Zone_analyse() #按区域分析
              self.Contractor_analyse() #按照分包商扣分情况分析
              self.Blacklist() #看看谁扣满12分了
              self.File_write_in() #文件写入


              23楼2021-05-20 20:58
              回复
                现在我们来编写violation_tickets_convert函数:
                def violation_tickets_convert(self, tickets_data):
                # 提取违章编号前四位
                self.four_letters = tickets_data[:4]
                # 违章单号编码前四位所对应的单位
                self.dep_code = {
                # 违章单号前四位与区域对应情况
                'Dong' : '东区',
                'ZQGL' : '中区',
                'West' : '西区' }
                if self.four_letters in self.dep_code:
                # 如果违章单号的前四位出现在字典的index里
                sending_dep = self.dep_code[self.four_letters]
                #知识点:利用字典的index查找字典的value
                return sending_dep
                else:
                # 如果违章单号的前四位没有出现在字典的index里
                sending_dep = 'error' # 明显填报有误,赋值为error
                return sending_dep


                24楼2021-05-20 21:01
                回复
                  广告
                  立即查看
                  这一部分在整个代码中算是相对比较技巧性的一部分了,这部分搞定了,剩下的只需要套公式一般慢慢完成代码即可。


                  25楼2021-05-20 21:02
                  回复
                    l 第三部分
                    接下来按照区域分析。
                    分组计算最常用的方法是groupby函数,这里也可以使用这个函数。大家可以试试这个代码:
                    def Zone_analyse(self): self.Zone_analyse = self.Vio_file.groupby(['违章发出单位', '本次违章扣分']).count().T self.West = self.Zone_analyse.西区 print(self.West)


                    26楼2021-05-20 21:02
                    回复

                      这里不打算细讲这个,因为这种方法后续还有很多细节需要处理,比如说列序的调整,比如对columns的重命名,还是比较麻烦的,对于刚接触Python的同学而言,也容易导致思路混乱,因此我用的是最简单粗暴的方法:直接创建目标函数的DataFrame,再一个个往里填,再看看我们的需求表格:


                      27楼2021-05-20 21:02
                      回复

                        好了,我们来设计这个DataFrame:
                        dep_name = ['东区’, '中区’, '西区’, '合计'] # 这个作为indexrank =['12分单数','6分单数','3分单数','2分单数','1分单数'] #这个作为columns


                        28楼2021-05-20 21:03
                        回复
                          然后往里面一行一行地填入数值,基本思路就是用pandas的筛选功能选出符合条件的值,再用len函数求出数量,以东区为例,代码如下:
                          东区_12分 = len(self.Vio_file[(self.Vio_file['违章发出单位']=='东区') & (self.Vio_file['本次违章扣分']==12)])
                          东区_6分 = len(self.Vio_file[(self.Vio_file['违章发出单位']=='东区') & (self.Vio_file['本次违章扣分']==6)])
                          东区_3分 = len(self.Vio_file[(self.Vio_file['违章发出单位']=='东区') & (self.Vio_file['本次违章扣分']==3)])
                          东区_2分 = len(self.Vio_file[(self.Vio_file['违章发出单位']=='东区') & (self.Vio_file['本次违章扣分']==2)])
                          东区_1分 = len(self.Vio_file[(self.Vio_file['违章发出单位']=='东区') & (self.Vio_file['本次违章扣分']==1)])


                          29楼2021-05-20 21:03
                          回复
                            再复制粘贴两次,把代码中的区域更改成中区与西区即可。最后再建立DataFrame:
                            self.dep_analyse = pd.DataFrame([[东区_12分, 东区_6分, 东区_3分, 东区_2分, 东区_1分], [中区_12分, 中区_6分, 中区_3分, 中区_2分, 中区_1分], [西区_12分, 西区_6分, 西区_3分, 西区_2分, 西区_1分]], index=dep_name, columns=rank)


                            30楼2021-05-20 21:04
                            回复
                              广告
                              立即查看
                              在Python中代码实际上是这个样子的,可以看出整体还是比较好阅读的,代码相对还是比较有条理的。


                              31楼2021-05-20 21:04
                              回复