[机器学习-01]一文了解|机器学习简介、工具选择和Python包基础应用

发布于:2024-05-08 ⋅ 阅读:(23) ⋅ 点赞:(0)

目录

前言

正文

01-机器学习简介

       (1)诞生过程

        (2)人工智能、机器学习和深度学习之间的关系

       (3)机器学习核心

02-机器学习工具

      (1)Anaconda简介

      (2)Jupyter Notebook简介

      (3) Anaconda Prompt简介

      (4) Python常用包简介

03-Python工具包的使用示例

    (1) Python工具包的调用

 (2) Matplotlib包的使用示例

    (3) NumPy包的使用示例

(4) Pandas包的使用示例

总结


前言

        机器学习是一种人工智能(AI)的分支,旨在让计算机系统自动通过数据学习并改进。它能够让机器通过分析大量数据来做出决策,而无需编程指定特定任务的解决方案。机器学习的核心思想是通过训练模型来使计算机系统能够自动进行决策,并不断地通过数据来改进自身的性能。

        机器学习在如今的社会生活中发挥着越来越重要的作用,包括医疗保健、金融、营销、交通、安全等各个领域。通过机器学习,我们可以提高生产效率、预测未来趋势、优化资源利用、改善用户体验等。随着技术的不断发展,机器学习也在不断演进和深化,为人类带来更多的便利和创新。

c9bf0c351e1c422982b7ac354af99fe7.png

图1 人类思考与机器学习

        注: 文章较长,但都是干货,可以仔细阅读,欢迎大家支持。本文的所有代码执行过程均在Anaconda下的Jupyter Notebook Web应用程序为便于阅读,都采用Jupyter Notebook编写并执行Python3程序。

正文

01-机器学习简介

       (1)诞生过程

        诞生于20 世纪 50 年代的人工智能(Artificial Intelligence,AI),因旨在实现人脑部分思维的计算机模拟,完成人类智力任务的自动化实现,从研究伊始就具有浓厚的神秘色彩。人工智能的研究经历了从符号主义人工智能(symbolic AI),到机器学习 (Machine Learning)到深度学习(Deep Learning)的不同发展阶段:

        a、符号主义人工智能:基于“一切都可规则化编码”的基本信念:作为符号主义人工智能另一重大应用研究成果的计算机博弈,体现在国际象棋、中国象棋、五子棋、围棋等棋类应用上。其巅峰成果之一是IBM研制的深蓝(Deep Blue)超级智能计算机系统。1997年5月,深蓝与国际象棋大师加里·卡斯帕罗夫(Garry Kasparov)进行了6局制比赛,结果深蓝以两胜三平一负的成绩获胜。深蓝出神入化的棋艺依赖于能快速评估每一步棋可能走法的利弊评估系统,而该系统背后除了有高性能计算机硬件系统的支撑,还有基于数千种经典对局和残局数据库的一般规则,以及人类棋手国际象棋大师乔约尔·本杰明的参谋团队针对卡斯帕罗夫的套路而专门设置的应对策略。但计算机博弈存在“致命”的“死穴”,那就是人类不按“套路出牌”会使计算机无法正确判断而导致失败。

        b、机器学习概念的提出源于“人工智能之父”阿兰·图灵的图灵测试: “思考的机器”是可能的

        c、相对于经典的程序设计范式,机器学习是一种新的编程范式

        机器学习的最大突破是2006年提出的深度学习:从数据中学习“数据表示”。强调基于训练数据,通过众多连 续的神经网络层(layer),过滤和提取数据中的服务于预测的重要特征。相对于拥有众多层的深度学习,机器学习有时也被称为浅层学习(Shallow Learning)。

cb1291c7e6804419bbf7815da4de3b03.png

图2 发展历程

        (2)人工智能、机器学习和深度学习之间的关系

        人工智能(Artificial Intelligence, AI)、机器学习(Machine Learning, ML)和深度学习(Deep Learning, DL)是三个密切相关但又有区别的概念。

        人工智能是一门研究如何使计算机能够像人类一样完成智能任务的学科,其目标是创造能够模拟人类智能的机器。人工智能包括了众多领域,如知识推理、自然语言处理、计算机视觉等。

        机器学习是人工智能的一个分支,其关注点在于通过数据和算法让机器具有学习能力。机器学习算法利用数据来自动改进模型的性能,而无需明确编程。在机器学习中,需要对数据进行训练和测试,以构建能够预测和识别模式的模型。

        深度学习是机器学习的一种特殊形式,它模仿人脑神经网络的结构和功能,通过多层神经网络进行复杂的模式识别和学习。深度学习在大规模数据和强大计算能力下取得了很大成功,在语音识别、图像处理等领域取得了许多突破性成果。

2cd62ef8a1e04f38a669f1cef1e940e3.png

图3 人工智能、机器学习和深度学习之间的关系

       (3)机器学习核心

        机器学习的主要任务:通过数据建模来完成数据预测和数据聚类两大主要任务。

        数据预测是基于已有数据集,归纳出输入变量和输出变量之间的数量关系,从而可以发现影响输出变量的重要输入变量,并通过数量关系预测新数据的输出变量取值。

        数据预测包括回归预测和分类预测,其中分类预测可进一步细分为二分类预测和多分类预测。下面图4和图6分别是回归和分类预测的例子:

f45ff4b393524b94b48edcf33104350b.png

图4 回归预测

        鸢尾花Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。介绍如下:

c3e1326d6f724069b1c84b0cb6fbcff0.png

图5 鸢尾花

        分类预测代码如下,在这里不做详细介绍,后续对代码做出介绍。 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings(action = 'ignore')
from sklearn.datasets import load_iris
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
# 获取鸢尾花数据集
iris = load_iris()
# 把数据转换成dataframe的格式
iris_d = pd.DataFrame(iris['data'], columns = ['花瓣长度', '花瓣宽度', '花蕊长度', '花蕊宽度'])
iris_d['种类'] = iris.target

def plot_iris(iris, col1, col2):
    sns.lmplot(x = col1, y = col2, data = iris, hue = "种类", fit_reg = False)
    plt.xlabel(col1)
    plt.ylabel(col2)
    plt.title('鸢尾花种类分布图')
    plt.savefig("../案例/花.png", dpi=300)
    plt.show()
plot_iris(iris_d, '花蕊宽度', '花瓣长度')

d8753cef4b7945bd8bb481467c783884.png

