MLNumpy & Pandas的学习

Posted woodwhale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MLNumpy & Pandas的学习相关的知识,希望对你有一定的参考价值。

【ML】Numpy & Pandas的学习

安装numpy和pandas

我就直接简单的pip3 install numpypip3 install pandas就完事了

最新的python3版本貌似自带?我也没注意…

numpy的简单使用

初识array

import numpy as np

array = np.array(
    [
        [1, 2, 3],
        [4, 5, 6]
    ]
)

print(array)
print("dim --> ", array.ndim)
print("shape --> ", array.shape)
print("size --> ", array.size)
'''
    [[1 2 3] 
     [4 5 6]]
    dim -->  2       
    shape -->  (2, 3)
    size -->  6  
'''

dim是array的维度,shape是array的行、列信息,size是array的大小

更多的array方法

import numpy as np

arr1 = np.array([114,514], dtype=np.int64)  # 数据类型为int64
arr2 = np.array([114,514], dtype=np.float64)# 数据类型为float64

arr_zero = np.zeros((3,4))  # 3行4列的空array
arr_empty = np.empty((3,4)) # 3行4列的近似于空的array

arr_range = np.arange(10,20,2)  # 和python中原生的range类似,左闭右开,第三个参数是间隔

arr_reshape = np.arange(12).reshape((3,4))  # 将1行重新生成为3行4列

arr_line = np.linspace(1, 10, 5)    # 生成线段

array的基础运算

加减法、判断、矩阵乘法、随机生成以及一些方法

import numpy as np

a = np.array([114, 514, 1919, 810])
b = np.arange(4)

print(a + b)
print(a - b)
print(a * b)
print(10*np.cos(a))
print(b < 3)            # 判断是否其中小于3
print(b == 3)           # 判断其中是否等于3

a = np.array([[114,514],[1919,810]])
b = np.arange(10,14).reshape(2,2)
print(a * b)        # 普通一一对应相乘
print(np.dot(a,b) == a.dot(b))  # 矩阵乘法

a = np.random.random((2,4)) # random模块下的random方法

print(a)
print(np.sum(a,axis=1))     # 每一行求和
print(np.min(a,axis=0))     # 每一列取最小
print(np.max(a,axis=1))     # 每一行取最大

matrix的基础运算

import numpy as np

a = np.arange(2,14).reshape((3,4))

print(a)
print(np.argmin(a)) # 找到最小值的下标
print(np.argmax(a)) # 找到最大值的下标
print(np.median(a)) # 找到中位数
print(np.cumsum(a)) # 累加(前缀和)
print(np.diff(a))   # 累差
print(np.nonzero(a))# 不为0的数的坐标
print(np.sort(a))   # 排序

a = np.arange(14,2,-1).reshape(3,4)
print(a)
print(np.transpose(a))# 矩阵的反向(对称轴反向)
print((a.T).dot(a)) # a.T就是矩阵的反向,dot是矩阵的乘法
print(np.clip(a,5,9))   # 让a的区间在[5,9]之间,超过这个区间的,取5或者9

a = np.arange(14,2,-1).reshape(3,4)
print(a)
print(np.mean(a,axis=0)) # 列的平均值
print(np.mean(a,axis=1)) # 行的平均值
print(np.mean(a))   # 所有的平均值

array中的迭代与位置

import numpy as np

a = np.arange(3,15).reshape(3,4)

print(a)

print(a[1][1] == a[1,1])    # 可以使用列表的形式
print(a[1,1:])   # 可以使用切片
print(a[2][3:4])    # 同理

# 迭代行
for row in a:
    print(row)

print(a.T)  # 矩阵反转
# 通过矩阵反转,迭代列
for col in a.T:
    print(col)

print(a.flatten())  # 平展化
# 迭代每个item
for item in a.flat:
    print(item)

array中的维度合并

import numpy as np

a = np.array([1, 1, 4])
b = np.array([5, 1, 4])
c = np.array([19, 19, 8])

# 垂直合并
print(np.vstack((a, b, c)))   # vertical stack

# 左右合并
print(np.hstack((a, b, c)))   # horizontal stack

print(a.T)
print(np.array(([1], [1], [4])))  # 无法使用矩阵反转将一个v向矩阵转为h向矩阵

print(a[np.newaxis, :])  # 在 行上 加了一个维度
print(a[:, np.newaxis])  # 在 列上 加了一个维度

print(a[:, np.newaxis] == np.array(([1], [1], [4])))   # 这样就实现了相等

