Numpy pandas matplotlib学习笔记

  • Post author:
  • Post category:其他


笔记终是笔记,记录使用频率高的函数

法宝:

import numpy as np
print(help(np.array))


numpy

import numpy as np
arr1 = np.array([1, 2, 3, 4]) #创建一维数组
print(' 创建的数组为: ',arr1)

# 创建二维数组
arr2 = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])
print('创建的数组为:\n',arr2)
print('数组类型为:',arr2.dtype)  #查看数组类型
print('数组元素个数为:',arr2.size)  #查看数组元素个数
print('数组每个元素大小为:',arr2.itemsize)  #查看数组每个元素大小

arr2.shape = 4,3 #重新设置shape
print('重新设置shape 后的arr2 为:',arr2)

# 类型字段名可以用于存取实际的 age 列

dt = np.dtype([('age',np.int8)]) 
a = np.array([(10,),(20,),(30,)], dtype = dt) 
print(a['age'])

student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) 
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student) 
print(a)
print('使用arange函数创建的数组为:\n',np.arange(0,1,0.1))
print('使用linspace函数创建的数组为:\n',np.linspace(0, 1, 12))#等差数列
print('使用logspace函数创建的数组为:\n',np.logspace(0, 2, 20))#等比数列
print('使用zeros函数创建的数组为:\n',np.zeros((2,3)))
print('使用eye函数创建的数组为:\n',np.eye(3))
print('使用ones函数的数组为:\n',np.ones((5,3)))

#冒号 : 的解释:如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。
# 一维数组的索引
arr = np.arange(10)
print('数据为:',arr)
#用整数作为下标可以获取数组中的某个元素
print('索引结果为:',arr[5])  
#用范围作为下标获取数组的一个切片,包括arr[3]不包括arr[5]
print('索引结果为:',arr[3:5])
#省略开始下标,表示从arr[0]开始
print('索引结果为:',arr[:5])  
#下标可以使用负数,-1表示从数组后往前数的第一个元素
print('索引结果为:',arr[-1])
#下标还可以用来修改元素的值
arr[2:4] = 100,101
print('索引结果为:',arr) 
#范围中的第三个参数表示步长,2表示隔一个元素取一个元素
print('索引结果为:',arr[1:-1:2])
#步长为负数时,开始下标必须大于结束下标
print('索引结果为:',arr[5:1:-2]) 

# 二维数组的索引
arr = np.array([[1, 2, 3, 4, 5],[4, 5, 6, 7, 8], [7, 8, 9, 10, 11]])
print('创建的二维数组为:\n',arr)
#索引第0行中第3和第4列的元素
print('索引结果为:\n',arr[0,3:5])  
#索引第2和第3行中第3列、第4列和第5列的元素
print('索引结果为:\n',arr[1:,2:])
#索引第2列的元素
print('索引结果为:\n',arr[:,2])  

# 二维数组的排序
arr = np.random.randint(1,10,size = (3,3))  #生成3行3列的随机数
print('创建的数组为:\n',arr)
arr.sort(axis = 1)  #沿着横轴排序
print('排序后数组为:\n',arr)
arr.sort(axis = 0)  #沿着纵轴排序
print('排序后数组为:\n',arr)
arr = np.array([2,3,6,8,0,7])
print('创建的数组为:',arr)
print('排序后数组为:',arr.argsort())  #返回值为重新排序值的下标


arr = np.arange(20).reshape(4,5)
print('创建的数组为:\n',arr)
print('数组的和为:',np.sum(arr))  #计算数组的和
print('数组横轴的和为:',arr.sum(axis = 0))  #沿着横轴计算求和

print('数组纵轴的和为:',arr.sum(axis = 1))  #沿着纵轴计算求和
print('数组的均值为:',np.mean(arr))  #计算数组均值
print('数组横轴的均值为:',arr.mean(axis = 0))  #沿着横轴计算数组均值
print('数组纵轴的均值为:',arr.mean(axis = 1))  #沿着纵轴计算数组均值
print('数组的标准差为:',np.std(arr))  #计算数组标准差
print('数组的方差为:',np.var(arr))  #计算数组方差
print('数组的最小值为:',np.min(arr))  #计算数组最小值
print('数组的最大值为:',np.max(arr))  #计算数组最大值
print('数组的最小元素为:',np.argmin(arr))  #返回数组最小元素的索引
print('数组的最大元素为:',np.argmax(arr))  #返回数组最大元素的索引

a = np.arange(9, dtype = np.float_).reshape(3,3)  
print ('第一个数组:')
print (a)
print ('\n')
print ('第二个数组:')
b = np.array([10,10,10])  
print (b)
print ('\n')
print ('两个数组相加:')
print (np.add(a,b))
print ('\n')
print ('两个数组相减:')
print (np.subtract(a,b))
print ('\n')
print ('两个数组相乘:')
print (np.multiply(a,b))
print ('\n')
print ('两个数组相除:')
print (np.divide(a,b))

