首页 技术 正文
技术 2022年11月14日
0 收藏 977 点赞 5,008 浏览 2936 个字

内容目录

  • 1. 统计函数
  • 2. 窗口函数
  • 3. 加深加强

  数据准备

# 导入相关库
import numpy as np
import pandas as pd
#Pandas 中包含了非常丰富的计算工具,如一些统计函数、窗口函数、聚合等计算工具。
index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name")
data = {
"age": [18, 40, 28, 20, 30, 35],
"income": [1000, 4500 , 1800, 1800, 3000, np.nan],
}
df = pd.DataFrame(data=data, index=index)
df
Out[43]:
age income
name
Tom 18 1000.0
Bob 40 4500.0
Mary 28 1800.0
James 20 1800.0
Andy 30 3000.0
Alice 35 NaN

1.统计函数

  最常见的计算工具莫过于一些统计函数了。

  这里我们首先构建一个包含了用户年龄与收入的 DataFrame。我们可以通过 cov 函数来求出年龄与收入之间的协方差,计算的时候会丢弃缺失值。除了协方差之外,我们还可以通过 corr 函数来计算下它们之间的相关性,计算的时候会丢弃缺失值。默认情况下 corr 计算相关性时用到的方法是 pearson,当然了你也可以指定 kendall 或 spearman。除了相关性的计算外,还可以通过 rank 函数求出数据的排名顺序。如果有相同的数,默认取其排名的平均值作为值。我们可以设置参数来得到不同的结果。可以设置的参数有:min、max、first、dense。

#协方差
df.age.cov(df.income)
#相关系数
df.age.corr(df.income)
df.age.corr(df.income,method="kendall")
df.age.corr(df.income,method="spearman")
#排名
df.income.rank()
df.income.rank(method="first")  

2.窗口函数

  有的时候,我们需要对不同窗口的中数据进行一个统计,常见的窗口类型为时间窗口。
  例如,下面是某个餐厅 7 天的营业额,我们想要计算每两天的收入总额,如何计算呢?
通过 rolling 我们可以实现,设置 window=2 来保证窗口长度为 2,设置 on=”date” 来保证根据日期这一列来滑动窗口(默认不设置,表示根据索引来欢动)

data = {
"turnover": [12000, 18000, np.nan, 12000, 9000, 16000, 18000],
"date": pd.date_range("2018-07-01", periods=7)
}
df2 = pd.DataFrame(data=data)
df2
Out[44]:
turnover date
0 12000.0 2018-07-01
1 18000.0 2018-07-02
2 NaN 2018-07-03
3 12000.0 2018-07-04
4 9000.0 2018-07-05
5 16000.0 2018-07-06
6 18000.0 2018-07-07
df2.rolling(window=2, on="date").sum()
Out[45]:
turnover date
0 NaN 2018-07-01
1 30000.0 2018-07-02
2 NaN 2018-07-03
3 NaN 2018-07-04
4 21000.0 2018-07-05
5 25000.0 2018-07-06
6 34000.0 2018-07-07
#是不是发现,有很多结果是缺失值,导致这个结果的原因是因为在计算时,窗口中默认需要的最小数据个数与窗口长度一致,这里可以设置 min_periods=1 来修改下。
df2.rolling(window=2, on="date", min_periods=1).sum()
Out[46]:
turnover date
0 12000.0 2018-07-01
1 30000.0 2018-07-02
2 18000.0 2018-07-03
3 12000.0 2018-07-04
4 21000.0 2018-07-05
5 25000.0 2018-07-06
6 34000.0 2018-07-07
#有时候,我想要计算每段时间的累加和,如何实现呢?先来看看第一种方式吧。
df2.rolling(window=len(df2), on="date", min_periods=1).sum()
Out[47]:
turnover date
0 12000.0 2018-07-01
1 30000.0 2018-07-02
2 30000.0 2018-07-03
3 42000.0 2018-07-04
4 51000.0 2018-07-05
5 67000.0 2018-07-06
6 85000.0 2018-07-07
#还有另外一种方式,直接使用 expanding 来生成窗口。
df2.expanding(min_periods=1)["turnover"].sum()
Out[48]:
0 12000.0
1 30000.0
2 30000.0
3 42000.0
4 51000.0
5 67000.0
6 85000.0
Name: turnover, dtype: float64

 3、加深加强

除了可以使用 sum 函数外,还有很多其他的函数可以使用,如:count、mean、median、min、max、std、var、quantile、apply、cov、corr等等。
方法描述
count()非空观测值数量
sum()值的总和
mean()价值的平均值
median()值的算术中值
min()最小值
max()最大
std()贝塞尔修正样本标准差
var()无偏方差
skew()样品偏斜度(三阶矩)
kurt()样品峰度(四阶矩)
quantile()样本分位数(百分位上的值)
apply()通用适用
cov()无偏协方差(二元)
corr()相关(二进制)
不过上面的方式只能生成一个结果,有时候想要同时求出多个结果(如求和和均值),如何实现呢?
借助 agg 函数可以快速实现
df2.rolling(window=2, min_periods=1)["turnover"].agg([np.sum, np.mean])
Out[52]:
sum mean
0 12000.0 12000.0
1 30000.0 15000.0
2 18000.0 18000.0
3 12000.0 12000.0
4 21000.0 10500.0
5 25000.0 12500.0
6 34000.0 17000.0
#如果传入一个字典,可以为生成的统计结果重命名。
df2.rolling(window=2, min_periods=1)["turnover"].agg({"tur_sum": np.sum, "tur_mean": np.mean})
Out[53]:
tur_sum tur_mean
0 12000.0 12000.0
1 30000.0 15000.0
2 18000.0 18000.0
3 12000.0 12000.0
4 21000.0 10500.0
5 25000.0 12500.0
6 34000.0 17000.0

  

 

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,085
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,560
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,409
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,182
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,819
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,902