目录
Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 之 [ 数据探索 ] [ 可视化 ] [数据清洗] | 2/3(含分析过程)
一、简单介绍
二、机器学习
1、为什么使用机器学习?
2、机器学习系统的类型,及其对应的学习算法
3、机器学习可利用的开源数据
三、从房价数据集中,进行数据探索、可视化发现规律
1、地理数据可视化
2、查找关联
3、属性组合试验
四、为机器学习算法准备数据
1、数据清洗
2、处理文本和类别属性
wps的的官网下载网站
3、自定义转换器
4、特征缩放
5、转换流水线
附录:
一、一些知识点
1、Scikit-Learn 设计
二、源码工程
wps的官网最新的下载网址怎么找(金山wps官网最新人工电话)
三、该案例的环境 package 信息如下
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
Python 机器学习是利用 Python 编程语言中的各种工具和库来实现机器学习算法和技术的过程。Python 是一种功能强大且易于学习和使用的编程语言,因此成为了机器学习领域的首选语言之一。Python 提供了丰富的机器学习库,如Scikit-learn、TensorFlow、Keras、PyTorch等,这些库包含了许多常用的机器学习算法和深度学习框架,使得开发者能够快速实现、测试和部署各种机器学习模型。
通过 Python 进行机器学习,开发者可以利用其丰富的工具和库来处理数据、构建模型、评估模型性能,并将模型部署到实际应用中。Python 的易用性和庞大的社区支持使得机器学习在各个领域都得到了广泛的应用和发展。
机器学习(Machine Learning)是人工智能(AI)的一个分支领域,其核心思想是通过计算机系统的学习和自动化推理,使计算机能够从数据中获取知识和经验,并利用这些知识和经验进行模式识别、预测和决策。机器学习算法能够自动地从数据中学习并改进自己的性能,而无需明确地编程。这一过程涉及对大量输入数据的分析和解释,以识别数据中的模式和趋势,并生成可以应用于新数据的预测模型。
1、为什么使用机器学习?
使用机器学习的原因主要包括以下几点:
高效性和准确性:机器学习算法能够处理大规模数据集,并从中提取有价值的信息,其预测和决策的准确性往往高于传统方法。自动化和智能化:机器学习能够自动学习和改进,减少了对人工干预的依赖,提高了工作效率和智能化水平。广泛应用性:机器学习在各个领域中都有广泛的应用,如图像识别、语音识别、自然语言处理、推荐系统、金融预测等,为许多实际问题的解决提供了有效的方法和工具。未来趋势:随着人工智能技术的不断发展,机器学习已成为未来的趋势,掌握机器学习技能将有助于提高职业竞争力和创造力。
2、机器学习系统的类型,及其对应的学习算法
机器学习系统可以根据不同的学习方式和目标进行分类,主要包括以下几种类型及其对应的学习算法:
监督学习(Supervised Learning)
定义:使用带有标签的训练数据来训练模型,以预测新数据的标签或目标值。常见算法:
线性回归(Linear Regression):用于预测连续值。逻辑回归(Logistic Regression):用于分类问题,尤其是二分类问题。支持向量机(SVM, Support Vector Machines):用于分类和回归问题,通过寻找最优的超平面来分割数据。决策树(Decision Trees)和随机森林(Random Forests):通过构建决策树或决策树集合来进行分类或回归。神经网络(Neural Networks):模仿人脑神经元的工作方式,通过多层节点之间的连接和权重调整来进行学习和预测。
无监督学习(Unsupervised Learning)
定义:在没有标签的情况下,从数据中发现隐藏的结构和模式。常见算法:
聚类算法(Clustering Algorithms):如K均值(K-Means)、层次聚类分析(HCA)等,用于将数据分组为具有相似特征的簇。降维算法(Dimensionality Reduction Algorithms):如主成分分析(PCA)、t-分布邻域嵌入算法(t-SNE)等,用于减少数据的维度以便于分析和可视化。异常检测(Anomaly Detection):用于识别数据中的异常点或离群点。
强化学习(Reinforcement Learning)
定义:通过与环境的交互学习,以最大化累积奖励为目标。特点:强化学习不需要明确的标签或监督信号,而是根据环境给出的奖励或惩罚来指导学习过程。应用场景:游戏AI、机器人控制、自动驾驶等领域。
半监督学习(Semi-Supervised Learning)
定义:处理部分带标签的训练数据,通常是大量不带标签数据加上小部分带标签数据。特点:结合了监督学习和无监督学习的特点,旨在利用未标记数据来提高模型的泛化能力。常见算法:多数半监督学习算法是非监督和监督算法的结合,如自训练(Self-Training)、协同训练(Co-Training)等。
3、机器学习可利用的开源数据
开源数据集可以根据需要进行选择,涵盖多个领域。以下是一些可以查找的数据的地方,供参考:
流行的开源数据仓库:
UC Irvine Machine Learning RepositoryKaggle datasetsAmazon's AWS datasets准入口(提供开源数据列表)
- Data Portalshttp://opendatamonitor.eu/Financial, Economic and Alternative Data | Nasdaq Data Link其它列出流行开源数据仓库的网页:
Wikipedia's list of Machine Learning datasetsQuora.com questionDatasets subreddit
(注意:代码执行的时候,可能需要科学上网)
目前为止,你只是快速查看了数据,对要处理的数据有了整体了解。现在的目标是更深的探索数据。
首先,保证你将测试集放在了一旁,只是研究训练集。另外,如果训练集非常大,你可能需要再采样一个探索集,保证操作方便快速。在我们的案例中,数据集很小,所以可以在全集上直接工作。创建一个副本,以免损伤训练集:
wps官网的下载的地址在哪里(wps office免费版本下载) 1、地理数据可视化
因为存在地理信息(纬度和经度),创建一个所有街区的散点图来数据可视化是一个不错的主意(图 3-1):
运行结果:

