Ускорение применения функции к списку кадров данных панд - PullRequest
0 голосов
/ 14 мая 2019

У меня есть данные временных рядов, где каждая точка данных представляет собой фрейм данных pandas, то есть список фреймов данных.У меня также есть функция foo, которая работает с каждой точкой данных.Цель состоит в том, чтобы применить функцию ко всем данным временных рядов и сделать это эффективно.

Я векторизовал функцию foo, чтобы она работала со всем фреймом данных и достигла ускорения примерно в 32 раза.

Исходный код выглядит следующим образом:

def bar(row, cols):
    return tuple([row[col] for col in cols])

def foo(df, cols):
    keys = set()
    for index, row in df.iterrows():
        key = bar(row, cols)
        keys.add(key)

    # do calculations on keys that returns a numeric output, result
    return result # float64

Векторизованный код выглядит следующим образом:

def vect_bar(df, cols):
    df['key'] = df[cols].values.sum(axis=1)
    return df

def vect_foo(df, cols):
    df['key'] = ""
    df = vect_bar(df, cols)
    keys = df.key.unique()

    # do calculations on keys that returns a numeric output, result
    return result # float64

Результаты синхронизации следующие:

%timeit -n 100 foo(df, cols)
100 loops, best of 3: 42.9 ms per loop

%timeit -n 100 vect_foo(df, cols)
100 loops, best of 3: 1.34 ms per loop

Примечание: cols - это список имен столбцов.Все элементы фрейма данных являются строками и объекта dtype.

Однако для применения vect_foo ко всем точкам данных все еще требуется много времени.Как я могу ускорить процесс?

Я попытался создать серию панд из данных и использовать series.apply().Тем не менее, это не вызвало какого-либо ускорения по сравнению с обычным циклическим подходом.

EDIT : Если мне неясно ранее, учитывая кадр данных, функция vect_foo довольно эффективна. Мне нужен способ ускорить применение vect_foo ко всем точкам данных, то есть к списку фреймов данных.

data_series = pd.Series(data)
def apply_data():
    return data_series.apply(vect_foo, cols)

data - это список фреймов данных пандт.е. data = [df1, df2, ..., df50K]

Здесь я попробовал pandas.Series.apply(), но он работал аналогично нормальному циклическому подходу.

1 Ответ

0 голосов
/ 14 мая 2019
import pandas as pd

def foo(row, cols):
    row['keys'] = row[cols].sum()
    return row

df.apply(foo, axis=1)

просто создайте свою вспомогательную функцию и используйте функцию apply.обычно это самый эффективный способ применить функцию к строкам / столбцам в pandas

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...