Python 在for循环中快速设置数据帧值的有效方法?可以矢量化吗?
快速概述我的目标: 我试图制作一个包含现金流支付数组的数据框架。行是m个贷款数,列是n个日期数,值是这些日期的相关付款(如果有)。我目前的方法是生成mxn数据帧,然后在每个贷款的每个日期查找每个现金流,并将数据帧的相应部分设置为该值Python 在for循环中快速设置数据帧值的有效方法?可以矢量化吗?,python,pandas,Python,Pandas,快速概述我的目标: 我试图制作一个包含现金流支付数组的数据框架。行是m个贷款数,列是n个日期数,值是这些日期的相关付款(如果有)。我目前的方法是生成mxn数据帧,然后在每个贷款的每个日期查找每个现金流,并将数据帧的相应部分设置为该值 cashflow_frame = pd.DataFrame(columns = all_dates, index = all_ids) 我目前有一个for循环,它可以实现我想要的功能,但是执行起来太长了。我已经对代码进行了行分析: Timer unit: 1e-0
cashflow_frame = pd.DataFrame(columns = all_dates, index = all_ids)
我目前有一个for循环,它可以实现我想要的功能,但是执行起来太长了。我已经对代码进行了行分析:
Timer unit: 1e-06 s
Total time: 38.6231 s
Line # Hits Time Per Hit % Time Line Contents
==============================================================
2 def frameMaker():
3 3642 1208212 331.7 3.1 for ids, slices in id_grouped:
4 3641 3542 1.0 0.0 data_slice = slices
5 3641 17040 4.7 0.0 original_index = data_slice.index.values
6 3641 583252 160.2 1.5 funded_amt = -data_slice.ix[original_index[0],'outstanding_princp_beg']
7 3641 2091958 574.6 5.4 issue_d = data_slice.ix[original_index[0], 'issue_d']
8 3641 346722 95.2 0.9 pmt_date_ranges = data_slice['date'].values
9 3641 101051 27.8 0.3 date_ranges = np.append(issue_d, pmt_date_ranges)
10 3641 310452 85.3 0.8 rest_cfs = data_slice['pmt_amt_received'].values
11 3641 50856 14.0 0.1 cfs = np.append(funded_amt, rest_cfs)
12
13 3641 321601 88.3 0.8 if data_slice.ix[original_index[-1], 'charged_off_recovs'] > 0:
14 412 6094 14.8 0.0 cfs[-1] = (data_slice.ix[original_index[-1], 'charged_off_recovs'] -
15 412 35943 87.2 0.1 data_slice.ix[original_index[-1], 'charged_off_fees'])
16
17 3641 33546392 9213.5 86.9 cashflow_frame.ix[ids,date_ranges] = cfs
因此,我可以看到在数据帧中设置数组是最慢的。我还注意到,由于我有更多的贷款,贷款速度呈指数级下降/所需时间增加了%。为什么它变得越来越慢?在数据帧中设置值的更快方法是什么?有没有办法将操作矢量化
我正在考虑为每笔贷款生成长度相等的数组,然后从(dict[loan id]=[cashflows])创建cashflow_框架,但如果有办法显著加快速度,我想使用我的原始代码
更多详情:
id\u grouped是按“id”分组的顶级数据帧。数据从csv中读取。
我的代码生成较低的数据帧,这正是我想要的,但它需要太长的时间。
第一个数据帧是850万行,大约有640000个贷款ID。输入和所需输出的示例?一般规则是一次点击即可构建一个数据帧。拥有一个数组的数据帧通常不是一个好主意,最好只是拥有一个多索引。为了提供帮助,一些
id\u分组的示例数据将非常有用。您的输入和所需输出的示例?一般规则是在一次点击中构建一个数据帧。拥有一个数组的数据帧通常不是一个好主意,最好只是拥有一个多索引。为了提供帮助,一些id\u分组的示例数据将非常有用。