图 3-1 数据的地理信息散点图
这张图看起来很像加州,但是看不出什么特别的规律。将设为 0.1,可以更容易看出数据点的密度(图 3-2):
运行结果:

图 3-2 显示高密度区域的散点图
现在看起来好多了:可以非常清楚地看到高密度区域,湾区、洛杉矶和圣迭戈,以及中央谷,特别是从萨克拉门托和弗雷斯诺。
通常来讲,人类的大脑非常善于发现图片中的规律,但是需要调整可视化参数使规律显现出来。
现在来看房价(图 3-3)。每个圈的半径表示街区的人口(选项),颜色代表价格(选项)。我们用预先定义的名为的颜色图(选项),它的范围是从蓝色(低价)到红色(高价):
运行结果:

图 3-3 加州房价
为了更加形象的展示效果,我们接下来加载地图进入图中:
下载加州地图
运行结果:
Downloading california.png
添加下载的加州地图一并显示,效果见图 3-4
运行结果:
WPS office的官网最新的下载网址的方法

图 3-4 带地图的加州房价图
这张图说明房价和位置(比如,靠海)和人口密度联系密切,这点你可能早就知道。可以使用聚类算法来检测主要的聚集,用一个新的特征值测量聚集中心的距离。尽管北加州海岸区域的房价不是非常高,但离大海距离属性也可能很有用,所以这不是用一个简单的规则就可以定义的问题。
2、查找关联
因为数据集并不是非常大,你可以很容易地使用方法计算出每对属性间的标准相关系数(standard correlation coefficient,也称作皮尔逊相关系数):
现在来看下每个属性和房价中位数的关联度:
运行结果:
median_house_value 1.000000
median_income 0.687151
total_rooms 0.135140
housing_median_age 0.114146
households 0.064590
total_bedrooms 0.047781
population -0.026882
longitude -0.047466
latitude -0.142673
Name: median_house_value, dtype: float64
相关系数的范围是 -1 到 1。当接近 1 时,意味强正相关;例如,当收入中位数增加时,房价中位数也会增加。当相关系数接近 -1 时,意味强负相关;你可以看到,纬度和房价中位数有轻微的负相关性(即,越往北,房价越可能降低)。最后,相关系数接近 0,意味没有线性相关性。图 3-5 展示了相关系数在横轴和纵轴之间的不同图形。

