,,Python计算IV值的示例讲解

,,Python计算IV值的示例讲解

今天边肖给大家分享一个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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: