【问题标题】:Why my code is working for one product and not the other?为什么我的代码适用于一种产品而不适用于另一种产品?
【发布时间】:2023-01-25 03:29:44
【问题描述】:

我有两种产品。一个为 10 年,另一个为 15 年(10 年机构合规和 15 年机构合规)。当我使用 10 时,它工作正常,但每当我尝试对 15 进行计算时,它什么也没有给我。一个空框。两种产品的逻辑相同。为什么我的代码适用于一种产品而不适用于另一种产品? 这是我的代码和我正在阅读的用于获取和计算 final_df 的 excel 文件。

final_df 适用于 10 年的产品,但不适用于 15 年的产品,尽管有记录,但它返回一个空 df 作为最终输出。为什么?

链接到我正在阅读的 excel 文件 -> https://drive.google.com/drive/folders/11BlzOkQJ2Uj88j_QvLjGdISlzLOKowNg

import pandas as pd
from datetime import datetime

file_path = r'C:\Users\admin\Downloads\retail_pricing\test\Retail_Pricing - RSG.xlsx'
main_df = pd.read_excel(file_path, engine='openpyxl', sheet_name='Source')
list_of_products = main_df["LoanID"].unique().tolist()
print(list_of_products)

def group_loans():
    group_df = main_df.groupby("LoanID")
    individual_loanid_df = group_df.get_group('10 Year Agency Conforming')
    final_df = final_range_output(individual_loanid_df,4,4)
    print(final_df)
    final_df.to_excel('final_output.xlsx', index=False)


def final_range_output(df,upper_row_no,lower_row_no):
    
    # Finding par rate
    df_60 = df[df['LockPeriod'] == 60]

    df_60['Check'] = abs(1-df_60['MarketPrice']/100)
    min_check = df_60['Check'].min()
    

    min_row = df_60.loc[df_60['Check'] == min_check]
    par_rate = float(min_row.NoteRate)
    print(par_rate)
    

    # Finding range
    idx = df.index[df['NoteRate'] == par_rate].to_list()[0]
    
    upper = (idx - (upper_row_no * 5))
    lower = (idx + (lower_row_no * 5) + 5) 
    
    range_df = df.iloc[upper : lower]

    # Rounding to nearest 1/8
    range_df['MarketPrice_Round'] = range_df['MarketPrice'].apply(lambda a: ((round((a*8)+0.5,0) - 1) / 8))

    # Final output
    range_df['MarketPrice_Final'] = range_df['MarketPrice'].apply(lambda a: 100 - a)
    return range_df
    
    
group_loans()

【问题讨论】:

  • individual_loanid_df = group_df.get_group('10 Year Agency Conforming')你这里没有常量吗?
  • 是的。当我使用这一行 individual_loanid_df = group_df.get_group('10 Year Agency Conforming') 并进行计算然后返回 df 以将其保存在 final_df 中时,它起作用了。但是,当我通过编写 individual_loanid_df = group_df.get_group('15 Year Agency Conforming') 将值更改为 15 然后进行计算时,它不会进行计算,因为它可以使用 10 年产品进行计算。你可以自己检查一下。只需将这一行的值从 10 更改为 15 并检查最终输出。你会明白我在说什么。 @ArtyomAkselrod

标签: python python-3.x pandas dataframe


【解决方案1】:

对于这 15 年,数据框在以下步骤变为空白:

range_df = df.iloc[upper : lower]

对于您发送 upper = 150 和 lower = 195 的示例,但此时您的数据框只有 45 行......

我没有花时间了解您的意图,但我建议您使用 vscode 的调试模式,并一次执行每一步以了解您的输出。

https://code.visualstudio.com/docs/python/debugging

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 2013-04-20
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多