python欧拉距离和数据可视化项目实战

经典开场

坚持是光明的前身,光明给予万物生命。光明不灭,生命不息,坚持亦不止。

一、前言

简介

时间稍纵即逝,转眼间大三就来到第二个学期,还有一学年就要毕业了;马上也要开始准备 毕业设计 。 但是很多地方还需要进阶学习。然后这段时间也学习了很多的东西,让我也是收获颇满;但同时也 认识到了自己的不足,下面我将介绍一下做的一些内容。

温馨提示:如果想直接看结果请直接看:实战代码

二、项目简介

Python数据处理、分析与应用的实现过程,以及专业技术人员所使用的基本方法和技巧,

培养自己解决Python数据处理、分析与应用过程中遇到实际问题的能力,

掌握应用Python编写程序的技术,提高学生在Python数据处理、分析与应用方面的综合应用能力。

基本的知识目前就不哆嗦了,直接实战。

三、实战项目

实战1:中文词频统计并利用词云图进行数据可视化

(1)认识jieba库和wordcloud库;

(2)利用jieba库进行中文词频统计,强调字典、列表的应用;

(3)结合词频统计结果利用wordcloud库进行词云图的可视化;

(4)程序代码存为“学号姓名a.py”,词频统计结果存为“学号姓名a.csv”,词云图存为“学号姓名a.png”;

(5)每个步骤需要运行结果截图,截图中需要加上水印,水印为自己的学号姓名。

第一步、安装库

    pip install 库名

第二步: 分析题目意思

题目需要利用jieba库和wordcloud库

首先认识一下这两个库

Jieba是什么

jieba(“结巴”)是Python中一个重要的第三方中文分词函数库,能够将一段中文文本分割成中文词语的序列。

jieba库的分词原理是利用一个中文词库,将待分词的内容与分词词库进行比对,通过图结构和动态规划方法找到最大概率的词组。 除了分词jieba还提供增加自定义中文单词的功能。

第二步、Jieba常用的方法

精确模式,将句子最精确地切开,适合文本分析;返回结果是列表类型

	    import jieba  #导入库
	    a="爱上对方过后就哭了."
	    ls = jieba.lcut(a)
	    print(ls)

精确

全模式,把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;将字符串的所有分词可能均列出来,返回结果是列表类型,冗余性最大

    import jieba
    a="爱上对方过后就哭了."
    ls = jieba.lcut(a,cut_all=True)
    print(ls)

在这里插入图片描述

搜索引擎模式,在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

    import jieba
    a="爱上对方过后就哭了."
    ls = jieba.lcut_for_search(a)
    print(ls)

在这里插入图片描述

jieba.add_word()函数,用来向jieba词库增加新的单词。

    import jieba
    a="爱上对方过后就哭了"
    jieba.add_word("过后就哭了")
    ls = jieba.lcut(a)
    print(ls)

在这里插入图片描述

第三步、Wordcloud常用的方法

在生成词云时,wordcloud默认会以空格或标点为分隔符对目标文本进行分词处理
根据文本中词语出现的频率等参数绘制词云 绘制词云的形状,尺寸和颜色都可以设定

过多的基础知识我这就不多余的讲解,不懂得请看以前的文章,嘿嘿