图6 分类预测

        数据聚类则是发现数据中可能存在的小类,并揭示数据的内在组织结构。通过聚类分析,可以给每个样本观测指派一个属于哪个小类的标签,从而得到聚类解。数据聚类是一种无监督学习方法,用于将数据集中的对象划分为不同的组或类别,使得同一组内的对象具有更高的相似性,而不同组之间的对象之间具有更高的差异性。

        数据聚类的目的是找到数据集中存在的潜在群组,使得每个群组内的数据点尽可能相似,而不同群组中的数据点尽可能不同。通过聚类可以发现数据集的内在结构,帮助对数据进行分类、可视化、降维和预测等任务。

        常见的数据聚类算法包括K均值聚类、层次聚类、密度聚类、谱聚类等。这些算法可基于不同的相似性度量标准(如距离、相似性度量、密度等)和优化准则(如最小化簇内差异、最大化簇间差异等)进行数据聚类。

        数据聚类的评估可以通过内部标准(如簇内紧密度、簇间分离度等)和外部标准(如标签信息、外部指标等)来进行,以评估聚类的质量和有效性。确定最佳聚类数目和选择适当的聚类算法是数据聚类的关键问题之一。

a4090c85598c4632a406c68d84de10d0.png

图7 聚类实例

        数据聚类和数据预测中的分类问题有联系但又有区别,聚类更侧重于数据的内在组织结构而不是预测特定输出变量的取值。

02-机器学习工具

        Python在机器学习领域获得广泛使用的原因:

        a、简明易用,严谨专业,良好的开发社区生态;

        b、Python拥有大量优秀的开源库和工具,如NumPy、Pandas、SciPy、scikit-learn、TensorFlow、PyTorch等,这些库提供了丰富的数据结构、算法和功能,方便了数据处理、特征提取、模型训练等各个环节的工作。

        c、Python是一种跨平台的编程语言,可以在各种操作系统上运行,包括Windows、Linux、MacOS等。这使得开发者能够在不同的环境下进行开发和部署,提高了代码的可移植性和灵活性。

        d、Python不仅在机器学习领域得到广泛应用,还被广泛用于Web开发、数据分析、科学计算、自然语言处理等多个领域。这使得Python成为一个全能的编程语言,同时也促进了各个领域之间的技术交叉和应用拓展。

      (1)Anaconda简介

        第三方程序包的管理是Python应用中重要而烦琐的任务。拥有一个方便包管理,并同时集程序编辑器、编译器、调试器以及图形化用户界面等工具为一体的集成开发环境(Integrated Development Environment,IDE)是极为必要的。Anaconda就是一种被广泛应用于Python程序开发的IDE。

        Anaconda简介:它是一款兼容Linux、Windows和Mac OS X.环境,支持Python 2系列和Python 3系列的,且可方便快捷完成机器学习和数据科学任务的开源IDE。通常将Anaconda可视为Python的发行版Anaconda®。Anaconda的官方下载地址为:https://www.anaconda.com/

0388dc7bf6224956b1a25e39412cb8c8.png

图8 网址主页

         Anaconda安装结束,将会产生所需要的部分软件如图9所示。打开Anaconda Navigator 之后,如图10所示,里面包含了各种集成环境,可以进行下载使用,对于Python机器学习来说,需要建立Python版本环境,可以建立多个环境,对应于不同的版本使用。这里的Anaconda Navigator 窗口其实是Anaconda Prompt的图形化用户界面。后面进入编程界面都是通过Anaconda Prompt进入,后面详细解释。

865a8baa55254ed191e172b0f48775d9.png

图9 安装软件

0b84d0036d1e43d2aa7ca5cf44d74af4.png

图10 Anaconda Navigator 窗口

         如图11所示,base是默认的python版本,可以通过序号2的Create建立新的版本环境,序号3里可以选择版本,R语言是最先开始用于机器学习的语言,当然现在仍然在使用,但是Python的受欢迎度已经越来越高,便于进行机器学习。因此,一般都是建立Python版本。点击生产即可建立。

de8a5b020b3b48eeb5f1f84c52b5a1c1.png

图11 建立python内核步骤

         建立内核环境之后,在图12的Jupyter notebook编程环境主页中便可以进行内核环境选择,需要哪个版本均可以进行选择。下面详细解释Jupyter notebook的作用。

ab8b94404efc42889b3a5a422109649e.png

图12 编程环境主页

      (2)Jupyter Notebook简介

        Jupyter Notebook是一个基于网页的交互式文本编辑器,是对唐纳德·克努特(Donald Knuth)在1984年提出的文字表达化编程形式的具体体现,如上图所示。

        Jupyter Notebook的前身是IPython Notebook,其主要特点是支持在程序代码中直接添加程序说明文档,而不必另外单独撰写。Jupyter Notebook本质上是一个Web应用程序,可实现程序开发(编程时具有语法高亮、缩进、〈Tab〉键代码补全功能)和代码执行(支持Python等多种编程语言,以及扩展名为.ipynb的JSON格式文件),运行结果和可视化图形直接显示在代码块下方,如下方图13所示:运行结果可以直接显示,方便调试程序。

7e4763491ea3474ca2f7c128f5a36a85.png

图13 运行结果显示

        Jupyter Notebook中文字和丰富的格式文本(包括Latex格式数学公式、Markdown语法格式文本、超链接等多种元素)的编辑和输出等,也有助于呈现和共享可再现的研究过程和成果。

        什么是cell?cell:一对In Out会话被视作一个代码单元,称为cell。cell行号前的 * ,表示代码正在运行。如图14所示,对编程环境中的控制模块备注如下。里面包含了对代码控制的各种功能,便于理解和使用。

13fe358585fe41658da7814189cd8d8d.png

图14 控制功能解释

        Jupyter Notebook的默认文件目录位于C盘,当然,可以进行切换其他硬盘,防止内存消耗过大,下面就是如何打开这个开发环境,一般可以直接进入Anaconda中,点击Jupyter Notebook进入编程环境,但是,由于软件启动较慢,这种打开方式等待时间过长,因此,这里选择更加方便的方式打开。

      (3) Anaconda Prompt简介

        Anaconda Prompt是Anaconda平台中的一个命令行工具,用于在Windows系统中执行与Python环境和Conda包管理器相关的命令。它是用于打开编程环境的关键,安装Anaconda软件之后就可以找到该工具,下面是Anaconda Prompt的一些方面解释:

        a、Anaconda Prompt主要用于管理和配置Anaconda环境,包括创建、激活、删除虚拟环境,安装、更新、卸载Python包等操作。通过Anaconda Prompt,用户可以更方便地进行Python项目的管理和维护。这里一般直接使用下面代码,完成Python包的安装和卸载。

