Study:day08-Numpy科学计算与Pandas数据分析
昨日内容:
- 数据的查询操作
- data[字段名] # 查询单列
- data[[字段名列表]] # 查询多列数据
- data.loc[轴0上标签名称,轴1上标签名称] # 查询指定的行和列
- data.iloc[轴0上标签的索引,轴1上标签的索引] # 可以根据行列标签的索引进行数据查询
- 多条件查询,条件与 & 条件或 |
- 使用自定义的聚合函数进行查询
- 数据的修改操作
- data[已存在字段名] = 新的值
- data.loc[轴0上标签名称,轴1上标签名称] = 新的值
- 数据的新增操作
- data[新字段名] = 新的值
- data.insert(位置,插入的名称,插入的值)
- 数据的删除操作
- data.drop(字段名/列表,axis,inplace=True)
- 数据的基本属性
- head/tail : 查看数据的前后N行
- index/columns: 查看数据的索引和列名
- dtypes: 查看数据的字段类型
- shape: 查看数据集的形状
- size: 查看数据集元素的个数
- info(): 查看数据集的基本信息
- describe: 查看数据集的描述性统计信息
- Pandas中SAC操作:
- S分割部分: groupby数据分组
- groupby对象本身的一些属性/ngroups/get_group/grooups/
- data.groupby(按谁分)[数据源].执行的操作上什么
- A应用部分: ATF操作之聚合操作(agg)[重要]
- 同时使用多个聚合函数
- 对不同的列使用不同的聚合函数
- 使用自定义的聚合函数
- 对聚合的结果进行重命名
今日内容:
- ATF操作之T操作: 转换操作
- ATF操作之F操作: 过滤操作
- ATF操作之补充操作: map/apply
- SAC操作之C部分: 数据合并
1.1 ATF操作之转换操作(Transformation)
某些特殊场景下,需要对数据进行变换操作,这种变化不会改变每个组的大小
1.1.1 常见的转换操作
import pandas as pd
import numpy as np
import sys
print('Python version:', sys.version)
print('Pandas version:', pd.__version__)
print('Numpy version:', np.__version__)
Python version: 3.12.3 | packaged by conda-forge | (main, Apr 15 2024, 18:20:11) [MSC v.1938 64 bit (AMD64)]
Pandas version: 2.2.2
Numpy version: 1.26.4
1.1.1.1 cumsum/cumprod 累计求和/求积
- 移动平均/计算累计的收益
- cumsum: 累计求和
- cumprod: 累计求积
data = pd.read_excel('./data/transform.xlsx', sheet_name='sheet1')
任务1: 知道每个月都收入和支出,想要知道每个月都剩余的余额怎么算
data['balance'] = data['income'] - data['expense']
# 以前方法使用迭代器进行累加计算
import itertools
list(itertools.accumulate(data['balance'].to_list(), lambda x, y: x + y))
data['cum_balance'] = list(itertools.accumulate(data['balance'].to_list()))
data['cum_balance2'] = data['balance'].cumsum() # 用函数进行累加
1.1.1.2 diff差分计算
- diff函数用于计算序列的差分值,它将序列当前的元素的差异值计算出来,对于时间序列数据,差分转换为平缓的时间序列,进而进行更准确的预测和建模
- 使用场景
- 温度变化
- 电子产品电池电量变化
- 人口数量变化
data = pd.DataFrame({
'A': [np.random.randint(10, 100) for i in range(20)],
'B': [np.random.randint(10, 100) for i in range(20)]
})
data.diff(periods=1) # 差分计算
data.diff(periods=7) # 可以指定步长
A | B | |
---|---|---|
0 | NaN | NaN |
1 | NaN | NaN |
2 | NaN | NaN |
3 | NaN | NaN |
4 | NaN | NaN |
5 | NaN | NaN |
6 | NaN | NaN |
7 | -8.0 | -36.0 |
8 | 26.0 | 22.0 |
9 | 40.0 | 56.0 |
10 | -1.0 | -7.0 |
11 | 18.0 | -63.0 |
12 | 27.0 | 10.0 |
13 | 17.0 | 76.0 |
14 | 63.0 | 22.0 |
15 | 36.0 | -55.0 |
16 | -4.0 | -9.0 |
17 | 28.0 | 7.0 |
18 | -52.0 | 32.0 |
19 | -50.0 | 1.0 |
1.1.1.3 shift:将数据向前或向后移动指定的位数
shift函数用于将数据向前或向后移动指定的位数,默认为1位,可以指定步长periods=3步长为3
# 计算每个月的销售额相对于上个月的增长率
sales = pd.DataFrame({
'sales': [2000, 2500, 3000, 4000, 4500]})
sales['next_month'] = sales.shift(-1)
sales['diff_value'] = sales['next_month'] - sales['sales']
sales['增长率'] = sales['diff_value'] / sales['sales']
sales.head()
sales | next_month | diff_value | 增长率 | |
---|---|---|---|---|
0 | 2000 | 2500.0 | 500.0 | 0.250000 |
1 | 2500 | 3000.0 | 500.0 | 0.200000 |
2 | 3000 | 4000.0 | 1000.0 | 0.333333 |
3 | 4000 | 4500.0 | 500.0 | 0.125000 |
4 | 4500 | NaN | NaN | NaN |
1.1.1.4 rank:对数据进行排序
data = pd.DataFrame({
'name': ['张三', '李四', 'Loong', '王五'],
'score': [80, 90, 100, 90]
})
- average:默认选项,为每个值分配平均的排名
- dense:组内连续排名
- first:为每个值分配他们第一次出现的第一个位置排名
- min:为每个值分配他们所在组内的最小排名
- max:为每个值分配他们所在组内的最大排名
data['rank'] = data['score'].rank()
data['rank_dense'] = data['score'].rank(method='dense')
data['rank_first'] = data['score'].rank(method='first')
data['rank_min'] = data['score'].rank(method='min')
data['rank_max'] = data['score'].rank(method='max')
1.1.1.5 pct_change:计算百分比变化
用于计算百分比变化的数据转换函数,它可以计算每个点相对于前一个数据点的变化的百分比
np.random.seed(1210)
dates = pd.date_range('20230101', periods=12, freq='ME')
data = np.random.randint(10, 100, size=(12,))
data1 = pd.DataFrame({
'data': data}, index=dates)
data1['MoM'] = data1['data'].pct_change(periods=1) # 计算环比,当前值相对于前一个时间点的值的百分比变化
data1['YoY'] = data1['data'].pct_change(periods=12) # 计算同比,当前值相对于前12个月之前的百分比变化
1.1.2 转换操作Transform
data = pd.read_csv('./data/pandas_test.csv')
# 按照省份分组,对各省成绩进行0-1标准化,