1.28 numpy和pandas学习

1.28 numpy与pandas学习

numpy

numpy是什么

numerical python

一个开源的科学计算库

numpy优势

  • 代码更简洁(以数组,矩阵为粒度)

  • 性能更高效(存储效率和输入输出性能更好)

  • numpy是python科学数据类库的基础库

测试一个函数执行的时间

%timeit 执行的函数

Numpy中的核心array

array中的所有元素都是同一种类型的

array本身的属性

  • shape:返回一个元组,表示array的维度
  • ndim:一个数字,表示array的维度的数目
  • size:一个数字,表示array中所有数据元素的数目
  • dtype:数据类型

创建array的方法

  • 从python的列表list和嵌套列表创建array
  • 使用arange,ones,zeros,empty,full,eye等函数创建
  • 生成随机数的np.random模块创建

array支持的操作与函数

  • 支持逐元素的加减乘除
  • 面向多维数组索引
  • 有sum,mean等聚合函数
  • 有线性代数函数

python的list创建array

import numpy as np
x = np.array([1,2,3,4,5,6,7,8])
X = np.array(
	[
        [1,2,3,4],
        [5,6,7,8]
    ]
)

用arange创建数字序列

arange([start,] stop[,step,], dtype = None)
np.ones / [zeros] / [empty(随机值)] / [full(指定值)] (shape, dtype=None, order='C') 

# 例如
np.ones(10)
np.ones((2,3))

# np使用ones_like创建形状相同的数组
np.ones_like(x)

# full创建指定值
np.full(10, 666)
np.full((2,4), 666)

np.random(d0,d1,d2……,dn)
# 随机数生成指定维树的随机数array

B = np.random.randn(2,5)
# 随机数改变形状

A = np.arange(10).reshape(2,5)
# reshape 直接改造形状为2*5

# 二元运算直接逐元素操作

Numpy对数组按索引查询

  • 基础索引
  • 神奇索引
  • 布尔索引

基础索引

0开始从左到右,1开始从右到左

可以采用切片的方式进行索引

二维数组索引

x[0][0]
x[0,0] # 与上面等价

x[2] # 筛选第二行
x[:-1] # 筛选多行
x[:,2] # 二维筛选

numpy切片的修改会修改原来的数组

神奇索引

用整数数组进行的索引,叫神奇索引

x = np.arange(10)
x[[3,4,7]] # 返回一个数组array([3,4,7])

indexs = np.array([[0, 2], [1,3 ]])
x[indexs]

# 返回一个array,按下标进行索引

二维数组

X[[0, 2], :] # 筛选多列,行不能省略
X[[0, 2, 3], [1, 3, 4]] # 同时指定行列-列表,返回的是[(0,1),(2,3),(3,4)]位置的数字

布尔索引

可以进行筛选

一维数组

x = np.arange(10)
x > 5
# 返回一个10个元素列表(True or False)
x[x > 5] # 返回比5的元素构成的列表

x[x < 5] += 20 # 元素自增量操作

二维数组

# 如果二维数组进行筛选
X > 5
# 返回的是一个一位数组,起到降维的作用

Numpy随机数random

函数名 说明
seed([seed]) 设定随机种子,这样每次生成的随机数会相同
rand(d0,d1,……dn) 返回数据在[0,1)之间
randn(d0,d1……dn) 返回数据具有标准正态分布(均值0,方差1)
randint(low[,high,size,dtype]) 生成随机整数,包含low,不包含high
random([size]) 生成[0.0,1.0)的随机数
choice(a) a是一个一维数组,从里面生成随机结果
shuffle(x) 对数组x随机排列
permutation(x) 随机排列,或数字的全排列
normal([loc,scale,size]) 按照均值loc和方差scale生成高斯分布的数字
uniform([low,high,size]) 在[low,high)之间生成均匀分布的数字

Numpy数据计算从入门到实战