a = np.array([[3,7],[9,1]])  
print ('我们的数组是:')
print (a)
print ('\n')
print ('调用 sort() 函数:')
print (np.sort(a))
print ('\n')
print ('按列排序:')
print (np.sort(a, axis =  0))
print ('\n')
# 在 sort 函数中排序字段 
dt = np.dtype([('name',  'S10'),('age',  int)]) 
a = np.array([("raju",21),("anil",25),("ravi",  17),  ("amar",27)], dtype = dt)  
print ('我们的数组是:')
print (a)
print ('\n')
print ('按 name 排序:')
print (np.sort(a, order =  'name'))


a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print(b)
print(c)
print(d)

x=np.arange(32).reshape((8,4))
print (x)
print (x[[4,2,1,7]])

a = np.arange(6).reshape(2,3)
print ('原始数组是:')
print (a)
print ('\n')
print ('迭代输出元素:')
for x in np.nditer(a):
    print (x, end=", " )
print ('\n')

a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print ('原始数组是:') 
print (a) 
print ('\n') 
print ('原始数组的转置是:') 
b = a.T 
print (b) 
print ('\n') 
print ('以 C 风格顺序排序:') 
c = b.copy(order='C')  
print (c)
for x in np.nditer(c):  
    print (x, end=", " )
print  ('\n') 
print  ('以 F 风格顺序排序:')
c = b.copy(order='F')  
print (c)
for x in np.nditer(c):  
    print (x, end=", " )
    

#通过指定不同的axis,numpy会沿着不同的方向进行操作,如果不设置,则表示对所有的元素进行操作,如果axis=0,则沿着纵轴进行操作,若axis=1则沿着横轴进行操作。但是这只是仅仅对于二维数组而言。但是可以总结为一句话:设axis=i ,则numpy沿着第i个下标变化的方向进行操作
arr=np.arange(16).reshape(2,4,2)
print (arr) 
print (arr.sum(axis=0)) 
'''
axis=0,首先来看一下,arr的0轴在哪里,arr的shape为(2,4,2),arr的shape下标为(0,1,2),则axis=0对应于数组shape下标的的第一个位置。那么第一个位置的变化方向有几个呢,就要看shape下标对应的数值了,为2,那我们列举这两个变化的方向
000->100 , 001->101
010->110 , 011->111
020->120 , 021->121
030->130 , 031->131
000->010->020->030    # axis=1的变化方向
001->011->021->031
100->110->120->130
101->111->121->131
'''
print (arr.sum(axis=1)) 


pandas

'''
Series
Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成,即index和values两部分,可以通过索引的方式选取Series中的单个或一组值。

Series的创建
pd.Series(list,index=[ ]),第二个参数是Series中数据的索引,可以省略。

DataFrame
DataFrame是一个表格型的数据类型,每列值类型可以不同,是最常用的pandas对象。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。

DataFrame的创建
pd.DataFrame(data,columns = [ ],index = [ ]):columns和index为指定的列、行索引,并按照顺序排列。

创建DataFrame最常用的是直接传入一个由等长列表或NumPy数组组成的字典,会自动加上行索引,字典的键会被当做列索引:

'''
import numpy as np, pandas as pd
arr1 = np.arange(10)
s1 = pd.Series(arr1)
print(s1)   #由于我们没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引

#三种创建DataFrame方式
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002, 2003],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
df= pd.DataFrame(data)
print(df)

df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],index=['one', 'two', 'three', 'four', 'five', 'six'])
print(df2)

pop = {'Nevada': {2001: 2.4, 2002: 2.9},'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
df3 = pd.DataFrame(pop)
print(df3)
################
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002, 2003],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
                     index=['one', 'two', 'three', 'four', 'five', 'six'])

print(df2.columns)

#通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series。
print(df2['state']) #或者df2.state

#列可以通过赋值的方式进行修改。例如,我们可以给那个空的"debt"列赋上一个标量值或一组值
df2['debt'] = 16.5
print(df2)

#将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值
val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
df2['debt'] = val
print(df2)

#为不存在的列赋值,会创建出一个新列
df2['eastern'] = df2.state == 'Ohio'
print(df2)

#关键字del用于删除列
del df2['eastern']
print(df2.columns)


数据索引:Series和DataFrame的索引是Index类型,Index对象是不可修改,可通过索引值或索引标签获取目标数据,也可通过索引使序列或数据框的计算、操作实现自动化对齐。索引类型index的常用方法:

.append(idx):连接另一个Index对象,产生新的Index对象

.diff(idx):计算差集,产生新的Index对象

.intersection(idx):计算交集

.union(idx):计算并集