pip install 包名称    // 安装Python包

pip uninstall 包名称    // 卸载Python包

        b、Anaconda Prompt是Anaconda平台中一个集成的命令行工具,可以直接在其中执行Python和Conda相关的命令,而无需使用额外的终端或命令行窗口。

        c、Conda命令:在Anaconda Prompt中,可以使用Conda命令来管理Python环境和软件包,如创建环境、激活环境、安装软件包、查看环境信息等。Conda提供了一种方便灵活的方式来管理Python环境和包依赖。

        d、Python交互:除了使用Conda命令外,Anaconda Prompt也可以直接在其中执行Python代码,类似于Python解释器。用户可以在命令行中输入Python代码并立即看到执行结果,方便快捷地进行数据分析、算法验证等操作。

        e、通过Anaconda Prompt,用户可以方便地设置系统路径和环境变量,以确保Anaconda中的Python和相关工具可以被系统正确识别和调用,避免出现环境配置错误导致的问题。

        图15所示,是Anaconda Prompt的一些功能展示,首先,可以直接切换路径,也就是上面说的该软件打开默认是C盘,可以切换需要的目录。另外,还可以使用conda 命令,进行一些操作,下图使用conda list用于查看该Python版本安装的都有哪些包,并且包的版本也会显示出来,其他更多功能可以自行搜索。

eb29ba09586c4a01b7487f17389d8f01.png

图15 功能演示

        总的来说,Anaconda Prompt是一个在Windows系统中管理Anaconda环境、执行Python和Conda相关命令的工具。通过Anaconda Prompt,用户可以更高效地管理Python项目和环境,提高开发效率和便捷性。

      (4) Python常用包简介

        Python包在机器学习中起着至关重要的作用,以下是一些常用的Python包及其在机器学习中的用途。这些Python包在机器学习中发挥着重要的作用,为开发者提供了丰富的工具和功能,帮助他们进行数据处理、特征工程、模型构建、模型评估等不同阶段的工作。

        NumPy:用于数学运算和数据处理,提供了多维数组对象和各种数学函数,是很多其他Python科学计算库的基础。官方网站:NumPy -Why NumPy? Powerful n-dimensional arrays. Numerical computing tools. Interoperable. Performant. Open source.icon-default.png?t=N7T8https://numpy.org/

        Pandas:用于数据处理和分析,提供了数据结构和数据操作工具,可以高效地处理结构化数据。官方网站:pandas - Python Data Analysis Libraryicon-default.png?t=N7T8https://pandas.pydata.org/

        Scikit-learn:机器学习库中的瑞士军刀,包含了大量常用的机器学习算法和工具,用于分类、回归、聚类、降维等任务。官方网站:scikit-learn: machine learning in Python — scikit-learn 1.4.2 documentationicon-default.png?t=N7T8https://scikit-learn.org/stable/        TensorFlow / PyTorch:用于构建神经网络和深度学习模型的库,提供了各种强大的工具和功能,是深度学习领域的主要选择。官方网站分别为:

https://www.tensorflow.org/icon-default.png?t=N7T8https://www.tensorflow.org/PyTorchicon-default.png?t=N7T8https://pytorch.org/        Matplotlib / Seaborn:用于数据可视化,可以绘制各种统计图表和图形,帮助分析数据和展示结果。官方网站分别为:

Matplotlib — Visualization with Pythonicon-default.png?t=N7T8https://matplotlib.org/seaborn: statistical data visualization — seaborn 0.13.2 documentationicon-default.png?t=N7T8https://seaborn.pydata.org/        Scipy科学计算库,提供了许多科学计算算法和工具,包括数值积分、最优化、信号处理等功能。官方网站:

SciPy -Why SciPy? Fundamental algorithms. Broadly applicable. Foundational. Interoperable. Performant. Open source.icon-default.png?t=N7T8https://www.scipy.org/        注:经过上述分析,对机器学习基础知识以及机器学习Python编程工具的使用已经有了初步了解,并对常用工具包进行了解释。俗话说“实践出真知”,下面将以上述介绍的编程工具以及常用工具包,进行编程实践,便于理解代码使用过程。这里初步学习仅对常用科学计算工具包进行分析,后续更新各类常用算法包。代码和数据均可以直接使用。

03-Python工具包的使用示例

        Python工具包在机器学习领域使用广泛,正是由于这些工具包的存在,使得机器学习编程更加快捷方便,一般不需要了解工具包更深层次的底层逻辑,仅需要学会调用工具包,灵活运用,便可以完成大部分的数据处理过程。

        下面首先以分析工具包调用过程,然后以最常用的NumPy、Pandas和Matplotlib工具包为例,进行这些包的使用方式分析和功能展示。

    (1) Python工具包的调用

        第三方包是一种在Python中用于扩展功能的工具,可以将程序代码、变量和函数组合到一个模块(文件)中,方便代码的重用。通过使用import语句,我们可以在自己编写的Python程序中导入已安装的第三方包,以便直接调用其中的函数和变量来实现特定功能。

        一般的导入语法格式包括:

        import 模块名:导入整个模块

        from 模块名 import 函数名:导入模块中的特定函数

        from 模块名 import 函数名1, 函数名2, …:导入模块中的多个特定函数

        from 模块名 import *:导入模块中的所有函数
        此外,也可以使用as关键字为导入的模块指定别名,使代码更易读和避免函数名冲突。例如,import numpy as np,表示导入numpy并将其别名设置为np。如图16所示:

1f6d8e7096fe4140bee42a6b73c0a0cc.png

图16 导入模块实例

 (2) Matplotlib包的使用示例

        Matplotlib是一个用于绘制各种图形和图表的Python包。其主要作用是提供了丰富的绘图函数和方法,使用户可以快速、方便地可视化数据和结果。Matplotlib可以用于创建折线图、散点图、柱状图、饼图、等高线图等不同类型的图形,以便更直观地展示数据的分布、趋势和关系。通过Matplotlib绘制的图形可以帮助用户更好地理解数据、分析结果和模型表现,从而支持决策和沟通。因此,Matplotlib在数据科学、数据分析、统计学、机器学习等领域中被广泛应用。在上面的工具箱官网中包含了众多图形绘制实例,如下图所示:

c1b47828028642e59cb81b6df5f83aab.png

图17 可视化工具界面

        1)Matplotlib导入方式和优势

        Matplotlib包的导入代码如下,plt.show()有释放资源的作用,因此保存图像必须在前面运行,否则,保存的是空白。

