У меня есть данные временных рядов, где каждая точка данных представляет собой фрейм данных 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()
, но он работал аналогично нормальному циклическому подходу.