.delete(loc):删除loc位置处的元素

.insert(loc,e):在loc位置增加一个元素

重新索引:能够改变、重排Series和DataFrame索引,会创建一个新对象,如果某个索引值当前不存在,就引入缺失值。

df.reindex(index, columns ,fill_value, method, limit, copy ):index/columns为新的行列自定义索引;fill_value为用于填充缺失位置的值;method为填充方法,ffill当前值向前填充,bfill向后填充;limit为最大填充量;copy 默认True,生成新的对象,False时,新旧相等不复制

删除指定索引:默认返回的是一个新对象。

.drop():能够删除Series和DataFrame指定行或列索引。

删除一行或者一列时,用单引号指定索引,删除多行时用列表指定索引。

如果删除的是列索引,需要增加axis=1或axis=’columns’作为参数。

增加inplace=True作为参数,可以就地修改对象,不会返回新的对象。

索引、选取和过滤

df.loc[行标签,列标签]:通过标签查询指定的数据,第一个值为行标签,第二值为列标签。当第二个参数为空时,查询的是单个或多个行的所有列。如果查询多个行、列的话,则两个参数用列表表示。

df.iloc[行位置,列位置]:通过默认生成的数字索引查询指定的数据。


适用于Series和DataFrame的基本统计分析函数:传入axis=’columns’或axis=1将会按行进行运算。

.describe():针对各列的多个统计汇总,用统计学指标快速描述数据的概要。

.sum():计算各列数据的和

.count():非NaN值的数量

.mean( )/.median():计算数据的算术平均值、算术中位数

.var()/.std():计算数据的方差、标准差

.corr()/.cov():计算相关系数矩阵、协方差矩阵,是通过参数对计算出来的。Series的corr方法用于计算两个Series中重叠的、非NA的、按索引对齐的值的相关系数。DataFrame的corr和cov方法将以DataFrame的形式分别返回完整的相关系数或协方差矩阵。

.corrwith():利用DataFrame的corrwith方法,可以计算其列或行跟另一个Series或DataFrame之间的相关系数。传入一个Series将会返回一个相关系数值Series(针对各列进行计算),传入一个DataFrame则会计算按列名配对的相关系数。

.min()/.max():计算数据的最小值、最大值

.diff():计算一阶差分,对时间序列很有效

.mode():计算众数,返回频数最高的那(几)个

.mean():计算均值

.quantile():计算分位数(0到1)

.isin():用于判断矢量化集合的成员资格,可用于过滤Series中或DataFrame列中数据的子集

适用于Series的基本统计分析函数,DataFrame[列名]返回的是一个Series类型。

.unique():返回一个Series中的唯一值组成的数组。

.value_counts():计算一个Series中各值出现的频率。

.argmin()/.argmax():计算数据最大值、最小值所在位置的索引位置(自动索引)

.idxmin()/.idxmax():计算数据最大值、最小值所在位置的索引(自定义索引)

*在许多数据分析工作中,缺失数据是经常发生的。对于数值数据,pandas使用浮点值NaN(np.nan)表示缺失数据,也可将缺失值表示为NA(Python内置的None值)。

.info():查看数据的信息,包括每个字段的名称、非空数量、字段的数据类型。

.isnull():返回一个同样长度的值为布尔型的对象(Series或DataFrame),表示哪些值是缺失的,.notnull()为其否定形式。

.dropna():删除缺失数据。对于Series对象,dropna返回一个仅含非空数据和索引值的Series。对于DataFrame对象,dropna默认删除含有缺失值的行;如果想删除含有缺失值的列,需传入axis = 1作为参数;如果想删除全部为缺失值的行或者列,需传入how=’all’作为参数;如果想留下一部分缺失数据,需传入thresh = n作为参数,表示每行至少n个非NA值。

.fillna(value,method,limit,inplace):填充缺失值。value为用于填充的值(比如0、’a’等)或者是字典(比如{‘列’:1,‘列’:8,……}为指定列的缺失数据填充值);method默认值为ffill,向前填充,bfill为向后填充;limit为向前或者向后填充的最大填充量。inplace默认会返回新对象,修改为inplace=True可以对现有对象进行就地修改。

数据转换

替换值

.replace(old, new):用新的数据替换老的数据,如果希望一次性替换多个值,old和new可以是列表。默认会返回一个新的对象,传入inplace=True可以对现有对象进行就地修改。

删除重复数据

.duplicated():判断各行是否是重复行(前面出现过的行),返回一个布尔型Series。

.drop_duplicates():删除重复行,返回删除后的DataFrame对象。默认保留的是第一个出现的行,传入keep=’last’作为参数后,则保留最后一个出现的行。

两者都默认会对全部列做判断,在传入列索引组成的列表[ ‘列1’ , ‘列2’ , ……]作为参数后,可以只对这些列进行重复项判断。

