Использование R.dot (вектор) на фрейме данных панд - PullRequest
0 голосов
/ 18 октября 2018

Я получил данные Dataframe для нескольких объектов в направлении x, y, z со временем в виде индекса, подобного следующему:

df = pd.DataFrame(index=range(0,10), columns=pd.MultiIndex.from_tuples([("foo","x"),("foo","y"),("foo","z"),("bar","x"),("bar","y"),("bar","z")]), data=np.random.rand(10,6))
        foo                           bar                    
          x         y         z         x         y         z
0  0.972557  0.711319  0.190318  0.134453  0.903132  0.847353
1  0.922516  0.369936  0.940566  0.847049  0.180356  0.925252
2  0.843484  0.817282  0.245280  0.614433  0.959601  0.571053
3  0.409911  0.643583  0.723806  0.652375  0.532277  0.278601
4  0.322778  0.270078  0.822233  0.224622  0.808430  0.786399
5  0.323539  0.009899  0.175882  0.897813  0.287025  0.648503
6  0.180822  0.199223  0.573267  0.739941  0.479798  0.048885
7  0.961212  0.085247  0.092500  0.629304  0.582119  0.788289
8  0.960532  0.558652  0.676768  0.235705  0.255208  0.232676
9  0.213508  0.042688  0.238658  0.685202  0.760240  0.860439

мне нужно использовать матрицу вращения, различную для каждогоСущность для поворота данных x, y, z и замены старых значений новыми.в настоящее время делается для каждого индекса индивидуально, например так:

for entity in df.columns.levels[0]:
    R = np.matrix("[-0.70710678,-0.70710678,0.];[0.70710678,-0.70710678,0.];[0.,0.,1.]")
    for row in df.index:
                try:
                    vector = np.array(
                        [[df.loc[row, (entity, x)]], [df.loc[row, (entity, y)]], [df.loc[row, (entity, z)]]])
                    rvector = R.dot(vector)
                    df.loc[row, (entity, x)] = complex(rvector[0])
                    df.loc[row, (entity, y)] = complex(rvector[1])
                    df.loc[row, (entity, z)] = complex(rvector[2])
                except ValueError as e:
                    logger.error(e)
                    logger.debug(f"{vector} {R} {row}")

Я попытался придумать более простой / быстрый подход.Я получил фрейм данных с 174 сущностями и 1255 временными шагами, с моей текущей реализацией для расчета одной сущности требуется около 1 минуты.Где отверстия три колонки будут работать одновременно, но я могу это выяснить.

РЕДАКТИРОВАТЬ: добавлена ​​матрица экзаменов

1 Ответ

0 голосов
/ 18 октября 2018

Итак, после еще одной попытки получить решение:

    entity_data = df.loc[:, entity]
    data = R.dot(entity_data.transpose()).transpose()
    entity_data_new = pd.DataFrame(data=data, index=entity_data.index,
                                   columns=entity_data.columns)
    df.loc[:, entity] = entity_data_new.values

это должно сократить время вычислений почти до линейного времени

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