提高谐波平均效率

2024-04-16 12:21:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我在应用调和平均值scipy.统计对于表中的aggfunc参数,但它比简单的数量级平均值慢得多。你知道吗

我想知道这是一个例外的行为,还是有一种方法,使这个计算更有效,因为我需要做这个计算数千次。你知道吗

我需要使用调和平均数,但这需要大量的处理时间。你知道吗

我尝试过使用python3.6统计表中的调和平均值,但是开销还是一样的。你知道吗

谢谢

import numpy as np
import pandas as pd
import statistics

data = pd.DataFrame({'value1':np.random.randint(1000,size=200000),
                     'value2':np.random.randint(24,size=200000),
                     'value3':np.random.rand(200000)+1,
                     'value4':np.random.randint(100000,size=200000)})

%timeit result = pd.pivot_table(data,index='value1',columns='value2',values='value3',aggfunc=hmean)
1.74 s ± 24.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit result = pd.pivot_table(data,index='value1',columns='value2',values='value3',aggfunc=lambda x: statistics.harmonic_mean(list(x)))
1.9 s ± 26.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit result = pd.pivot_table(data,index='value1',columns='value2',values='value3',aggfunc=np.mean)
37.4 ms ± 938 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

#Single run for both functions
%timeit hmean(data.value3[:100])
155 µs ± 3.17 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit np.mean(data.value3[:100])
138 µs ± 1.07 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)


Tags: ofdevloopdatanprunsmeanpd
1条回答
网友
1楼 · 发布于 2024-04-16 12:21:21

我建议使用多处理池,下面的代码已经测试了2000万条记录,它比原来的快了3倍,请尝试一下,当然代码还需要更多的改进来回答您关于性能缓慢的具体问题统计学.调和平均数. 注意:对于大于100米的记录,您可以获得更好的结果

import time
import numpy as np
import pandas as pd
import statistics
import multiprocessing

data = pd.DataFrame({'value1':np.random.randint(1000,size=20000000),
                     'value2':np.random.randint(24,size=20000000),
                     'value3':np.random.rand(20000000)+1,
                     'value4':np.random.randint(100000,size=20000000)})


def chunk_pivot(data):
    result = pd.pivot_table(data,index='value1',columns='value2',values='value3',aggfunc=lambda x: statistics.harmonic_mean(list(x)))
    return result


DataFrameDict=[]
for i in range(4):
    print(i*250,i*250+250)
    DataFrameDict.append(data[:][data.value1.between(i*250,i*250+249)])

def parallel_pivot(prcsr):
# 6 is a number of processes I've tested
    p = multiprocessing.Pool(prcsr)
    out_df=[]
    for result in p.imap(chunk_pivot, DataFrameDict):
        #print (result)
        out_df.append(result)
    return out_df

start =time.time()
dict_pivot=parallel_pivot(6)
multiprocessing_result=pd.concat(dict_pivot,axis=0)
#singleprocessing_result = pd.pivot_table(data,index='value1',columns='value2',values='value3',aggfunc=lambda x: statistics.harmonic_mean(list(x)))
end = time.time()
print(end-start)

相关问题 更多 >