import matplotlib.pyplot as plt
import random 
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 

         下面对Matplotlib包中常用的数据可视化图像绘制进行详细分析:

         2)折线图绘制

        折线图是一种简单而有效的数据可视化工具,能够帮助用户更好地理解数据和进行数据分析。代码和运行结果如下图所示:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 
x = np.linspace(-10,10,1000)
y = np.sin(x)

plt.plot(x, y, color='b', marker='o', linestyle='-', linewidth=1, markersize=1)  # 设置线条颜色为蓝色,数据点形状为圆圈,线型为实线,线条宽度为2,数据点大小为8
plt.xlabel('X轴', fontsize=12, color='black')  # 设置X轴标签文字为黑色、字号大小为12
plt.ylabel('Y轴', fontsize=12, color='black')  # 设置Y轴标签文字为黑色、字号大小为12
plt.title('折线图', fontsize=14, color='black')  # 设置标题为黑色、字号大小为14
plt.grid(True, linestyle='--', color='gray', alpha=0.6)  # 显示网格,线型为虚线,颜色为灰色,透明度为0.6
plt.savefig("../1.png", dpi=300)
plt.show()

896ee571042649c19718baaa6ab7d2bd.png

        3)散点图绘制

        散点图是一种简单而有效的数据可视化工具,适用于展示数据分布、发现关联性、识别异常值和比较不同类别数据等分析需求。代码和运行结果如下图所示:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 
x = [1, 2, 3, 4, 5,6,7,8,9]
y = [2, 5, 7, 3, 8,6,3,1,9,]

plt.scatter(x, y, color='r', marker='o', s=100, edgecolors='k', alpha=0.8)  # 设置散点颜色为红色,形状为圆圈,大小为100,边缘颜色为黑色,透明度为0.8
plt.xlabel('X轴', fontsize=12, color='black')  
plt.ylabel('Y轴', fontsize=12, color='black')  
plt.title('散点图', fontsize=14, color='black')  
plt.grid(True, linestyle='--', color='gray', alpha=0.6)  
plt.savefig("../2.png", dpi=300)
plt.show()

7c0d6e2d79194530bd5bfff9127da5fa.png

        4)柱状图绘制

        柱状图是一种直观简单的数据可视化工具,适用于比较数据大小、显示数据分布、突出数据特征和比较不同时间点数据等分析需求。代码和运行结果如下图所示:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 
# 0,准备数据
# 电影名字 此时输入的为字符串,必须转化为数字,使用range
movie_name = [
    '雷神3:诸神黄昏', '正义联盟', '东方快车谋杀案', '寻梦环游记', '全球风暴', '降魔传', '追捕', '七十七天', '密战',
    '狂兽', '其它'
]
# 横坐标  len(movie_name)计算了这个字典有多少个元素
x = range(len(movie_name))
# y轴 票房数据
y = [73853, 57767, 22354, 15969, 14839, 8725, 8716, 8318, 7916, 6764, 52222]
# 1,创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2,绘制图像
y_ticks = range(100000)
plt.bar(x,
        y,
        width=0.5,
        color=['b', 'r', 'g', 'y', 'c', 'm', 'y', 'k', 'c', 'g', 'b'])
# x_ticks_labels = ["{}".format(i) for i in movie_name] # 刻度显示一定要在绘制图像处添加
# plt.xticks(x,x_ticks_labels,fontsize = 15) 由于x和moviename是两个分开的变量,因此,这两种方法都可以实现x轴显示文字功能
# 但是必须记住,plt.xticks()括号里的第一个值必须是数,而不是字符串
plt.xticks(x, movie_name, fontsize=15)
plt.yticks(y_ticks[::10000], fontsize=15)
plt.title('某月各电影票房统计', fontsize=20)
plt.grid()
# 3,图像显示
plt.savefig("../3.png", dpi=300)
plt.show()

fda12eea1a1e425b86ed2385d0b5837c.png

        5)饼图绘制

        饼图是一种简单直观的数据可视化工具,适用于显示数据占比、突出重点、比较数据大小和易于理解传达等分析需求。代码和运行结果如下图所示:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 
sizes = [30, 20, 15, 35]
labels = ['A', 'B', 'C', 'D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']  # 自定义颜色

plt.pie(sizes, labels=labels, autopct='%1.1f%%', colors=colors, startangle=90, shadow=True, explode=(0.1, 0, 0, 0))  # 设置颜色、起始角度、阴影、爆炸效果
plt.title('饼图', fontsize=16, color='black')  # 设置标题字号为16、颜色为黑色
plt.axis('equal')  # 设置饼图为等比例
plt.savefig("../4.png", dpi=300)
plt.show()

e92f1b7ff887473bb37fbaf115649477.png

        6)等高线图绘制

        等高线图是一种有效的数据可视化工具,适用于显示数据变化趋势、描绘地形地貌、显示数据分布和计算高度或温度等分析需求。代码和运行结果如下图所示:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)

plt.contourf(X, Y, Z, cmap='coolwarm', levels=20, alpha=0.8)
plt.colorbar(label='值')  # 调整颜色条标签名称

plt.title('等高线图', fontsize=16, color='black')  # 设置标题为黑色、字号大小为16
plt.xlabel('X轴', fontsize=12, color='black')  # 设置X轴标签文字为黑色、字号大小为12
plt.ylabel('Y轴', fontsize=12, color='black')  # 设置Y轴标签文字为黑色、字号大小为12

plt.grid(True, linestyle='--', color='gray', alpha=0.6)  # 添加灰色虚线网格
plt.savefig("../5.png", dpi=300)
plt.show()

0e21892eff0e41c5af6b4a2dd6b443ed.png

        7)箱线图绘制

        箱线图是一种有效的数据可视化工具,适用于展示数据分布、比较数据集、检测异常值和评估数据的稳定性等分析需求。代码和运行结果如下图所示:实现过程解释如下

  1. 生成三组随机数据 data1data2data3,分别表示均值分别为0、1、2的正态分布随机数据。
  2. 创建箱线图对象 fig, ax = plt.subplots(),其中 fig 为整个图表对象,ax 为坐标轴对象。
  3. box = ax.boxplot([data1, data2, data3], patch_artist=True): 使用 boxplot 函数创建一个箱线图,并将数据传递进去。patch_artist=True 表示箱体为矩形。
  4. 设置箱体颜色和边框颜色。利用循环和 zip 函数,依次设置每个箱体的颜色、须的颜色、中位线的颜色以及边缘线的颜色。
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 
# 生成多组随机数据
np.random.seed(10)
data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 1, 100)
data3 = np.random.normal(2, 1, 100)

