小编Car*_*arl的帖子

用向量化替换lambda x对排序函数的性能增强

我有一个排名函数,我应用于数百万行的大量列,需要几分钟才能运行.通过删除准备数据以应用该.rank(方法的所有逻辑,即通过这样做:

ranked = df[['period_id', 'sector_name'] + to_rank].groupby(['period_id', 'sector_name']).transform(lambda x: (x.rank(ascending = True) - 1)*100/len(x))        
Run Code Online (Sandbox Code Playgroud)

我设法把它降到了几秒钟.但是,我需要保留我的逻辑,并且正在努力重构我的代码:最终,最大的瓶颈是我对lambda x:的双重使用,但显然其他方面正在减慢速度(见下文).我提供了一个示例数据框,以及下面的排名函数,即MCVE.从广义上讲,我认为我的问题归结为:

(i)如何.apply(lambda x用快速的矢量化等价替换代码中的用法?(ii)如何循环多索引,分组,数据帧并应用函数?就我而言,对于date_id和category列的每个唯一组合.
(iii)我还能做些什么来加快我的排名逻辑?主要的开销似乎是在.value_counts().这与上面的(i)重叠; 也许在发送排名之前,可以通过构建临时列来在df上完成大部分逻辑操作.同样,可以在一次调用中对子数据帧进行排名吗?
(iv)为什么要使用pd.qcut()而不是df.rank()?后者是cython化的,似乎有更灵活的关系处理,但我看不出两者之间的比较,pd.qcut()似乎最广泛使用.

样本输入数据如下:

import pandas as pd
import numpy as np
import random

to_rank = ['var_1', 'var_2', 'var_3']
df = pd.DataFrame({'var_1' : np.random.randn(1000), 'var_2' : np.random.randn(1000), 'var_3' : np.random.randn(1000)})
df['date_id'] = np.random.choice(range(2001, 2012), df.shape[0])
df['category'] = ','.join(chr(random.randrange(97, 97 + 4 + 1)).upper() for x in range(1,df.shape[0]+1)).split(',')
Run Code Online (Sandbox Code Playgroud)

这两个排名功能是:

def rank_fun(df, …
Run Code Online (Sandbox Code Playgroud)

python lambda vectorization ranking pandas

13
推荐指数
1
解决办法
756
查看次数

pandas qcut没有将相同数量的观察结果放入每个箱子中

我有一个数据框,我可以从中选择一个列(系列),如下所示:

DF:

            value_rank
275488          90
275490          35
275491          60
275492          23
275493          23
275494          34
275495          75
275496          40
275497          69
275498          14
275499          83
...             ...
Run Code Online (Sandbox Code Playgroud)

value_rank是先前从较大数据集创建的百分位数排名.我想要做的是创建这个数据集的箱子,例如五分之一

pd.qcut(df.value_rank, 5, labels=False)


275488    4
275490    1
275491    3
275492    1
275493    1
275494    1
275495    3
275496    2
...      ...
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这似乎很好,但事实并非如此.

事实上,我有1569列.可被5个分区整除的最近数字是1565,这应该在每个分区中给出1565/5 = 313个观测值.有4个额外的记录,所以我希望有4个箱子有314个观测值,一个有313个观测值.相反,我明白了:

obs =  pd.qcut(df.value_rank, 5, labels=False)
obs.value_counts()

0    329
3    314
1    313
4    311
2    302
Run Code Online (Sandbox Code Playgroud)

我在df中没有nans,也无法想出为什么会发生这种情况.从字面上开始撕掉我的头发!

这是一个小例子:

DF:

            value_rank
286742               11
286835               53
286865               40
286930 …
Run Code Online (Sandbox Code Playgroud)

python binning pandas

6
推荐指数
2
解决办法
4008
查看次数

Pandas - 删除重复的行,除了另一列中具有最高值的行

我有一个大型数据框(超过 100 列,数十万行),其中许多行包含重复数据。我正在尝试删除重复的行,将具有最大值的行保留在不同的列中。

\n\n

本质上,我根据时间段将数据分类到单独的容器中,因此跨时期,人们会期望发现大量重复,因为大多数实体都存在于所有时间段中。然而,不能允许同一实体在给定时间段内出现多次。

\n\n

我尝试了 python pandas 中的方法:在数据的子集上按 A 列删除重复项,保留 B 列中具有最高值的行,并计划与原始数据帧 df 重新组合。

\n\n

示例数据子集:

\n\n
              unique_id   period_id   liq\nindex                                   \n19            CAN00CE0     199001  0.017610\n1903          **USA07WG0** 199001  1.726374\n12404         **USA07WG0** 199001  0.090525\n13330         USA08DE0     199001  1.397143\n14090         USA04U80     199001  2.000716\n12404         USA07WG0     199002  0.090525\n13330         USA08DE0     199002  1.397143\n14090         USA04U80     199002  2.000716\n
Run Code Online (Sandbox Code Playgroud)\n\n

在上面的示例中,我想保留第一个实例(因为 liq 较高,为 1.72)并丢弃第二个实例(liq 较低,为 0.09)。请注意,给定 period_id 中可以有两个以上的重复项。

\n\n

我试过这个,但对我来说非常慢(5分多钟后我就停止了):

\n\n
def h(x):\n    x = x.dropna() #idmax fails on nas, and happy to throw out where liq is …
Run Code Online (Sandbox Code Playgroud)

python max duplicates apply pandas

5
推荐指数
1
解决办法
3713
查看次数

Pandas 将 nan 替换为给定分组的平均值

我有一个以下形式的大型数据集:

    period_id  gic_subindustry_id  operating_mgn_fym5  operating_mgn_fym4  317        201509            25101010           13.348150           11.745965   
682        201509            20101010           10.228725           10.473917   
903        201509            20101010           NaN                 17.700966   
1057       201509            50101010           27.858305           28.378040   
1222       201509            25502020           15.598956           11.658813   
2195       201508            25502020           27.688324           22.969760   
2439       201508            45202020           NaN                 27.145216   
2946       201508            45102020           17.956425           18.327724 
Run Code Online (Sandbox Code Playgroud)

实际上,我有 25 年前每年的数千个值和多个(10+)列。

我试图用该时间段的 gic_industry_id 中值/平均值替换 NaN 值。

我尝试了一些类似的事情

df.fillna(df.groupby('period_id', 'gic_subindustry_id').transform('mean')),但这似乎非常慢(几分钟后我就停止了)。

我发现它可能很慢的原因是重新计算遇到的每个 NaN 的平均值。为了解决这个问题,我认为计算每个 period_id 的平均值,然后使用它替换/映射每个 NaN 可能会快得多。

means = df.groupby(['period_id', 'gic_subindustry_id']).apply(lambda x:x.mean())
Run Code Online (Sandbox Code Playgroud)

输出:

                             operating_mgn_fym5  operating_mgn_fym4 operating_mgn_fym3 operating_mgn_fym2   
period_id gic_subindustry_id                                             
201509    45202030            1.622685  0.754661   0.755324 …
Run Code Online (Sandbox Code Playgroud)

python dictionary replace nan pandas

4
推荐指数
1
解决办法
5488
查看次数

R:从动物园对象列表中获取单个数据帧

我有一个由不规则时间序列lodf组成的动物园对象列表,格式如下:

> head(lodf)

[[1]]
2014-08-08 2014-08-14 2014-09-12  
  1.15       1.32       2.39 

[[2]]  
2014-07-22 2014-07-24 2014-08-14 2014-08-20 2014-08-27 2014-09-12 
  0.50       0.75       1.29       1.36       1.28       1.28   

[[3]]
2012-11-01 2012-11-02 2013-07-12 2013-08-13 2013-09-11 2014-07-01 
  1.00       1.27       0.91       1.00       0.99       0.98 

...
Run Code Online (Sandbox Code Playgroud)

我最终试图将所有这些时间序列合并为一个组合的时间序列,即对每一列进行求和.为此,我尝试转换为zoo/xts时间序列以进行进一步操作,即在使用rowsum对各个数据框/日期求和之前应用na.locf和其他动物园库功能.即我试图将我上面的日期框列表变成一个类似于此的组合动物园对象:

           Value
12/09/2014  1.07
14/08/2014  1.32
08/08/2014  1.15
12/09/2014  0.48
27/08/2014  0.53
20/08/2014  0.61
14/08/2014  0.54
24/07/2014  0.75
22/07/2014  0.5
01/07/2014  0.98
01/07/2014  0
...
Run Code Online (Sandbox Code Playgroud)

在各个数据帧之间经常存在重叠,即对应于相同日期索引的若干值,并且在这些情况下我想要做的是对值进行求和.例如,如果我有

012-11-01
  0.7

012-11-01
 1.5

012-11-01
 0.7
Run Code Online (Sandbox Code Playgroud)

我想拥有

012-11-01
2.9
Run Code Online (Sandbox Code Playgroud)

作为生成的大数据框中此日期索引的值.

我已尝试合并,以当前格式读取动物园对象,do.call(rbind)等,但我很难过.对于进一步的上下文,此问题是此处概述的更大项目的一部分:R:具有重复时间索引条目的时间序列.非常感激任何的帮助!

更新:请按要求在下面找到数据对象:

> dput(head(lodf))
list(structure(c(1.15, …
Run Code Online (Sandbox Code Playgroud)

merge r list zoo

3
推荐指数
1
解决办法
480
查看次数

Python pandas 使用滚动应用到 groupby 对象以矢量化方式计算机车车辆 beta

我有一个包含 4 列的大型数据框 df:

             id           period  ret_1m   mkt_ret_1m
131146       CAN00WG0     199609 -0.1538    0.047104
133530       CAN00WG0     199610 -0.0455   -0.014143
135913       CAN00WG0     199611  0.0000    0.040926
138334       CAN00WG0     199612  0.2952    0.008723
140794       CAN00WG0     199701 -0.0257    0.039916
143274       CAN00WG0     199702 -0.0038   -0.025442
145754       CAN00WG0     199703 -0.2992   -0.049279
148246       CAN00WG0     199704 -0.0919   -0.005948
150774       CAN00WG0     199705  0.0595    0.122322
153318       CAN00WG0     199706 -0.0337    0.045765

             id           period  ret_1m   mkt_ret_1m
160980       CAN00WH0     199709  0.0757    0.079293
163569       CAN00WH0     199710 -0.0741   -0.044000
166159       CAN00WH0     199711  0.1000   -0.014644
168782       CAN00WH0     199712 …
Run Code Online (Sandbox Code Playgroud)

python beta vectorization apply pandas

2
推荐指数
2
解决办法
1万
查看次数

perl在","上分割一个字符串

我试图从CSV文件中分割几百行,.例如:

"Acme services","Sesame street","zip","0,56","2013-10-21"  
"Black adder, intra-national Association","shaftsville rd","zap code","0,50","2014-10-14"  
Run Code Online (Sandbox Code Playgroud)

等等

我可以拆分第一行,,但这不适用于第二行.但是,如果我分裂,,那么我会陷入这些情况.然后我可以删除"使用简单的正则表达式(例如$col[i] =~ s/\"+//g)

我已经试过@cols = split(/\",\"/,$line)了,我已经试过split('","',$lines)各种变化,但每一次,我得到充分$line$col[0],与$cols[1:n]为空.

任何帮助将非常感激!谢谢.

regex perl split

0
推荐指数
1
解决办法
103
查看次数

标签 统计

pandas ×5

python ×5

apply ×2

vectorization ×2

beta ×1

binning ×1

dictionary ×1

duplicates ×1

lambda ×1

list ×1

max ×1

merge ×1

nan ×1

perl ×1

r ×1

ranking ×1

regex ×1

replace ×1

split ×1

zoo ×1