数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
八、 聚合与分组
1. 分组
分组运算的过程为:拆分-应用-合并
- 拆分阶段:
Series/DataFrame
等数据根据你提供的一个或者多个键,被拆分为多组 - 应用阶段:根据你提供的一个函数应用到这些分组上
- 合并阶段:将函数的执行结果合并到最终结果中
- 拆分阶段:
分组中有两种数据:源数据(被分组的对象),分组数据(用于划分源数据的)。
- 源数据每一行(axis=0) 对应于分组数据中的一个元素。分组数据中每一个唯一值对应于一个分组。
- 当分组数据也在源数据中时,可以直接通过指定列名来指定分组数据(值相同的为同一组)。
.groupby()
方法是分组方法:xxxxxxxxxx
Series/DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)by
:一个mapping function
、list of function
、一个字典、一个序列、一个元组、一个list of column name
。它指定了分组数据。如果传入了函数,则在每个
index value
上调用函数来产生分组数据如果是
Series
或者字典,则根据每个index value
在字典/Series
中的值来产生分组数据如果是个
column label
,则使用该label
抽取出来的一列数据产生分组数据如果是个
column label
的list
,则使用一组column label
抽取出来的多列数据作为分组数据。如果是个序列,则它直接指定了分组数据。
如果是个序列的序列,则使用这些序列拼接成一个
MulitiIndex
,然后根据这个MultiIndex
替换掉index
后,根据label value
来分组。(事实上并没有替换,只是用于说明这个过程)如果
axis=1
,则index label
替换成column label
axis
:指定沿着哪个轴分组。可以为0/'index'
,表示沿着 0轴。可以为1/'columns'
,表示沿着 1轴level
:一个整数、level name
或者其序列。如果axis
是个MultiIndex
,则在指定级别上的索引来分组as_index
:一个布尔值。如果为True
,则将group label
作为输出的index
。如果为False
,则输出是SQL
风格的分组(此时分组的key
作为一列,而不是作为index
)。Series
中,该参数必须为True
。sort
:一个布尔值。如果为True
,则对分组的键进行排序。group_keys
:一个布尔值。如果为True
,且调用了函数来决定分组,则添加分组键来区分不同的数据(否则你不知道每一行数据都对应于哪里)squeeze
:一个布尔值。如果为True
,则尽可能的缩减结果的类型。
该函数返回一个
GroupBy
对象。我们可以使用
dtype
来分组,此时by=df.dtypes,axis=1
:对于由
DataFrame
产生的GroupBy
对象,我们可以用一个或者一组列名对其索引。它其实一个语法糖。如果索引是一个列名,则
df.groupby('key1')['data1']
等价于df['data1'].groupby(df['key1'])
如果索引是一个元组和序列,则
df.groupby('key1')[['data1','data2']]
并不等价于df[['data1','data2']].groupby(df['key1'])
,而是等同于df.groupby(df['key1'])
- 之所以用
[['data1','data2']]
,是因为df[['data1','data2']]
与df['data1','data2']
语义不同。后者表示某个label
是个元组,该元组的值为'data1','data2'
。
- 之所以用
2. GroupBy对象
GroupBy
对象是一个迭代器对象。迭代结果产生一组二元元组(由分组名和数据块组成)。- 如果有多重键,则元组的第一个元素将是由键组成的元组。
dict(list(GroupBy_obj))
将生产一个字典,方便引用
GroupBy.groups
属性返回一个字典:{group name->group labels}
GroupBy.indices
属性返回一个字典:{group name->group indices}
GroupBy
的统计函数有(排除了NaN
):GroupBy.count()
:计算各分组的非NaN
的数量GroupBy.cumcount([ascending])
:计算累积分组数量GroupBy.first()
:计算每个分组的第一个非NaN
值GroupBy.head([n])
:返回每个分组的前n
个值GroupBy.last()
:计算每个分组的最后一个非NaN
值GroupBy.max()
:计算每个分组的最大值GroupBy.mean(*args, **kwargs)
:计算每个分组的均值GroupBy.median()
:计算每个分组的中位数GroupBy.min()
:计算每个分组的最小值GroupBy.nth(n[, dropna])
:计算每个分组第n
行数据。 如果n
是个整数列表,则也返回一个列表。GroupBy.ohlc()
:计算每个分组的开始、最高、最低、结束值GroupBy.prod()
:计算每个分组的乘GroupBy.size()
:计算每个分组的大小(包含了NaN
)GroupBy.sem([ddof])
:计算每个分组的sem
(与均值的绝对误差之和)GroupBy.std([ddof])
:计算每个分组的标准差GroupBy.sum()
:计算每个分组的和GroupBy.var([ddof])
:计算每个分组的方差GroupBy.tail([n])
:返回每个分组的尾部n
个值
另外
SeriesGroupBy/DataFrameGroupBy
也支持Series/DataFrame
的统计类方法以及其他方法:xxxxxxxxxx
#SeriesGroupBy - DataFrameGroupBy 都有的方法: .agg(arg, *args, **kwargs) .all([axis, bool_only, ...]) .any([axis, bool_only, ...]) .bfill([limit]) .corr([method, min_periods]) .count() .cov([min_periods]) .cummax([axis, skipna]) .cummin([axis, skipna]) .cumprod([axis]) .cumsum([axis]) .describe([percentiles, ...]) .diff([periods, axis]) .ffill([limit]) .fillna([value, method, ...]) .hist(data[, column, by, ...]) .idxmax([axis, skipna]) .idxmin([axis, skipna]) .mad([axis, skipna, level]) .pct_change([periods, ...]) .plot .quantile([q, axis, ...]) .rank([axis, method, ...]) .resample(rule, *args, **kwargs) .shift([periods, freq, axis]) .size() .skew([axis, skipna, level, ...]) .take(indices[, axis, ...]) .tshift([periods, freq, axis]) #SeriesGroupBy独有的方法 SeriesGroupBy.nlargest(*args, **kwargs) SeriesGroupBy.nsmallest(*args, **kwargs) SeriesGroupBy.nunique([dropna]) SeriesGroupBy.unique() SeriesGroupBy.value_counts([normalize, ...]) #DataFrameGroupBy独有的方法 DataFrameGroupBy.corrwith(other[, axis, drop]) DataFrameGroupBy.boxplot(grouped[, ...])如果你希望使用自己的聚合函数,只需要将其传入
.aggregate(func, *args, **kwargs)
或者.agg()
方法即可。其中func
接受一维数组,返回一个标量值。- 注意:自定义聚合函数会慢得多。这是因为在构造中间分组数据块时存在非常大的开销(函数调用、数据重排等)
- 你可以将前面介绍的
GroupBy
的统计函数名以字符串的形式传入。 - 如果你传入了一组函数或者函数名,则得到的结果中,相应的列就用对应的函数名命名。如果你希望提供一个自己的名字,则使用
(name,function)
元组的序列。其中name
用作结果列的列名。 - 如果你希望对不同的列采用不同的聚合函数,则向
agg()
传入一个字典。字典的键就是列名,值就是你希望对该列采用的函数。
.get_group(key)
可以获取分组键对应的数据。key
:不同的分组就是依靠它来区分的
GroupBy
的下标操作将获得一个只包含源数据中指定列的新GroupBy
对象GroupBy
类定义了__getattr__()
方法,当获取GroupBy
中未定义的属性时:- 如果属性名是源数据对象的某列的名称则,相当于
GroupBy[name]
,即获取针对该列的GroupBy
对象 - 如果属性名是源数据对象的方法,则相当于通过
.apply(name)
对每个分组调用该方法。
- 如果属性名是源数据对象的某列的名称则,相当于
3. 分组级运算
agg/aggregate
只是分组级运算其中的一种。它接受一维数组,返回一个标量值。transform
是另一个分组级运算。它也接受一维数组。只能返回两种结果:要么是一个标量值(该标量值将被广播),或者一个相同大小的结果数组。- 你无法通过字典来对不同的列进行不同的
transform
xxxxxxxxxx
GroupBy.transform(func, *args, **kwargs)- 你无法通过字典来对不同的列进行不同的
apply
是另一个分组级运算。它是最一般化的分组级运算。它将待处理的对象拆分成多个片段,然后对各个片段调用传入的函数,最后尝试将各个片段组合到一起。xxxxxxxxxx
GroupBy.apply(func, *args, **kwargs)func
:运算函数。其第一个位置参数为待处理对象。其返回值是一个标量值或者pandas
对象。args/kwargs
是传递给func
的额外的位置参数与关键字参数。
对于
DataFrame
的.groupby
时,传递给func
的第一个参数是DataFrame
;对于Series
的.groupby
,传递给func
的第一个参数是Series
。pd.cut()/qcut()
函数返回的是Categorical
对象。我们可以用它作为.groupby()
的by
参数的值。这样可以实现桶分析。
4. 透视表和交叉表
透视表
pivot table
是一种数据汇总工具。它根据一个或者多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个单元格中。- 你可以通过
.groupby
功能以及索引的变换来手工实现这种功能
- 你可以通过
DataFrame.pivot_table()
方法,以及pandas.pivot_table()
函数都可以实现这种功能xxxxxxxxxx
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')data
:一个DataFrame
对象values
:指定哪些列将被聚合。默认聚合所有的数值列。index
:一个index label
、一个Grouper
、一个数组,或者前面这些类型的一个列表。它指定关于分组的列名或者其他分组键,出现在结果透视表的行columns
:一个column label
、一个Grouper
、一个数组,或者前面这些类型的一个列表。它指定关于分组的列名或者其他分组键,出现在结果透视表的列aggfunc
:一个函数或者函数的列表。默认为numpy.mean
。它作为聚合函数。如果为函数的列表,则结果中会出现多级索引,函数名就是最外层的索引名。fill_value
:一个标量,用于替换NaN
margins
:一个布尔值。如果为True
,则添加行/列的总计。dropna
:一个布尔值。如果为True
,则结果不包含这样的列:该列所有元素都是NaN
margins_name
:一个字符串。当margins=True
时,margin
列的列名。
交叉表
cross-tabulation:crosstab
是一种用于计算分组频率的特殊透视表。我们可以使用pivot_table()
函数实现透视表的功能,但是直接使用更方便:xxxxxxxxxx
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)index
:一个array-like
、Series
或者前两种的列表。它给出了行的计算频数的数据。columns
:一个array-like
、Series
或者前两种的列表。它给出了列的计算频数的数据。values
:一个array-like
,该数据用于聚合。如果出现了values
,则必须提供aggfunc
。aggfunc
:一个函数对象,是聚合函数。如果出现了aggfunc
,则必须提供values
。rownames
:一个序列。如果非空,则必须和结果的row index
的level
数量相等colnames
:一个序列。如果非空,则必须和结果的column index
的level
数量相等margins
:一个布尔值。如果为True
,则添加行/列的总计。dropna
:一个布尔值。如果为True
,则结果不包含这样的列:该列所有元素都是NaN
normalize
:一个布尔值、字符串('all'/'index'/'columns'
)、或者整数0/1
。它指定是否进行归一化处理(归一化为频率),否则就是频数。- 如果
'all'/True
,则对所有数据进行归一化 - 如果为
'index'
:则对每一行归一化 - 如果为
'columns'
:则对每一列归一化 - 如果
margins
为True
,则对margins
也归一化。
- 如果
values
的作用是这样的:首先根据index-columns
建立坐标。行坐标来自index
,列坐标来自columns
。在index-columns-values
中,同一个坐标下的values
组成Series
。这个Series
被aggfunc
进行聚合,aggfunc
接受一个Series
,返回一个标量。此时就不再是对坐标点进行计数了,而是对values
进行聚合。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论