图 3-5 不同数据集的标准相关系数
注意:相关系数只测量线性关系(如果上升,则上升或下降)。相关系数可能会完全忽略非线性关系(例如,如果接近 0,则值会变高)。在上面图片的最后一行中,他们的相关系数都接近于 0,尽管它们的轴并不独立:这些就是非线性关系的例子。另外,第二行的相关系数等于 1 或 -1;这和斜率没有任何关系。例如,你的身高(单位是英寸)与身高(单位是英尺或纳米)的相关系数就是 1。
另一种检测属性间相关系数的方法是使用 Pandas 的函数,它能画出每个数值属性对每个其它数值属性的图。因为现在共有 11 个数值属性,你可以得到张图,在一页上画不下,所以只关注几个和房价中位数最有可能相关的属性(图 3-6):
运行结果:

图 3-6 散点矩阵
如果 pandas 将每个变量对自己作图,主对角线(左上到右下)都会是直线图。所以 Pandas 展示的是每个属性的柱状图(也可以是其它的,请参考 Pandas 文档)。
最有希望用来预测房价中位数的属性是收入中位数,因此将这张图放大(图 3-7):
运行结果:

图 3-7 收入中位数 vs 房价中位数
这张图说明了几点。首先,相关性非常高;可以清晰地看到向上的趋势,并且数据点不是非常分散。第二,我们之前看到的最高价,清晰地呈现为一条位于 500000 美元的水平线。这张图也呈现了一些不是那么明显的直线:一条位于 450000 美元的直线,一条位于 350000 美元的直线,一条在 280000 美元的线,和一些更靠下的线。你可能希望去除对应的街区,以防止算法重复这些巧合。
3、属性组合试验
希望前面的一节能教给你一些探索数据、发现规律的方法。你发现了一些数据的巧合,需要在给算法提供数据之前,将其去除。你还发现了一些属性间有趣的关联,特别是目标属性。你还注意到一些属性具有长尾分布,因此你可能要将其进行转换(例如,计算其对数)。当然,不同项目的处理方法各不相同,但大体思路是相似的。
给算法准备数据之前,你需要做的最后一件事是尝试多种属性组合。例如,如果你不知道某个街区有多少户,该街区的总房间数就没什么用。你真正需要的是每户有几个房间。相似的,总卧室数也不重要:你可能需要将其与房间数进行比较。每户的人口数也是一个有趣的属性组合。让我们来创建这些新的属性:
现在,再来看相关矩阵:
运行结果:
median_house_value 1.000000
median_income 0.687151
rooms_per_household 0.146255
total_rooms 0.135140
housing_median_age 0.114146
households 0.064590
total_bedrooms 0.047781
population_per_household -0.021991
population -0.026882
longitude -0.047466
latitude -0.142673
bedrooms_per_room -0.259952
Name: median_house_value, dtype: float64
看起来不错!与总房间数或卧室数相比,新的属性与房价中位数的关联更强。显然,卧室数/总房间数的比例越低,房价就越高。每户的房间数也比街区的总房间数的更有信息,很明显,房屋越大,房价就越高。
我们用来预测房价中位数的属性是房间数,因此将这张图放大(图 3-8):
运行结果:

图 3-8 房间数 vs 房价中位数
方法展示了数值属性的概括,见图 3-9
运行结果:

图 3-9 每个数值属性的概括
这一步的数据探索不必非常完备,此处的目的是有一个正确的开始,快速发现规律,以得到一个合理的原型。但是这是一个交互过程:一旦你得到了一个原型,并运行起来,你就可以分析它的输出,进而发现更多的规律,然后再回到数据探索这步。
现在来为机器学习算法准备数据。不要手工来做,你需要写一些函数,理由如下:
函数可以让你在任何数据集上(比如,你下一次获取的是一个新的数据集)方便地进行重复数据转换。
你能慢慢建立一个转换函数库,可以在未来的项目中复用。
在将数据传给算法之前,你可以在实时系统中使用这些函数。
这可以让你方便地尝试多种数据转换,查看哪些转换方法结合起来效果最好。
但是,还是先回到干净的训练集(通过再次复制),将预测量和标签分开,因为我们不想对预测量和目标值应用相同的转换(注意创建了一份数据的备份,而不影响):
1、数据清洗
大多机器学习算法不能处理缺失的特征,因此先创建一些函数来处理特征缺失的问题。前面,你应该注意到了属性有一些缺失值。有三个解决选项:
去掉对应的街区;
去掉整个属性;
进行赋值(0、平均值、中位数等等)。
运行结果:

