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']来取值

posted @ 2019-09-08 09:16  π=3.1415926  阅读(233)  评论(0编辑  收藏  举报