# 创建箱线图
fig, ax = plt.subplots()
box = ax.boxplot([data1, data2, data3], patch_artist=True)

# 设置箱体颜色和边框颜色
colors = ['#FF6347', '#FFD700', '#40826D']
for patch, color in zip(box['boxes'], colors):
    patch.set_facecolor(color)
for whisker, median, cap in zip(box['whiskers'], box['medians'], box['caps']):
    whisker.set(color='#1f77b4', linewidth=2)
    median.set(color='#bcbd22', linewidth=2)
    cap.set(color='#d62728', linewidth=2)

# 添加标题和标签
ax.set_title('箱线图', fontsize=14)
ax.set_ylabel('值', fontsize=12)
plt.savefig("../6.png", dpi=300)
plt.show()

669edfa4b86a465ca4339a73201e3a4c.png

        8)较为复杂的折线图绘制

        这里需要使用数据进行分析,数据链接在网盘中,可以自行下载链接:https://pan.baidu.com/s/1VrFb8a0FmNEBKq9gQq9dPA?pwd=0rrn 提取码:0rrn 。代码和运行结果如下图所示:实现过程解释如下

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False

data=pd.read_excel('北京市空气质量数据.xlsx')
data=data.replace(0,np.NaN)

plt.figure(figsize=(10,5))
plt.plot(data['AQI'],color='black',linestyle='-',linewidth=0.5)
plt.axhline(y=data['AQI'].mean(),color='red', linestyle='-',linewidth=0.5,label='AQI总平均值')
data['年']=data['日期'].apply(lambda x:x.year)
AQI_mean=data['AQI'].groupby(data['年']).mean().values
year=['2014年','2015年','2016年','2017年','2018年','2019年']
col=['red','blue','green','yellow','purple','brown']
for i in range(6):
    plt.axhline(y=AQI_mean[i],color=col[i], linestyle='--',linewidth=0.5,label=year[i])
plt.title('2014年至2019年AQI时间序列折线图')
plt.xlabel('年份')
plt.ylabel('AQI')
plt.xlim(xmax=len(data), xmin=1)
plt.ylim(ymax=data['AQI'].max(),ymin=1)
plt.yticks([data['AQI'].mean()],['AQI平均值'])
plt.xticks([1,365,365*2,365*3,365*4,365*5],['2014','2015','2016','2017','2018','2019'])
plt.legend(loc='best')
plt.text(x=list(data['AQI']).index(data['AQI'].max()),y=data['AQI'].max()-20,s='空气质量最差日',color='red')
plt.savefig("../6.png", dpi=300)
plt.show()

 6c3bbf356fc74513bd3f854ac2a960be.png

        9)热力图绘制

        热力图是一种简单有效的数据可视化工具,可以帮助分析师、研究人员等快速理解数据分布、相关性和异常情况,从而支持更深入的数据分析和决策过程。正方形热力图和三角形热力图代码和运行结果如下图所示:

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 

data_square = np.random.rand(5, 5)

# 创建正方形热力图
fig, ax = plt.subplots()
im = ax.imshow(data_square, cmap='viridis')

# 显示数据值
for i in range(len(data_square)):
    for j in range(len(data_square[0])):
        text = ax.text(j, i, round(data_square[i, j], 2),
                       ha='center', va='center', color='black')

# 添加颜色条
plt.colorbar(im)

# 设置标题和标签
ax.set_title('热力图', fontsize=14)
plt.savefig("../7.png", dpi=300)
plt.show()

2bf5ae0021c74715bd21d73f1bc1b446.png

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False 
# 生成上三角形状数据
data_triangle = np.triu(np.random.rand(5, 5))

# 创建上三角形热力图
fig, ax = plt.subplots()
im = ax.imshow(data_triangle, cmap='plasma')

# 显示数据值
for i in range(len(data_triangle)):
    for j in range(len(data_triangle[0])):
        if data_triangle[i, j] != 0:
            text = ax.text(j, i, round(data_triangle[i, j], 2),
                           ha='center', va='center', color='black')

# 添加颜色条
plt.colorbar(im)

# 设置标题和标签
ax.set_title('热力图', fontsize=14)
plt.savefig("../8.png", dpi=300)
plt.show()

b83f84a911aa4ddb929819d4169ef20d.png

        关于Matplotlib工具包的一些常用的图形绘制分析已经结束,它Python中一个功能强大的数据可视化库,提供了众多丰富的绘图接口,还可以继续更多复杂图形的绘制。

    (3) NumPy包的使用示例

       NumPy(Numerical Python)是Python中最常用的包之一,主要用于处理多维数组数据。以下是NumPy的主要特点:

        a、NumPy以N维数组对象(ndarray)形式组织数据集,其中要求数据集中各变量的类型相同。一维数组对应向量,二维数据对应矩阵。

        b、数据访问简单灵活,可以通过指定位置编号(索引,从0开始编号)来访问数组中的元素。

        c、NumPy拥有丰富的数学运算和统计函数,能够方便地进行基本统计分析和各种矩阵运算,如加法、减法、乘法、除法等。

        通过NumPy提供的功能,用户可以快速、高效地处理和分析数据,进行各种数学计算和统计分析。NumPy的强大功能使得它成为科学计算、数据分析和机器学习等领域中不可或缺的工具之一。

d6b626dd7da64298accb6daad3473740.png

图18 NumPy

        1)NumPy导入方式和优势

        NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。导入代码如下:起别名为np,便于使用。

import numpy as np

        NumPy中的ndarray(n-dimensional array)是一个多维数组对象,用于存储同类型数据。它是NumPy的核心数据结构,是NumPy库的重要组成部分。 ndarray对象可以是一维、二维、三维或更高维度的数组,可以存储整数、浮点数、复数等不同类型的数据。

        ndarray对象具有以下重要特点:

        数据类型(dtype):ndarray对象中存储的元素都是同一种数据类型,该数据类型可以通过dtype属性来指定或推断出来。不同的dtype可以包括整数、浮点数、字符串等。

        形状(shape):ndarray对象的形状是一个元组,其中包含数组在每个维度上的大小。通过shape属性可以获取或修改数组的形状。

        维度(ndim):ndarray对象的维度是数组的轴数,即数组中有多少个维度。通过ndim属性可以获取数组的维度。

        元素操作:ndarray对象支持各种数学运算和逻辑运算,可以对数组中的元素进行各种操作。

        矢量化操作:ndarray对象支持矢量化操作,可以在没有显式循环的情况下快速对整个数组执行操作。

        广播机制:ndarray对象根据广播规则自动扩展数组的维度,使得不同维度的数组之间可以进行数学运算。

        切片索引:ndarray对象支持使用切片操作和索引操作来访问数组中的元素。

        通过使用ndarray对象,可以高效地处理大量数据,并且可以利用NumPy库提供的各种函数和方法来进行数据处理、分析和计算。下面重点以ndarray进行分析优势。

        2)ndarray用法

        下面就是以代码为示例进行分析,编程环境就在Jupyter Notebook中,下面代码用于创建创建ndarray n维数组,运行之后,如图19所示:

