numerical python
一个开源的科学计算库
代码更简洁(以数组,矩阵为粒度)
性能更高效(存储效率和输入输出性能更好)
numpy是python科学数据类库的基础库
测试一个函数执行的时间
%timeit 执行的函数
array中的所有元素都是同一种类型的
np.random
模块创建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([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
# 二元运算直接逐元素操作
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
# 返回的是一个一位数组,起到降维的作用
函数名 | 说明 |
---|---|
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)之间生成均匀分布的数字 |
函数名 | 说明 |
---|---|
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 | 方差 |
axis=0 代表行, axis=1代表列
对于sum,mean等的聚合函数
标准化: 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=(A−mean(a,axis=0))/std(A,axis=0)
import numpy as np
arr = np.random.randint(1, 10000, size = int(1e8))
arr[arr > 5000]
arr[np.newaxis, :] # 添加一个行维度
arr[:, np.newaxis] # 添加一个列维度
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) # 按列进行数据合并
开源的python类库
pd.read_csv
pd.read_sql
ratings = pd.read_csv(fpath)
ratings.head() # 查看前几行数据
ratings.shape # 查看数据的形状
ratings.columns # 查看列名列表
ratings.index # 查看索引列
ratings.dtypes # 查看每列的数据类型
pru = pd.read_csv(
fpath,
sep = "\t", # 分隔符
header = None, # 标题行
names = ['pdate', 'pv', 'uv'] # 指定列名
)
puv = pd.read_csv(fpath)
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)
二维数据,整个表格,多行多列
每一列的索引df.columns
,每一行的索引df.index
一维数据,一行或者一列
类似于一维数组的对象,是由一组数据(不同数据类型)以及一组与之
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']
s3 = pd.Series(sdata_dict)
# key变成索引,value变成值
s2['a'] # 查询单个值
s2[['b', 'a']] # 返回一个Series
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] # 查询一行
根据行、列标签值查询
[区间起始,区间结束]
根据行、列的数字位置查询
df.loc[:, "wencha"] = df["bWendu"] - df["yWendu"]
df.loc[:, "wendu_type"] = df.apply(get_wendu_type, axis = 1)
# 可以同时添加多个新的列
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()
:相关系数矩阵
检测是否为空值
丢弃、删除缺失值
填充空值
st = pd.read_csv("./data.xlsx", skiprows = 2) # 跳过前面的空行
st.dropna(axis="columns". how="all", inplace=True)
st.fillna({"分数", 0})
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,再进行修改写入
inplace:是否修改原始DataFrame
by:通过啥进行排序
startswith():以括号中的东西开头
replace():替换
df.set_index("userId", inplace = True, drop = False)
drop让索引列还保持在column
df.index
查询索引
python根据数据类型自动优化
将不同的表按key关联到一个表
类似于sql的join
批量合并相同格式的Excel,给DataFrame添加行,给DataFrame添加列
可以做类似于sql的qroup by