Как интерполировать 0 между тремя значениями в Python?

Скажем, у меня есть три столбца

1,2,3 со значениями -5, 5, 15

Мне нужно найти, где между столбцами находится 0, и сделать его новым столбцом.

Здесь ответ будет 1,5 (на полпути между столбцами 1 и 2).

Как выполнить линейную интерполяцию в Python, чтобы сделать это для многих строк?

Необходимо включить все три столбца, чтобы получить ответ типа 2,2.

Если больше 3, можно экстраполировать или просто поставить 3 или нет.

Спасибо!

Что делать, если три значения равны -5, 5, -5… или даже 1,1,1?

lastchance 20.08.2024 18:31

Поправьте меня, если я ошибаюсь, но линейная интерполяция работает только с двумя точками, так как же вы ожидаете, что она будет включать три? Тем не менее, вы получите результат, подобный 2,2, если точка пересечения с x находится между двумя точками. Кроме того, является ли это интерполяцией, если вы находите точку пересечения с x? Я думал, что интерполяция означает, что точки известны заранее, а не рассчитываются.

wjandrea 20.08.2024 19:27

Пожалуйста, предоставьте пример фрейма данных и желаемый результат. Советы можно найти в разделе Как сделать хорошие воспроизводимые примеры панд

wjandrea 20.08.2024 19:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из приведенного выше кода не очень понятно, как вы хотите обобщить код, но вот мое решение:

row = [-5, 5, 15]

for idx, val in enumerate(row):

    if idx == len(row) - 1:
        print("No change of sign.")
        break

    if row[idx] < 0 and row[idx + 1] > 0:
        print(f"The change of sign occurs in column {idx+1+.5}.")
        break

# > The change of sign occurs in column 1.5.

Вы не используете val в цикле, поэтому лучше использовать диапазон: for idx in range(len(row)-1). А затем вместо idx == len(row) - 1 поставьте в цикле else: else: print("No change of sign."). (Примечание на полях: мне нравится оставлять комментарий, еще: # без перерыва, чтобы было понятно.)

wjandrea 20.08.2024 17:49
Ответ принят как подходящий

Вы можете использовать numpy.interp для каждой строки. Если цель находится за пределами границ, вы получите ближайшее значение x.

Пример:

df = pd.DataFrame([[-5, 5, 15], [-5, -2, 6],[1, 2, 3], [-3, -2, -1]],
                  columns=[1,2,3])

df['x_at_0'] = [np.interp(0, xp, df.columns) for xp in df.to_numpy()]

Выход:

   1  2   3  x_at_0
0 -5  5  15    1.50
1 -5 -2   6    2.25
2  1  2   3    1.00
3 -3 -2  -1    3.00

Другие вопросы по теме