import random
import numpy as np
import time

# 创建ndarray
score = np.array(
[[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
score

5da77eed29664c31aa4ea75749408da8.png

图19 运行结果

        ndarray的属性查看代码如下,这里使用的依然是上面的score变量,下面这些代码直接点击运行即可得到所需结果。

score.shape  # 查看数组是几行几列的  

score.ndim  # 查看数组维数

score.size  # 查看数组的元素数量

score.itemsize  # 查看一个数组元素的长度

score.dtype  # 查看数组元素的类型

        ndarray的形状其实也就是一维数组和二维数组以及三维数组的区别,以excle表格表示,在里面,一个空格就是一维数组,多个空格加到一起,就是二维数组,然后多个工作表就是三维数组,下面代码用于建立不同类型的数组:

a = np.array([1,2,3])
a

#  结果为
array([1, 2, 3])



c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
c

#  结果为
array([[[1, 2, 3],
        [4, 5, 6]],

       [[1, 2, 3],
        [4, 5, 6]]])

        使用numpy计算时消耗的时间与python自带函数进行计算的时间也是有所不同,下面代码是时间对比,random.random(): 返回随机生成的一个浮点数,范围在[0,1)之间

a = []
for i in range(10000000):
    a.append(random.random())
    
# 通过%time魔方方法,查看当前行的代码运行一次花费的时间
%time sum1 = sum(a)  # 使用原生python的方法

b = np.array(a)
%time sum2  = np.sum(b)  # 使用numpy中sum计算的方法


#  运行结果

Wall time: 146 ms   时间较长
Wall time: 24.9 ms  时间较短 

        因此,使用numpy计算可以节省计算时间,使内存消耗减小。

        3)ndarray计算

        下面以代码为示例进行分析逻辑运算过程:

import numpy as np

# 1、使用np.random.normal函数生成了一个具有指定均值(1)和标准差(2)的正态分布,然后通过参数(8,10)指定生成的二维数组的形状为8行10列。
stock_change = np.random.normal(1,2,(8,10))  
stock_change


# 2、stock_change[0:5, 0:5]表示取原数组stock_change的第0行到第4行(共5行)和第0列到第4列(共5列)的元素,形成一个新的子数组stock_c
stock_c = stock_change[0:5,0:5]
stock_c

# 运行结果
array([[-1.20476328,  0.37719088,  0.27285241,  0.09288599, -0.97858714],
       [ 3.80752327,  3.01924402, -0.15153158,  0.93401968, -0.54770299],
       [ 2.43011748,  4.34599432, -3.49387468, -1.31181069, -0.70021698],
       [-0.36350034,  4.80499329,  0.20046949, -0.62963766,  0.88730939],
       [ 0.26654384,  1.21205692,  4.90718483, -3.78580604,  2.77278093]])

# 3、判断参数,符合的为true
stock_c > 1

# 运行结果
array([[False, False, False, False, False],
       [ True,  True, False, False, False],
       [ True,  True, False, False, False],
       [False,  True, False, False, False],
       [False,  True,  True, False,  True]])

# 4、BOOL赋值, 将满足条件的设置为指定的值-布尔索引
stock_c[stock_c>1] = 2  
stock_c

# 运行结果
array([[-1.20476328,  0.37719088,  0.27285241,  0.09288599, -0.97858714],
       [ 2.        ,  2.        , -0.15153158,  0.93401968, -0.54770299],
       [ 2.        ,  2.        , -3.49387468, -1.31181069, -0.70021698],
       [-0.36350034,  2.        ,  0.20046949, -0.62963766,  0.88730939],
       [ 0.26654384,  2.        ,  2.        , -3.78580604,  2.        ]])

        下面以代码为示例进行通用判断函数的分析:

stock_d = stock_change[0:2,0:5]
stock_d
# 运行结果
array([[-1.20476328,  0.37719088,  0.27285241,  0.09288599, -0.97858714],
       [ 2.        ,  2.        , -0.15153158,  0.93401968, -0.54770299]])

# 1、如果里面的元素全部大于0,返回True,有一个不满足,返回False
np.all(stock_d>0)  


# 2、如果里面的元素有一个大于0,返回True
np.any(stock_d>0)  

# 3、大于0,赋值为1,否则赋值为0
np.where(stock_d>0,1,0)  
# 运行结果
array([[0, 1, 1, 1, 0],
       [1, 1, 0, 1, 0]])

# 4、大于-0.5并且小于3的,赋值为1,否则赋值为0
np.where(np.logical_and(stock_d>-0.5,stock_d<3),1,0) 
# 运行结果
array([[0, 1, 1, 1, 0],
       [1, 1, 1, 1, 0]])

# 5、大于0或者小于-1的,赋值为2,否则赋值为0
np.where(np.logical_or(stock_d>0,stock_d<-1),2,0)
# 运行结果
array([[2, 2, 2, 2, 0],
       [2, 2, 0, 2, 0]]) 

        统计运算 a,.min()求最小值 b,.max()求最大值 c,.std()求标准差 d,.var()求方差 e,.median()求中位数 f,.mean()求平均值,这些可以直接使用,下面仅有几个例子。

stock_change.max()   # 求最大值

stock_change.var()  # 求方差

        4)数组的基本操作

        下面以代码为示例进行生产数组的过程分析:

import numpy as np
import random
import matplotlib.pyplot as plt

ones = np.ones([4,8],dtype=np.int64)  # 生成1的数组
ones

# 运行结果
array([[1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1]], dtype=int64)

zero = np.zeros_like(ones)  # 将1数组转成0数组
zero

# 运行结果
array([[0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0]], dtype=int64)

a = np.array([[1,2,3],[4,5,6]])
a1 = np.array(a)  # 深拷贝
a2 = np.asarray(a)  # 浅拷贝

        下面以生成固定范围的数组为例进行分析 

        a、np.linspace(start,stop,num,endpoint) 生成等间隔的序列 num为要生成的等间隔的样例数量,默认为50

        b,np.arange(start,stop,step,dtype) step为步长

        c,np.logspace()生成的为10的次方

np.linspace(0,100,11)
# 运行结果
array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])

