Альтернативный метод двухсторонней интерполяции - PullRequest
3 голосов
/ 31 марта 2020

Я написал код для выполнения интерполяции на основе двух критериев: страховой суммы и вычитаемой суммы%. Я изо всех сил пытался сделать интерполяцию все сразу, поэтому разделил фильтрацию. Таблица hf содержит известные данные, которые я использую, чтобы основывать свои результаты интерполяции. Таблица df содержит новые данные, которые нуждаются в сложившихся факторах, интерполированных на основе hf ,

Прямо сейчас моя работа вокруг - сначала отфильтровать каждую таблицу на основе процента ded_amount, а затем выполнить интерполяцию в пустой фрейм данных и добавлять после каждого l oop.

Я чувствую себя так неэффективно, и есть лучший способ сделать это, надеясь услышать некоторые отзывы о некоторых улучшениях, которые я могу сделать. Спасибо

Данные испытаний приведены ниже.

import pandas as pd
from scipy import interpolate

known_data={'AOI':[80000,100000,150000,200000,300000,80000,100000,150000,200000,300000],'Ded_amount':['2%','2%','2%','2%','2%','3%','3%','3%','3%','3%'],'factor':[0.797,0.774,0.739,0.733,0.719,0.745,0.737,0.715,0.711,0.709]}
new_data={'AOI':[85000,120000,130000,250000,310000,85000,120000,130000,250000,310000],'Ded_amount':['2%','2%','2%','2%','2%','3%','3%','3%','3%','3%']}

hf=pd.DataFrame(known_data)
df=pd.DataFrame(new_data)

deduct_fact=pd.DataFrame()
for deduct in hf['Ded_amount'].unique():
    deduct_table=hf[hf['Ded_amount']==deduct]
    aoi_table=df[df['Ded_amount']==deduct]
    x=deduct_table['AOI']
    y=deduct_table['factor']
    f=interpolate.interp1d(x,y,fill_value="extrapolate")
    xnew=aoi_table[['AOI']]
    ynew=f(xnew)
    append_frame=aoi_table
    append_frame['Factor']=ynew
    deduct_fact=deduct_fact.append(append_frame)

1 Ответ

3 голосов
/ 31 марта 2020

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

from scipy import interpolate
known_data={'AOI':[80000,100000,150000,200000,300000,80000,100000,150000,200000,300000],'Ded_amount':['2%','2%','2%','2%','2%','3%','3%','3%','3%','3%'],'factor':[0.797,0.774,0.739,0.733,0.719,0.745,0.737,0.715,0.711,0.709]}
new_data={'AOI':[85000,120000,130000,250000,310000,85000,120000,130000,250000,310000],'Ded_amount':['2%','2%','2%','2%','2%','3%','3%','3%','3%','3%']}

hf=pd.DataFrame(known_data)
df=pd.DataFrame(new_data)

# Create this column now
df['Factor'] = None

# I like specifying this explicitly; easier to debug
deduction_amounts = list(hf.Ded_amount.unique())
for deduction_amount in deduction_amounts:
    # You can index a dataframe and call a column in one line
    x, y = hf[hf['Ded_amount']==deduction_amount]['AOI'], hf[hf['Ded_amount']==deduction_amount]['factor']

    f = interpolate.interp1d(x, y, fill_value="extrapolate")

    # This is the most important bit. Lambda function on the dataframe
    df['Factor'] = df.apply(lambda x: f(x['AOI']) if x['Ded_amount']==deduction_amount else x['Factor'], axis=1)

Принцип работы лямбда-функции заключается в следующем: она проходит строка за строкой через столбец «Фактор» и присваивает ей значение на основе условий других столбцов.

Возвращает интерполяцию столбца AOI в df (это то, что вы назвали xnew), если сумма вычетов совпадает, в противном случае просто возвращается то же самое.

...