Python知识分享第三十一天-Numpy和Pnadas入门
NumPy
Numpy介绍
Numpy是Python中科学计算的基础包,它是一个Python库提供多维数组对象 各种派生对象(如掩码数组和矩阵),以及用于对数组进行快速的各种例程,包括数学 ,逻辑, 形状操作,排序,选择,I/O,离散傅里叶变换,基本线性代数,基本统计运算,随机模拟等等(Numpy的核心是ndarray对象 这是一个多维数组)
安装方式
pip install numpy
多维数组概念
在numpy中 维度被称作轴例如
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
在以上数组中有两个轴 即是二维数组. 第一个轴有三个元素 即分别是[ 0 1 2 3 4], [ 5 6 7 8 9],
[10 11 12 13 14] |长度为3 第二个轴有五个元素 即长度为5
Numpy的常用属性是实例
数组维度(轴数): arr.ndim
数组的形状(行数列数): arr.shape
数组的元素类型: arr.dtype
数组中每个元素占的字节数: arr.itemsize
数组中元素的个数: arr.size
数组的类型: type(arr)
创建ndarry数组的方式
array()函数
arr = numpy.attay([1,2,3,4,5],dtype=numpy,int32)
arange()函数
arr = numpy.arange(0,10,2,dtype=numpy.int32)
## arange(起始值,结束值,步长,dtype=numpy.数据类型)
创建随机数矩阵
arr = numpy.random.rand(3,4) |生成0.0-1.0之间的随机数 包左不包右
arr = numpy.random.rand(-1,5,size(3,4)) ----->生成指定范围的随机整数
arr = numpy.random.uniform(-1,5,size(3,4)) -----> 生成指定的随机小数
创建等比数列
logspace(起始次幂,结束次幂,数字个数,base=基数) ----> 生成等比数列 默认基数为10, 即10的起始次幂 ~10的
结束次幂 包左包右 base参数可以修改基数
例:创建长度为5的等比数列 起始次幂1 结束次幂3:
arr= numpy.logsapce(1,3,5)
创建等差数列
生成指定范围内的等差数列 默认 包左包右
格式: numpy.linspace(起始值,结束值,元素个数,encoding=True)
创建等差数列:1,10之间 10个值
arr =linsapce(1,10,10)
NumPy中的数据类型转换
转换格式
新数组名 = arr.astype(numpy.要转成的类型)
例如:将numpy.float64转为 numpy.int32
arr = numpy.zeros((3,4),dtype= numpy.float64)
arr1 = arr.astype(numpy.int32)
NumPy常用函数
天花板数(向上取整): numpy.ceil(arr)
地板数(向下取整): numpy.floor(arr)
四舍五入: numpy.rint(arr)
判断是否为空: numpy.isnan(arr)
矩阵乘法: numpy.multiply(arr1,arr2)
矩阵除法 numpy.divide(arr1,arr2)
判断数组内是否满足判断条件 满足返回第一个参数否则返回第二个
numpy.where(arr >0,1,-1)
sum() -> 求和, cumsum() -> 计算累计和, 0 -> 列, 1 -> 行
numpy.unique() 去重函数 -> 获得到: 一维数组. 对原数组无影响, 是返回新的结果.
numpy.sort(): 排序, 返回新结果, 对原数组无影响.
数组名.sort(): 排序, 直接对原数组排序.
Pandas
pandas,python+data+analysis的组合缩写,是python中基于numpy和matplotlib的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包,享有数分三剑客之名。
正因为pandas是在numpy基础上实现,其核心数据结构与numpy的ndarray十分相似,但pandas与numpy的关系不是替代,而是互为补充。二者之间主要区别是:
从数据结构上看:
numpy的核心数据结构是ndarray,支持任意维数的数组,但要求单个数组内所有数据是同质的,即类型必须相同;
而pandas的核心数据结构是series和dataframe,仅支持一维和二维数据,但数据内部可以是异构数据,仅要求同列
数据类型一致即可
numpy的数据结构仅支持数字索引,而pandas数据结构则同时支持数字索引和标签索引
从功能定位上看:
numpy虽然也支持字符串等其他数据类型,但仍然主要是用于数值计算,尤其是内部集成了大量矩阵计算模块,例如基本
的矩阵运算、线性代数、fft、生成随机数等,支持灵活的广播机制
pandas主要用于数据处理与分析,支持包括数据读写、数值计算、数据处理、数据分析和数据可视化全套流程操作
pandas主要面向数据处理与分析,主要具有以下功能特色:
按索引匹配的广播机制,这里的广播机制与numpy广播机制还有很大不同
便捷的数据读写操作,相比于numpy仅支持数字索引,pandas的两种数据结构均支持标签索引,包括bool索引也是支持的
类比SQL的join和groupby功能,pandas可以很容易实现SQL这两个核心功能,实际上,SQL的绝大部分DQL和DML操作在pandas中都可以实现
类比Excel的数据透视表功能,Excel中最为强大的数据分析工具之一是数据透视表,这在pandas中也可轻松实现
自带正则表达式的字符串向量化操作,对pandas中的一列字符串进行通函数操作,而且自带正则表达式的大部分接口
丰富的时间序列向量化处理接口
常用的数据分析与统计功能,包括基本统计量、分组统计分析等
集成matplotlib的常用可视化接口,无论是series还是dataframe,均支持面向对象的绘图接口
正是由于具有这些强大的数据分析与处理能力,pandas还有数据处理中"瑞士军刀"的美名。
数据结构
pandas核心数据结构有两种,即一维的series和二维的dataframe,二者可以分别看做是在numpy一维数组和二维数组的基础上增加了相应的标签信息。正因如此,可以从两个角度理解series和dataframe:
series和dataframe分别是一维和二维数组,因为是数组,所以numpy中关于数组的用法基本可以直接应用到这两个数据结构,包括数据创建、切片访问、通函数、广播机制等
series是带标签的一维数组,所以还可以看做是类字典结构:标签是key,取值是value;而dataframe则可以看做是嵌套字典结构,其中列名是key,每一列的series是value。所以从这个角度讲,pandas数据创建的一种灵活方式就是通过字典或者嵌套字典,同时也自然衍生出了适用于series和dataframe的类似字典访问的接口,即通过loc索引访问。
关于series和dataframe数据结构本身,有大量的方法可用于重构结构信息:
rename,可以对标签名重命名,也可以重置index和columns的部分标签列信息,接收标量(用于对标签名重命名)或字典(用于重命名行标签和列标签)
reindex,接收一个新的序列与已有标签列匹配,当原标签列中不存在相应信息时,填充NAN或者可选的填充值
set_index/reset_index,互为逆操作,前者是将已有的一列信息设置为标签列,而后者是将原标签列归为数据,并重置为默认数字标签
set_axis,设置标签列,一次只能设置一列信息,与rename功能相近,但接收参数为一个序列更改全部标签列信息(rename中是接收字典,允许只更改部分信息)
rename_axis,重命名标签名,rename中也可实现相同功能
pandas支持大部分的主流文件格式进行数据读写,常用格式及接口为:
文本文件,主要包括csv和txt两种等,相应接口为read_csv()和to_csv(),分别用于读写数据
Excel文件,包括xls和xlsx两种格式均得到支持,底层是调用了xlwt和xlrd进行excel文件操作,相应接口为read_excel()和to_excel()
SQL文件,支持大部分主流关系型数据库,例如MySQL,需要相应的数据库模块支持,相应接口为read_sql()和to_sql()
此外,pandas还支持html、json等文件格式的读写操作。
# 1.Series
s1 = pd.Series([1,2,3])
s1 = pd.Series([1,2,3],index=['a','b','c'])
# 可以转换列表 元组 字典,Numpy等
# 字典
dict_pd = pd.Series({'name':'张三','gender':'男','age':23})
# 转Numpy
num_pd = pd.Series(np.arange(1,6))
# 2.Series对象的常用属性
# 创建Series对象
s2 = pd.Series(data=[i for i in range(6)],index=[i for i in 'ABCDEF'])
print(s2.index)
print(s2.values)
# 2.DataFrame对象的创建 常用属性和方法
# 字典加列表的方式存进DataFrame
data_dict = {
'日期': ['2024-12-19', '2024-12-20', '2024-12-21'],
'温度': [8, 5, 7],
'湿度': [65, 70, 60]
}
df1 = pd.DataFrame(data=data_dict,index=['a','b','c'])
# 列表+元组的方式存进 DataFream
data_list = [ ('2024-12-19', 8, 65),
('2024-12-20', 5, 70),
('2024-12-21', 7, 60)]
df2 = pd.DataFrame(data = data_list,columns=['日期', '温度', '湿度'],index=['a','b','c'])
df2
# 把Numpy的ndarray对象存进DataFrame
pd.DataFrame(np.arange(9).reshape(3,3))
这里生成一个学生成绩列表
# 需求: 生成10个学生的5门功课的数据.
# 并将列名改为: ['语文', '数学', '英语', '物理', '化学'],
# 索引列改为: ['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9']
# 生成数据
score_data = np.random.randint(40,101,size=(10,5))
score_data
# 转成DataFrame对象
score_df = pd.DataFrame(score_data)
# 定义列表 记录别名
col_names= ['语文', '数学', '英语', '物理', '化学']
# 定义列表 记录索引列
index_names = ['同学'+str(i) for i in range(10)]
# 修改DataFrane对象的列名和索引列
score_df.columns = col_names
score_df.index = index_names
score_df
# 也可以直接生成
score_df2 =- pd.DataFrame(data = score_data,columns=col_names,index=index_names)
score_df2
运行结果
这里用一个小例子展示一下数据分析处理和数据可视化
前提是有一份存有部分国家年GDP的csv文件,读取文件数据 分析展示
import pandas as pd
import numpy as np
import os
os.chdir(r'F:\itheima\02_数据处理和统计分析\06_Numpy和Pandas入门\3.数据')
# 解决中文显示问题,下面的代码只需运行一次即可
import matplotlib as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('./1960-2019全球GDP数据.csv',encoding='gbk')
df.head()
# 绘制中国近年的GDP变化曲线
china_df = df[df.country == '中国']
china_df.head()
china_df.set_index('year',inplace=True)
# china_df.plot()
china_df.GDP.plot()
# 绘制中美日三国曲线
china = df[df.country== '中国'].set_index('year')
us = df[df.country== '美国'].set_index('year')
jb = df[df.country== '日本'].set_index('year')
china.rename(columns={'GDP':'中国'},inplace=True)
us.rename(columns={'GDP':'美国'},inplace=True)
jb.rename(columns={'GDP':'小八嘎'},inplace=True)
print(jb)
china.中国.plot(color='red',legend=True)
us.美国.plot(color='blue',legend=True)
jb.小八嘎.plot(color='gray',legend=True)
下面是最终展示结果:
坚持分享 共同进步 如有错误 欢迎指出