第四步、实战一代码

    import matplotlib.pyplot as plt
    from PIL import Image
    import wordcloud as wc
    import jieba
    import csv
    import numpy as np
    
    #排除不合法字符
    excludes = open("stoplist.txt", 'r+', encoding='utf-8').read()
    b = []
    i = 0
    while i < len(excludes) - 1:
        if excludes[i] not in {',', '、', '.', ' ', '\n', '\\'}:
            b.append(excludes[i:i + 2])
            i += 2
        else:
            i += 1
    
    
    # 打开文件
    counts = {}
    with open('Praxis.txt', mode='r', encoding='utf-8') as fp:
        content = fp.read()
    words = jieba.lcut(content)  # 精确模式,返回一个列表类型的分词结果
    text = " ".join(words) #文本必须以空格的方式存入
    
    # 统计词语的次数
    for word in words:
        if len(word) == 1:
            continue
        else:
            rword = word
        counts[rword] = counts.get(rword, 0) + 1
    
    for word in b:
        print(f'word{word}')
        if word in counts:
            del counts[word]
    print(f'counts{counts}')
    
    items = list(counts.items())
    print(f'item{items}')
    
    mask = np.array(Image.open('love.png'))
    word_cloud = wc.WordCloud(
        font_path=r'C:\Windows\Fonts\simkai.ttf',
        background_color="#e6ebf1",
        mask=mask,  # 背景图片
        max_words=2000,  # 设置最大显示的词数
        max_font_size=100,  # 设置字体最大值
        width=500,  # 设置画布的宽度
        height=500,  # 设置画布的高度
    )  # 创建文本对象
    word_cloud.generate(text)  # 加载文本
    fn = '888888小猿.csv'
    with open(fn, 'w', encoding='gbk', newline='') as csvfile:  # 打开文件
        csvWiter = csv.writer(csvfile)  # 建立Writer对象
        for key in counts:
            csvWiter.writerow([key, counts[key]])
        print("数据加载完毕")
    plt.imshow(word_cloud)
    word_cloud.to_file('888888小猿.jpg')  # 保存为图片
    plt.show()

第四步、结果

python欧拉距离和数据可视化项目实战_第1张图片

(1)认识jieba库和wordcloud库;

(2)利用jieba库进行中文词频统计,强调字典、列表的应用;

(3)结合词频统计结果利用wordcloud库进行词云图的可视化;

(4)程序代码存为“学号姓名a.py”,词频统计结果存为“学号姓名a.csv”,词云图存为“学号姓名a.png”;

(5)每个步骤需要运行结果截图,截图中需要加上水印,水印为自己的学号姓名。

实战2:Numpy数值计算

掌握NumPy数组对象ndarray;

掌握NumPy矩阵与通用函数;

利用NumPy进行统计分析;

平面上有100个点,求任意2点间的欧式距离,并将其保存到矩阵当中。

程序代码存为“学号姓名b.py”,矩阵存为“学号姓名b.csv”;

每个步骤需要运行结果截图,截图中需要加上水印,水印为自己的学号姓名

第一步、安装库

    pip install numpy

第二步、分析题目意思

主要是生成100个点在平面上,来求两点距离.

这里就需要掌握一些Numpy基本的知识

第三步、Numpy是什么

NumPy(Numerical Python) 是科学计算基础库,提供大量科学计算相关功能
比如数据 统计,随机数生成等。其提供最核心类型为多维数组类型(ndarray)
支持大量的维度数组 与矩阵运算,Numpy 支持向量处理 ndarray 对象,提高程序运算速度。

第四步、欧拉距离

python欧拉距离和数据可视化项目实战_第2张图片

从图中可以很清晰的了解到这张图就是一个矩阵

行和列已经标注的很清晰可见

当然,看懂了图就要把题目联想起来

平面上面要求100个随机点的欧拉距离

方法1:d = (x-x1)2+(y-y1)2开平方根

方法2:看见途中蓝色笔画出来的抽象直角三角形,知道两个点的X和Y;

以可以使用直角三角形的勾股定理来解这个题目 两种方法任选其一

欧拉距离就是两个点之间的距离。

第五步、Numpy基础

NumPy(Numerical Python) 是科学计算基础库,提供大量科学计算相关功能

比如数据 统计,随机数生成等。其提供最核心类型为多维数组类型(ndarray)

支持大量的维度数组 与矩阵运算,Numpy 支持向量处理 ndarray 对象,提高程序运算速度。

部分基础

参数 描述
shape 数组形状
dtype 数据类型,可选
order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

arange 函数创建数值范围并返回 ndarray 对象

