快捷搜索:  汽车  科技

python覆盖分析(被多种离散化场景困扰)

python覆盖分析(被多种离散化场景困扰)In [24]: ages=[20 22 25 27 21 23 37 31 61 45 41 32]接下来将这些数据划分为“18到25“、”26到35“、”35到60“以及”60以上“几个面元。要实现此功能,需要使用pandas的cut函数:8种python技巧为了便于分析,连续数据常常被离散化或拆分为“面元“(bin),假设有一组人员数据,而你希望将它们划分为不同的年龄组:In [154]: ages=[20 22 25 27 21 23 37 31 61 45 41 32]


python覆盖分析(被多种离散化场景困扰)(1)

前言

python数据处理与分析学习过程中,需要有这样的一种意识,即元“为什么选择了python而不是其他?”既然选择了python,那么在实际应用中,它到底哪里不一样?大家说的方便、快捷、高复用性具体体现在哪里?带着问题进行学习,会有事半功倍的效果,记忆力和识别能力也会有所提高。

在本文,小编跟大家分享的是数据处理与分析中的“离散化或面元”。8种python技巧,让连续数据离散化更简洁。

python覆盖分析(被多种离散化场景困扰)(2)

8种python技巧

为了便于分析,连续数据常常被离散化或拆分为“面元“(bin),假设有一组人员数据,而你希望将它们划分为不同的年龄组:

In [154]: ages=[20 22 25 27 21 23 37 31 61 45 41 32]

离散化或面元:cut()

接下来将这些数据划分为“18到25“、”26到35“、”35到60“以及”60以上“几个面元。要实现此功能,需要使用pandas的cut函数:

In [24]: ages=[20 22 25 27 21 23 37 31 61 45 41 32]

In [25]: bins=[18 25 35 60 100]

In [26]: cats=pd.cut(ages bins)

In [27]: cats

Out[27]:

[(18 25] (18 25] (18 25] (25 35] (18 25] ... (25 35]

(60 100] (35 60] (35 60] (25 35]]

Length: 12

Categories (4 interval[int64]): [(18 25] < (25 35] < (35 60] < (60 100]]

codes属性:标号

In [29]: cats.codes

Out[29]: array([0 0 0 1 0 0 2 1 3 2 2 1] dtype=int8)

value_counts方法

该方法会按照离散化或面元结果,进行符合区间的值统计,具体使用方法如下:

In [30]: pd.value_counts(cats)

Out[30]:

(18 25] 5

(35 60] 3

(25 35] 3

(60 100] 1

dtype: int64

控制开/关:right=False

跟“区间“的数学符号一样,圆括号表示开端,而方括号则表示闭端(包括)。哪边是闭端可以通过right=False进行修改:

In [31]: pd.cut(ages [18 26 36 61 100] right=False)

Out[31]:

[[18 26) [18 26) [18 26) [26 36) [18 26) ... [26 36)

[61 100) [36 61) [36 61) [26 36)]

Length: 12

Categories (4 interval[int64]): [[18 26) < [26 36) < [36 61) < [61 100)]

设置面元名称:labels

设置自己的面元名称,将labels选项设置为一个列表或数组即可:

In [33]: group_names=['Youth' 'YoungAdult' 'MiddleAged' 'Senior']

In [34]: pd.cut(ages bins labels=group_names)

Out[34]:

[Youth Youth Youth YoungAdult Youth ... YoungAdult

Senior MiddleAged MiddleAged YoungAdult]

Length: 12

Categories (4 object): [Youth < YoungAdult < MiddleAged < Senior]

计算等长面元

如果向cut传入的是面元的数量而不是确切的面元边界,则它会根据数据的最小值和最大值计算等长面元。下面这个例子中,将一些均匀分布的数组分成四组:

In [35]: data=np.random.rand(20)

In [36]: pd.cut(data 4 precision=2)

Out[36]:

[(0.039 0.27] (0.27 0.5] (0.73 0.95] (0.5 0.73]

(0.039 0.27] ... (0.5 0.73] (0.27 0.5] (0.73 0.95]

(0.039 0.27] (0.73 0.95]]

Length: 20

Categories (4 interval[float64]): [(0.039 0.27] < (0.27 0.5]

< (0.5 0.73] < (0.73 0.95]]

qcut()

qcut是一个非常类似于cut的函数,它可以根据样本分位数对数据进行面元划分。根据数据的分布情况,cut可能无法使各个面元中含有相同数量的数据点。而qcut由于使用的是样本分位数,因此可以得到大小基本相等的面元:

In [37]: data=np.random.randn(1000)

In [38]: cats=pd.qcut(data 4)

In [39]: cats

Out[39]:

[(-0.66 -0.0518] (0.68 3.328] (-0.66 -0.0518] (0.68 3.328]

(-3.452 -0.66] ... (-3.452 -0.66] (0.68 3.328] (-3.452 -0.66]

(-0.66 -0.0518] (-3.452 -0.66]]

Length: 1000

Categories (4 interval[float64]): [(-3.452 -0.66] < (-0.66 -0.0518]

< (-0.0518 0.68] < (0.68 3.328]]

In [40]: pd.value_counts(cats)

Out[40]:

(0.68 3.328] 250

(-0.0518 0.68] 250

(-0.66 -0.0518] 250

(-3.452 -0.66] 250

设置自定义分位数

跟cut一样,也可以设置自定义的分位数(0到1之间的数值,包含端点):

python覆盖分析(被多种离散化场景困扰)(3)

总结

离散化或面元是数据处理与分析中的常用方法。python提供了便捷、丰富的方法。该类方法通常是解决数据分析、机器学习或深度学习中,需要将连续性变量离散化的场景。8种不同的技巧均有其适用场景,无好与坏之分。大家可以实践操作进行体验,感谢大家关注!

猜您喜欢: