Медленные коды из функций в Python Pandas - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь запустить специальную c функцию (stats.boxcox) быстрее в Python, но оба кода, которые я использую, работают очень медленно. Есть ли способ сделать это более эффективным способом в Python?

Первый код:

import numpy as np
import pandas as pd
from scipy import stats

df = pd.DataFrame(np.random.randint(1,100,size=(100, 4)), columns=list('ABCD'))

df_new = pd.DataFrame()
for column in list(df):
        df_new[column], lam = stats.boxcox(df[column])

Второй код:

import numpy as np
import pandas as pd
from scipy import stats

df = pd.DataFrame(np.random.randint(1,100,size=(100, 4)), columns=list('ABCD'))

df2_a = df.apply(lambda x: stats.boxcox(x))
df2_al = list(zip(*df2_a))
df2 = pd.DataFrame(df2_al[0]).T

1 Ответ

0 голосов
/ 14 июля 2020

Мы можем сделать это параллельно, используя ProcessPoolExecutor вот так:

from concurrent.futures import ProcessPoolExecutor

# utils function
def cpu_tasks(func, *args):

    # set chunksize to be even 
    with ProcessPoolExecutor(max_workers=None) as tp:
        result = tp.map(func, chunksize=10, *args)
    return list(result)

def get_box(s):
    return stats.boxcox(s)[0]

# make column list
obj_lst = [df[x].tolist() for x in df.columns]

ddf = pd.DataFrame(cpu_tasks(get_box, obj_lst)).T
ddf.columns = list('ABCD')

print(ddf.head())

           A          B          C          D
0   8.906146  23.867250  23.682790  16.669473
1  16.948358  11.752727  18.120534  15.678950
2  23.892165   7.159087   1.693517  17.055528
3  11.210063   5.720299  29.496806  13.348581
4   6.588403  29.940734  35.874053   4.101704
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...