Método alternativo para dos vías de interpolación

Bjc51192:

Escribí algo de código para llevar a cabo la interpolación en base a dos criterios, la cantidad de seguro y el deducible%. He tenido problemas para hacer la interpolación de todos a la vez, dividir, así que tenía la mesa hf filtering.The contiene los datos conocidos que estoy utilizando para basar mis resultados de interpolación df on.Table contiene los nuevos datos que necesita los factores desarrollados interpolados en base a hf .

Ahora mismo mi torno al trabajo está filtrando primero cada tabla en función del porcentaje ded_amount y luego realizar la interpolación en una trama de datos vacía y añadiendo después de cada bucle.

Siento que este es ineficiente, y no hay una mejor manera de realizar esto, mirando a escuchar algunos comentarios sobre algunas mejoras que puedo hacer. Gracias

Los datos de prueba proporcionan a continuación.

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)
Alan:

Sí, hay una manera de hacerlo más eficiente, sin tener que hacer un montón de tramas de datos intermedios y añadiéndolos. echar un vistazo a este código:

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)

La forma en que funciona la función lambda es: No hace fila por fila a través de la columna de 'Factor' y le da un valor en función de las condiciones en las otras columnas.

Devuelve la interpolación de la columna de la AOI de df (esto es lo que llamó Xnueva) si el importe de deducción partidos, de lo contrario sólo devuelve la misma cosa posterior.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=387560&siteId=1
Recomendado
Clasificación