利用函数或字典进行数据转换

Series.map():接受一个函数或字典作为参数。使用map方法是一种实现元素级转换以及其他数据清理工作的便捷方式。*


DataFrame常见函数

df.head():查询数据的前五行

df.tail():查询数据的末尾5行

pandas.cut()

pandas.qcut() 基于分位数的离散化函数。基于秩或基于样本分位数将变量离散化为等大小桶。

pandas.date_range() 返回一个时间索引

df.apply() 沿相应轴应用函数

Series.value_counts() 返回不同数据的计数值

df.aggregate()

df.reset_index() 重新设置index,参数drop = True时会丢弃原来的索引,设置新的从0开始的索引。常与groupby()一起用


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


matplotlib

import matplotlib.pyplot as plt
import numpy as np

'''
设置刻度范围
plt.xlim(), plt.ylim()
ax.set_xlim(), ax.set_ylim()
设置显示的刻度
plt.xticks(), plt.yticks()
ax.set_xticks(), ax.set_yticks()
设置刻度标签
ax.set_xticklabels(), ax.set_yticklabels()
设置坐标轴标签
ax.set_xlabel(), ax.set_ylabel()
设置标题
ax.set_title()
图例
ax.plot(label=‘legend’)
ax.legend(), plt.legend()
通过loc指定图例的位置,默认右上角
loc=‘best’:自动选择放置图例最佳位置

'''

# 计算正弦和余弦曲线上的点的 x 和 y 坐标 
x = np.arange(0,  3  * np.pi,  0.1) 
y_sin = np.sin(x) 
y_cos = np.cos(x)  
# 建立 subplot 网格,高为 2,宽为 1  
# 激活第一个 subplot
plt.subplot(2,  1,  1)  
# 绘制第一个图像 
plt.plot(x, y_sin) 
plt.title('Sine')  
# 将第二个 subplot 激活,并绘制第二个图像
plt.subplot(2,  1,  2) 
plt.plot(x, y_cos) 
plt.title('Cosine')  
# 展示图像
plt.show()

x = np.arange(1,11) 
y =  2  * x +  5 
plt.title("Matplotlib demo") 
plt.xlabel("x axis caption") 
plt.ylabel("y axis caption") 
plt.plot(x,y,"ob") 
plt.show()


#折线图
x = np.arange(24)
y = [np.random.uniform(0,60) for i in x]
plt.figure(figsize=(5,3),dpi=100)
 ## figure指的是画的图
 ## 通过实例化一个figure并且传递参数,能够在后台自动使用该figure实例
 ## 在图像模糊的时候可以传入dpi参数,让图片更清晰
plt.plot(x,y)
plt.show()

#柱状图
x =  [5,8,10] 
y =  [12,16,6] 
x2 =  [6,9,11] 
y2 =  [6,15,7] 
plt.bar(x, y, align =  'center') 
plt.bar(x2, y2, color =  'g', align =  'center') 
plt.title('Bar graph') 
plt.ylabel('Y axis') 
plt.xlabel('X axis') 
plt.show()

#散点图
np.random.seed(19)

x = np.arange(0.0, 50.0, 2.0)
y = x ** 1.3 + np.random.rand(*x.shape) * 30.0
s = np.random.rand(*x.shape) * 400 + 100

plt.scatter(x, y, s, c="g", alpha=0.5, marker=r'$\clubsuit$',label="Luck")
plt.xlabel("Leprechauns")
plt.ylabel("Gold")
plt.legend(loc='upper left')
plt.show()


中文显示问题

from  matplotlib import pyplot as plt
import random
from  matplotlib import font_manager
# 设置中文显示,fname表示字体的路径。
# 在需要显示中文的地方加上fontproperties = my_font
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")

y = [random.randint(20,35) for i in range(120)]
x = range(0, 120)

fig = plt.figure(figsize=(20,8),dpi=80)
_x = list(x)

_xtick_labels = ["10点{}分".format(i) for i in range(60) ]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
# 让列表x中的数据和_xtick_labels上的数据都传入,最终会在x轴上一一对应显示
# 两组数据的长度必须一样,否则不能完全覆盖整个轴
# [::5]使用列表切片,每隔5个选一个数据进行展示
# rotation=45表示旋转45°,这样字符串之间不会覆盖 ,fontproperties = my_font
plt.xticks(_x[::5], _xtick_labels[::5],rotation = 45 ,fontproperties = my_font)

plt.xlabel("时间" ,fontproperties = my_font)
plt.ylabel("温度(ºC)" ,fontproperties = my_font)
plt.title("10点到12点每分钟温度的变化情况" ,fontproperties = my_font)
plt.plot(x,y)
plt.show()

在这里插入图片描述

在这里插入图片描述



版权声明:本文为qq_32812063原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。