Интерполировать между двумя столбцами Dataframe - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь интерполировать значение на основе позиции числа в другом столбце.Возьмем, к примеру, этот столбец:

Coupon  Price
9.5     109.04
9.375   108.79
9.25    108.54
9.125   108.29
9       108.04
8.875   107.79
8.75    107.54
8.625   107.29
8.5     107.04
8.375   106.79
8.25    106.54

Допустим, у меня есть число, подобное 107. Я хочу иметь возможность найти относительное расстояние 107 от 107.04 и 106.79, чтобы интерполировать значение, имеющее одинаковое относительное расстояние между8,5 и 8,375, значения купона на тот же индекс.Это возможно?Я могу решить это в Excel, используя метод FORECAST, но хочу знать, можно ли это сделать в Python.

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Добро пожаловать в переполнение стека.

Для этого нам нужно создать пользовательскую функцию, если только я не знаю стандартной библиотечной функции, что вполне возможно. Я собираюсь создать функцию, которая позволит вам вводить облигацию по цене, и она будет вставлена ​​в информационный кадр с соответствующим купоном.

Предполагается, что мы начинаем с отсортированного кадра данных.

print(df)

    Coupon   Price
0    9.500  109.04
1    9.375  108.79
2    9.250  108.54
3    9.125  108.29
4    9.000  108.04
5    8.875  107.79
6    8.750  107.54
7    8.625  107.29
8    8.500  107.04
9    8.375  106.79
10   8.250  106.54

Я вставил комментарии в функцию.

def add_bond(Price, df):
    # Add row
    df.loc[df.shape[0]] = [np.NaN, Price]
    df = df.sort_values('Price', ascending=False).reset_index(drop=True)

    # Get index
    idx = df[df['Price'] == Price].head(1).index.tolist()[0]

    # Get the distance from Prices from previous row to next row
    span = abs(df.iloc[idx-1, 1] - df.iloc[idx +1, 1]).round(4)

    # Get the distance and direction from Price from previous row to new value
    terp = (df.iloc[idx, 1] - df.iloc[idx-1, 1]).round(4)

    # Find the percentage movement from previous in percentage.
    moved = terp / span

    # Finally calculate the move from the previous for Coupon.
    df.iloc[idx, 0] = df.iloc[idx-1,0] + (abs(df.iloc[idx-1,0] - df.iloc[idx+1, 0]) * (moved))

    return df

Функция для расчета купона новой облигации с использованием Price в кадре данных.

# Add 107
df =  add_bond(107, df)
print(df)

    Coupon   Price
0    9.500  109.04
1    9.375  108.79
2    9.250  108.54
3    9.125  108.29
4    9.000  108.04
5    8.875  107.79
6    8.750  107.54
7    8.625  107.29
8    8.500  107.04
9    8.480  107.00
10   8.375  106.79
11   8.250  106.54

Добавить еще один.

# Add 107.9
df = add_bond(107.9, df)
print(df)

    Coupon   Price
0    9.500  109.04
1    9.375  108.79
2    9.250  108.54
3    9.125  108.29
4    9.000  108.04
5    8.930  107.90
6    8.875  107.79
7    8.750  107.54
8    8.625  107.29
9    8.500  107.04
10   8.480  107.00
11   8.375  106.79
12   8.250  106.54

Если этот ответ соответствует вашим потребностям, не забудьте выбрать правильный ответ. Благодарю.

0 голосов
/ 11 июля 2019

Вероятно, есть функция, которая работает где-то за вас, но я советую запрограммировать ее самостоятельно, это совсем не сложно, и это хороший пример программирования. Просто найдите наклон в этом сегменте и используйте уравнение прямой линии:

(y-y0) = ((y1-y0)/(x1-x0))*(x-x0) -> y = ((y1-y0)/(x1-x0))*(x-x0) + y0

Where:

x -> Your given value (107)
x1 & x0 -> The values right above and below (107.04 & 106.79)
y1 & y0 -> The corresponding values to x1 & x0 (8.5 & 8.375)
y -> Your target value.

Просто базовая математика в средней школе; -)

...