numpy与pandas的基础学习例子

简介: numpy与pandas的基础学习例子
# -*- 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 # 查看行数据类型
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的数据
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()
"""
[参考1](https://mofanpy.com/tutorials/data-manipulation/pandas/)
[参考2](https://mofanpy.com/tutorials/data-manipulation/numpy/)
目录
相关文章
|
27天前
|
数据采集 数据处理 Python
探索数据科学前沿:Pandas与NumPy库的高级特性与应用实例
探索数据科学前沿:Pandas与NumPy库的高级特性与应用实例
30 0
|
2月前
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
56 0
|
1天前
|
数据采集 数据可视化 数据处理
如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`)
本文介绍了如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`),加载历史数据,计算均线和其他技术指标,实现交易逻辑,记录和可视化交易结果。示例代码展示了如何根据均线交叉和价格条件进行开仓、止损和止盈操作。实际应用时需注意数据质量、交易成本和风险管理。
13 5
|
22天前
|
数据采集 机器学习/深度学习 数据处理
数据科学家的秘密武器:Pandas与NumPy高级应用实战指南
【10月更文挑战第4天】在数据科学领域,Pandas和NumPy是每位数据科学家不可或缺的秘密武器。Pandas凭借其DataFrame和Series数据结构,提供高效灵活的数据处理工具;NumPy则以其强大的N维数组对象ndarray和丰富的数学函数库,成为科学计算的基石。本文通过实战示例,展示了两者如何携手助力数据科学家在数据探索中披荆斩棘。Pandas擅长数据清洗、转换和结构化操作,NumPy则专注于数值计算与矩阵运算。通过结合使用,可以实现高效的数据处理与分析,大幅提升工作效率与数据处理深度。
29 4
|
21天前
|
机器学习/深度学习 数据采集 算法
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
【10月更文挑战第5天】随着数据科学和机器学习领域的快速发展,处理大规模数据集的能力变得至关重要。Python凭借其强大的生态系统,尤其是NumPy、Pandas和SciPy等库的支持,在这个领域占据了重要地位。本文将深入探讨这些库如何帮助科学家和工程师高效地进行数据分析,并通过实际案例来展示它们的一些高级应用。
39 0
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
|
28天前
|
数据采集 数据挖掘 大数据
【Python篇】详细学习 pandas 和 xlrd:从零开始
【Python篇】详细学习 pandas 和 xlrd:从零开始
52 2
|
28天前
|
数据采集 数据挖掘 API
Python数据分析加速器:深度挖掘Pandas与NumPy的高级功能
在Python数据分析的世界里,Pandas和NumPy无疑是两颗璀璨的明星,它们为数据科学家和工程师提供了强大而灵活的工具集,用于处理、分析和探索数据。今天,我们将一起深入探索这两个库的高级功能,看看它们如何成为数据分析的加速器。
32 1
|
26天前
|
数据采集 机器学习/深度学习 数据处理
数据科学家的秘密武器:Pandas与NumPy高级应用实战指南
【7月更文挑战第14天】Pandas与NumPy在数据科学中扮演关键角色。Pandas的DataFrame和Series提供高效数据处理,如数据清洗、转换,而NumPy则以ndarray为基础进行数值计算和矩阵操作。两者结合,从数据预处理到数值分析,形成强大工具组合。示例展示了填充缺失值、类型转换、矩阵乘法、标准化等操作,体现其在实际项目中的协同效用。掌握这两者,能提升数据科学家的效能和分析深度。**
39 0
|
2月前
|
数据处理 Python
Python数据转换:从Pandas到NumPy转换
Python数据转换:从Pandas到NumPy转换
38 0
|
3月前
|
SQL 数据挖掘 索引
12种Numpy&Pandas高效技巧
12种Numpy&Pandas高效技巧