坚持是光明的前身,光明给予万物生命。光明不灭,生命不息,坚持亦不止。
时间稍纵即逝,转眼间大三就来到第二个学期,还有一学年就要毕业了;马上也要开始准备 毕业设计 。 但是很多地方还需要进阶学习。然后这段时间也学习了很多的东西,让我也是收获颇满;但同时也 认识到了自己的不足,下面我将介绍一下做的一些内容。
温馨提示:如果想直接看结果请直接看:实战代码
Python数据处理、分析与应用的实现过程,以及专业技术人员所使用的基本方法和技巧,
培养自己解决Python数据处理、分析与应用过程中遇到实际问题的能力,
掌握应用Python编写程序的技术,提高学生在Python数据处理、分析与应用方面的综合应用能力。
基本的知识目前就不哆嗦了,直接实战。
(1)认识jieba库和wordcloud库;
(2)利用jieba库进行中文词频统计,强调字典、列表的应用;
(3)结合词频统计结果利用wordcloud库进行词云图的可视化;
(4)程序代码存为“学号姓名a.py”,词频统计结果存为“学号姓名a.csv”,词云图存为“学号姓名a.png”;
(5)每个步骤需要运行结果截图,截图中需要加上水印,水印为自己的学号姓名。
pip install 库名
题目需要利用jieba库和wordcloud库
首先认识一下这两个库
jieba(“结巴”)是Python中一个重要的第三方中文分词函数库,能够将一段中文文本分割成中文词语的序列。
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默认会以空格或标点为分隔符对目标文本进行分词处理
根据文本中词语出现的频率等参数绘制词云 绘制词云的形状,尺寸和颜色都可以设定
过多的基础知识我这就不多余的讲解,不懂得请看以前的文章,嘿嘿
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()
(1)认识jieba库和wordcloud库;
(2)利用jieba库进行中文词频统计,强调字典、列表的应用;
(3)结合词频统计结果利用wordcloud库进行词云图的可视化;
(4)程序代码存为“学号姓名a.py”,词频统计结果存为“学号姓名a.csv”,词云图存为“学号姓名a.png”;
(5)每个步骤需要运行结果截图,截图中需要加上水印,水印为自己的学号姓名。
掌握NumPy数组对象ndarray;
掌握NumPy矩阵与通用函数;
利用NumPy进行统计分析;
平面上有100个点,求任意2点间的欧式距离,并将其保存到矩阵当中。
程序代码存为“学号姓名b.py”,矩阵存为“学号姓名b.csv”;
每个步骤需要运行结果截图,截图中需要加上水印,水印为自己的学号姓名
pip install numpy
主要是生成100个点在平面上,来求两点距离.
这里就需要掌握一些Numpy基本的知识
NumPy(Numerical Python) 是科学计算基础库,提供大量科学计算相关功能
比如数据 统计,随机数生成等。其提供最核心类型为多维数组类型(ndarray)
支持大量的维度数组 与矩阵运算,Numpy 支持向量处理 ndarray 对象,提高程序运算速度。
从图中可以很清晰的了解到这张图就是一个矩阵
行和列已经标注的很清晰可见
当然,看懂了图就要把题目联想起来
平面上面要求100个随机点的欧拉距离
方法1:d = (x-x1)2+(y-y1)2开平方根
方法2:看见途中蓝色笔画出来的抽象直角三角形,知道两个点的X和Y;
以可以使用直角三角形的勾股定理来解这个题目 两种方法任选其一
欧拉距离就是两个点之间的距离。
NumPy(Numerical Python) 是科学计算基础库,提供大量科学计算相关功能
比如数据 统计,随机数生成等。其提供最核心类型为多维数组类型(ndarray)
支持大量的维度数组 与矩阵运算,Numpy 支持向量处理 ndarray 对象,提高程序运算速度。
参数 | 描述 |
---|---|
shape | 数组形状 |
dtype | 数据类型,可选 |
order | 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。 |
格式:numpy.arange(start, stop, step 步长,默认为1, dtype 数据类型)
datal = np.arange(10, 34).astype(int)
print(f'arange:{datal}')
格式: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}')
创建一个 3x3 并且值从0到8的矩阵。
data2 = np.arange(9).reshape(3, 3)
print(f'reshape:{data2}')
datal = np.ones((3, 3)).astype(int)
print(f'ones:{datal}')
矩阵元素值全为0,调用numpy库中zeros(行数,列数)方法
datal = np.zeros((5, 0))
print(f'zeros:{datal}')
print(''.center(30, '*'))
此矩阵每隔一行元素值相同,只需对两行的相邻位置进行赋值,用步长对其他元素赋值。
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))表示对距离平方进行开方运算,得到每个点与其他所有点的距离矩阵。
(1)了解绘图基础语法与常用参数;
(2)分析特征间的关系;
(3)分析特征内部数据分布与分散状况;
(4)根据老师提供的“国民经济核算季度数据.npz”,用散点图来展示数据中的两个属性:时间(横坐标)、国内生产总值_当季值(亿元)(纵坐标)。
(5)程序代码存为“学号姓名c.py”,这两列数据结果存为“学号姓名c.csv”;)
pip install 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()
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()
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()
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()
两个属性:时间(横坐标)、国内生产总值_当季值(亿元)(纵坐标)
这个是这道题目的重点
拿到这两个数据这道题就可以完美解决
方法一 保存到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("数据保存成功!")
通过本次的实战训练,学会了很多的知识点,革命尚未结束,小猿还得努力。
如果对你有帮助,请下方投币,创作不容易,请多多支持小猿✅
山前有路,山后也未必有曙光,所以请坚持下去,心中的火不能灭,哪怕别人只能看见烟。