1.numpy
1.1 介绍
Numpy:Numerical python的简称。
Numpy系统是python的一种开源的数值计算框架,这种工具可用来存储和处理大型矩阵,相当于python边成一种免费的更强大的MatLab系统
1.2 安装
pip install numpy
官方文档:
https://numpy.org/doc/stable/user/quickstart.html
1.3 具体使用
import numpy as np
# 1. 基本用法
# 创建数组array
# 一维数组
data1 = [1, 2, 8, 6]
data1_arr = np.array(data1)
print(data1_arr.ndim)
print(data1_arr.itemsize)
print(data1_arr) # [1 2 8 6]
print(type(data1_arr)) # <class 'numpy.ndarray'>
# 二维数组
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
data2_arr = np.array(data2)
print(data2_arr)
# 数组维度
print(data2_arr.ndim)
# 一个一维数组的元素个数
print(data2_arr.itemsize)
# 数组中的所有元素个数
print(data2_arr.size)
"""
[[1 2 3 4]
[5 6 7 8]]
"""
# dtype数据类型
print(data2_arr.dtype) # int32
# shape属性
print(data2_arr.shape) # (2, 4):2行4列的数组
# 指定数据类型创建数组
arr3 = np.array(data2, dtype=np.int64)
print(arr3.dtype) # int64
# 创建浮点类型数组
data4 = [6, 1.5, 8, 9.6]
data4_arr = np.array(data4)
print(data4_arr.dtype) # float64
# 创建复数数组
c = np.array([ [1, 0 + 2j], [3, 1 + 4j] ], dtype=complex)
print(c)
# 转换数据类型
arr5 = data4_arr.astype(np.int64)
print(arr5) # [6 1 8 9]
print(arr5.dtype) # int64
# ones生成全为1的数组
arr6 = np.ones(10)
print(arr6) # [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
print(np.ones((4, 5)))
"""
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
"""
# zeros生成全为0的数组
arr7 = np.zeros(10)
print(arr7) # [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
print(np.zeros((2, 3)))
"""
[[0. 0. 0.]
[0. 0. 0.]]
"""
# 数组与标量之间的运算
# 对数组元素进行运算
# 特性:大小相等的数组之间的任何运算都会应用到元素级
# 使得我们不用编写循环即可对数组中的元素执行批量运算
nd = np.array([1, 2, 3, 4])
print(nd * 2) # [2 4 6 8]
print(nd * nd) # [ 1 4 9 16]
print(nd ** 2) # [ 1 4 9 16]
print(nd + 1) # [2 3 4 5]
print(nd - 1) # [0 1 2 3]
print(nd / 2) # [0.5 1. 1.5 2. ]
print(nd + nd) # [2 4 6 8]
# 取倒数
print(1 / nd) # [1. 0.5 0.33333333 0.25 ]
# 2. 基本的索引和切片
# arage: 相当于range函数的数组版
print(np.arange(5)) # [0 1 2 3 4]
nd1 = np.arange(1, 20, 2)
print(nd1) # [ 1 3 5 7 9 11 13 15 17 19]
# 通过索引获取元素
# 一维
print(nd1[1]) # 3
print(nd1[2:5]) # [5 7 9]
# 二维
nd2 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(nd2[1, 1]) # 6,第一行,第一列 (从0开始)
print(nd2[1]) # [5,6,7,8]
print(nd2[:1]) # [[1 2 3 4]]
# 通过索引赋值
# 一维
nd1[2:5] = 10
print(nd1) # [ 1 3 10 10 10 11 13 15 17 19]
# 多维
nd2[1] = 10
print(nd2)
"""
[[ 1 2 3 4]
[10 10 10 10]]
"""
nd2[0][1:3] = 5
print(nd2)
"""
[[ 1 5 5 4]
[10 10 10 10]]
"""
# 3. 花式索引
# 指的是利用整数数据进行索引
# reshape
nd = np.arange(12)
print(nd) # [ 0 1 2 3 4 5 6 7 8 9 10 11]
nd1 = np.reshape(nd, (3, 4)) # 将一维数据变为二维数组:3行4列
print(nd1)
"""
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
"""
#ravel:恢复一维数组
print(123456)
print(nd1.ravel()) #
#转置矩阵
print(nd1.T)
"""
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
"""
# 选取特定的行子集 #花式索引,传入一个数组进行索引
print(nd1[[0, 2]]) # 得到第一行和第三行
"""
[[ 0 1 2 3]
[ 8 9 10 11]]
"""
print(nd1[[0, 2][1]]) # [ 8 9 10 11]
# 选取多行,多列交叉处元素(类比坐标)
print(nd1[[0, 2, 1], [1, 1, 2]]) # [1 9 6]
"""
(0,1)---1
(2,1)---9
(1,2)---6
"""
# 选取矩形区域的两种方法
"""
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
"""
# 1.
print(nd1[[0, 1]][:, [1, 2]])
"""
[[1 2]
[5 6]]
"""
# 2. np.ix_
print(nd1[np.ix_([0, 1], [1, 2])])
"""
[[1 2]
[5 6]]
"""
# 4.通用函数
# nfunc(universal functions)是一种对ndarray中的数据执行元素级别运算的函数,如sqrt,exp
# sqrt开根号
nd = np.arange(9)
nd1 = nd ** 2
print(nd1) # [ 0 1 4 9 16 25 36 49 64]
print(np.sqrt(nd1)) # [0. 1. 2. 3. 4. 5. 6. 7. 8.]
#exp:自然常数e为底的指数函数
print(np.exp(np.array([1,2]))) #[2.71828183 7.3890561 ]
# add:相加
a = np.arange(3) # 0,1,2
b = np.array([1, -1, 2])
c = np.add(a, b)
print(c) # [1 0 4]
# maximum:比较对应元素,取最大值
print(np.maximum(a, b)) # [1 1 2]
#vstack:按照垂直方向堆栈数组
a = np.array([[0,1],[2,3]])
b = np.array([[4,5],[6,7]])
print(np.vstack((a,b)))
"""
[[0 1]
[2 3]
[4 5]
[6 7]]
"""
#hstack:按照水平方向堆栈数组
print(np.hstack((a,b)))
"""
[[0 1 4 5]
[2 3 6 7]]
"""
# 5.常用的数学和统计方法
# 一维
# 生成随机数组
nd = np.random.randn(9)
print(nd) # [ 0.57073301 -0.69598833 -0.20702626 -0.86582638 -0.09858326 0.08781526 0.25506694 1.58026149 0.35448699]
# max最大值
print(np.max(nd)) # 1.5802614926823562
# 最小值
print(np.min(nd)) # -1.4584447066232877
# 求均值
print(np.mean(nd))
# 求和
print(np.sum(nd))
# 排序
print(np.sort(nd))
# 二维
# nd = np.random.randn(5,3)
# print(nd)
arr = np.array([[1, 5, 0, 3], [5, 8, 12, 9], [0, 0, -9, 55]])
print(np.max(arr)) # 55
print(np.sort(arr)) # 每行按照升序排列
"""
[[ 0 1 3 5]
[ 5 8 9 12]
[-9 0 0 55]]
"""
print(np.sort(arr, axis=0)) # 按照列排序
"""
[[ 0 0 -9 3]
[ 1 5 0 9]
[ 5 8 12 55]]
"""
# linspace等分区间
arr = np.linspace(0, 10, 2)
print(arr) # [ 0. 10.]
arr = np.linspace(0, 10, 3)
print(arr) # [ 0. 5. 10.]
# 生成0~10之间均匀分布的11个数
arr = np.linspace(0, 10, 11)
print(arr) # [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
# 计算
print("***")
a = np.arange(1,25, 2).reshape(3,4)
c = np.arange(5,17).reshape(3,4)
b = a > 4
print(b)
"""
[[False False False False]
[False True True True]
[ True True True True]]
"""
#所有超过4的元素都改为0
a[b] = 0
print(a)
#对应元素比较
print(a>c)
"""
[[False False False False]
[False True True True]
[ True True True True]]
"""
# 线性代数
# 矩阵乘法 dot
a = np.array([[1, 2, 3], [4, 5, 6]]) # 2*3
print(a)
"""
[[1 2 3]
[4 5 6]]
"""
b = np.array([[0, 1], [2, 3], [-1, 6]]) # 3*2
print(b)
"""
[[ 0 1]
[ 2 3]
[-1 6]]
"""
print(a.dot(b))
"""
[[ 1 25]
[ 4 55]]
"""
d1 = 1 * 0 + 2 * 2 + 3 * -1
d2 = 1 * 1 + 2 * 3 + 3 * 6
d3 = 4 * 0 + 5 * 2 + 6 * -1
d4 = 4 * 1 + 5 * 3 + 6 * 6
print(d1)
print()
# 矩阵求逆:inv
from numpy.linalg import inv
a = np.array([[4, 2], [3, 1]]) # 2*3
print(a)
"""
[[1 2 3]
[4 5 6]]
"""
b = inv(a)
print(b)
"""
[[-0.5 1. ]
[ 1.5 -2. ]]
"""
# cumsum:累计求和
b = np.arange(12).reshape(3,4)
print(b.cumsum(1)) #各行累计合计
"""
[[ 0 1 3 6]
[ 4 9 15 22]
[ 8 17 27 38]]
"""
print(b.cumsum(0)) #各列求和
"""
[[ 0 1 2 3]
[ 4 6 8 10]
[12 15 18 21]]
"""
# 7.随机数的生成
from numpy import random
# normal
arr = random.normal(size=(4, 4))
print(arr)
"""
[[-0.6731776 -0.77674242 0.15674769 0.65875012]
[ 0.47656572 0.7074826 -0.59584356 -0.10902432]
[-0.18324892 -0.93819386 -0.16716246 1.84150379]
[-1.53836002 0.95684367 1.44417437 -2.43975145]]
"""
# randint给帝国上下限范围内的随机选取整数
arr = random.randint(0, 8)
print(arr)
2. pandas
import numpy as np
import pandas as pd
from pandas import Series
#pandas数据结构
#创建Series序列
s1 = Series([4,7,-5,3])
print(s1) #前面是索引,后面为值
"""
0 4
1 7
2 -5
3 3
dtype: int64
"""
#获取index
print(s1.index) #RangeIndex(start=0, stop=4, step=1)
#获取values
print(s1.values) #[ 4 7 -5 3]
#指定index
s2 = Series([4,7,-5,3], index=["3月1日","3月2日","3月3日","3月4日"])
print(s2)
"""
3月1日 4
3月2日 7
3月3日 -5
3月4日 3
dtype: int64
"""
#通过索引获取值
print(s2["3月2日"]) #7
#通过条件筛选
print(s2[s2>0])
"""
3月1日 4
3月2日 7
3月4日 3
dtype: int64
"""
#in
print("3月2日" in s2) #True
#通过字典创建Series
dict1 = {"user1":4,
"user2":7,
"user3":-5,
"user4":3}
s3 = Series(dict1)
print(s3)
"""
user1 4
user2 7
user3 -5
user4 3
dtype: int64
"""
#DataFrame 数据框架
from pandas import DataFrame
#创建数据框
positions = ["产品经理","数据分析师","UI","产品经理"]
companys = ["百度","三星","腾讯","华为"]
df = DataFrame([positions,companys])
print(df)
"""
0 1 2 3
0 产品经理 数据分析师 UI 产品经理
1 百度 三星 腾讯 华为
"""
#转置
job_info = DataFrame([positions,companys]).T
print(job_info)
"""
0 1
0 产品经理 百度
1 数据分析师 三星
2 UI 腾讯
3 产品经理 华 为
"""
# 设置列名
job_info.columns = ["职位","公司"]
print(job_info)
#设置序号
job_info.index = ["a","b","c","d"]
print(job_info)
#重置index
job_info.reset_index(drop=True)
print(job_info)
#展示数据条数
print(job_info.head(2))
#tail显示后面几条数据
print(job_info.tail(2))
#获取某列的值
print(job_info["职位"])
print(job_info.职位)
#获取某行的值(索引名)
print(job_info.loc["c"])
#获取某行的值(索引序号)
print(job_info.iloc[2])
#返回固定频率的日期索引
dates = pd.date_range('20201101', periods=6)
print(dates)
print(dates[0])
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df)
"""
A B C D
2020-11-01 0.511831 1.902508 -0.601631 -1.275379
2020-11-02 0.081817 -0.734119 1.201803 0.148207
2020-11-03 -0.746071 0.550262 -0.035730 -1.275730
2020-11-04 2.014247 0.066116 0.581703 0.361273
2020-11-05 0.131509 0.122587 1.049349 -0.761779
2020-11-06 0.395198 -0.587009 0.216365 -0.853146
"""
#常用方法
data = np.arange(16).reshape((4,4))
print(data)
df = DataFrame(data=data,index=['a','b','c','d'], columns=list('ABCD'))
print(df)
"""
A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
"""
#删除指定轴上的项
df1 = df.drop('b') #删除索引是b的行
print(df1)
"""
A B C D
a 0 1 2 3
c 8 9 10 11
d 12 13 14 15
"""
df1 = df.drop('C', axis=1) #删除索引是C的列,axis=1b=表示按列执行
print(df1)
"""
A B D
a 0 1 3
b 4 5 7
c 8 9 11
d 12 13 15
"""
#查找列D,值为11的行内容
print(df[df["D"]==11])
"""
A B C D
c 8 9 10 11
"""
print(df[df>5])
"""
A B C D
a NaN NaN NaN NaN
b NaN NaN 6.0 7.0
c 8.0 9.0 10.0 11.0
d 12.0 13.0 14.0 15.0
"""
df['E'] = [2,5,9,45] #新增或修改列
print(df)
"""
A B C D E
a 0 1 2 3 2
b 4 5 6 7 5
c 8 9 10 11 9
d 12 13 14 15 45
"""
#删除没有数值的数据NaN
print("****************")
df2 = df[df>9]
"""
A B C D E
a NaN NaN NaN NaN NaN
b NaN NaN NaN NaN NaN
c NaN NaN 10.0 11.0 NaN
d 12.0 13.0 14.0 15.0 45.0
"""
print(df2.dropna(how='any'))
"""
A B C D E
d 12.0 13.0 14.0 15.0 45.0
"""
#填充缺失的数据
print(df2.fillna(value=13))
"""
A B C D E
a 13.0 13.0 13.0 13.0 13.0
b 13.0 13.0 13.0 13.0 13.0
c 13.0 13.0 10.0 11.0 13.0
d 12.0 13.0 14.0 15.0 45.0
"""
#判断数值是否为NaN
print(pd.isna(df2))
"""
A B C D E
a True True True True True
b True True True True True
c True True False False True
d False False False False False
"""
#唯一值,unique
obj = Series([1,2,2,5,6,3,5])
print(obj.unique()) #[1 2 5 6 3]
#频率统计。value_counts
print(obj.value_counts()) #按照品=频率降序排列,如果不做排序,obj.value_counts(sort=False)
"""
5 2
2 2
6 1
3 1
1 1
dtype: int64
"""
#获取指定内容
print(df["A"])
"""
a 0
b 4
c 8
d 12
Name: A, dtype: int32
"""
#根据索引序号切片获取行
print(df[0:3])
"""
A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
"""
#根据索引切片获取行
print(df["b":"c"])
"""
A B C D
b 4 5 6 7
c 8 9 10 11
"""
#常用的数学和统计函数
#describe:一些数据的统计量
print(df.describe())
"""
A B C D
count 4.000000 4.000000 4.000000 4.000000
mean 6.000000 7.000000 8.000000 9.000000
std 5.163978 5.163978 5.163978 5.163978
min 0.000000 1.000000 2.000000 3.000000
25% 3.000000 4.000000 5.000000 6.000000
50% 6.000000 7.000000 8.000000 9.000000
75% 9.000000 10.000000 11.000000 12.000000
max 12.000000 13.000000 14.000000 15.000000
"""
#求和,sum,每列求和
print(df.sum()) #添加参数axis=1,每列求和
"""
A 24
B 28
C 32
D 36
dtype: int64
"""
#均值,mean
print(df.mean())
"""
A 6.0
B 7.0
C 8.0
D 9.0
dtype: float64
"""
#累计求和, cumsum
print(df.cumsum()) #每一列累计求和
"""
A B C D
a 0 1 2 3
b 4 6 8 10
c 12 15 18 21
d 24 28 32 36
"""
#最值
print(df.max()) #每列最大值
"""
A 12
B 13
C 14
D 15
dtype: int32
"""
#非数值的信息描述
positions = ["产品经理","数据分析师","UI","产品经理"]
companys = ["百度","三星","腾讯","华为"]
df = DataFrame([positions,companys])
print(df.describe())
"""
0 1 2 3
count 2 2 2 2
unique 2 2 2 2
top 产品经理 数据分析师 UI 产品经理
freq 1 1 1 1 #频率
"""
#to_numpy,将Dataframe转换为一个小阵列。
data = df.to_numpy()
print(data)
"""
[['产品经理' '数据分析师' 'UI' '产品经理']
['百度' '三星' '腾讯' '华为']]
"""
#按照某列排序
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df)
""" A B C D
2020-11-01 0.511831 1.902508 -0.601631 -1.275379
2020-11-02 0.081817 -0.734119 1.201803 0.148207
2020-11-03 -0.746071 0.550262 -0.035730 -1.275730
2020-11-04 2.014247 0.066116 0.581703 0.361273
2020-11-05 0.131509 0.122587 1.049349 -0.761779
2020-11-06 0.395198 -0.587009 0.216365 -0.853146
"""
print(df.sort_values(by='B'))
"""
A B C D
2020-11-02 -0.299943 -0.627584 0.417651 -0.006916
2020-11-06 -0.583363 -0.056184 1.941390 1.350911
2020-11-04 -0.486949 0.160367 1.178660 -0.572378
2020-11-03 0.449339 0.772650 -0.106306 -0.964246
2020-11-05 -1.358415 1.033476 -0.218945 -1.207231
2020-11-01 1.818069 1.197937 1.800319 -0.017046
"""
print(df.sort_index(axis=1, ascending=False))
#合并
df1 = DataFrame(np.random.randn(2, 4))
df2 = DataFrame(np.random.randn(3, 4))
print(pd.merge(df1,df2))