Ускорение преобразования pandas в numpy - PullRequest
1 голос
/ 16 июня 2020

У меня Pandas df примерно из 2,5 млн строк с мультииндексом вида: ('assetCode', 'date') и примерно 60 столбцов.

Я пытаюсь преобразовать это в 3D numpy матрицу:

assetCodes = X_calculated.index.get_level_values(0).unique().sort_values().to_numpy()
dates = X_calculated.index.get_level_values(1).unique().sort_values().to_numpy()
columns = X_calculated.columns.to_numpy()
myData = np.empty((assetCodes.size, dates.size, columns.size))

def updateMatrix(row):
    idx = row.name
    assetLabel = np.searchsorted(assetCodes, idx[0])
    dateLabel = np.where(dates == idx[1])
    myData[assetLabel][dateLabel] = row.to_numpy()

X_calculated.apply(updateMatrix, axis=1)

Эта операция занимает очень много времени. Есть ли способ быстрее?

1 Ответ

1 голос
/ 16 июня 2020

Я думаю, что если у вас уже есть все комбинации assetCode и date в вашем фрейме данных, вы можете сделать это с изменением формы:

# example data
X_calculated = pd.DataFrame(np.arange(36).reshape(9, -1), 
                           index=pd.MultiIndex.from_product([range(101,104),
                                                             range(111,114)],
                                                            names=('assetCode','date')), 
                           columns=list('abcd'))

# get dimensions
nb_asset =  X_calculated.index.get_level_values(0).nunique()
nb_dates = X_calculated.index.get_level_values(1).nunique()
nb_cols = len(X_calculated.columns)

# create myData
myData = X_calculated.sort_index().to_numpy().reshape(nb_asset, nb_dates, nb_cols)
print (myData) #same result than with your code
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]

 [[24 25 26 27]
  [28 29 30 31]
  [32 33 34 35]]]

Если у вас отсутствуют комбинации, вы можете использовать reindex раньше pd.MultiIndex.from_product со значением unique на обоих уровнях индекса. Мне больше не нужно sort_index, я думаю, поскольку новый multiIndex генерируется отсортированным

assetCodes = X_calculated.index.get_level_values(0).unique().sort_values()
dates = X_calculated.index.get_level_values(1).unique().sort_values()

myData = (X_calculated.reindex(pd.MultiIndex.from_product([assetCodes, dates]))
                      .to_numpy()
                      .reshape(len(assetCodes), len(dates), len(X_calculated.columns))
         )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...