在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
库可以说是最有效的。
使用SciPy
和NumPy
在 Python 中对数据进行分级
从SciPy
和NumPy
开始,假设你有一个你想分类的数据点列表。第一步是导入SciPy
和NumPy
库:
import numpy as np
import scipy as sp
接下来,你需要定义分仓的边缘。这可以用linspace
函数来完成:
bin_edges = np.linspace(start, stop, num=num_bins)
其中start
和stop
分别是数据的最小值和最大值,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))