pandas、matplotlib、Numpy模块的简单学习
一、pandas模块
pandas是BSD许可的开源库,为Python编程语言提供了高性能,易于使用的数据结构和数据分析工具。
pandas模块:操作excel/json/sql/ini/csv(配置文件)
使用pandas处理Excel文件需要根据报错内容安装两个插件,pd从Excel中读取的是DataFrame数据类型。
import numpy as np
import pandas as pd
np.random.seed(10)
index = pd.date_range('2019-01-01',periods=6,freq='M')#产生以月为间隔的的时间(periods时间,freq频率相当于间隔的时间单位)
print(index)
columns = ['c1','c2','c3','c4']
print(columns)
val = np.random.randn(6,4)
print(val)
df = pd.DataFrame(index=index,columns=columns,data=val)#索引,列,值
print(df)
#保存文件
df.to_excel('date_c1.xls')
#读取文件
df = pd.read_excel('date_c.xls',index_col=[0])#index_col[0]第零列
print(df)
#接下来我们可以打印出来行和列的索引,然后根据索引打印出对应的行和列的数据然后对它们进行处理
print(df.index)#打印出行索引
print(df.columns)#打印出列索引
print(df.values)#打印出所有的值
#loc[]按照index取值
print(df.loc['2019-01-31'])#取出2019-01-31对应的数据(注意loc是中括号)
print(df.loc['2019-01-31':'2019-05-31'])#取出这两个时间段之间的所有数据
print(df)
二、matplotlib模块
Matplotlib是一个Python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形。Matplotlib可用于Python脚本,Python和IPython Shell,Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包。
Matplotlib尝试使容易的事情变得容易,使困难的事情变得可能。您只需几行代码就可以生成图表,直方图,功率谱,条形图,误差图,散点图等。
为了简单绘图,该pyplot
模块提供了类似于MATLAB的界面,尤其是与IPython结合使用时。对于高级用户,您可以通过面向对象的界面或MATLAB用户熟悉的一组功能来完全控制线型,字体属性,轴属性等。
matplotlib模块:用于画各种统计图
1.条形图
from matplotlib import pyplot as plt
#约定俗成这样写
from matplotlib.font_manager import FontProperties
#修改字体
font = FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
plt.style.use('ggplot')#设置背景
clas = ['3班','4班','5班','6班']
stuents = [50,45,55,60]
clas_index = range(len(clas))
plt.bar(clas_index,stuents,color = 'darkblue')#使用bar()函数生成条形图
plt.xlabel('学生',fontproperties=font)
plt.ylabel('学生人数',fontproperties=font,fontsize=20,fontweight=25)#更改y轴的字体大小
plt.xticks(clas_index,clas,fontproperties=font)#获取或设置x轴的当前刻度位置和标签。
plt.show()#显示绘制的图形
2. 直方图
import numpy as np
from matplotlib import pyplot as plt # 约定俗成
from matplotlib.font_manager import FontProperties # 修改字体
font = FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
plt.style.use('ggplot')
x1 = np.random.randn(10000)
x2 = np.random.randn(10000)
fig = plt.figure() # 生成一张画布
ax1 = fig.add_subplot(1, 2, 1) # 将画布分成两块,取第一块
ax2 = fig.add_subplot(1, 2, 2)
ax1.hist(x1, bins=50,color='darkblue')
ax2.hist(x2, bins=50,color='y')
fig.suptitle('两个正态分布',fontproperties=font,fontsize=20)
ax1.set_title('x1的正态分布',fontproperties=font) # 加子标题
ax2.set_title('x2的正态分布',fontproperties=font)
plt.show()
3.折线图
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
plt.style.use('ggplot')
np.random.seed(10)
x1 = np.random.randn(40).cumsum()
x2 = np.random.randn(40).cumsum()
x3 = np.random.randn(40).cumsum()
x4 = np.random.randn(40).cumsum()
plt.plot(x1,c='r',linestyle='-',marker='o',label='红圆线')
plt.plot(x2,color='y',linestyle='--',marker='*',label='黄虚线')
plt.plot(x3,color = 'b',linestyle='-.',marker='s',label='蓝方线')
plt.plot(x4,color='black',linestyle=':',marker='s',label='黑方线')
plt.legend(loc='best',prop=font)#显示label(标签)
plt.show()
4.散点图+直线图
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
plt.style.use('ggplot')
fig = plt.figure()#创建一块新的画布
ax1 = fig.add_subplot(1,2,1)#将画布分成两块,取第一块
ax2 = fig.add_subplot(1,2,2)
x = np.arange(20)#x的范围
y = x**2
x2 = np.arange(20)
y2 = x2
ax1.scatter(x,y,c='r',label='红')
ax1.scatter(x2,y2,c='b',label='蓝')
ax2.plot(x,y)#将y与x作图作为线和/或标记
ax2.plot(x2,y2)
fig.suptitle('两张图',FontProperties=font,fontsize=15)
ax1.set_title('散点图',fontproperties=font)
ax2.set_title('折线图',fontproperties=font)
ax1.legend(prop=font)#Legend(显示图中的标签)
plt.show()
三、numpy
NumPy是使用Python进行科学计算的基本软件包。它包含以下内容:
- 强大的N维数组对象
- 复杂的(广播)功能
- 集成C / C ++和Fortran代码的工具
- 有用的线性代数,傅立叶变换和随机数功能
除了其明显的科学用途外,NumPy还可以用作通用数据的高效多维容器。可以定义任意数据类型。这使NumPy可以无缝,快速地与各种数据库集成。
NumPy已获得BSD许可证的许可,从而可以无限制地进行重用。
numpy:用于数据分析的模块,可进行矩阵的运算,
对两个数组进行相乘的运算
lt1 = [1,2,3]
lt2 = [4,5,6]
lt = []
for i in range(len(lt1)):
lt.append(lt1[i]*lt2[i])
print(lt)
import numpy as np
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
print(arr1*arr2)
[4, 10, 18]
[ 4 10 18]数组和列表是不一样的
一维数组
arr3 = np.array([1,2,3])
#二维数组
arr4 = np.array([[1,2,3],
[4,5,6]])
#三维数组
arr5 = np.array([[[1,2,3],
[4,5,6]],
[[1,2,3],
[4,5,6]]])
print(arr3)#[1 2 3]
print(arr4)
# [[1 2 3]
# [4 5 6]]
print(arr5)
[[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]]
这里只讨论二维数组
numpy的属性
T转置,就是矩阵的转置
arr = np.array([[1,2,3],
[4,5,6]])
print(arr,'\n',arr.T)
# [[1 4]
# [2 5]
# [3 6]
dtype 数组元素的数据类型,numpy数组是属于Python解释器的;int32/float64是属于numpy的
print(arr.dtype)#int32
size数组元素的个数
print(arr.size)#6
ndim 数组的维数
print(arr.ndim)#2
shape数组维度的大小(以元组的形式)
print(arr.shape[0])#2
print(arr.shape[1])#3就是指数组的行数和列数
astype数据类型转换
arr = arr.astype(np.float64)
print(arr)
[[1. 2. 3.]
[4. 5. 6.]]#浮点数据类型小数点后为零所以省略不写
切片numpy数组
lt = [1,23,4]
print(lt[1:])
arr = np.array([[11,2,3],
[4,5,6]])
print(arr[:,0])#数组的切片和列表的切片相似,但是这个是[行,列]也是通过索引取值,这个更类似与坐标,如果要取整行或者整列需要用冒号代替数字,如[:,0]就是取得第零列
#逻辑取值
print(arr[arr>4])#[11 5 6]去除所有大于4的数值构成一维数组
赋值
lt = [1,2,3]
lt[:] = [0,0,0]
print(lt)
arr = np.array([[1,2,3],
[4,5,6]])
arr[0,0] = 0
print(arr)
# [[0 2 3]
# [4 5 6]]
arr[:,0] = [2,5]
print(arr)
# [[2 2 3]
# [5 5 6]]
#数组的赋值可以通过坐标的方式一个一个的对其元素赋值,也可以整行整列对其元素进行互换
数组的合并:可以左右合并也可以上下合并,前提是对应的行和列要相等
arr1 = np.array([[1,2,3],
[4,5,6]])
arr2 = np.array([[7,8,9],
['a','s','g']])
print(np.hstack((arr1,arr2)))#只能放元组行合并
print(np.vstack((arr1,arr2)))#列合并
print(np.concatenate((arr1,arr2),axis=1))#默认为列合并,0为列合并,1为行合并
# [['1' '2' '3' '7' '8' '9']
# ['4' '5' '6' 'a' 's' 'g']]
# [['1' '2' '3']
# ['4' '5' '6']
# ['7' '8' '9']
# ['a' 's' 'g']]
# [['1' '2' '3' '7' '8' '9']
# ['4' '5' '6' 'a' 's' 'g']]
通过函数创建numpy数组
print(np.ones((2,3)))#创建一个两行三列的元素都为一的矩阵数据类型是float类型
# [[1. 1. 1.]
# [1. 1. 1.]]
print(np.zeros((2,3)))#创建一个元素都为零的矩阵
# [[0. 0. 0.]
# [0. 0. 0.]]
print(np.eye(3))#创建一个单位阵这里括号里面不需要元组
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
print(np.linspace(1,100,10))#将0-100平均分成10份
#[ 1. 12. 23. 34. 45. 56. 67. 78. 89. 100.]
print(np.arange(2,10))#构造一个2-9的一维数组
#[2 3 4 5 6 7 8 9]
print(np.arange(1,20,2))#构造一个2-19的数组,步长为2
#[ 1 3 5 7 9 11 13 15 17 19]
arr1 = np.zeros((1,12))
print(arr1.reshape((3,4)))#将原来的数组重构形状,reshape((行,列))
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
numpy数组运算
这里的数组运算其实就是矩阵的数学运算遵循所有矩阵的运算规则
arr1 = np.ones((3,4))*4#数乘
print(arr1)
# [[4. 4. 4. 4.]
# [4. 4. 4. 4.]
# [4. 4. 4. 4.]]
#numpy数组还可以进行正余弦等三角函数运算
print(np.sin(arr1))#对所有的元素都会进行运算
#数组的矩阵运算--》点乘
arr1 = np.array([[1,2,3],
[4,5,6]])
arr2 = np.array([[1,2],
[4,5],
[8,7]])
print(np.dot(arr1,arr2))
# [[33 33]
# [72 75]]
#求逆运算
arr3 = np.dot(arr1,arr2)
print(np.linalg.inv(arr3))
# [[ 0.75757576 -0.33333333]
# [-0.72727273 0.33333333]]
#numpy的数学和统计方法
print(np.sum(arr3[0,:]))#对第一行元素求和
# np.random.seed(1)#让随机数暂停
# print(np.random.random((3,4)))#生成一个三行四列的随机数
print(np.random.rand(3,4))#产生均匀分布的随机数
s = np.random.RandomState(1)#让随机数暂停,和seed(1)得到的结果相同
print(s.random((3,4)))
arr = np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10],[11,23,45,67]])
np.random.shuffle(arr)#整行整行的乱序(将每一行都当做一个整体然后在乱序)
print(arr)
# [[7 8 9]
# [4 5 6]
# [1 2 3]]
print(np.random.choice([1,2,3],1))#随机选择一个数
print(np.random.randint(1,100,(3,4)))#对1-100内的整数进行随机,生成一个三行四列的矩阵
实例分析
按照要求对电影数据绘图
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
解决中文乱码配置
#### mac 系统需要配置下面所有的
from matplotlib.font_manager import FontProperties
font=FontProperties(fname='/Users/shangzekai/Downloads/font/simhei.ttf')
font1=FontProperties(fname='/Users/shangzekai/Downloads/font/simhei.ttf')
plt.rcParams['font.sans-serif'] = ['SimHei']#windows系统只需要这两行配置
plt.rcParams['axes.unicode_minus'] = False
movies = pd.read_csv('./douban_movie.csv')
movies.head()
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|
0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142.0 | 1994 | 9.6 | 多伦多电影节 |
1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116.0 | 1957 | 9.5 | 美国 |
2 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116.0 | 1997 | 9.5 | 意大利 |
3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142.0 | 1994 | 9.4 | 洛杉矶首映 |
4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171.0 | 1993 | 9.4 | 香港 |
res = movies.groupby('产地').size().sort_values(ascending=False)
#条形图的绘制
x = res.index
y = res.values
plt.figure(figsize=(18,6))#画布大小
plt.xlabel('产地',size=15,color='blue')
plt.ylabel('数量',size=15)
plt.xticks(size=18,rotation=45)#对坐标轴上的刻度进行设置,rotation设置字体的角度
for a,b in zip(x,y):
plt.text(a,b+100,b,horizontalalignment='center')#将值写在坐标轴上点(a,b+100),horizontalalignment也可简写成ha,将数字居中
plt.bar(x,y,color="blue")#color可以设置树状图的颜色
# plt.savefig('/a.png')#保存图片,必须写在show前面
plt.show()
统计每一年电影的数量的折线图
res = movies.groupby('年代').size().sort_index()[:-3]
#折线图的绘制
x = res.index
y = res.values
plt.figure(figsize=(10,6))
plt.title('每一年电影数量的折线图',color='blue')
plt.xlabel('年代',color='blue',size=15)
plt.ylabel('数量',color='blue',size=15)
plt.plot(x,y)
plt.show()
根据电影的时长分布绘制饼状图
movie_time = movies['时长']
movie_time
0 142.0
1 116.0
2 116.0
3 142.0
4 171.0
...
38730 58.0
38731 98.0
38732 91.0
38733 78.0
38734 97.0
Name: 时长, Length: 38735, dtype: float64
movie_time.sort_values(ascending=False)
19690 11500.0
38727 9200.0
36522 958.0
26910 934.0
30525 929.0
...
15241 1.0
22021 1.0
5582 1.0
26875 1.0
14153 1.0
Name: 时长, Length: 38735, dtype: float64
res_time = pd.cut(movie_time,(0,60,90,120,150,180,1000)).value_counts()
res_time
(90, 120] 16578
(0, 60] 10324
(60, 90] 7727
(120, 150] 3154
(150, 180] 571
(180, 1000] 379
Name: 时长, dtype: int64
#饼状图的绘制
x = res_time.index
y = res_time.values
plt.figure(figsize=(10,6))
plt.title('电影时长分布',color='blue',size=20)
patchs, l_text, p_text = plt.pie(y,labels=x, autopct='%.2f%%')
#patchs是补丁,autopct是百分比的精确度
for l in l_text:#l_text是一个label的列表
l.set_size(15)
l.set_color('red')
for p in p_text:#p_text:就是百分比值
p.set_size(15)
p.set_color('white')
plt.show()
pandas、matplotlib、Numpy模块的简单学习的更多相关文章
- numpy, pandas, matplotlib等常用库的学习手册
pandas介绍: 待续 参考资料: 中文:https://www.cnblogs.com/skying555/p/5914391.html 英文:http://www.datadependence. ...
- 利用pandas对numpy数组进行简单的科学计算
二维数组转换为DataFrame pandas可直接进行科学计算形式: import numpy as np import pandas as pd a = [1,2,3] b = [4,5,6] # ...
- Python之numpy模块array简短学习
1.简介 Python的lists是非常的灵活以及易于使用.但是在处理科学计算相关大数量的时候,有点显得捉襟见肘了. Numpy提供一个强大的N维数组对象(ndarray),包含一些列同类型的元素,这 ...
- Python中numpy模块的简单使用
# encoding:utf-8 import numpy as np data1 = np.array([1, 2, 3, 4, 5]) print(data1) data2 = np.array( ...
- numpy模块(详解)
重点 索引和切片 级联 聚合操作 统计操作 矩阵 什么是数据分析 是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律 数据分析是用适当的方法对收集来的大量数据进行分析,帮助 ...
- Numpy 模块的应用
数据分析三剑客: Numpy, Pandas, Matplotlib NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数 ...
- Python模块简介及安装 [numpy,pandas,matplotlib,scipy,statsmodels,Gensim,sklearn,keras]
https://pan.baidu.com/s/1bpVv3Ef 67bd 模块安装文件下载地址 pip install "numpy-1.12.0b+mkl-cp35- ...
- 11-2 numpy/pandas/matplotlib模块
目录 numpy模块 一维数组 二维数组 列表list和numpy的区别 获取多维数组的行和列 多维数组的索引 高级功能 多维数组的合并 通过函数方法创建多维数组 矩阵的运算 求最大值最小值 nump ...
- numpy+pandas+ matplotlib模块(day18)
目录 numpy模块 二维数组 numpy数组的属性 T 数组的装置 dtype 数组元素的数据类型 size 数组元素的个数 ndim 数组的维数 shape数组的维度大小 astype 类型转换 ...
随机推荐
- TCP/IP 网络模型
前言 互联网是怎么构成的,又是怎么运作的?什么是 TCP/IP 网络?为什么远隔万里的计算机可以互相通信?计算机网络作为 IT 行业的基石,是工程师永远绕不开的话题. 计算机网络的分层体系结构 计算机 ...
- 阶段3 1.Mybatis_12.Mybatis注解开发_3 mybatis注解开发保存和更新功能
使用直接来实现CRUD操作 Insert方法 创建测试类 把变量都定义在外面 写测试方法 修改链接的数据库 update方法 再加上address 被更新的数据
- robot framework断言
一.基础 RobotFramework带有丰富的系统关键,使用时无需导入,直接使用,为写自动化用例带来了极大的方便:不能停留在知道或者是会得程度,只有熟练使用各关键字,才能提升自动化用例的写作效率.下 ...
- 【Qt开发】Qt5.7中文显示乱码解决方法两种
升级到Qt5.X之后,原先解决的Qt显示中文乱码的方法突然不适用了,找了很多方式来解决这个问题 第一种: 在公司代码里看到的方法,先将对应的cpp文件用windows自带的记事本打开,另存为UTF-8 ...
- liteide使用中的注意点
liteide使用中的注意点 无法跳转 会出现无法跳转的情况,可能是这个包里面的某个文件会有错误,一般把这个包里的所有的错误都改正之后就能正常跳转了.Ubuntu中,直接按f2可以跳入,之后按住alt ...
- js五种不同的遍历 (filter, map,foreach,every, some,)
var arr=[1,2,"a",2,4,1,4,"a",5,6,7,8,"aa","bb","c" ...
- python 三元表达式
python 三元表达式(ternary expression) 把 if-else块 写到一行或者一个表达式中 并且产生一个值 value = true if condition else fal ...
- [2019上海网络赛F题]Rhyme scheme
题目链接 题意,求出合法的长度为n的字典序第k小字符串,合法的定义为除了最后一位,每一位的取值范围为'A'到'A'+pos-1,而最后一位的取值范围'A'到当前字符串最大值+1. 队友tql,Orz ...
- Phone List POJ-3630 字典树 or 暴力
Phone List POJ-3630 字典树 or 暴力 题意 目前有 t 组数据, n 个电话号码,如果拨打号码的时候 先拨通了某个号码,那么这一串号码就无法全部拨通. 举个例子 911 和 91 ...
- Python 入门之 文件
Python 入门之 文件 1.文件操作 找到文件位置 双击打开 进行一些操作 r-read(读) w-write(写) a-追加 rd--读字节 wd--清空写,写字节 ad --追加写(字节) r ...