zoukankan      html  css  js  c++  java
  • pandas

    一个很强的科学计算库

    import pandas as pd
    创建dataframe


    DataFrame运算


    Pandas画图
    DataFrame.plot(x=None, y=None, kind='line')

    文件读取与存储

    缺失值的处理

    数据离散化


    表格处理

    准备好表格数据,直接使用

    df
                主机名                           IP                                  监控项                  最新值
    0  Sdata-server                        127.0.0.1                      CPU 使用率          14.6985
    1    大上的拉数据活动即可        122.28.169.245          CPU 使用率           1.1704
    2    大系统平台-测试主机          122.196.112.143          CPU 使用率          24.2978
    
    df.to_excel(file_path,
            sheet_name="Sheet1",
            na_rep="",
            float_format=None,
            columns=None,
            header=True,
            index=True,
            index_label=None,
            startrow=0,
            startcol=0,
            engine=None,
            merge_cells=True,
            encoding=None,
            inf_rep="inf",
            verbose=True,
            freeze_panes=None)    #index=False 可以删除默认的列索引,
    

    pandas应用

    pandas查询数据

    df.loc查询

    数据

    查看类型

    1. 单label

      指定位置取值取到的是个值,指定位置切片取到的是个series

    2. 批量查询

      注意取到的结果对象是有区别的

    3. 区间查询

      可以切片取值,

    4. 条件表达式查询

    返回的是一串bool值

    多条件可组合

    1. 调用函数查询

      可以使用lambda函数或者直接定义一个函数
      传递函数,

    数据列的新增

    大致方法

    直接新增一列,给定一个新的列明及其值

    apply对于函数的调用

    assign

    按照条件分组赋值

    数据统计函数

    describe()

    mean() max() min()

    唯一去重和按值计数

    相关系数 协方差

    各因素相关性

    pandas读取文件操作

    原文件

    处理后

    pandas对缺失值的处理

    读取原文件
    skiprows 跳过的行,将空数据跳过

    原始数据

    空值检测

    对某一列的空值检测

    删除全是空值的列 how指定方式,all为所有都空再删,any表示任意空即删,inplace表示返回的对象是否为新对象

    空值填充

    名称填充 ,method指定是跟前面/后面的数据为准进行填充

    pandas的SettingWithCopyWarning报警





    pandas排序



    中文也可以




    pandas字符串处理



    字符串方法只能用于字符串上




    正则处理

    匹配中括号中的任意一个即为成功

    pandas中axis参数的理解









    index用途










    自动对齐数据


    merge
















    移动列



    pd去重

    pandas对触发器的方法解析

    
    trigger_args = {
    'templateids': '',
    'output': ['description', 'priority', 'expression', 'status'],
    'selectItems': ['name', 'key_', 'value_type', 'delay', 'status'],
    'selectFunctions': 'extend',
    ''
    'expandDescription': True,
    'expandExcpression': True,
    }
    item_args = {
    'templated': True, 'selectApplications': ['name'],
    'output': ['name', 'value_type', 'type', 'delay', 'status'],
    'templateids': '',
    'with_triggers': False
    }
    
    def analysis_function(df):
      function_df = df['functions']
      items_df = df['items']
    
      func_tri_merge = []
      for idx, expression in enumerate(df['expression']):
          func_tmp = pd.DataFrame(function_df[idx])
          item_tmp = pd.DataFrame(items_df[idx])
          tmp = pd.merge(func_tmp, item_tmp, on=['itemid']).loc[:,['functionid','name','function','parameter','itemid','triggerid','value_type','delay','status']]
          func_tri_merge.append(tmp)
          for index in tmp.index:
              function_id, item_name, function, function_parameter = tmp.loc[index][:4]
              df['expression'][idx] = df['expression'][idx].replace('{{{}}}'.format(function_id),'{}.{}({})'.format(item_name, function,
                                                                                       function_parameter))
      return func_tri_merge
    
    
    def merge_triger(df,tri_df):
          ret = []
          sub_set = []
          for i in df['triggerid']:
                if isinstance(i,str):
                      ret.append(tri_df[tri_df['triggerid']==i]['description'].values[0])
                else:
                      sub_set = []
                      for j in i:
                            sub_set.append(tri_df[tri_df['triggerid']==j]['description'].values[0])
                      ret.append(','.join(sub_set))
          df['trigger_info'] = ret
    
    # templateid=10172
    templateid=10462
    trigger_args.update({'templateids': templateid})
    item_args.update({'templateids': templateid})
    
    trigger_protos = api.triggerprototype.get(**trigger_args)
    triggers = api.trigger.get(**trigger_args)
    tri_data = triggers + trigger_protos
    tri_df = pd.DataFrame(tri_data)
    # 获取需要合并ret_df = ret_df.reset_index(drop=True)+的监控项信息和处理完expression的tri_df
    concat_data = analysis_function(tri_df)
    concat_df = pd.concat(concat_data)
    
    # concat_df = concat_df.groupby('name').agg(np.unique).reset_index()
    # merge_triger(concat_df,tri_df)
    
    # 删除重复的监控项
    # concat_df.drop_duplicates(subset=['name', 'itemid'], keep='first', inplace=True)
    
    # concat_df = concat_df.loc[:, ['triggerid', 'itemid', 'name', 'value_type', 'delay', 'status','trigger_info']]
    concat_df = concat_df.loc[:, ['triggerid', 'itemid', 'name', 'value_type', 'delay', 'status']]
    tri_df = tri_df.loc[:, ['triggerid', 'priority', 'expression', 'status','description']]
    
    tri_merge = pd.merge(concat_df, tri_df, on=['triggerid'], how='outer')
    
    
    
    try:
          tri_merge = tri_merge.groupby(['itemid','name']).agg(np.unique).reset_index()
    except Exception as e:
          tri_merge = tri_merge.groupby('name').agg(np.unique).reset_index()
    
    # 重新构造索引
    # concat_df = concat_df.reset_index(drop=True)
    # concat_df.drop('itemid', axis=1, inplace=True)
    
    # 获取未被触发器使用的监控项
    item_protos = api.itemprototype.get(**item_args)
    items = api.item.get(**item_args)
    item_data = item_protos + items
    if item_data:
          item_df = pd.DataFrame(item_data)
          print(tri_merge,tri_merge.columns)
          df1 = tri_merge.loc[:,['itemid','name', 'value_type', 'delay', 'status_x', 'description', 'expression','priority','status_y']]
    
          df1.columns = ['itemid','name','value_type','delay','status','description','expression','priority','trigger_status']
          df2 = item_df.loc[:, ['itemid', 'name', 'value_type', 'delay', 'status', ]]
          ret_df = pd.concat([df1,df2])
    
          ret_df.drop_duplicates(subset=['name', 'itemid'], keep='first', inplace=True)
          # ret_df.drop('itemid',axis=1,inplace=True)
          ret_df = ret_df.reset_index(drop=True)
    else:
          print(tri_merge,tri_merge.columns)
          df1 = tri_merge.loc[:,['itemid','name', 'value_type', 'delay', 'status_x', 'description', 'expression','priority','status_y']]
          df1.columns = ['itemid','name','value_type','delay','status','description','expression','priority','trigger_status']
    ret.append(ret_df)
    

    处理模板基线

    
        # def _tmp(self, series):
        #     ret = []
        #     for i in series:
        #         ret.append(i['name'])
        #     return ','.join(ret)
        #
        # def _trigger(self, series, property):
        #     ret = []
        #     for i in series:
        #         if property == 'priority':
        #             ret.append(ALERT_MAP[i[property]])
        #         else:
        #             ret.append(i[property])
        #     return ','.join(ret)
        #
        # def _analysis_function(self, df):
        #     function_df = df['functions']
        #     items_df = df['items']
        #
        #     func_tri_merge = []
        #     for idx, expression in enumerate(df['expression']):
        #         func_tmp = pd.DataFrame(function_df[idx])
        #         item_tmp = pd.DataFrame(items_df[idx])
        #         tmp = pd.merge(func_tmp, item_tmp, on=['itemid']).loc[:,
        #               ['functionid','name','function','parameter','itemid','triggerid','value_type','delay','status']]
        #         func_tri_merge.append(tmp)
        #         for index in tmp.index:
        #             function_id, item_name, function, function_parameter = tmp.loc[index][:4]
        #             df['expression'][idx] = df['expression'][idx].replace('{{{}}}'.format(function_id),
        #                                                                   '{}.{}({})'.format(item_name, function,
        #                                                                                      function_parameter))
        #     return func_tri_merge
    
        # def get_template_info_pd(self, key_=None, group_id=None, name=None, parent_key=None):
        #     """
        #     获取监控系统当前模板的监控项,触发器的信息
        #     :param key_:
        #     :param group_id:
        #     :param name:
        #     :param parent_key:
        #     :return:  list[str,df] [模板名称,模板监控明细的df对象]
        #     """
        #     res_df = []
        #     templates = self.api.template.get(selectHosts=['name'], output=['name'])
        #     trigger_args = {
        #         'templateids': '',
        #         'output': ['description', 'priority', 'expression', 'status'],
        #         'selectItems': ['name', 'key_', 'value_type', 'delay', 'status'],
        #         'selectFunctions': 'extend',
        #         'expandDescription': True,
        #         'expandExcpression': True,
        #     }
        #     item_args = {
        #         'templated': True, 'selectApplications': ['name'],
        #         'output': ['name', 'value_type', 'type', 'delay', 'status'],
        #         'templateids': '',
        #         'with_triggers': False
        #     }
        #     for template in templates:
        #         trigger_args.update({'templateids': template['templateid']})
        #         item_args.update({'templateids': template['templateid']})
        #
        #         trigger_protos = self.api.triggerprototype.get(**trigger_args)
        #         triggers = self.api.trigger.get(**trigger_args)
        #         tri_data = triggers + trigger_protos
        #         tri_df = pd.DataFrame(tri_data)
        #         # 获取需要合并的监控项信息和处理完expression的tri_df
        #         concat_data = self._analysis_function(tri_df)
        #         concat_df = pd.concat(concat_data)
        #         # 删除重复的监控项
        #         concat_df = concat_df.loc[:, ['triggerid', 'itemid', 'name', 'value_type', 'delay', 'status']]
        #         tri_df = tri_df.loc[:, ['triggerid', 'priority', 'expression', 'status', 'description']]
        #         # concat_df.drop_duplicates(subset=['name', 'itemid'], keep='first', inplace=True)
        #         # concat_df = concat_df.loc[:, ['triggerid', 'itemid', 'name', 'value_type', 'delay', 'status']]
        #         # tri_df = tri_df.loc[:, ['triggerid', 'description', 'priority', 'expression', 'status']]
        #         # tri_merge = pd.merge(concat_df, tri_df, on=['triggerid'], how='outer')
        #         tri_merge = pd.merge(concat_df, tri_df, on=['triggerid'], how='outer')
        #         tri_merge = tri_merge.groupby('name').agg(np.unique).reset_index()
        #         # 重新构造索引
        #         # concat_df.drop('itemid', axis=1, inplace=True)
        #
        #         # 获取未被触发器使用的监控项
        #         item_protos = self.api.itemprototype.get(**item_args)
        #         items = self.api.item.get(**item_args)
        #         item_data = item_protos + items
        #         item_df = pd.DataFrame(item_data)
        #         try:
        #             df1 = tri_merge.loc[:,['itemid', 'name', 'value_type', 'delay', 'status_x', 'description', 'expression', 'priority','status_y']]
        #         except Exception as e:
        #             print()
        #             print(tri_merge)
        #         df1.columns = ['itemid', 'name', 'value_type', 'delay', 'status', 'description', 'expression', 'priority','trigger_status']
        #         df2 = item_df.loc[:, ['itemid', 'name', 'value_type', 'delay', 'status', ]]
        #         ret_df = pd.concat([df1, df2])
        #         ret_df.drop_duplicates(subset=['name', 'itemid'], keep='first', inplace=True)
        #         ret_df.drop('itemid',axis=1,inplace=True)
        #         ret_df = ret_df.reset_index(drop=True)
        #         res_df.append(ret_df)
        # if data:
        #     df = pd.DataFrame(data)
        #     df['application'] = df['applications'].apply(self._tmp) if isinstance(df.get('applications'),
        #                                                                           Series) else None
        #     df['value_type'] = df['value_type'].apply(lambda x: VALUE_MAP[x]) if isinstance(df.get('value_type'),
        #                                                                                     Series) else None
        #     if isinstance(df.get('triggers'), Series):
        #         df['description'] = df['triggers'].apply(self._trigger, args=('description',))
        #         df['priority'] = df['triggers'].apply(self._trigger, args=('priority',))
        #         df['expression'] = df['triggers'].apply(self._trigger, args=('expression',))
        #         df['trigger_status'] = df['triggers'].apply(self._trigger, args=('status',))
        #     else:
        #         df['description'] = None
        #         df['priority'] = None
        #         df['expression'] = None
        #         df['trigger_status'] = None
        #
        #     df = df.loc[:,
        #          ['name', 'delay', 'value_type', 'status', 'application', 'description', 'expression', 'priority',
        #           'trigger_status']]
        #     res_df.append([template['name'].replace('Template', 'Tpl')[:31], df])
        # else:
        #     continue
        # return res_df
    

    二次学习

















    聚合



    apply
    今天以df去apply 用series的时候 指定了series.name(源数据中有这个字段)
    不能这么用,会跟pandas原生的series.name冲突 展示index值,需要使用['name']来取值

  • 相关阅读:
    双向链表

    一个简单makefile
    内存管理
    队列
    postgresql表结构查询sql
    postgresql 命令
    NSMutableDictionary 中使用setValueForKey 和 setObjectForKey有什么区别?
    ViewController 生命周期
    程序启动过程
  • 原文地址:https://www.cnblogs.com/cizao/p/11484326.html
Copyright © 2011-2022 走看看