Study:day08-Numpy科学计算与Pandas数据分析

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差分计算
  1. diff函数用于计算序列的差分值,它将序列当前的元素的差异值计算出来,对于时间序列数据,差分转换为平缓的时间序列,进而进行更准确的预测和建模
  2. 使用场景
    • 温度变化
    • 电子产品电池电量变化
    • 人口数量变化
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标准化,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值