print(np.concatenate(
    (a[np.newaxis, :], b[np.newaxis, :], c[np.newaxis, :]), axis=0))    # v向
print(np.concatenate(
    (a[np.newaxis, :], b[np.newaxis, :], c[np.newaxis, :]), axis=1))  # h向

array的分割

import numpy as np

a = np.arange(12).reshape((3, 4))
print(a)
'''
    [[ 0  1  2  3]
    [ 4  5  6  7]
    [ 8  9 10 11]]
'''

print(np.split(a, 2, axis=1))   # 对 列 进行切割,切割成2块

'''
    [array([[0, 1],
        [4, 5],
        [8, 9]]), 
    array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
'''

print(np.split(a, 3, axis=0))  # 对 行 进行切割,切割成3块

'''
    [array([[0, 1, 2, 3]]), 
    array([[4, 5, 6, 7]]), 
    array([[ 8,  9, 10, 11]])]
'''

print(np.array_split(a, 3, axis=1))   # 使用array_split进行不等项分割

'''
    [array([[0, 1],
        [4, 5],
        [8, 9]]), 
    array([[ 2],
        [ 6],
        [10]]), 
    array([[ 3],
        [ 7],
        [11]])]
'''

print(np.vsplit(a,3))   # v向分割 axis=0

'''
    [array([[0, 1, 2, 3]]), 
    array([[4, 5, 6, 7]]), 
    array([[ 8,  9, 10, 11]])]
'''

print(np.hsplit(a,2))   # h向分割 axis=1
'''
    [array([[0, 1],
       [4, 5],
       [8, 9]]), 
    array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]
'''

copy、deep copy

import numpy as np

a = np.arange(4)
print(a)

b = a   # b就是a
print(b is a)
c = b
print(c is a)
a[0] = 11

print(a)
print(b)    # a和b相等,完全相等
print(c)    # 同样的,c和b和a完全相同

d = np.copy(a)  # 拷贝
print(d)
d[1:3] = [114,514] 
print(d is a)   # d不是a,改变d不会改变a
print(d)
print(a)

pandas的简单使用

pandas的使用一般配合numpy一起使用

初识pandas

在pandas中,可以使用Series方法来进行数据的处理,表示一串连续的数据

可以使用DataFrame方法来进行表格数据的处理(二维)

import numpy as np
import pandas as pd

s = pd.Series([1,919,810, np.nan, 114,514])
print(s)    # 默认是float64形式

dates = pd.date_range('20221102',periods=6) # 日期,时限为六天
print(dates)

# 随机生成一个6行四列的表格数据,行列可以进行指示
df = pd.DataFrame(np.random.randn(6,4),index = dates, columns=['1','2','3','4'])
print(df)
'''
                    1         2         3         4
    2022-11-02 -0.321048  0.295775 -1.901901  0.251561
    2022-11-03  0.823800  1.705003  0.783017  0.742216
    2022-11-04  0.572487 -2.251691  1.047995 -0.334308
    2022-11-05 -1.153551  0.592805  1.294137  0.870890
    2022-11-06 -0.725959 -0.568566  0.112640  0.302099
    2022-11-07 -0.019136 -0.760683 -1.105404 -0.975848
'''

df = pd.DataFrame(np.random.randn(6,4))
print(df)   # 默认名称
'''
            0         1         2         3
    0  1.061890  0.443764  0.511670 -1.415818
    1 -0.605931 -0.488900 -0.492849 -0.930321
    2  1.276535  0.345806  0.193465  1.016358
    3  0.038369 -0.218895  1.001611  0.505635
    4  1.168394  0.933190 -0.794221  0.719631
    5  0.572634 -0.713252  0.276506 -0.991942
'''

print(df)
print(df.dtypes)    # 数据的类型
print(df.index)     # 行序号
print(df.columns)   # 列序号
print(df.values)    # 所有有效值
print(df.describe())# 所有的列的描述,只能描述数字类型
print(df.T) # 和numpy中一样。矩阵反转
print(df.sort_index(axis=1,ascending=False))    # sort_index表示对下标排序,可以指定是行还是列 axis = 1 对行进行排序,ascending = False 表示倒叙 
'''
            3         2         1         0
    0 -0.834417 -0.259117  0.678874  0.585828
    1  0.049437  0.406795  0.121693 -0.911248
    2 -0.016904 -1.064432  1.162741 -0.021980
    3  0.178585 -0.035309  0.687608 -0.086795
    4  0.124227  2.161858  0.270373  1.135770
    5 -0.971254  1.105907  0.589002  0.417444
'''
print(df.sort_index(axis=0,ascending=False))    # axis = 0 对行进列排序,ascending = False 表示倒叙 
'''
            0         1         2         3
    5  0.417444  0.589002  1.105907 -0.971254
    4  1.135770  0.270373  2.161858  0.124227
    3 -0.086795  0.687608 -0.035309  0.178585
    2 -0.021980  1.162741 -1.064432 -0.016904
    1 -0.911248  0.121693  0.406795  0.049437
    0  0.585828  0.678874 -0.259117 -0.834417
'''

