Подобные функции в Python не дают одинакового результата - PullRequest
0 голосов
/ 07 ноября 2019

У меня проблема с двумя функциями, которые я определил в Python. Обе функции имеют схожие операции в первых нескольких строках тела функции, и одна из них будет запущена, а другая выдаст сообщение «Ошибка ключа». Я объясню подробнее ниже, но сначала приведем две функции.

#define function that looks at the number of claims that have a decider id that was dealer
#normalize by business amount   
def decider(df):
    #subset dataframe by date
    df_sub = df[(df['vehicle_repair_date'] >= Q1_sd) & (df['vehicle_repair_date'] <= Q1_ed)]

    #get the dealer id
    did = df_sub['dealer_id'].unique()

    #subset data further by selecting only records where 'dealer_decide' equals 1
    df_dealer_decide = df_sub[df_sub['dealer_decide'] == 1]

    #count the number of unique warranty claims
    dealer_decide_count = df_dealer_decide['warranty_claim_number'].nunique()

    #get the total sales amount for that dealer
    total_sales = float(df_sub['amount'].max())

    #get the number of warranty claims decided by dealer per $100k in dealer sales
    decider_count_phk = dealer_decide_count * (100000/total_sales)


    #create a dictionary to store results
    output_dict = dict()
    output_dict['decider_phk'] = decider_count_phk
    output_dict['dealer_id'] = did
    output_dict['total_claims_dealer_dec_Q1_2019'] = dealer_decide_count
    output_dict['total_sales2019'] = total_sales

    #convert resultant dictionary to dataframe
    sum_df = pd.DataFrame.from_dict(output_dict)

    #return the summarized dataframe
    return sum_df

#apply the 'decider' function to each dealer in dataframe 'data'
decider_count = data.groupby('dealer_id').apply(decider)  


#define a function that looks at the percentage change between 2018Q4 and 2019Q1 in terms of the number #of claims processed 
def turnover(df):

    #subset dealer records for Q1
    df_subQ1 = df[(df['vehicle_repair_date'] >= Q1_sd) & (df['vehicle_repair_date'] <= Q1_ed)]

    #subset dealer records for Q4
    df_subQ4 = df[(df['vehicle_repair_date'] >= Q4_sd) & (df['vehicle_repair_date'] <= Q4_ed)]

    #get the dealer id
    did = df_subQ1['dealer_id'].unique()

    #get the unique number of claims for Q1
    unique_Q1 = df_subQ1['warranty_claim_number'].nunique()

    #get the unique number of claims for Q1
    unique_Q4 = df_subQ4['warranty_claim_number'].nunique()

    #determine percent change from Q4 to Q1
    percent_change = round((1 - (unique_Q1/unique_Q4))*100, ndigits = 1)

    #create a dictionary to store results
    output_dict = dict()
    output_dict['nclaims_Q1_2019'] = unique_Q1
    output_dict['nclaims_Q4_2018'] = unique_Q4
    output_dict['dealer_id'] = did
    output_dict['quarterly_pct_change'] = percent_change

#apply the 'turnover' function to each dealer in 'data' dataframe    
dealer_turnover = data.groupby('dealer_id').apply(turnover)  

Каждая функция применяется к одному и тому же набору данных, и я получаю идентификатор дилера (переменная в теле функции)путь. Я также использую тот же код groupby, а затем apply, но когда я запускаю две функции, функция decider запускается, как и ожидалось, но функция turnover выдает следующую ошибку:

KeyError: 'dealer_id'.

Сначала я подумал, что это может быть проблема с областью видимости, но на самом деле это не имеет смысла, поэтому, если кто-то сможет пролить свет на то, что может происходить, я был бы очень признателен.

Спасибо, Кертис

1 Ответ

1 голос
/ 07 ноября 2019

IIUC, вы применяете функцию оборота после решающей функции. Вы получаете ключевую ошибку, так как dealer_id присутствует как индекс, а не как столбец. Попробуйте заменить

decider_count = data.groupby('dealer_id').apply(decider)

на

decider_count = data.groupby('dealer_id', as_index=False).apply(decider)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...