import pandas as pd
df = pd.read_csv(‘51.txt’, sep=’\t’)
计算类别的先验概率
pc = df[‘addr’].value_counts() / df[‘addr’].size
###value_counts()计算取这个地址的数目
###df[‘add’].size计算地址所在这一列的所有数目
计算每个特征属性条件概率
pa = pd.crosstab(df[‘addr’], df[‘key’], margins=True).apply(lambda x:x/x[-1], axis=1)
###pd.crosstab(df[‘add’], df[‘key’], margins=True)计算该地址数下工作类型数目,margins=True计算总数
###x[-1]每组最后一个数 这个(lambda x:x/x[-1], axis=1)的意思是拿所有的数除最后一个数就是条件概率
###apply将他应用的对象拆分到小一级,然后让拆分后的每个子部分去实施apply括号内的函数操作,再把操作后的结果合在一起
通过样本计算出均值和方差,也就是得到正态分布的密度函数。有了密度函数,就可以把值代入,算出某一点的密度函数的值
import numpy as np
df2 = df.groupby(‘addr’).agg([np.mean, np.var])
###agg的函数如其名为聚合作用,他接在被groupby函数后的类型使用
df2[‘x’] = 1
###mean是均值,var是方差
from math import pi, exp, sqrt
def f(x, mean, var):
return exp(-(x-mean)**2/(2var))/sqrt(2pi*var)
df2[‘p_x_min’]=df2[[‘min’,‘x’]].apply(lambda x: f(x[‘x’], x[‘min’][‘mean’], x[‘min’][‘var’]), axis=1)
df2[‘p_x_max’]=df2[[‘max’,‘x’]].apply(lambda x: f(x[‘x’], x[‘max’][‘mean’], x[‘max’][‘var’]), axis=1)
(df2[‘p_x_min’]pcpa[‘java’]).argmax()