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查询

数据


查看类型

-
单label
![]()
指定位置取值取到的是个值,指定位置切片取到的是个series -
批量查询
![]()
注意取到的结果对象是有区别的 -
区间查询
![]()
可以切片取值, -
条件表达式查询
![]()
返回的是一串bool值

多条件可组合

- 调用函数查询
![]()
可以使用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']来取值







浙公网安备 33010602011771号