print(df.sort_values(by=3)) # by=3 表示以列为 3 的数据为基准,进行排序,默认从小到大

读取数值

一般使用如下三种方法来获取数据

  1. 切片或属性
  2. loc
  3. iloc
  4. boolean判断
import numpy as np
import pandas as pd

line_split = lambda: print("-"*50)

dates = pd.date_range("20220701", periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=["A", "B", "C", "D"])
print(df)
line_split()

# 使用切片或者属性进行读取
print(df['A'] == df.A)  # 可以使用数组的方式,也可以使用属性的方式,获取一列的数值
line_split()

print(df[0:3] == df['20220701':'20220703'])  # 可以使用切片,也可以使用标签指定形式
line_split()

# 使用loc方法,相当于 select by label
print(df.loc["20220701"])   # 获取某行的数值
line_split()

print(df.loc[:, ['A', 'B']])  # 获取A,B两列的所有数据
line_split()

# 使用iloc方法,相当于 select by position
print(df.iloc[0, 0])  # 第0行的第0列数据
line_split()

print(df.iloc[3:5, 1:3])    # 第3、4行的第1、2列数据(切片形式)
line_split()

print(df.iloc[[1,3,4],1:3]) # 不连续的获取数据,获取第1、3、4行的第1、2列数据
line_split()

# 使用判断方法
print(df[df['A'] > 8])  # A列中数据 > 8 的所有数据
line_split()

覆写数据

使用上述的读取数据的方法然后进行赋值就可以进行覆写数据的操作了

可以使用dropna方法来进行数据丢弃nan数据,使用fillna方法来进行填充nan数据

import numpy as np
import pandas as pd

line_split = lambda: print("-"*50)

dates = pd.date_range("20220701", periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=["A", "B", "C", "D"])

# 使用iloc方法进行修改值
df.iloc[2,2] = 114514   # index指定位置

# 使用loc方法进行修改值
df.loc['20220702','A'] = 1919810   # 行列指定位置

# 使用boolean判断方法进行修改
df.A[df.A > 12] = 0    # 将A列中大于12的值改为0

# 直接赋值
df.D = np.nan   # 将D列全部赋值为nan
df.C = pd.Series([1,1,4,5,1,4],index = dates)   # 将C列转为我们新写的series

print(df)
line_split()

'''
                A   B  C   D
    2022-07-01   0   1  1 NaN
    2022-07-02   0   5  1 NaN
    2022-07-03   8   9  4 NaN
    2022-07-04  12  13  5 NaN
    2022-07-05   0  17  1 NaN
    2022-07-06   0  21  4 NaN
'''


print(df.dropna(axis=1,how="all"))    # 对列下标进行丢弃,是nan就丢弃,how="all" 表示只有一行中全是nan才丢弃,how = "any"表示只要存在nan就丢弃(这里丢弃了D列)
line_split()
'''
                A   B  C
    2022-07-01   0   1  1
    2022-07-02   0   5  1
    2022-07-03   8   9  4
    2022-07-04  12  13  5
    2022-07-05   0  17  1
    2022-07-06   0  21  4
'''

print(df.fillna(value=114514))  # 对nan数据进行填充
line_split()

print(df.isnull())    # 判断数据是否缺失
line_split()

print(np.any(df.isnull()) == True)  # 是否至少存在一个nan, np.any方法可以对所有元素进行或运算,存在True就返回True

concat合并数据

import numpy as np
import pandas as pd

line_split = lambda: print("-"*50)

df1 = pd.DataFrame(np.ones((3,4))*0,columns=["a","b","c","d"])
df2 = pd.DataFrame(<

以上是关于MLNumpy & Pandas的学习的主要内容,如果未能解决你的问题,请参考以下文章

python & pandas学习札记

numpy & pandas & matplotlib 学习笔记

机器学习Numpy&Pandas 快速入门笔记

验证码腾X滑块的学习记录之三#整个请求流程的倒叙分析

2 Series&Pandas

Panda的学习之路——pandas 设置特定的值&处理没有数据的部分