Я работаю с данными, поступающими от датчика положения, который сообщает в угловых координатах (шаг, рулон и рыскание). Показания датчиков таковы, что максимальное показание составляет 180 градусов. Проходя мимо этого, показания переходят на отрицательные градусы. Например, слегка колеблющийся ряд показаний может пойти что-то вроде:Обработка обертывания значений в pandas
178.8
178.9
-178.8
-178.0
-179.0
180.0
179.0
Я в настоящее время обработки, проверив все значения последовательно в цикле. Я получаю дельта между двумя последовательными показаниями и сохраняю текущую сумму, чтобы получить текущее угловое положение. Если я перехожу из третьего квадранта (90 < = предыдущее значение < = 180) в четвертое (-180 < = текущее значение < = -90), я добавляю 360 к текущему значению, прежде чем принимать дельту. Если я поеду четвертый квадрант в 3-й, я вычитаю 360, прежде чем принимать дельту. Например:
Yaw = inData['Yaw']
cum_sum = Yaw[0]
for i in range(1, Yaw)):
x_prev = Yaw[i-1]
x = Yaw[i]
if 90 <= x_prev and x_prev <= 180 and -180 <= x and x <= -90:
x = x + 360
elif -180 <= x_prev and x_prev <= -90 and 90 <= x and x <= 180:
x = x - 360
else:
pass
delta = x - x_prev
cum_sum += delta
Здесь входных данных, является dataframe, содержащий угловые положения из нескольких осей, и «рыскание» представляет собой серию в этом dataframe.
Если бы я мог выполнить последовательную поправку к значениям угла, я мог бы создать серию дельт и сделать кумулятивную сумму, чтобы получить позицию. Однако добавление 360 ко всем показаниям или работа с углами по модулю 360 только перемещает точку перевала с пересечения между +/- 180 и пересечением между 0 и 360.
Учитывая, что у меня уже есть эти показания в DataFrame/Series, мне было интересно, есть ли более Pythonic (и более быстрый) способ сделать это.
Почему вы не добавить 360 градусов только значения, которые меньше нуля? – BrenBarn
Что-то вроде: 'inData.Yaw [inData.Yaw <0.0] + = 360.' – screenpaver
Обратите внимание, что это также работает и более читаемо:' -180 <= x <= -90'. Учитывая, что -180 является показанием min, вы можете просто использовать 'x <= -90'. Но я все равно не буду делать этот расчет в цикле. Посмотрите на мое векторное решение ниже. – Alexander