Skip to content

数据分析

numpy - 数据计算

pandas - 数据处理

matplotlib - 数据可视化

一.numpy

import numpy as np

1. 创建数组

python
# 列表创建数组
# 一维数组 - np.array
npr1 = np.array([1, 2, 3, 4, 5])
# 二维数组 - np.array
npr2 = np.array([[1, 2, 3], [4, 5, 6]])

# 特殊数组
# 全零数组 - np.zeros
npr3 = np.zeros((2, 3))
# 全一数组 - np.ones
# 总共几维看元组长度,每一维有几个数字看元组内容
npr4 = np.ones((2, 3, 3))

# 序列数组
# 范围 - np.arange
npr5 = np.arange(1, 10, 2)  # 1-9,步长为2 ,包头不包尾
# 等分 - np.linspace
npr6 = np.linspace(1, 10, 5)  # 起始,结束,切几下

# 随机数组
# 随机 - np.random.rand
npr7 = np.random.rand(2, 3, 2)  # rand范围是0-1,参数是生成数组维度
# 正态 - np.random.randn
npr8 = np.random.randn(3, 3, 3)  # randn范围是正态分布均值为0,标准差为1,参数是生成数组维度

2. 数组的属性

python
# 获取维度 - ndim
print(f'维度:{npr8.ndim}')
# 获取形状 - shape
print(f'形状:{npr8.shape}')
# 获取大小 - size
print(f'大小:{npr8.size}')
# 获取数据类型 - dtype
print(f'数据类型:{npr8.dtype}')

3. 数组的形状处理

python
# 改变形状 - reshape
npr9 = np.array([[1, 2, 3], [4, 5, 6]])
npr10 = npr9.reshape(3, 2)
# 转置 - T
npr11 = npr9.T
# 展平 (把数组转成一行的数组) - flatten
npr12 = npr9.flatten()
# 调整形状+大小(不够就重复,多余就切除) - resize
npr13 = np.resize(npr12, (3, 4))  # 不够就重复
npr14 = np.resize(npr12, (2, 2))  # 多余就切除

4. 数组运算

python
# 加减乘除幂(对应位运算) - + - * / **
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(f'加法运算:{arr1 + arr2}')
print(f'减法运算:{arr1 - arr2}')
print(f'乘法运算:{arr1 * arr2}')
print(f'除法运算:{arr1 / arr2}')
print(f'幂运算:{arr1 ** arr2}')
# 比较(返回布尔值) - > < ==
print(f'比较运算:{arr1 > arr2}')
# 矩阵运算
# .dot(点积运算) - 不是矩阵专有
print(np.dot(1, 2))  # 标量积算
print(np.dot(arr1, arr2))  # 向量计算
arr3 = np.array([[1, 2], [3, 4]])
arr4 = np.array([[5, 6], [7, 8]])
print(np.matmul(arr3, arr4))  # 矩阵运算
# @(运算符)  matmul(API) - 矩阵专有
print(arr3 @ arr4)
print(np.matmul(arr3, arr4))

5.数组统计

python
arr5 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 数组的和 - np.sum
print(f'数组的和:{np.sum(arr5)}')
# 数组列的和 axis=0   列
print(f'数组列的和:{np.sum(arr5, axis=0)}')
# 数组行的和   axis=1   行
print(f'数组行的和:{np.sum(arr5, axis=1)}')
# 平均值 - np.mean
print(f'平均值:{np.mean(arr5)}')
# 方差 - ((每个数 - 平均值)²,求和)/ 数组长度 - np.var
print(f'方差:{np.var(arr5)}')
# 标准差 - 方差开方 - np.std
print(f'标准差:{np.std(arr5)}')
# 最大值 - np.max
print(f'最大值:{np.max(arr5)}')
# 最小值 - np.min
print(f'最小值:{np.min(arr5)}')
# 最大值索引 - np.argmax
print(f'最大值索引:{np.argmax(arr5)}')
# 最小值索引 - np.argmin
print(f'最小值索引:{np.argmin(arr5)}')

6.广播机制

python
# 6.广播机制(由少到多的扩散)
# 先升维度(少向多升)
# 再拉伸(少向多拉)
arr6 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr7 = np.array([10, 20, 30])
print(arr6 + arr7)
arr8 = np.array([[10], [20], [30]])
print(arr6 + arr8)
# 原则:维度从尾看,相同才广播,见一都能扩,不足就补一

二. pandas

import pandas as pd

1. Series对象的创建 - 单列

