如何在Python嵌套循环中添加迭代器且不新增额外循环?
问题:嵌套循环中整合日期迭代逻辑的优化方案
我想在现有嵌套循环里加入日期迭代逻辑,但不想新增额外循环。End是我的日期天数列表,它的长度和year的长度一致。另外,把日期字段添加到DataFrame data1中是不是更优的解决方案?
数据示例
state_list = ['A','B','C','D','E'] # 可选状态列表 data1 = pd.DataFrame({"cust_id": ['x111','x112'], # 客户数据 "state": ['B','E'], "amount": [1000,500], "year":[3,2], "group":[10,10], "loan_rate":[0.12,0.13]}) data1['state'] = pd.Categorical(data1['state'], categories=state_list, ordered=True).codes lookup1 = pd.DataFrame({'year': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'lim %': [0.1, 0.1, 0.1, 0.1, 0.1,0.1, 0.1, 0.1, 0.1, 0.1]}).set_index(['year']) matrix_data = np.arange(250).reshape(10,5,5) # 按年份(1-10)和状态(A-E)划分的3维矩阵 end = pd.Timestamp(year=2021, month=9, day=1) # 生成日期列表 df = pd.DataFrame({"End": pd.date_range(end, periods=10, freq="M")}) df['End']=df['End'].dt.day End=df.values
当前计算逻辑
results={} for cust_id, state, amount, start, group, loan_rate in data1.itertuples(name=None, index=False): res = [amount * matrix_data[start-1, state, :]] for year in range(start+1, len(matrix_data)+1,): res.append(lookup1.loc[year].iat[0] * np.array(res[-1])) res.append(res[-1] * (loan_rate)) # 这里需要加入*(End/365)的日期迭代逻辑 res.append(res[-1]+ 100) res.append(multi_dot([res[-1],matrix_data[year-1]])) results[cust_id] = res
预期输出示例
{'x111': [array([55000, 56000, 57000, 58000, 59000]), array([5500., 5600., 5700., 5800., 5900.]), array([56.055, 57.074, 58.093, 59.112., 60.132.]), ...
关键计算说明
第3行的计算规则为:(数组元素 * loan_rate) * (对应End日期天数/365),例如示例中的((5500 * 0.12) * (30/365))。需要将数组array([5500., 5600., 5700., 5800., 5900.])整体乘以loan_rate * (对应End天数/365)的乘积。
内容的提问来源于stack exchange,提问作者user1000x
相关产品推荐
相关产品推荐