np.arange(10,50,2)
# 运行结果
array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
       44, 46, 48])

np.logspace(0,2,3)
# 运行结果
array([  1.,  10., 100.])

np.random.rand(3,2)  # 这里和单个生成一个数的用法是不一样的,生成单个数用random.random()即可
# 运行结果
array([[0.53834539, 0.55484381],
       [0.9664531 , 0.72855247],
       [0.5112696 , 0.40542041]])

np.random.uniform(1,10,size = (3,5))  # 随机生成一个下限为1,上限为10,3行5列的数组
# 运行结果
array([[9.1355648 , 1.68011553, 9.95195423, 5.97546792, 6.86533668],
       [3.70215788, 9.33261917, 2.04375357, 9.98963526, 6.5803873 ],
       [8.45740048, 8.20677477, 9.26228604, 7.34943017, 9.52935494]])

np.random.randint(1,10,(3,5)) # 生成的为整数
# 运行结果
array([[3, 1, 6, 3, 9],
       [9, 2, 4, 2, 9],
       [9, 8, 9, 5, 9]])

        下面绘图证明生成的数据都是均匀分布的,代码如下,运行结果如图20所示:

# 0,生成数据
x = np.random.uniform(-1,1,1000000)
# 1,创建画布
plt.figure(figsize=(10,10),dpi=100)
# 2,绘制图像
plt.hist(x,bins=1000)  # bins指的是表示要划分的区域
# 3,图像显示
plt.savefig("../案例/1.png", dpi=300)
plt.show() 

ab76d125f1fd45b0a558a96b802d2345.png

图20 运行结果

        创建正态分布,生成正态分布数据,并证明生成的数据服从正态分布:

np.random.normal(1.75,1,1000000)

# 0,生成数据
x = np.random.normal(1.75,1,100000000)
# 1,创建画布
plt.figure(figsize=(20,10),dpi=100)
# 2,绘制图像
plt.hist(x,bins=1000)  # bins指的是表示要划分的区域
# 3,图像显示
plt.savefig("../案例/2.png", dpi=300)
plt.show() 

746cf9b0a851433fb7b03e7030996c86.png

图21 运行结果 

         数组去重代码如下:

temp = np.array([[1,2,3,4,5],[3,4,5,6,7]])

np.unique(temp)  # 重复部分被删除

(4) Pandas包的使用示例

        注:在Pandas中将会用到DataFrame,这里会出现大量数据使用过程,并且绘图过程也需要注意,因此,这里给出一部分代码,可以一劳永逸解决很多经常遇到的小问题,一般都会直接写一篇介绍,这里仅在这里说明,可以自行使用这些代码可以解决的问题都已经进行说明   

plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False


warnings.filterwarnings("ignore")
plt.rcParams['xtick.direction'] = 'in'#将x周的刻度线方向设置向内
plt.rcParams['ytick.direction'] = 'in'#将y轴的刻度方向设置向内
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['axes.unicode_minus'] = False 


warnings.filterwarnings("ignore")
pd.set_option('display.max_columns', None)    # 显示所有列
pd.set_option('display.max_rows', None)      # 显示所有行
pd.set_option('display.max_colwidth',1000)

       Pandas中的DataFrame是一个二维数据结构,类似于电子表格或SQL表,可以看作是由多个Series组成的数据表。DataFrame由行索引和列索引组成,可以存储不同类型的数据,如整数、浮点数、字符串等。DataFrame提供了丰富的功能,包括数据选取、数据过滤、数据排序、数据聚合等,使得数据处理和分析更加方便和高效。

        1)Pandas导入方式和优势

        DataFrame对象具有以下重要特点:

        索引:DataFrame对象具有行索引和列索引,可以通过指定索引值来访问和操作数据。行索引用于标识每行数据,列索引用于标识每列数据。

        数据结构:DataFrame以二维表格形式存储数据,其中行表示观察值(样本),列表示变量(特征),每个单元格存储一个数据值。

        数据类型:DataFrame中的数据类型可以是整数、浮点数、字符串等。通过指定列的数据类型,可以确保数据被正确地解释和处理。

        操作方法:DataFrame对象支持多种操作方法,如选择列、选择行、过滤数据、排序数据、合并数据等,可以对数据进行灵活的操作和处理。

        缺失值处理:DataFrame可以处理缺失值,提供了多种方法来填充、删除或插值缺失值,保证数据的完整性和可靠性。

        分组和聚合:DataFrame支持数据的分组和聚合操作,可以按照指定的列对数据进行分组,并对每个组进行统计分析。

        数据可视化:DataFrame可以轻松实现数据可视化,通过内置的绘图函数,可以生成各种图表(如折线图、柱状图、散点图等)来展示数据分布和趋势。

        总之,Pandas中的DataFrame是一个功能强大且灵活的数据结构,为数据处理和分析提供了丰富的功能和工具,是数据科学和机器学习领域中重要的数据处理工具之一。  

        导入过程如下:

import pandas as pd
import numpy as np

         2)Pandas简单应用

         工具包导入,以及代码展示如下:

import pandas as pd
import numpy as np

stock_change = np.random.normal(0,1,(10,5))
stock_change

# 运行结果
array([[-0.13531309, -0.72951103, -1.1353953 ,  0.99691979,  0.93708321],
       [-1.08530631, -0.08309686, -0.41826418,  0.45031056, -0.02218678],
       [-0.92276437,  1.49013562,  0.47419507, -1.223163  , -1.24855296],
       [-1.63071878, -1.76460582, -0.40342722, -0.79265869, -0.99107917],
       [-1.31850827, -0.18569403,  0.09962667,  0.21432945, -0.97233143],
       [-0.1511324 ,  0.8650329 ,  1.53819837, -1.38214208,  0.37306642],
       [-0.38810066, -1.12715386,  1.26988509, -0.21249664,  1.29072036],
       [-0.25642766,  0.40713892, -1.03324253,  0.77720226,  0.06203371],
       [ 0.8460169 , -0.95170402, -1.41253699, -1.05079115, -0.78271313],
       [-1.34119872, -1.82446274,  1.60956472,  1.04509439,  1.02654752]])


