Я получил данные 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 минуты.Где отверстия три колонки будут работать одновременно, но я могу это выяснить.
РЕДАКТИРОВАТЬ: добавлена матрица экзаменов