在Python中使用SciPy、NumPy和Pandas的宾语数据

随着数据和用例的指数级增长,数据分档或分类对于理解这些数据变得非常必要。

关于数据分类,有不同的技术可用,如数据聚类或更经典的统计技术,如回归分析。

我们将看到为什么你需要数据分选,以及哪种技术最适合哪种情况。

Python中的分选

分级是推断不同变量关系的最强大的分析技术之一。

分级是一种非参数和高度灵活的技术,在这种技术中,变量被归类为不同的集合以揭示模式和趋势。它广泛适用于各种数据集和微小的样本量。

分组是一个将数据分组的过程。它可以出于各种目的,如按范围对数据点进行分组,按密度对数据点进行分组,或按相似度对数据点进行分组。

在python中,有多种方法来对数据进行分组,比如使用numpy.digitize() 函数,pandas.cut() 函数,以及使用scipy.stats.binned_statistic() 函数。

每种方法都有优点和缺点,所以选择合适的方法来完成任务是至关重要的。

数据分档的重要性

数据分档是一个简单的概念:为更直接的分析对数据进行分类。例如,你在CSV中可能有几个大的数据表,你想把数据分成小块。

数据分档允许你把数据放到不同的组中,这样你就可以更好地分析它,我们还可以用它来创建漂亮的可视化。

那么,为什么数据分档是必要的?首先,数据分档是必不可少的,因为它可以帮助你更好地分析你的数据。例如,你可以将整个数据表分割成更小的块状,更容易理解或可视化。

数据分档可以帮助你找到数据中的模式,使你更容易识别异常值。它允许你把一个庞大的数据集,使其更容易管理,以获得问题的实质。

数据分档是一个将连续变量细分为离散分档的过程。作为一个粗略的例子,如果你有一个病人的体温变量,你可以把温度分成五档(比如,< 36.5, 36.5–37.5, 37.5–38.5, 38.5–39.5 and > 39.5 )。

这样做的好处是,你可以在直方图或箱形图中使用仓的范围对变量进行可视化。

在Python中对数据进行分类的不同方法

有几种方法可以在Python中对数据进行分级,但是使用SciPy NumPy 库可以说是最有效的。

使用SciPyNumPy 在 Python 中对数据进行分级

SciPyNumPy 开始,假设你有一个你想分类的数据点列表。第一步是导入SciPyNumPy 库:

import numpy as np
import scipy as sp

接下来,你需要定义分仓的边缘。这可以用linspace 函数来完成:

bin_edges = np.linspace(start, stop, num=num_bins)

其中startstop 分别是数据的最小值和最大值,num_bins 是你想要创建的bin的编号。最后,你可以使用SciPy 直方图函数对数据进行分类:

binned_data = sp.histogram(data, bin_edges)

binned_data 变量现在将包含一个有两个元素的元组。第一个元素是一个分选数据的数组,第二个元素是一个分选边缘的数组。

在Python中使用Numpy 来对数据进行分级

代码示例:

# import Numpy library
import numpy
# define the edges of bin
data = numpy.random.random(100)
bins = numpy.linspace(0, 1, 10)
# finally, bin the data using numpy
digitized = numpy.digitize(data, bins)
bin_means = [data[digitized == i].mean() for i in range(1, len(bins))]
bins = numpy.linspace(0, 1, 10)
digitized = numpy.digitize(data, bins)
[data[digitized == i].mean() for i in range(1, len(bins))]

输出:

[0.05308461260140375,
 0.16559348769870028,
 0.28950800899648155,
 0.3874228665181473,
 0.5046647094141071,
 0.6254841134474202,
 0.7216935463408317,
 0.8374773268113803,
 0.9421576008815353]

在Python中使用Pandas 对数据进行分级

代码示例:

# import libraries
import numpy as np
import pandas
df = pandas.DataFrame({"a": np.random.random(100),
                       "b": np.random.random(100) + 10})
# will Bin the data frame by "a" in 10 bins
bins = np.linspace(df.a.min(), df.a.max(), 10)
groups = df.groupby(pandas.cut(df.a, bins))
# Get the b mean that the values will bin
print (groups.mean().b)

输出:

a
(0.00762, 0.117]    10.576639
(0.117, 0.226]      10.319629
(0.226, 0.335]      10.633805
(0.335, 0.444]      10.404979
(0.444, 0.553]      10.551616
(0.553, 0.662]      10.420306
(0.662, 0.771]      10.434091
(0.771, 0.88]       10.402038
(0.88, 0.989]       10.537547
Name: b, dtype: float64

在Python中使用SciPy 来对数据进行分级

代码示例:

# import libraries
import numpy as np
from scipy import stats
# define array
arr = [20, 2, 7, 1, 34]
print("narr : n", arr)
# start binning
print("nbinned_statistic for median : n", stats.binned_statistic(
        arr, np.arange(5), statistic ='median', bins = 4))

输出:

Array = [20, 2, 7, 1, 34]
Binned statistics for median
BinnedStatisticResult(statistic=array([ 2., nan,  0.,  4.]), bin_edges=array([ 1.  ,  9.25, 17.5 , 25.75, 34.  ]), binnumber=array([3, 1, 1, 1, 4], dtype=int64))