函数名 说明
np.sum 所有元素的和
np.prod 所有元素的乘积
np.cumsum 元素的累计加和
np.sumprod 元素的累积乘积
np.min 最小值
np.max 最大值
np.percentile 0-100百分位数
np.quantile 0-1分位数
np.median 中位数
np.average 平均(可加权)
np.mean 平均值
np.std 标准差
np.var 方差

Numpy中axis参数

axis=0 代表行, axis=1代表列

对于sum,mean等的聚合函数

  • axis=0代表把行消掉,axis=1代表把列消解掉
  • axis=0代表跨行计算,axis=1代表跨列计算

标准化: A = ( A − m e a n ( a , a x i s = 0 ) ) / s t d ( A , a x i s = 0 ) A=(A-mean(a,axis=0))/std(A,axis=0) A=(Amean(a,axis=0))/std(A,axis=0)

Numpy中满足条件元素的计算

import numpy as np
arr = np.random.randint(1, 10000, size = int(1e8))

arr[arr > 5000]

Numpy 怎样给数组增加一个维度

  • np.newaxis : 关键字,使用索引的语法给数组添加维度
  • np.expand_dims(arr, axis) : 方法,和np.newaxis实现一样的功能,给arr在axis位置添加维度
  • np.reshape(a, newshape) : 方法,给一个维度设置为1完成升维

一维向量添加维度(newaxis)

arr[np.newaxis, :] # 添加一个行维度
arr[:, np.newaxis] # 添加一个列维度

一位数组添加维度(expand_dims)

np.expand_dims(arr, axis = 0)

np.reshape(arr, (1,5))

数据合并操作

  • 添加多行

  • 添加多列

np.concatenate(array_list, axis = 0/1) # 按指定axis进行合并

np.vstack
np.row_stack(array_list) # 按行进行数据合并

np.hstack
np.column_stack(array_list) # 按列进行数据合并

Pandas

开源的python类库