格式:numpy.arange(start, stop, step 步长,默认为1, dtype 数据类型)

    datal = np.arange(10, 34).astype(int)
    print(f'arange:{datal}')

linspace 函数用于创建一个一维数组,数组是一个等差数列

格式:np.linspace(start, stop, num=50, endpoint=True (默认) endpoint 设为 false,不包含终止值, retstep=False , dtype=None)

    datal = np.linspace(10, 20, 5, endpoint=False).astype(int)
    print(f'linspace:{datal}')

arange(开始索引,终止索引) ,开始索引为0 可以省略不写。结合reshape()方法定义维数。

创建一个 3x3 并且值从0到8的矩阵。

    data2 = np.arange(9).reshape(3, 3)
    print(f'reshape:{data2}')

ones((行,列)) 创建一个 3x3 的单位矩阵。

    datal = np.ones((3, 3)).astype(int)
    print(f'ones:{datal}')

创建一个数组,数组的shape为(5, 0),元素都是0。

矩阵元素值全为0,调用numpy库中zeros(行数,列数)方法

    datal = np.zeros((5, 0))
    print(f'zeros:{datal}')
    print(''.center(30, '*'))

创建一个表示国际象棋棋盘的8*8数组,其中,棋盘白格用0填充,棋盘黑格用1填充

此矩阵每隔一行元素值相同,只需对两行的相邻位置进行赋值,用步长对其他元素赋值。

    data5 = np.arange(64).reshape(8, 8)
    data5[::2, ::2] = data5[1::2, 1::2] = 0
    data5[::2, 1::2] = data5[1::2, ::2] = 1
    print('国际象棋:')

第六步、实战二代码

方法一

    import numpy as np  # 随机生成100个点的坐标   均匀分布的值
    points = np.random.rand(100, 2)  # 查看生成的100个点
    distances = np.sqrt(np.sum((points[:, np.newaxis] - points) ** 2, axis=2))
    # 将距离保存到文件中
    print('正在保存数据')
    np.savetxt('888888小猿.csv', distances)
    print('数据保存完毕')

方法二

    import numpy as np
    import matplotlib.pyplot as plt
    import xlwt
    
    plt.rcParams["font.sans-serif"] = ["simhei"]  #指定默认字体
    plt.rcParams["axes.unicode_minus"]= False   #解决保存图像是负号‘-’显示为方块的问题
    # 生成100个随机点
    points = np.random.rand(100, 2)
    
    # 绘制点图
    plt.scatter(points[:, 0], points[:, 1], c='b')
    plt.title('随机图')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.show()
    
    # 计算距离矩阵
    diff = np.expand_dims(points, axis=1) - np.expand_dims(points, axis=0)
    dist_matrix = np.sqrt(np.sum(diff ** 2, axis=-1))
    
    # 存储距离矩阵到 Excel 文件中
    filename = '888888小猿b.xls'
    workbook = xlwt.Workbook()
    sheet = workbook.add_sheet('Distances')
    
    for i in range(len(dist_matrix)):
        for j in range(len(dist_matrix)):
            sheet.write(i, j, dist_matrix[i, j])
    
    workbook.save(filename)

方法二会生成一个点图,然后在生成一个xls文件

方法三

    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams["font.sans-serif"] = ["simhei"]  #指定默认字体
    plt.rcParams["axes.unicode_minus"]= False   #解决保存图像是负号‘-’显示为方块的问题
    # 随机生成100个点的坐标   均匀分布的值
    points = np.random.rand(100, 2)  #生成100个点
    plt.scatter(points[:, 0], points[:, 1], c='k') #points[:, 0]表示所有点的x坐标 points[:, 1]表示所有点的y坐标
    plt.title('随机100点图')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.savefig('888888小猿b.jpg')
    plt.show()
    distances = np.sqrt(np.sum((points[:, np.newaxis] - points) ** 2, axis=2))
    print('正在保存数据')
    np.savetxt('888888小猿b.csv', distances)
    print('数据保存完毕')

