代码语言:python代码运行次数:0复制
# -*- coding:utf-8 -*-
# @author:Ye Zhoubing
# @datetime:2022/11/11 10:39
# @software: PyCharm
# numpy与pandas的基础学习
"""
# numpy属性
import numpy as np
array1 = np.array([[1,2,3],
[2,3,4]]) # 定义一个数组
print(array1)
print(array1.ndim) # ndim属性是维数
print(array1.shape) # shape属性为行列数,第一个数为行,第二个数为列
print(array1.size) # size属性为总元素个数
"""
"""
# numpy的创建array
import numpy as np
a = np.array([2,3,4]) # ar ray来创建一维数组,数组与列表不同:数组没有逗号分割
a2 = np.array([2,3,4],dtype = np.int) # 定义数组类型为整型np.int32,还有np.float
print(a2.dtype)
a3 = np.array([[2,3,4],
[2,3,4]]) # 二位数组(矩阵)
a4 = np.zeros((3,4)) # 生成一个三行四列的0矩阵
a4 = np.zeros((2,3,4)) # 生成2层3行4列的0矩阵
a5 = np.ones((3,4)) # 生成一个三行四列的1矩阵,类似的还有empoty,arrange
a6 = np.arange(10,20,2) # 默认一维,从10开始,到20(不包括20),步长为2
a7 = np.arange(12).reshape((3,4)) # 默认步长为1,从0开始,到11;reshape()重新分为3行4列
a8 = np.linspace(1,10,5) # 将1到10取等距离的5个点,1为起点,10为终点
"""
"""
# numpy的基础运算
# 轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。
# 简单记忆:axis=0代表往跨行(down),而axis=1代表跨列(across)
import numpy as np
a = np.array([1,2,3])
b = np.array([1,2,3])
c = a - b # c的结果为a与b对应位置元素相减生成的数组,其他运算也是一样的,三角函数类似可以np.sin(a)
print(b<3) # 返回数组,小于3的元素位置显示为true,其它为false
d = np.array([[1,2],
[1,2]])
e = np.array([[1,2],
[1,2]])
c1 = d*e # 矩阵对应位置元素相乘,若一个是矩阵,另一个是数,就是矩阵中的每个元素乘以这个数
c_dot = np.dot(d,e) # 线性代数中矩阵乘法,还可以这么写:c_dot = a.dot(b);dot 函数用于矩阵乘法,对于二维数组,它计算的是矩阵乘积,对于一维数组,它计算的是内积
f = np.random.random((2,4)) # 随机生成2行4列,值在0~1之间的矩阵
np.sum(f) # 矩阵所有元素求和
np.sum(f,axis=1) # axis表示维度,这里axis=1表示每列求和
np.min(f) # 矩阵求最小值
np.min(f,axis=0) # 矩阵求每行最小值
np.max(f) # 矩阵求最大值
# 不止二维,可以多维
"""
"""
# numpy的基础运算2
import numpy as np
a = np.arange(2,14).reshape((3,4)) # 2到13
np.argmin(a) # a矩阵最小值索引,返回的均是一个数(如果a是二维数组,会将数据平铺成一维)
np.argmax(a) # a矩阵最大值索引
np.mean(a) # a矩阵所有元素平均值,还可以:a.mean()
np.average(a) # a矩阵所有元素平均值,还可以加权平均
np.median(a) # a矩阵中所有元素中位数
np.cumsum(a) # a矩阵中累加,新矩阵第一个位置是原来的值,第二个是原来第一个加原来第二个,新第三个=原第一 原第二 原第三,以此类推
np.cumsum(a) # a矩阵相邻元素差,新第一个=原第二个-原第一个,新第二个=原第三个-原第二个,最右边只有一个元素的话就不运算,不放入新矩阵,结果3x3矩阵
np.nonezero(a) # 查看a矩阵中非0元素位置索引,第一个数组为行,第二个数组为列,一一对应
np.sort(a) # a矩阵每行按由小到大的顺序排序
np.transpose(a) # a矩阵的转置矩阵,也可以:a.T
np.clip(a,5,9) # a矩阵中所有小于5(包括5)的数变为5,所有大于9的数(包括9)变为9,其他的不变
"""
"""
# numpy的索引,索引从0开始
a = np.arange(3,15)
print(a[3]) # 即a矩阵第四个元素
a2 = np.arange(3,15).reshape((3,4))
print(a2[2]) # 输出的是第三行
print(a2[1][1]) # 输出第一行第一列的元素,也可以:print(a2[1,1])
print(a2[1,:]) # 输出第一行所有元素
print(a2[1,1:2]) # 输出第一行,第一、二列的所有元素
for row in a2:
print(a2) # 迭代a2的行
for col in a2.T:
print(col) # 迭代a2的列
a2.flatten() # 将a2矩阵变为一维矩阵
# a2.flat相当于flattten的迭代器
for item in a2.flat:
print(item) # 迭代a2矩阵元素
"""
"""
# numpy array的合并
import numpy as np
a = np.array([1,1,1])
b = np.array([2,2,2])
np.vstack((a,b)) # 将a与b合并(上下),即新矩阵第一行为a,第二行为b
np.hstack((a,b)) # 将a与b合并(左右),即新矩阵第一行为a与b
# 对于一维矩阵而言,不能通过a.T来将其转换为竖着的即nx1为矩阵
# np.newaxis添加一个维度
c = a[:,np.newaxis] # 在列上添加一个维度,即变为竖向矩阵
d = np.concatenate((a,b,b,a),axis=0) # 将多个矩阵进行上下合并,axis=1就是横向合并
"""
"""
# numpy array的分割
import numpy as np
a = np.arange(12).reshape((3,4))
np.split(a,2,axis=1) # 对列进行分割,分成两块(横向分割)(均等分割)
np.array_split(a,3,axis=1) # 对a进行不等分割,分为3块
np.vsplit(a,3) # 纵向上分成3块,即每行分出来,1x4
np.hsplit(a,2) # 横向上分成2块,即列分开,3x2
"""
"""
# numpy copy和deep copy
import numpy as np
a = np.arange(4)
b = a # 这样的话b就是a,当后续a的值发生变化时,b也会变
# 解决
b = a.copy() # 把a的值给b,但并没有将b与a关联起来
"""
"""
# pandas基本
import pandas as pd
import numpy as np
s = pd.Series([1,3,6,np.nan,44,1]) # 序列
dates = pd.date_range('20221111',periods=6) # 生成2022-11-11开始的6个数据的序列,默认步长为1
df = pd.DataFrame(np.random.random(6,4),index=dates,columns=['a','b','c','d']) # 行的索引为日期,列的索引为abcd,np为数据,如果不给行列索引,默认就是0开始的数字;dataframe里还可以用字典定义
# 其他方式构建(字典)
df = pd.DataFrame({
"date":pd.date_range("20100102",periods=6),
"age":np.arange(6)})
df.dtypes # 查看行数据类型
len(df) # 查看行数
df.index # 行的名字
df.columns # 列的名字
df.values # df中的值,得到的是ndarray类型的值
df.describe() # 默认是描述数字类型的属性,目的在于观察这一系列数据的范围、大小、波动趋势等等(只运算矩阵)
df.T # 与numpy相同,转置
df.sort_index(axis=1,ascending=False) # 列按降序排序,相应的值位置变化
df.sort_values(by='E') # 按'E'列的值进行升序排序
"""
"""
# pandas选择数据
import pandas as pd
import numpy as np
dates = pd.date_range('20221111',periods=6)
df = pd.DataFrame(np.random.random(6,4),index=dates,columns=['a','b','c','d'])
df['a'] # 选择列名称为a的列数据,也可以:df.a
df[0:3] # 选择第0、1、2行数据
# loc根据标签选择
df['20130102':'20130104'] # 选择值在2013-1-2、2013-1-3的数据
df.loc['20130102'] # 选择日期为2013-1-2的数据
df.loc[:,['a','b']] # 选择所有行,列为a、b的数据(换句话说:提取a、b列的数据)
df.iloc[:,0] # 提取第0列的数据
df.loc['20130102',['a','b']] # 选择20130102的行,列为a、b的数据
# iloc根据位置选择
df.iloc[3] # 第三行(从0开始第三行)
df.iloc[3,1] # 第三行第一列(从0开始)
df.iloc[3:5,1:3] # 第三行到第五列(不包括),第一列到第三列(不包括)(从0开始,左闭右开)
df.iloc[1,3,5,1:3] # 第一行 第三行 第五列,第一列到第三列(不包括)(从0开始,左闭右开)
# 注:ix标签与位置混合选择(现在已经被弃用)
df[df.A<8] # 将A列中小于8的值对于数据与其他列保留形成新dataframe
"""
"""
# pandas设置值
import pandas as pd
import numpy as np
dates = pd.date_range('20221111',periods=6)
df = pd.DataFrame(np.random.random(6,4),index=dates,columns=['a','b','c','d'])
df.iloc[2,2] = 1 # 第二行第二列的值改为1(从0开始)
df.iloc[20130101,2] = 2
df[df.a>5] = 0 # 修改整个,只要a列大于5,就都是0
df.a[df.a>5] = 0 # 只改a列
df['f'] = np.nan # 添加新列
"""
"""
# pandas处理丢失数据
import pandas as pd
import numpy as np
dates = pd.date_range('20221111',periods=6)
df = pd.DataFrame(np.random.random(6,4),index=dates,columns=['a','b','c','d'])
# 假设这两个数据丢失
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
df.dropna(axis=0,how='any') # 行里面只要有nan,便不要该行;如果是how='all',就是只有该行全部为nan才丢弃
# 将nan数据填上
df.fillna(value=0) # 填充0
df.isnull() # 查找数据是否有缺失,有缺失则为true
np.any(df.isnull()) == True # 则只返回一个true或false
"""
"""
# pandas导入导出数据
# 读取excel推荐使用reas_csv
# 保存:to_csv等
import pandas as pd
import numpy as np
data = pd.read_csv('test.csv')
data.to_csv('new.csv')
"""
"""
# pandas合并concat
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'])
df4 = pd.DataFrame(np.ones((3,4))*1,columns=['b','c','d','e'])
res = pd.concat([df1,df2,df3],axis=0) # 竖向合并,即最终矩阵为9x4 但是行的索引不会变
res = pd.concat([df1,df2,df3],axis=0,ignore_index=True) # 重新排序,行的索引便会改变了
res = pd.concat([df1,df4],axis=0,ignore_index=True) # concat默认对于列不同的合并,会用nan填充,ignore_index=True:如果两个表index没有实际含义,使用该参数会重新整理一个index
res = pd.concat([df1,df4],axis=0,ignore_index=True,join='innner') # 这样合并就只会寻找相同部分了
res = pd.concat([df1,df4],axis=1,ignore_index=True,join_axes=[df1.index]) # 以df1为参考,左右合并
res = df1.append(df2,ignore_index=True) # 相当于df1与df2上下合并
res = df1.append([df2,df3],ignore_index=True) # 多个合并
s1 = pd.Series([1,2,3,4],index=['a','b','c','d'])
res = df1.append(s1,ignore_index=True) # 添加列
"""
"""
# pandas合并merge,merge 只做左右拼接
import pandas as pd
left = pd.DataFrame({
"key": ["K0", "K1", "K2", "K3"],
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"],
})
right = pd.DataFrame({
"key": ["K0", "K1", "K2", "K3"],
"C": ["C0", "C1", "C2", "C3"],
"D": ["D0", "D1", "D2", "D3"],
})
pd.merge(left, right, on="key") # 基于key列合并
# 对于基于两列的合并
left = pd.DataFrame({
"key1": ["K0", "K0", "K1", "K2"],
"key2": ["K0", "K1", "K0", "K1"],
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"],
})
right = pd.DataFrame({
"key1": ["K0", "K1", "K1", "K2"],
"key2": ["K0", "K0", "K0", "K0"],
"C": ["C0", "C1", "C2", "C3"],
"D": ["D0", "D1", "D2", "D3"],
})
pd.merge(left, right, on=["key1", "key2"])
#下面的前两种是 concat() 和 merge() 都具备的。后面几种是 merge() 另外的。
# outer: 集合两个 df 所有 的 key
# inner: 集合两个 df 同时拥有 的 key(默认)
# left: 仅考虑左边 df 所有 的 key
# right: 仅考虑右边 df 所有 的 key
# cross: 对于两个 df key 的笛卡尔积
pd.merge(left, right, how="left", on=["key1", "key2"])
"""
"""
# pandas画图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# series数据画图
data = pd.Series(np.random.randn(1000),index=np.arange(1000))
data = data.cumsum() # 计算一个数组各行的累加值
data.plot()
plt.show()
# dataframe数据画图
df = pd.DataFrame(np.random.rand(5, 3), columns=["a", "b", "c"]) # np.random.rand(5, 3)5行3列随机数
df.plot.bar() # bar hist box kde area scatter hexbin pie
ax = df.plot.scatter(x='a',y='b',colorama='Blue',label='class1') #一组
df.plot.scatter(x='a',y='c',colorama='Red',label='class2',ax=ax) #两组一起画在一张图
plt.show()
"""
""""
# pandas获取excel所有sheet名
df = pd.read_excel(IMF_file, sheet_name=None)
print(list(df))
""""
"""
# pandas获取excel文件所有的sheet名
df = pd.read_excel('自己的Excel文件路径.xlsx', sheet_name=None) # 路径注意转义
for i in df.keys():
print(i)
"""
[参考1](https://mofanpy.com/tutorials/data-manipulation/pandas/)
[参考2](https://mofanpy.com/tutorials/data-manipulation/numpy/)