Я работаю с apis, которые возвращают большие кадры данных панд. Мне не известен быстрый способ итерации по всему фрейму данных, поэтому я приведу к словарю с to_dict()
.
После того, как мои данные представлены в виде словаря, производительность в порядке. Однако операция to_dict()
обычно является узким местом для производительности.
Я часто группирую столбцы информационного кадра вместе, чтобы сформировать мультииндекс, и использую ориентацию «индекс» для to_dict()
. Не уверен, что большие многоиндексные диски имеют низкую производительность.
Есть ли более быстрый способ разыграть кадр данных панд? Может быть, есть лучший способ итерации непосредственно по фрейму данных без приведения? Не уверен, есть ли способ, которым я мог бы применить векторизацию.
Ниже приведен пример кода, который имитирует проблему с таймингами:
import pandas as pd
import random as rd
import time
#Given a dataframe from api (model as random numbers)
df_columns = ['A','B','C','D','F','G','H','I']
dict_origin = {col:[rd.randint(0,10) for x in range(0,1000)] for col in df_columns}
dict_origin = pd.DataFrame(dict_origin)
#Transform to pivot table
t0 = time.time()
df_pivot = pd.pivot_table(dict_origin,values=df_columns[-3:],index=df_columns[:-3])
t1 = time.time()
print('Pivot Construction takes: ' + str(t1-t0))
#Iterate over all elements in pivot table
t0 = time.time()
for column in df_pivot.columns:
for row in df_pivot[column].index:
test = df_pivot[column].loc[row]
t1 = time.time()
print('Dataframe iteration takes: ' + str(t1-t0))
#Iteration over dataframe too slow. Cast to dictionary (bottleneck)
t0 = time.time()
df_pivot = df_pivot.to_dict('index')
t1 = time.time()
print('Cast to dictionary takes: ' + str(t1-t0))
#Iteration over dictionary is much faster
t0 = time.time()
for row in df_pivot.keys():
for column in df_pivot[row]:
test = df_pivot[row][column]
t1 = time.time()
print('Iteration over dictionary takes: ' + str(t1-t0))
Спасибо!