方法三主要是通过数组的升维,然后在进行欧拉计算

了解知识

axis翻译过来就是轴的意思

三维数组拥有三个轴:axis=0,axis=1,axis=2。 以此类推

axis=0对应最外层的[],axis=1对应第二外层的[],…,axis=n对应第n外层的[]。

axis [ ]
axis = 0 [ ]
axis = 1 [ [ ] ]
axis = 2 [ [ [ ] ] ]

[1, 2, 3]是一维数组、[[1, 2, 3], [4, 5, 6]]是二维数组、[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]] 是三维数组

每一行代码的意思:

1.points[:, np.newaxis]将points数组转换为二维数组,并在第二个维度上添加一个新的维度,这样才能与原数组进行减法操作。

2.(points[:, np.newaxis] - points)表示将每个点与其他所有点的坐标相减,得到一个三维数组。

3.(points[:, np.newaxis] - points) ** 2表示对每个坐标差值进行平方运算。

4.np.sum((points[:, np.newaxis] - points) ** 2, axis=2)表示沿着第三个维度(即每个点的两个坐标值)对平方差值进行求和,得到一个二维数组,表示每个点与其他所有点的距离平方。

5.np.sqrt(np.sum((points[:, np.newaxis] - points) ** 2, axis=2))表示对距离平方进行开方运算,得到每个点与其他所有点的距离矩阵。

第七步、结果

python欧拉距离和数据可视化项目实战_第3张图片

实战3:Matplotlib数据可视化

(1)了解绘图基础语法与常用参数;

(2)分析特征间的关系;

(3)分析特征内部数据分布与分散状况;

(4)根据老师提供的“国民经济核算季度数据.npz”,用散点图来展示数据中的两个属性:时间(横坐标)、国内生产总值_当季值(亿元)(纵坐标)。

(5)程序代码存为“学号姓名c.py”,这两列数据结果存为“学号姓名c.csv”;)

第一步、安装库

    pip install Matplotlib

第二步、学习Matplotlib

Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。

Matplotlib 可以用来绘制各种静态,动态,交互式的图表。

Matplotlib 是一个非常强大的 Python 画图工具,我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来。

Matplotlib 可以绘制折线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。

折线图

    import numpy as np
    import matplotlib.pyplot as plt
    x = np.linspace(0.05, 18, 100)
    y = np.sin(x)
    plt.plot(x, y, ls='-', lw=2, label="plot figure")
    print("曲线")
    plt.legend()
    plt.xlabel('x-axis')
    plt.ylabel('y-axis')
    plt.show()

结果

python欧拉距离和数据可视化项目实战_第4张图片

饼图

    import matplotlib.pyplot as plt
    # 数据
    sizes = [15, 30, 45, 10]
    # 饼图的标签
    labels = ['A', 'B', 'C', 'D']
    # 饼图的颜色
    colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
    # 突出显示第二个扇形
    explode = (0, 0.1, 0, 0)
    # 绘制饼图
    plt.pie(sizes, explode=explode, labels=labels, colors=colors,
           autopct='%1.1f%%', shadow=True, startangle=90)
    # 标题
    plt.title("RUNOOB Pie Test")
    # 显示图形
    plt.show()

结果

python欧拉距离和数据可视化项目实战_第5张图片

散点图

    from pylab import *
    n = 1024
    X = np.random.normal(0,1,n)
    Y = np.random.normal(0,1,n)
    print("散点图:")
    scatter()
    scatter(X,Y)
    show()

结果

python欧拉距离和数据可视化项目实战_第6张图片

条形图

    from pylab import *
    n = 12
    X = np.arange(n)
    Y1 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
    Y2 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
    bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
    bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
    print("条形图:")
    for x,y in zip(X,Y1):
        text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
    ylim(-1.25,+1.25)
    show()

结果

python欧拉距离和数据可视化项目实战_第7张图片

第三步、分析题目

