NumPy
NumPy = Numeric Python
数值运算、矩阵运算……
- 运算逻辑基于矩阵演算,代码相对简洁
- 底层大量采用C语言实现,执行速度快
matplotlib、pandas、TuShare等都用到了NumPy模块。
ndarray类型
一维数组
ndarray = N-dimensional array,N维数组,和Python中的列表相似。
- 使用array()将列表等容器转换为ndarray类型的数组
(range等可迭代对象都可以转换为ndarray) - 将 ndarray数据看作矩阵,可以进行整体的数学运算
- 使用tolist方法将ndarray转换为普通的python列表
- 使用numpy模块提供的各种函数对数组统计运算
math模块要求参数必须是数字,不能是容器;而numpy模块提供的各种函数可以对数组统计运算
import numpy as np
x = [15, 20, 16, 8, 6, 15, 12, 20, 3, 5, 8, 10] # 列表类型
a = np.array(x)
a # ndarray类型
array([15, 20, 16, 8, 6, 15, 12, 20, 3, 5, 8, 10])
b = a * 3
b
array([45, 60, 48, 24, 18, 45, 36, 60, 9, 15, 24, 30])
如果a是Python列表对象,那么a*3就是把a重复3次
c = np.array(range(12))
c
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
d = b - c
d
array([45, 59, 46, 21, 14, 40, 30, 53, 1, 6, 14, 19])
各月收入 = [3000,2500,2800,4400]
各月支出 = [2700,3200,2100,4300]
各月盈余 = np.array(各月收入) - np.array(各月支出)
各月盈余 = 各月盈余.tolist()
各月盈余
[300, -700, 700, 100]
二维数组
- 使用reshape将一维结构ndarray转换为二维结构
- numpy的计算规则和函数同样适用于二维数组(但具体使用时要指定行列轴)
- a.T可以生成a的转置矩阵
x = [15, 20, 16, 8, 6, 15, 12, 20, 3, 5, 8, 10]
a = np.array(x)
b = a.reshape(4, 3)
b
array([[15, 20, 16],
[ 8, 6, 15],
[12, 20, 3],
[ 5, 8, 10]])
c = b.reshape(2, 6)
c
array([[15, 20, 16, 8, 6, 15],
[12, 20, 3, 5, 8, 10]])
c.T
array([[15, 12],
[20, 20],
[16, 3],
[ 8, 5],
[ 6, 8],
[15, 10]])
使用NumPy处理Excel数据
import numpy as np
import xlwings as xw
app = xw.App()
wb = app.books.open('一季度工资.xlsx')
工资 = np.array(wb.sheets['计件工资'].range('c5:e8').value)
奖金 = np.array(wb.sheets['出勤奖励'].range('e4:e15').value).reshape(4, 3)
实发 = 工资 + 奖金
wb.sheets['实发工资'].range('c4:f6').value = 实发.T # xlwings支持ndarray
wb.save('一季度工资.xlsx')
wb.close()
app.quit()
pandas
pandas = Panel Data
统计运算、数据导入、数据清洗、合并分组、索引定位、筛选切片…..
pandas数据类型
一维Series 和 二维DataFrame
pandas读写Excel基本方法
read_excel
(文件名, 工作表名)
pandas的Excel读写使用了xlrd
和openpyxl
第三方模块,需要先安装才能使用。**to_excel**
(文件名, 工作表名)会覆盖原Excel文件!所以不要用**to_excel**
(文件名, 工作表名)向已经存在的工作簿中写入数据! ```python import pandas as pd 工资 = pd.read_excel(‘一季度工资.xlsx’, ‘计件工资’) 工资数据 = 工资.iloc[4:, 3:] 奖金 = pd.read_excel(‘一季度工资.xlsx’, ‘出勤奖励’) 奖金数据 = 奖金.iloc[3:, 4] # 一维数据,Series类型,无法直接和dataframe类型进行运算 奖金数据 = 奖金数据.values.reshape(4, 3) # .values得到一维数组
实发工资 = 工资数据 + 奖金数据 实发工资 = 实发工资.T
实发工资.to_excel(‘实发工资.xlsx’, ‘实发工资’) ```