python
# 从列表创建Series对象 不写index就拿索引当说明
s1 = pd.Series([1, 2, 3, 4, 5], index=['one', 'two', 'three', 'four', 'five'])
# 从字典创建Series对象  那键当说明
s2 = pd.Series({'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5})
# series获取值 - values
print(f'Series对象的值:\n{s1.values}')
# series获取索引 - index
print(f'Series对象的索引:\n{s1.index}')

2. DataFrame对象的创建 - 多列

python
# 列表创建DataFrame对象
d1 = pd.DataFrame([['张三', 18, '男'], ['李四', 19, '女'], ['王五', 20, '男']])

# 列表创建DataFrame对象+数据说明  columns - 列的说明  index - 行的说明
d2 = pd.DataFrame([['张三', 18, '男'], ['李四', 19, '女'], ['王五', 20, '男']], columns=['姓名', '年龄', '性别'],
                  index=['冠军', '亚军', '季军'])

# 字典创建DataFrame对象
d3 = pd.DataFrame({'姓名': ['张三', '李四', '王五'], '年龄': [18, 19, 20], '性别': ['男', '女', '男']},
                  index=['冠军', '亚军', '季军'])


# 属性查看
# 形状 - shape
print(f'DataFrame对象的形状:{d3.shape}')
# 列名 - columns
print(f'DataFrame对象的列名:{d3.columns}')
# 索引 - index
print(f'DataFrame对象的索引:{d3.index}')
# 数据类型 - dtypes
print(f'DataFrame对象的数据类型:{d3.dtypes}')

3. 获取数据和分析

python
# 从前取 - head
print(f'从前取 - 前两个:\n{d3.head(2)}')
# 从尾取 - tail
print(f'从尾取 - 后两个:\n{d3.tail(2)}')
# 数据分析 - 简单的统计(只能分析数值类的) - describe
print(f'数据分析 - 简单的统计:\n{d3.describe()}')
# 通过列获取数据
print(f'通过列获取数据:\n{d3["姓名"]}')
print(f'通过列获取数据:\n{d3[["姓名", "年龄"]]}')
# 通过行获取数据 - 自定义名称 - loc
print(f'通过行名称获取数据:\n{d3.loc["亚军"]}')
print(f'通过行名称获取数据:\n{d3.loc[["冠军", "亚军"]]}')
# 通过行获取数据 - 索引 - iloc
print(f'通过行索引获取数据:\n{d3.iloc[0]}')
print(f'通过行索引获取数据:\n{d3.iloc[[0, 1]]}')
# 切片
print(f'名称切片:\n{d3.loc['冠军':'季军']}')  # 包头包尾
print(f'索引切片:\n{d3.iloc[0:2]}')  # 包头不包尾
# 补充:numpy的切片 - 多维切片用逗号隔开
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a[0:2, 0:2])

4. 数据筛选

python
# 筛选 - query
print(d3[d3['年龄'] > 18])
print(d3.query('年龄>18' and '性别=="男"'))
# 排序 - sort_values	
print(d3.sort_values('年龄'))  # 默认为升序
print(d3.sort_values(['性别', '年龄'], ascending=[True, False]))  # 先按性别排序再按年龄排序

5. 数据的分组聚

python
# 读取csv文件(以逗号隔开的文件) - pd.read_csv
df = pd.read_csv('分组聚合数据.csv', sep=',', encoding='utf-8')

# 单个分组 - groupby
print(f'单个分组:\n{df.groupby("产品").sum()}')
# 多个分组 - groupby
print(f'多个分组:\n{df.groupby(["产品", "地区"]).agg(['sum', 'max', 'min'])}')
# 查看某一个属性的数据 
print(f'查看某一个属性的数据:\n{df.groupby(["产品", "地区"])['销售额'].agg(['sum', 'max', 'min'])}')
# 透视表 - 以excel形式展示 - pivot_table
p_table = df.pivot_table(index='产品', columns='地区', values='销售额', aggfunc='sum')
print(f'透视表:\n{p_table}')

6. 数据清洗

python
df1 = pd.read_csv('数据清洗.csv', sep=',', encoding='utf-8')
print(f'数据清洗:\n{df1}')
# 检测缺省/非缺省的数量 - isnull notnull
print(f'缺省数量:\n{df1.isnull().sum()}')
print(f'非缺省数量:\n{df1.notnull().sum()}')
# 清洗数据 - 删除/填充
# 删除有空缺的行 - dropna
# 返回一个新的DataFrame对象
df2 = df1.dropna()
# print(f'删除有空缺的行df2:\n{df2}')
# 在原DataFrame对象上进行修改 - inplace=True
df1.dropna(inplace=True)
# print(f'删除有空缺的行df1:\n{df1}')
# 删除有空缺的列 - dropna axis = 1
# 返回新的DataFrame对象
df2 = df1.dropna(axis=1)
# print(f'删除有空缺的列df2:\n{df2}')
# 在原DataFrame对象上进行修改 - inplace=True
df1.dropna(axis=1, inplace=True)
# print(f'删除有空缺的列df1:\n{df1}')
# 填充数据fillna
df2 = df1.fillna(0)
print(f'填充数据0:\n{df2}')
df3 = df1.fillna(df1.mean())  # pandas底层依赖numpy,所以numpy的许多函数都可以用
print(f'每列填充每列平均值:\n{df3}')