pandas读取数据

  • 读入csv, tsv, txt。
    • 用逗号分隔,tab分割的纯文本文件
    • pd.read_csv
  • 读入excel
    • 微软xls或者xlsx文件
    • ``pd.read_sql`
  • msql
    • 关系型数据表
    • pd.read_sql

读入csv

ratings = pd.read_csv(fpath)
ratings.head() # 查看前几行数据
ratings.shape # 查看数据的形状

ratings.columns # 查看列名列表
ratings.index # 查看索引列
ratings.dtypes # 查看每列的数据类型

读取txt文件

pru = pd.read_csv(
	fpath,
    sep = "\t", # 分隔符
    header = None, # 标题行
    names = ['pdate', 'pv', 'uv'] # 指定列名
    
)

读取excel文件

puv = pd.read_csv(fpath)

读取mysql数据表

import pymysql
conn = pymysql.connect(
	host = '127.0.0.1',
    user = 'root',
    password = '',
    database = 'txy',
    charset = 'utf8'
)

mysql_page = pd.read_sql("select * from txy", con = conn)

Pandas数据结构

  • DataFrame
  • Series

DataFrame

二维数据,整个表格,多行多列

每一列的索引df.columns,每一行的索引df.index

Series

一维数据,一行或者一列

类似于一维数组的对象,是由一组数据(不同数据类型)以及一组与之

用列表生成series

s1 = pd.Series([1, 'a', 5, 2, 7])
# 左侧为索引,右侧为数据

s1.index # 获取索引
s1.values # 获取数据

# 创建具有标签索引的series
s2 = pd.Series([1, 'a', 5.2, 7]), index = ['d', 'b', 'a', 'c']

用python字典创建Series

s3 = pd.Series(sdata_dict)
# key变成索引,value变成值

根据标签索引查询数据

s2['a'] # 查询单个值
s2[['b', 'a']] # 返回一个Series

DataFrame

  • 每一列是不同的数据类型
  • 既有行索引index,也有列索引columns
  • 可以被看做由Series组成的字典

多维字典创建DataFrame

data = {
    'state' : ['Ohio', 'Nevada'],
    'year' : [2000, 2002],
    'pop' : [1.5, 1.7]
}
df = pd.DataFrame(data)

从DataFrame中查询出Series

  • 如果只查询一行、一列,返回pd.Series
  • 如果查询多行、多列,返回pd.DataFrame
df['year']
df[['year', 'pop']]
df.loc[1] # 查询一行

Pandas查询数据

df.loc方法

根据行、列标签值查询

  • 行、列传入单个值,实现精确匹配
  • 传入一个list,进行批量查询
  • 传入一个区间,进行范围查询·[区间起始,区间结束]
  • 条件查询
  • 调用lambda匿名函数或函数查询

df.iloc方法

根据行、列的数字位置查询

df.where方法

df.query方法

Pandas新增数据列

直接赋值

df.loc[:, "wencha"] = df["bWendu"] - df["yWendu"]

df.apply方法

df.loc[:, "wendu_type"] = df.apply(get_wendu_type, axis = 1)

df.assign方法

# 可以同时添加多个新的列
df.assign(
	yWendu huashi = lambda x : x["yWendu"] * 9 / 5 + 32, # 可以是一个函数
    bWendu_huashi = lambda x : x["bWendu"] * 9 / 5 + 32
)

按条件选择分组分别赋值

df['wencha_type'] = ''
df.loc[df["bWendu"] - df["yWendu"] > 10, "wencha_type"] = "温差大"

数据统计函数

汇总类统计

df.describe() # 提取所有数字列统计结果

唯一去重和按值计数

  • 针对非数值列

df["fengxiang"].unique 枚举所有列

df["fengxiang"].value_counts() 计数

相关系数和协方差

相关系数:衡量相似度程度。1:正向相似度最大。-1:反向相似度最大

协方差:衡量同向反向程度。正:同变化。负:反向运动

df.cov():协方差矩阵

df.corr():相关系数矩阵

Pandas缺失值处理

isnull和notnull函数

检测是否为空值

dropna

丢弃、删除缺失值

  • axis:删除行还是列
  • how:如果等于any则任何值为空都删除,如果等于all则所有值为空才删除
  • inplace:如果为True则修改当前df,否则返回新的df

fillna

填充空值

  • value:用于填充的值,可以是单个值,或者字典
  • method:ffill使用前一个不为空的值填充,bfill使用后一个不为空的值填充
  • axis:按行还是按列填充
  • inplace:等同于dropna
st = pd.read_csv("./data.xlsx", skiprows = 2) # 跳过前面的空行

st.dropna(axis="columns". how="all", inplace=True)
st.fillna({"分数", 0})

Waring: setting with copy

df[condition]["wencha"] = df["bWendu"] - df["yWendu"]
# 等同于
df.get(condition).setr(wen_cha)

pandas的dataframe的修改写操作,只允许在源dataframe上进行,一步到位

df.loc[condition, "wen_cha"] = df["bWendu"] - df["yWendu"] # 1

df_month3 = df[condition].copy()
df_month3["wencha"] = df["bWendu"] - df["yWendu"]

pandas不允许先筛选子dataframe,再进行修改写入

sort_value(by, asscending = True, inplace = False)

inplace:是否修改原始DataFrame

by:通过啥进行排序

Pandas字符串处理

  • 使用方法:先获取Series的str属性,然后在属性上调用函数
  • 只能再字符串列调用
  • DataFrame上无str属性和处理方法

startswith():以括号中的东西开头

replace():替换

index

df.set_index("userId", inplace = True, drop = False)

drop让索引列还保持在column

df.index

查询索引

python根据数据类型自动优化

index自动对齐

Merge用法

将不同的表按key关联到一个表

类似于sql的join

Concat用法

批量合并相同格式的Excel,给DataFrame添加行,给DataFrame添加列

可以做类似于sql的qroup by

Multiindex分层索引

你可能感兴趣的:(python,数据挖掘,机器学习)