stock_rise = pd.DataFrame(stock_change)  # 功能强大,数据更加直观

        stock_rise生成DataFrame之后,可以得到运行结果如图22所示,直观方便观察。

0d306d04c2034f5382ff747d8b68193d.png

图22 运行结果

         上述得到的DataFrame不带标题,可以使用下面代码进行设置,经过运行之后,可以得到带有标题的DataFrame,如图23所示:

# 生成行的标题  ,使用列表生成式
stock_row  = ['股票{}'.format(i+1) for i in range(stock_rise.shape[0])]  # i+1的原因是为了让股票的序号从1开始
stock_row

# pd.date_range()生成一组连续的时间序列,四个关键词 start:开始时间;end:结束时间;periods:时间跨度;freq:递进单位,默认跨一天,当freq='B'时,默认跨过周末

stock_col  = pd.date_range('20220728',periods=stock_rise.shape[1],freq='B')
stock_col

# 在这里列索引用的是columns,使用的是月份,也可以用口年某月某日               
stock_c = pd.DataFrame(stock_change,index=stock_row,columns=stock_col)  

stock_c

b2e2089dd8164437abe692b580f94489.png

图23 运行结果

         当数据特别多的时候,获取某几行(前几行或者后几行)的用法,代码和结果如下

# 使用head()函数,获取某几行,默认为前5行,如果要获取更多,可以在括号里添加变量
stock_c.head(6)

63aa26e682124a9998902ff0b11be6fb.png

图24 运行结果

# 使用tail()函数,获取某几行,默认为后5行,如果要获取更多,可以在括号里添加变量
stock_c.tail()

f6976b85697a42a3b177c56a8640168a.png

图25 运行结果

        3)DataFrame运算

        需要使用的数据在下方链接中,可以自行下载:

链接:https://pan.baidu.com/s/17svPFHitcuAKBUTIrdJHkA?pwd=0v9u 提取码:0v9u

通过代码可以对数据进行读取,以及各种操作,具体代码如下:

import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.max_rows', None)  # 设置显示最大行
pd.set_option('display.max_columns', None)   # 设置显示最大列

# 导入数据
data = pd.read_csv('./data/stock_day.csv')
data.head()

        读取之后,运行结果如图26所示,

24b5a5af82ca4ea0abe120bf300d706a.png

图26 运行结果

        对DataFrame中某几列进行删除,代码如下,运行结果如图27所示:

data = data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"],axis=1)
data.head()

fec785c6900142a3b2f542ff2db39ce9.png

图27 运行结果

        下面是一些常用的对DataFrame中数据进行计算的各种函数,代码如下:

# 1、算术运算
data['close'].add(10).head()  # 将close这一列都加上10
#运行结果
2018-02-27    34.16
2018-02-26    33.53
2018-02-23    32.82
2018-02-22    32.28
2018-02-14    31.92
Name: close, dtype: float64

# 2、逻辑运算符号<,>,|,&
data[data['open']>23].head()  

# data[data['open']>23 & data['open']<24] # TypeError: Cannot perform 'rand_' with a dtyped [float64] array and scalar of type [bool]
# 这里的错误是优先级的问题,必须一步一步执行,使用括号
data[(data['open']>23) & (data['open']<24)].head()


# 3、逻辑运算函数
query()函数
isin()函数,判断数据是否在对象里面,可传入一个值,也可多个值。 用法为df['查看对象'].isin([里面输入需要查看的值])

# data[(data['open']>23) & (data['open']<24)].head() 执行同样的这一行命令,使用函数更加方便
data.query('open>23 & open<24').head()  # 输出结果一样

data['open'].isin([23.53,23.85]).head()  # 输出bool值

# 4、统计运算
data.describe()  # std指的是标准差  25%为四分位的第一个数,50%为四分位的第二个数 

data.sum()  # 也可以在括号里写入axis=0或者1,等于1,按行求和,等于0,按列求和,默认按列求和

data.idxmax()  # 索引的是每一列最大值的下标,而不是直接显示最大值

data.idxmin() # 索引每一列最小值的下标

# 5、累计统计函数
.cumsum()函数,累计求和函数,即第二个值等于第一个值加上第二个值,第三个值等于新的到的第二个值加上第三个值,以此类推 .cummax()函数,计算前n个数的最大值
data = data.sort_index()  # 索引排序,按时间排序
data.head()

stock_rise  = data['p_change']
stock_rise.head()

stock_rise.cumsum()

        4)文件读取和存储操作

        需要使用的数据在上方链接中,可以自行下载,读取文件和保存文件代码如下:

import pandas as pd
pd.set_option('display.max_rows', None)  # 设置显示最大行
pd.set_option('display.max_columns', None)   # 设置显示最大列

# 1、读取csv文件
data = pd.read_csv('./data/stock_day.csv',usecols=['open','high'])  # usecols的作用时可以读取需要的某几列,记住只能是列

# 2、保存读取的csv文件
data[:10].to_csv('./data/test_py.csv',columns=['open']) # 将前10行存在了data文件夹中

data[:10].to_csv('./data/test_py1.csv',columns=['open'],index=False) # 使用index时会将日期 删除

        5)索引操作

        需要使用的数据在上方链接中,可以自行下载,索引操作代码如下:

import pandas as pd 
pd.set_option('display.max_rows', None)  # 设置显示最大行
pd.set_option('display.max_columns', None)   # 设置显示最大列

stock_data  = pd.read_csv('./data/stock_day.csv')  # 读取文件的操作,也可以将csv文件放到一个文件夹中,使用路径读取
stock_data.head()


# drop的作用可以用来删除某几列的值,当然必须加上axis=1
stock_data = stock_data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"],axis=1)
stock_data.head()

# 1、索引第几行第几列的值的时候,只能使用先列后行的索引,不可以使用先行后列
stock_data['open']['2018-02-27']

# 2、获取2月27到2月22的结果
stock_data.loc['2018-02-27':'2018-02-22','high']  # 在这里用的是字符串索引,即'2018-02-27'和'high'都是对应的行和列的字符串形式

# 3、使用iloc可以直接获取某几行几列
stock_data.iloc[:3,:5]  # 这里用的是下标值,意思就是2018-02-27行的第0行,open属于列的第0列

# 4、混合索引,同时使用字符串和下标数字
stock_data.loc[stock_data.index[:4],['high','low']]

总结

        该篇完成花费不少时间,算是将开始机器学习研究需要进行的准备工作进行了详细彻底地分析和讨论,希望有所帮助,也希望大家能够多多支持。


网站公告

今日签到

点亮在社区的每一天
去签到