[docs]defoutput_sample_mean(items,items_start_end,row_used_indices,reordered_outlosses,period_weights,max_summary_id,no_of_periods,):# Track number of entries per summary_idsummary_counts=np.zeros(max_summary_id,dtype=np.int32)# First pass to count how many times each summary_id appearsforidxinrow_used_indices:period_no,summary_id=get_sample_mean_outlosses_idx_data(idx,no_of_periods)summary_counts[summary_id-1]+=1# Compute cumulative start indicespos=0foridxinrange(max_summary_id):ifsummary_counts[idx]>0:items_start_end[idx][0]=pos# Start indexpos+=summary_counts[idx]items_start_end[idx][1]=pos# End index# Reset summary counts for inserting datasummary_counts[:]=0# Track which period_no are used if period_weights existsis_weighted=len(period_weights)>0used_period_no=np.zeros(len(period_weights),dtype=np.bool_)# Second pass to populate the data arrayforidxinrow_used_indices:period_no,summary_id=get_sample_mean_outlosses_idx_data(idx,no_of_periods)# Compute position in the flat arrayinsert_idx=items_start_end[summary_id-1][0]+summary_counts[summary_id-1]# Store valuesitems[insert_idx]["summary_id"]=summary_iditems[insert_idx]["value"]=reordered_outlosses[idx]ifis_weighted:# Fast lookup period_weights as they are numbered 1 to no_of_periodsitems[insert_idx]["period_weighting"]=period_weights[period_no-1]["weighting"]items[insert_idx]["period_no"]=period_noused_period_no[period_no-1]=Truesummary_counts[summary_id-1]+=1returnis_weighted,used_period_no