两个属性:时间(横坐标)、国内生产总值_当季值(亿元)(纵坐标)

这个是这道题目的重点

拿到这两个数据这道题就可以完美解决

第四步、实战三代码

方法一 保存到XSL文件

    import numpy as np
    import matplotlib.pyplot as plt
    import xlwt
    
    plt.rcParams["font.sans-serif"] = ["simhei"]  #指定默认字体
    plt.rcParams["axes.unicode_minus"]= False   #解决保存图像是负号‘-’显示为方块的问题
    # 生成100个随机点
    points = np.random.rand(100, 2)
    
    # 绘制点图
    plt.scatter(points[:, 0], points[:, 1], c='b')
    plt.title('随机图')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.show()
    
    # 计算距离矩阵
    diff = np.expand_dims(points, axis=1) - np.expand_dims(points, axis=0)
    dist_matrix = np.sqrt(np.sum(diff ** 2, axis=-1))
    
    # 存储距离矩阵到 Excel 文件中
    filename = '888888小猿b.xls'
    workbook = xlwt.Workbook()
    sheet = workbook.add_sheet('Distances')
    
    for i in range(len(dist_matrix)):
        for j in range(len(dist_matrix)):
            sheet.write(i, j, dist_matrix[i, j])
    
    workbook.save(filename)

方法二 保存到CSV文件

    import numpy as np 
    import matplotlib.pyplot as plt
    import csv
    plt.rcParams["font.sans-serif"] = ["simhei"]  #指定默认字体
    plt.rcParams["axes.unicode_minus"]= False   #解决保存图像是负号‘-’显示为方块的问题
    data = np.load('国民经济核算季度数据.npz',allow_pickle=True)
    print(list(data))
    
    columns=data['columns']  #用columns定义字典的键值对
    values = data['values']  #用values定义字典的数据值
    
    mark = ["o","*","D"]
    for i in range(3,6):
        plt.scatter(values[:,1], values[:, i],marker=mark[i-3])
    plt.xticks(values[range(0,69,4),1],rotation=45)
    plt.legend(columns[3:6])  #图例
    plt.title("2000-2017年各个产业国民生产总值散点图")
    plt.savefig('888888小猿c.jpg')
    plt.show()
    print("正在保存数据")
    data = np.array([columns[1:3],values[:,[1,2]]])
    np.savetxt('888888小猿c.csv', data, delimiter=',', fmt = '%s')
    print("保存数据成功")

方法三 保存到CSV文件

    import csv
    import numpy as np
    import matplotlib.pyplot as plt
 
    plt.rcParams["font.sans-serif"] = ["simhei"]  
    plt.rcParams["axes.unicode_minus"] = False  
    
    # 读取数据
    data = np.load('国民经济核算季度数据.npz', allow_pickle=True)
    columns = data['columns']  
    values = data['values'] 
    
    mark = ["o", "*", "D"]
    for i in range(3, 6):
        plt.scatter(values[:, 1], values[:, i], marker=mark[i-3])
    plt.xticks(values[range(0, 69, 4), 1],rotation=45)
    plt.legend(columns[3:6])
    plt.title("2000-2017年各个产业国民生产总值散点图")
    plt.savefig('888888小猿c.jpg')
    plt.show()
    
    # 将数据写入 CSV 文件
    data_to_save = np.vstack((columns[1:3], values[:, [1, 2]]))
    np.savetxt('888888小猿c.csv', data_to_save, delimiter=',', fmt='%s')
    print("数据保存成功!")

第五步、结果

python欧拉距离和数据可视化项目实战_第8张图片

四、总结

通过本次的实战训练,学会了很多的知识点,革命尚未结束,小猿还得努力。

如果对你有帮助,请下方投币,创作不容易,请多多支持小猿✅

完美收官

山前有路,山后也未必有曙光,所以请坚持下去,心中的火不能灭,哪怕别人只能看见烟。

你可能感兴趣的:(python,信息可视化,开发语言)