今天边肖给大家分享一个Python计算IV值的实例讲解,有很好的参考价值。希望对你有帮助。来和边肖一起看看吧。
变量装箱后,需要计算变量的重要性。IV是评价变量的差异或重要性的统计量之一。python计算IV值的代码如下:
def CalcIV(Xvar,Yvar):
N_0=np.sum(Yvar==0)
N_1=np.sum(Yvar==1)
n _ 0 _ group=NP . zeros(NP . unique(Xvar)。形状)
n _ 1 _ group=NP . zeros(NP . unique(Xvar)。形状)
对于范围内的I(len(NP . unique(Xvar))):
n _ 0 _ group[I]=Yvar[(Xvar==NP . unique(Xvar)[I])(Yvar==0)]。计数()
n _ 1 _ group[I]=Yvar[(Xvar==NP . unique(Xvar)[I])(Yvar==1)]。计数()
iv=NP . sum((N _ 0 _ group/N _ 0-N _ 1 _ group/N _ 1)* NP . log((N _ 0 _ group/N _ 0)/(N _ 1 _ group/N _ 1)))
返回iv
def caliv_batch(df,Kvar,Yvar):
df_Xvar=df.drop([Kvar,Yvar],axis=1)
ivlist=[]
对于df_Xvar.columns中的col:
iv=CalcIV(df[col],df[Yvar])
ivlist.append(iv)
names=list(df_Xvar.columns)
iv_df=pd。DataFrame({'Var': names,' Iv': ivlist},columns=['Var ',' Iv'])
返回iv_df
其中df是宁滨之后的数据集,Kvar是主键,Yvar是Y变量(0是好的,1是坏的)。
代码运行如下:
补充拓展:python基础IV(切片、迭代、生成列表)
对list进行切片
获取列表中的一些元素是一个非常常见的操作。例如,列表如下:
L=['亚当','丽莎','巴特','保罗']
取前三个元素。我该怎么办?
笨办法:
[L[0],L[1],L[2]]
['亚当','丽莎','巴特']
之所以愚蠢,是因为如果展开,就拿前N个元素没办法了。
取前N个元素,即索引为0-(N-1)的元素,可以使用循环:
r=[]
n=3
对于范围内的I(n):
.r.append(L[i])
.
r
['亚当','丽莎','巴特']
对于这种通常采用指定索引范围的操作,使用循环是非常繁琐的。所以Python提供了Slice操作符,可以大大简化这个操作。
对于上面的问题,取前3个元素,用一行代码切片:
L[0:3]
['亚当','丽莎','巴特']
L[0:3]表示从索引0到索引3,但不包括索引3。即索引0,1,2,正好是3个元素。
如果第一个索引为0,也可以省略:
第三节
['亚当','丽莎','巴特']
您也可以从索引1开始,取出2个元素:
法律[1:3]
['丽莎','巴特']
只使用一个:表示从头到尾:
L[:]
['亚当','丽莎','巴特','保罗']
所以,L[:]其实是复制了一个新的列表。
切片操作还可以指定第三个参数:
l[* 2]
['亚当','巴特']
第三个参数表示每n个元素取一个,上面的L[:2]将每两个元素取一个,即每隔一个元素。
把列表改成元组,切片操作完全一样,只是切片的结果也变成了元组。
倒序切片
对于list,由于Python支持L[-1]取最后一个元素,所以它也支持倒数切片。尝试:
L=['亚当','丽莎','巴特','保罗']
L[-2:]
['巴特','保罗']
L[:-2]
['亚当','丽莎']
L[-3:-1]
['丽莎','巴特']
L[-4:-1:2]
['亚当','巴特']
记住最后一个元素的索引是-1。反向切片包含起始索引,但不包含结束索引。
对字符串切片
字符串' xxx '和Unicode字符串u'xxx '也可以看作是一种列表,每个元素都是一个字符。因此,字符串也可以切片,但运算结果仍然是字符串:
ABCDEFG
' ABC '
ABCDEFG'[-3:]
EFG的
ABCDEFG'[:2]
ACEG的
在很多编程语言中,都为字符串提供了很多种拦截函数,其实目的就是对字符串进行切片。Python没有对字符串的拦截功能。只需要切片一个操作就可以了,非常简单。
什么是迭代
在Python中,如果给定一个链表或元组,我们可以通过一个for循环遍历这个链表或元组,这个遍历叫做迭代。
在Python中,迭代是由for完成的.在中,而在许多语言中,如C或Java,迭代列表是由下标完成的,如Java代码:
for(I=0;ilist.lengthi ) {
n=列表[I];
}
可以看出Python的for循环比Java的for循环更抽象。
因为Python的for循环不仅可以用在list或者tuple上,还可以用在其他任何迭代对象上。
所以迭代运算是指对于一个集合,不管这个集合是有序的还是无序的,我们总是可以通过使用for循环依次取出集合中的每一个元素。
注:集合是指包含一组元素的数据结构。我们已经介绍的内容包括:
1.有序集:列表、元组、str、unicode;
2.无序集合:集合
3.具有键值对的无序集:dict
迭代是一个动词,指的是一个操作。在Python中,它是一个for循环。
迭代和下标访问数组的最大区别在于,后者是迭代的具体实现,而前者只关心迭代结果,根本不关心在迭代内部是如何实现的。
索引迭代
在Python中,迭代总是取出元素本身,而不是元素的索引。
对于有序集合,元素确实被索引。有时,我们确实想在for循环中获取索引。我们做什么呢
方法是使用enumerate()函数:
L=['亚当','丽莎','巴特','保罗']
对于索引,枚举中的名称(L):
.打印索引,“-”,名称
.
0 -亚当
1 -丽莎
2 -巴特
3 -保罗
使用enumerate()函数,我们可以在for循环中同时绑定索引index和元素名称。但是,这不是enumerate()的特殊语法。实际上,enumerate()函数将:
['亚当','丽莎','巴特','保罗']
它变成了这样的东西:
[(0,'亚当'),(1,'丽莎'),(2,'巴特'),(3,'保罗')]
因此,迭代的每个元素实际上是一个元组:
对于枚举中的t(L):
index=t[0]
name=t[1]
打印索引,“-”,名称
如果我们知道每个元组元素包含两个元素,那么for循环可以进一步缩写为:
对于索引,枚举中的名称(L):
打印索引,“-”,名称
这不仅使代码更简单,还消除了两个赋值语句。
可以看出,索引迭代并不是真的被index访问,而是enumerate()函数自动把每个元素变成了一个类似(index,element)的元组。迭代后,索引和元素本身都会被获取。
迭代字典的价值
我们已经知道dict对象本身是一个可迭代的对象。通过用for循环直接迭代dict,我们每次都能得到dict的一个键。
想迭代dict对象的值应该怎么做?
dict对象有一个values()方法,它将dict转换成一个包含所有值的列表。这样,我们迭代的是dict的每个值:
d={ '亚当':95,'丽莎':85,'巴特':59 }
打印d .值()
# [85, 95, 59]
对于d.values()中的v:
印刷
# 85
# 95
# 59
如果仔细阅读Python的文档,还可以发现除了values()方法,dict还有一个itervalues()方法。使用itervalues()代替values()方法具有完全相同的迭代效果:
d={ '亚当':95,'丽莎':85,'巴特':59 }
打印数据条目值()
#0x 106 adbb 50处的字典值迭代器对象
对于d.itervalues()中的v:
印刷
# 85
# 95
# 59
那这两个方法有何不同之处呢?
1.values()方法实际上将一个字典转换成一个包含值的列表。
2.但是itervalues()方法不会被转换,它会在迭代过程中依次从dict中取出值,所以itervalues()方法比values()方法节省了生成列表所需的内存。
3.打印itervalues()并发现它返回一个dictionary-valueiterator对象。这说明在Python中,for循环可以使用的迭代对象远远多于list、tuple、str、unicode、dict等。任何可迭代的对象都可以用在for循环上,我们通常不关心如何在内部迭代。
如果一个对象说可以迭代,那么我们可以用for循环直接迭代。可以看出,迭代是一种抽象的数据操作,它不需要被迭代对象内部的任何数据。
迭代字典的键和值
我们知道如何迭代dict的键和值。那么,我们可以在for循环中同时迭代键和值吗?答案是肯定的。
首先,让我们看看dict对象的items()方法返回的值:
d={ '亚当':95,'丽莎':85,'巴特':59 }
打印数据项()
[('丽莎',85),('亚当',95),('巴特',59)]
如您所见,items()方法将dict对象转换为包含tuple的列表。我们迭代这个列表以获得键和值:
对于键,d.items()中的值:
.打印关键字':',值
.
丽莎:85岁
亚当:95
巴特:59
类似于values(),它有一个itervalues(),items()也有一个对应的iteritems()。iteritems()不把dict转换成list,而是在迭代过程中一直给tuple。所以,iteritems()不会占用额外的内存。
生成列表
要生成列表[1,2,3,4,5,6,7,8,9,10],我们可以使用range(1,11):
范围(1,11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但是如果你想生成[1x1,2x2,3x3,10x10]?第一种方法是循环:
L=[]
对于范围(1,11)中的x:
.l .追加(x * x)
.
L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是循环太繁琐,列表生成公式可以用一行语句代替循环来生成上面的列表:
[范围(1,11)中x的x * x
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
这种写法是Python特有的列表生成。使用列表生成公式,您可以用非常简洁的代码生成一个列表。
写列表生成公式的时候,可以把要生成的元素x * x放在前面,后面是for循环,这样就可以创建一个列表,非常有用。多写几次,很快就熟悉这个语法了。
复杂表达式
使用for循环的迭代不仅可以迭代普通链表,还可以迭代dict。
假设有以下格言:
d={ '亚当':95,'丽莎':85,'巴特':59 }
它可以通过复杂的列表生成转换成HTML表格:
TDS=[' trtd % s/tdtd % s/TD/tr ' %(name,score) for name,score in d.iteritems()]
打印“表格”
打印'总名/总分数/总分数'
打印' \n '。加入(tds)
打印'/表格'
注意:字符串可以用%格式化,用指定的参数替换%s。string的join()方法可以将一个列表拼接成一个字符串。
条件过滤
If判断也可以加在for循环列表后。例如:
[范围(1,11)中x的x * x
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
如果我们只想要偶数的平方,而不改变range(),我们可以添加If来过滤:
[x * x,如果x % 2==0,则x在范围(1,11)内]
[4, 16, 36, 64, 100]
使用if条件,只有当if被判断为真时,循环的当前元素才被添加到列表中。
多层表达式
For循环可以嵌套,因此,在列表生成公式中,多层for循环也可以用来生成列表。
对于字符串“ABC”和“123”,您可以使用两层循环来生成完整的排列:
[m n代表‘ABC’中的m,n代表‘123’中的n]
['A1 ',' A2 ',' A3 ',' B1 ',' B2 ',' B3 ',' C1 ',' C2 ',' C3']
翻译成这样的循环代码:
L=[]
对于“ABC”中的m:
对于“123”中的n:
l .追加(m n)
以上Python计算IV值的举例说明,是边肖分享的全部内容。希望能给你一个参考,多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。