Что у меня есть?
У меня есть df pd.DataFrame со столбцом «мощность» и столбцом «отметка времени». У меня также есть значение мощности, которое называется «x_power».
Чего я хочу?
Я пытаюсь выяснить, сколько энергии производится выше и ниже «x_power» (например, x_power = 900), для этого я думаю сделать интеграл:
Ось у - мощность
Ось x - метка времени
Розовая область - произведенная энергия выше x_power
Зеленая зона - произведенная энергия ниже x_power
from scipy.interpolate import InterpolatedUnivariateSpline
x = df['timestamp'].to_numpy()
y = df['power'].to_numpy()
max = np.max(x)
min = np.min(x)
f = InterpolatedUnivariateSpline(x, y, k=1) # k=1 gives linear interpolation
f.integral(min , max)
Выход - это область под графиком.
Есть ли простой способ рассчитать выше и ниже «x_power» без многократного интегрирования?
Как возможно, что ваша синяя кривая идет назад во времени с отметкой времени 32280 - 32290?
Это ошибка, но она не имеет отношения к вопросу
Так как pandas... особенный в этом: столбец действительно является отметкой времени, а не datetime или float/int (как указано на вашем графике)?
Да, это временная метка, мой график - это пример, который я сделал вручную в Excel
Чтобы интегрировать площадь нашего графика по x_power, вам нужно "опустить" ваши значения y таким образом, чтобы "новый 0" находится на уровне x_power.
Затем вы должны обрезать отрицательные значения до нуля.
Но поскольку вы выбрали только точки всего сюжета, первым шагом должно быть создание интерполированной версии вашей линии по производству электроэнергии, например. с шагом 1 и только потом выполнить 2 вышеуказанных шага.
Код для этого:
intStep = 1 # Interpolation step
# Interpolated x and y
xInt = np.arange(min, max + 1, intStep)
yInt = (np.interp(xInt, x, y) - x_power).clip(min=0)
Чтобы увидеть эту строку, вы можете запустить:
fig, ax = plt.subplots()
ax.grid(True)
plt.plot(xInt, yInt)
plt.show()
А чтобы интегрировать эту функцию, запустите свой код, но на приведенных выше исходных данных:
f = InterpolatedUnivariateSpline(xInt, yInt, k=1)
result = f.integral(min, max)
Я не понимаю, что вы подразумеваете под «интегральной» и «множественной интеграцией» в этом контексте. Пожалуйста, включите некоторые примеры данных (с кодом), ожидаемый результат и то, что вы пробовали до сих пор, в основной пост.