图3-10
用的,,和方法,可以方便地实现:
运行结果:

图3-11
运行结果:

图3-12
运行结果:

图3-13
如果选择选项 3,你需要计算训练集的中位数,用中位数填充训练集的缺失值,不要忘记保存该中位数。后面用测试集评估系统时,需要替换测试集中的缺失值,也可以用来实时替换新数据中的缺失值。
Scikit-Learn 提供了一个方便的类来处理缺失值:。下面是其使用方法:首先,需要创建一个实例,指定用某属性的中位数来替换该属性所有的缺失值:
因为只有数值属性才能算出中位数,我们需要创建一份不包括文本属性的数据副本:
现在,就可以用方法将实例拟合到训练数据:
计算出了每个属性的中位数,并将结果保存在了实例变量中。虽然此时只有属性存在缺失值,但我们不能确定在以后的新的数据中会不会有其他属性也存在缺失值,所以安全的做法是将应用到每个数值:
运行结果:
[-118.51 34.26 29. 2119. 433. 1164.
408. 3.54155]
运行结果:
[-118.51 34.26 29. 2119. 433. 1164.
408. 3.54155]
现在,你就可以使用这个“训练过的”来对训练集进行转换,将缺失值替换为中位数:
结果是一个包含转换后特征的普通的 Numpy 数组。如果你想将其放回到 Pandas中,也很简单:
运行结果:

顺便看看 ocean_proximity
运行结果:

2、处理文本和类别属性
前面,我们丢弃了类别属性,因为它是一个文本属性,不能计算出中位数。大多数机器学习算法更喜欢和数字打交道,所以让我们把这些文本标签转换为数字。
Scikit-Learn 为这个任务提供了一个转换器OrdinalEncoder:
Warning: earlier versions of the book used the class or Pandas' method to encode string categorical attributes as integers. However, the class that was introduced in Scikit-Learn 0.20 (see PR #10521) is preferable since it is designed for input features ( instead of labels ) and it plays well with pipelines (introduced later in this notebook). If you are using an older version of Scikit-Learn (<0.20), then you can import it from instead.
运行结果:
array([[1.],
[4.],
[1.],
[4.],
[0.],
[3.],
[0.],
[0.],
[0.],
[0.]])
好了一些,现在就可以在任何 ML 算法里用这个数值数据了。你可以查看映射表,编码器是通过属性 categories_ 来学习的(被映射为 0,被映射为 1,等等):
运行结果:
[array(['<1H OCEAN', 'INLAND', 'ISLAND', 'NEAR BAY', 'NEAR OCEAN'],
dtype=object)]
这种做法的问题是,ML 算法会认为两个临近的值比两个疏远的值要更相似。显然这样不对(比如,分类 0 和分类 4 就比分类 0 和分类 1 更相似)。要解决这个问题,一个常见的方法是给每个分类创建一个二元属性:当分类是,该属性为 1(否则为 0),当分类是,另一个属性等于 1(否则为 0),以此类推。这称作独热编码(One-Hot Encoding),因为只有一个属性会等于 1(热),其余会是 0(冷)。
Scikit-Learn 提供了一个编码器,用于将整数分类值转变为独热向量。注意用于 2D 数组,而是一个 1D 数组,所以需要将其变形:
运行结果:
<Compressed Sparse Row sparse matrix of dtype 'float64'
with 16512 stored elements and shape (16512, 5)>
注意输出结果是一个 SciPy 稀疏矩阵,而不是 NumPy 数组。当类别属性有数千个分类时,这样非常有用。经过独热编码,我们得到了一个有数千列的矩阵,这个矩阵每行只有一个 1,其余都是 0。使用大量内存来存储这些 0 非常浪费,所以稀疏矩阵只存储非零元素的位置。你可以像一个 2D 数据那样进行使用,但是如果你真的想将其转变成一个(密集的)NumPy 数组,只需调用方法:
运行结果:
array([[0., 1., 0., 0., 0.],
[0., 0., 0., 0., 1.],
[0., 1., 0., 0., 0.],
…,
[1., 0., 0., 0., 0.],
[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.]])
3、自定义转换器
尽管 Scikit-Learn 提供了许多有用的转换器,你还是需要自己动手写转换器执行任务,比如自定义的清理操作,或属性组合。你需要让自制的转换器与 Scikit-Learn 组件(比如流水线)无缝衔接工作,因为 Scikit-Learn 是依赖鸭子类型的(而不是继承),你所需要做的是创建一个类并执行三个方法:(返回),,和。通过添加作为基类,可以很容易地得到最后一个。另外,如果你添加作为基类(且构造器中避免使用和),你就能得到两个额外的方法(和),二者可以方便地进行超参数自动微调。例如,一个小转换器类添加了上面讨论的属性:
在这个例子中,转换器有一个超参数,默认设为(提供一个合理的默认值很有帮助)。这个超参数可以让你方便地发现添加了这个属性是否对机器学习算法有帮助。更一般wps的的官网下载的地方地,你可以为每个不能完全确保的数据准备步骤添加一个超参数。数据准备步骤越自动化,可以自动化的操作组合就越多,越容易发现更好用的组合(并能节省大量时间)。
或者,你可以使用Scikit-Learn的FunctionTransformer类,它让你可以轻松地基于转换函数创建一个转换器(感谢Hanmin Qin建议了这段代码)。请注意,我们需要设置validate=False,因为数据包含非浮点值(在Scikit-Learn 0.22中,validate默认为False)。
运行结果:

4、特征缩放
数据要做的最重要的转换之一是特征缩放。除了个别情况,当输入的数值属性量度不同时,机器学习算法的性能都不会好。这个规律也适用于房产数据:总房间数分布范围是 6 到 39320,而收入中位数只分布在 0 到 15。注意通常情况下我们不需要对目标值进行缩放。
有两种常见的方法可以让所有的属性有相同的量度:线性函数归一化(Min-Max scaling)和标准化(standardization)。
线性函数归一化(许多人称其为归一化(normalization))很简单:值被转变、重新缩放,直到范围变成 0 到 1。我们通过减去最小值,然后再除以最大值与最小值的差值,来进行归一化。Scikit-Learn 提供了一个转换器来实现这个功能。它有一个超参数,可以让你改变范围,如果不希望范围是 0 到 1。
标准化就很不同:首先减去平均值(所以标准化值的平均值总是 0),然后除以方差,使得到的分布具有单位方差。与归一化不同,标准化不会限定值到某个特定的范围,这对某些算法可能构成问题(比如,神经网络常需要输入值得范围是 0 到 1)。但是,标准化受到异常值的影响很小。例如,假设一个街区的收入中位数由于某种错误变成了 100,归一化会将其它范围是 0 到 15 的值变为 0-0.15,但是标准化不会受什么影响。Scikit-Learn 提供了一个转换器来进行标准化。
5、转换流水线
你已经看到,存在许多数据转换步骤,需要按一定的顺序执行。幸运的是,Scikit-Learn 提供了类,来进行这一系列的转换。下面是一个数值属性的小流水线:
运行结果:
array([[-0.94135046, 1.34743822, 0.02756357, …, 0.01739526,
0.00622264, -0.12112176],
[ 1.17178212, -1.19243966, -1.72201763, …, 0.56925554,
-0.04081077, -0.81086696],
[ 0.26758118, -0.1259716 , 1.22045984, …, -0.01802432,
-0.07537122, -0.33827252],
…,
[-1.5707942 , 1.31001828, 1.53856552, …, -0.5092404 ,
-0.03743619, 0.32286937],
[-1.56080303, 1.2492109 , -1.1653327 , …, 0.32814891,
-0.05915604, -0.45702273],
[-1.28105026, 2.02567448, -0.13148926, …, 0.01407228,
0.00657083, -0.12169672]])
构造器需要一个定义步骤顺序的名字/估计器对的列表。除了最后一个估计器,其余都要是转换器(即,它们都要有方法)。名字可以随意起。
当你调用流水线的方法,就会对所有转换器顺序调用方法,将每次调用的输出作为参数传递给下一个调用,一直到最后一个估计器,它只执行方法。
流水线暴露相同的方法作为最终的估计器。在这个例子中,最后的估计器是一个,它是一个转换器,因此这个流水线有一个方法,可以顺序对数据做所有转换(它还有一个方法可以使用,就不必先调用再进行)。
如果不需要手动将 Pandas中的数值列转成 Numpy 数组的格式,而可以直接将输入 pipeline 中进行处理就好了。Scikit-Learn 没有工具来处理 Pandas,因此我们需要写一个简单的自定义转换器来做这项工作:
每个子流水线都以一个选择转换器开始:通过选择对应的属性(数值或分类)、丢弃其它的,来转换数据,并将输出转变成一个 NumPy 数组。这样,你就可以很简单的写出一个以 Pandas 为输入并且可以处理数值的流水线: 该流水线从开始获取数值属性,前面讨论过的其他数据处理步骤紧随其后。 并且你也可以通过使用选择类别属性并为其写另一个流水线然后应用.
你现在就有了一个对数值的流水线,你还需要对分类值应用:如何将这些转换写成一个流水线呢?Scikit-Learn 提供了一个类实现这个功能。你给它一列转换器(可以是所有的转换器),当调用它的方法,每个转换器的会被并行执行,等待输出,然后将输出合并起来,并返回结果(当然,调用它的方法就会调用每个转换器的)。一个完整的处理数值和类别属性的流水线如下所示:
你可以很简单地运行整个流水线:
运行结果:
(16512, 16)
作为参考,以下是基于DataFrameSelector转换器的旧解决方案(仅选择Pandas DataFrame列的一个子集)和FeatureUnion:
现在,让我们将所有这些组件连接到一个大型管道中,它将预处理数值型和类别型特征(同样,如果愿意,我们可以使用CombinedAttributesAdder()而不是FunctionTransformer(…)):
运行代码,查看结果
运行结果:
<Compressed Sparse Row sparse matrix of dtype 'float64'
with 198144 stored elements and shape (16512, 16)>
结果与ColumnTransformer相同:
运行结果:
True
1、Scikit-Learn 设计
Scikit-Learn 设计的 API 设计的非常好。它的主要设计原则是:
一致性:所有对象的接口一致且简单:
估计器(estimator)。任何可以基于数据集对一些参数进行估计的对象都被称为估计器(比如,就是个估计器)。估计本身是通过方法,只需要一个数据集作为参数(对于监督学习算法,需要两个数据集;第二个数据集包含标签)。任何其它用来指导估计过程的参数都被当做超参数(比如的),并且超参数要被设置成实例变量(通常通过构造器参数设置)。转换器(transformer)。一些估计器(比如)也可以转换数据集,这些估计器被称为转换器。API 也是相当简单:转换是通过方法,被转换的数据集作为参数。返回的是经过转换的数据集。转换过程依赖学习到的参数,比如的例子。所有的转换都有一个便捷的方法,等同于调用再(但有时经过优化,运行的更快)。预测器(predictor)。最后,一些估计器可以根据给出的数据集做预测,这些估计器称为预测器。例如,上一章的模型就是一个预测器:它根据一个国家的人均 GDP 预测生活满意度。预测器有一个方法,可以用新实例的数据集做出相应的预测。预测器还有一个方法,可用于评估测试集(如果是监督学习算法的话,还要给出相应的标签)的预测质量。
可检验。所有估计器的超参数都可以通过实例的公共变量直接访问(比如,),并且所有估计器学习到的参数也可以通过在实例变量名后加下划线来访问(比如,)。
类不可扩散。数据集被表示成 NumPy 数组或 SciPy 稀疏矩阵,而不是自制的类。超参数只是普通的 Python 字符串或数字。
可组合。尽可能使用现存的模块。例如,用任意的转换器序列加上一个估计器,就可以做成一个流水线,后面会看到例子。
合理的默认值。Scikit-Learn 给大多数参数提供了合理的默认值,很容易就能创建一个系统。
https://github.com/XANkui/PythonMachineLearnIntermediateLevel
Package Version
————————- ————–
anyio 4.4.0
argon2-cffi 23.1.0
argon2-cffi-bindings 21.2.0
arrow 1.3.0
asttokens 2.4.1
async-lru 2.0.4
attrs 23.2.0wps 的官网最新下载地址是什么
Babel 2.15.0
beautifulsoup4 4.12.3
bleach 6.1.0
certifi 2024.7.4
cffi 1.16.0
charset-normalizer 3.3.2
colorama 0.4.6
comm 0.2.2
contourpy 1.2.1
cycler 0.12.1
debugpy 1.8.2
decorator 5.1.1
defusedxml 0.7.1
executing 2.0.1
fastjsonschema 2.20.0
fonttools 4.53.1
fqdn 1.5.1
h11 0.14.0
httpcore 1.0.5
httpx 0.27.0
idna 3.7
ipykernel 6.29.5
ipython 8.26.0
ipywidgets 8.1.3
isoduration 20.11.0
jedi 0.19.1
Jinja2 3.1.4
joblib 1.4.2
json5 0.9.25
jsonpointer 3.0.0
jsonschema 4.23.0
jsonschema-specifications 2023.12.1
jupyter 1.0.0
jupyter_client 8.6.2
jupyter-console 6.6.3
jupyter_core 5.7.2
jupyter-events 0.10.0
jupyter-lsp 2.2.5
jupyter_server 2.14.2
jupyter_server_terminals 0.5.3
jupyterlab 4.2.4
jupyterlab_pygments 0.3.0
jupyterlab_server 2.27.3
jupyterlab_widgets 3.0.11
kiwisolver 1.4.5
MarkupSafe 2.1.5
matplotlib 3.9.1
matplotlib-inline 0.1.7
mistune 3.0.2
nbclient 0.10.0
nbconvert 7.16.4
nbformat 5.10.4
nest-asyncio 1.6.0
notebook 7.2.1
notebook_shim 0.2.4
numpy 2.0.1
overrides 7.7.0
packaging 24.1
pandas 2.2.2
pandocfilters 1.5.1
parso 0.8.4
pillow 10.4.0
pip 24.1.2
platformdirs 4.2.2
prometheus_client 0.20.0
prompt_toolkit 3.0.47
psutil 6.0.0
pure_eval 0.2.3
pycparser 2.22
Pygments 2.18.0
pyparsing 3.1.2
python-dateutil 2.9.0.post0
python-json-logger 2.0.7
pytz 2024.1
pywin32 wps office 的官方下载网站是多少(wps官网最新下载电脑版官方下载免费版) 306
pywinpty 2.0.13
PyYAML 6.0.1
pyzmq 26.0.3
qtconsole 5.5.2
QtPy 2.4.1
referencing 0.35.1
requests 2.32.3
rfc3339-validator 0.1.4
rfc3986-validator 0.1.1
rpds-py 0.19.1
scikit-learn 1.5.1
scipy 1.14.0
Send2Trash 1.8.3
setuptools 70.1.1
six 1.16.0
sniffio 1.3.1
soupsieve 2.5
stack-data 0.6.3
terminado 0.18.1
threadpoolctl 3.5.0
tinycss2 1.3.0
tornado 6.4.1
traitlets 5.14.3
types-python-dateutil 2.9.0.20240316
typing_extensions 4.12.2
tzdata 2024.1
uri-template 1.3.0
urllib3 2.2.2
wcwidth 0.2.13
webcolors 24.6.0
webencodings 0.5.1
websocket-client 1.8.0
wheel 0.43.0
widgetsnbextension 4.0.11