├── .idea ├── encodings.xml ├── inspectionProfiles │ └── Project_Default.xml ├── misc.xml ├── modules.xml ├── other.xml ├── score_card_model.iml └── vcs.xml ├── README.md ├── example.py ├── requirements.txt ├── riskModel ├── .DS_Store ├── EDA.py ├── FeatureEngineering.py ├── Modeling.py ├── Preprocessing.py ├── RiskStragety.py ├── __init__.py ├── __pycache__ │ ├── EDA.cpython-37.pyc │ ├── FeatureEngineering.cpython-37.pyc │ ├── Modeling.cpython-37.pyc │ ├── Preprocessing.cpython-37.pyc │ ├── RiskStragety.cpython-37.pyc │ └── __init__.cpython-37.pyc ├── data │ ├── .DS_Store │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-37.pyc │ │ └── germancredit.cpython-37.pyc │ ├── german.txt │ ├── germancredit.csv │ └── germancredit.py └── utils │ ├── .DS_Store │ ├── PltFunction.py │ ├── __init__.py │ ├── __pycache__ │ ├── PltFunction.cpython-37.pyc │ ├── __init__.cpython-37.pyc │ └── tools.cpython-37.pyc │ ├── btl │ ├── .DS_Store │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-37.pyc │ │ ├── merge.cpython-37.pyc │ │ └── monotous.cpython-37.pyc │ ├── merge.py │ └── monotous.py │ └── tools.py └── setup.py /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 26 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/other.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /.idea/score_card_model.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## *riskModel* 2 | #### 风险评分模型 3 | ## *Install* 4 | #### pip install riskModel 5 | ======= 6 | ### *pip install riskModel* 7 | *** 8 | ## *主要功能* 9 | - 数据探索分析 (`数据概述BasicStat`) 10 | - 数据清洗 Preprocess(`异常值检测--异常值处理--众数处理--缺失处理`) 11 | - 数据采样 DataSample(`随机平衡采样, Borderline-SMOTE过采样`) 12 | - 特征离散化,特征工程 cat_bin,num_bin(`无序类别变量分箱组合, 有序数值变量分箱组合,支持单调性检验合并`) 13 | - 特征选择 SelectFeature(`基于IV信息值, 基于共线性, 基于VIF方差膨胀因子, 基于L1正则化`) 14 | - 模型训练 lr(`lr`) 15 | - 评分卡模型 ScoreCard(`标准评分卡转换,模型预测[概率预测,评分预测]`) 16 | - 风险决策 (`风险策略,稳定性评估PSI,评分决策表,KS`) 17 | *** 18 | ```python 19 | # -*- coding: utf-8 -*- 20 | """ 21 | 评分卡示例: 22 | 0.数据探索分析,1.数据预处理,2.特征分箱,3.特征选择,4.模型训练,5.评分卡构建,6.模型评估,7.风险决策 23 | """ 24 | 25 | import scorecardpy as sc 26 | 27 | import joblib 28 | import riskModel as rs 29 | from sklearn.model_selection import train_test_split 30 | 31 | path = './result/' 32 | # 导入数据 33 | germanCredit = rs.Germancredit() 34 | df = germanCredit.get_data() 35 | germanCredit.get_describe() 36 | df.sample(5) 37 | # 数值化 38 | for col in germanCredit.sub_col: 39 | df[col] = df[col].apply(lambda x:int(str(x)[1:])) 40 | # 替换 41 | df = df.replace(germanCredit.rep_dict) 42 | df['target'] = df['target'].replace({1:0,2:1}) 43 | 44 | all_cols = germanCredit.all_feature 45 | num_cols = germanCredit.num_col 46 | cat_cols = germanCredit.cat_col 47 | 48 | ####################################### 49 | # 0.数据探索分析 50 | ####################################### 51 | bs = rs.BasicStat(df=df) 52 | html_report = bs.get_report() 53 | # 保存 54 | with open(path+'dt_report.html','w',encoding='utf8') as f: 55 | f.write(html_report) 56 | 57 | df_report = bs.get_describe() 58 | df_report.to_excel(path+'df_report.xlsx') 59 | 60 | ####################################### 61 | # 1.数据清洗 62 | ####################################### 63 | pr = rs.Preprocess() 64 | str_s = pr.find_str(df=df,cols=num_cols) 65 | print('字符:',str_s) 66 | sign_s = pr.find_sign(df=df,cols=all_cols) 67 | print('特殊符号:',sign_s) 68 | # 离群值 69 | outliers = pr.outlier_drop(df=df,cols=all_cols,low_percent=0.001,up_percent=0.999,cat_percent=0.01) 70 | print('离群值:',outliers) 71 | # 离群值处理 72 | for k,v in outliers.items(): 73 | if type(v) == dict: 74 | df[k] = df[k].apply(lambda x:v.get('low') if x < v.get('low') else v.get('up') if x > v.get('up') else x) 75 | elif type(v) == list: 76 | df[k] = df[k].replace(v,df[k].mode()[0]) 77 | 78 | # 缺失统计 79 | missm_result = pr.miss_mode_cnt(df=df,cols=all_cols) 80 | print(missm_result) 81 | # 连续变量删除缺失80%+,众数率90%+ 82 | # 分类变量删除缺失率90%,众数率95%+ 83 | num_cols = [i for i in num_cols if missm_result['miss'][i] < 0.8 and missm_result['mode'][i] < 0.8] 84 | cat_cols = [i for i in cat_cols if missm_result['miss'][i] < 0.8 and missm_result['mode'][i] < 0.95] 85 | print(f'drop num cols :{[i for i in all_cols if i not in num_cols+cat_cols]}') 86 | all_cols = num_cols + cat_cols 87 | # 缺失填充 88 | df = pr.fill_nan(df=df,cols=all_cols,values=-99999,min_miss_rate=0.05) 89 | 90 | # 字符变量数值化 91 | df,factorize_dict = pr.factor_map(df=df,cols=cat_cols) 92 | # 过采样 93 | int_cols = cat_cols + [i for i in num_cols if i in germanCredit.int_col] 94 | print('int_cols:',int_cols) 95 | 96 | ds = rs.DataSample(df=df,cols=all_cols,target='target',sampling_strategy='minority') 97 | df_res = ds.over_sample(int_cols=int_cols) 98 | # 分类变量还原 99 | to_factorize = {k: {i:j for j,i in v.items()} for k,v in factorize_dict.items()} 100 | df_res = df_res.replace(to_factorize) 101 | df = df.replace(to_factorize) 102 | ######################################## 103 | # 2.特征工程 104 | ######################################## 105 | # 样本划分 106 | # woe bin 107 | train,valid = train_test_split(df_res,test_size=0.3,random_state=0) 108 | cat_bin,cat_iv = rs.cat_bin(df=train,cols=cat_cols,target='target',specials=['-99999'], 109 | bin_num_limit=5,count_distr_limit=0.05,method='chimerge') 110 | num_bin,num_iv = rs.num_bin(df=train,cols=num_cols,target='target',specials=[-99999], 111 | bin_num_limit=8,count_distr_limit=0.05,sc_method='chimerge', 112 | non_mono_cols=['age_in_years'],init_bins=15,init_min_samples=0.05,init_method='chi') 113 | 114 | bins = {**cat_bin,**num_bin} 115 | ivs = {**cat_iv,**num_iv} 116 | # woe转换 117 | train_woe = sc.woebin_ply(dt=train,bins=bins) 118 | valid_woe = sc.woebin_ply(dt=valid,bins=bins) 119 | df_woe = sc.woebin_ply(dt=df,bins=bins) 120 | 121 | ######################################### 122 | # 3.特征选择 123 | ######################################### 124 | sf = rs.SelectFeature() 125 | high_iv = sf.baseOn_iv(ivd=ivs,thred=0.05,is_draw=False) 126 | low_vif = sf.baseOn_collinear(df=train_woe,high_iv=high_iv,thred=0.7,is_draw=False) 127 | ml_cols, best_C = sf.baseOn_l1(X=train_woe[low_vif.keys()],y=train_woe['target'],Kfold=5,drop_plus=False) 128 | 129 | ######################################### 130 | # 4.模型训练 131 | ######################################### 132 | 133 | lr = rs.Lr(C=best_C) 134 | lr.fiting(X=train_woe[ml_cols.keys()],y=train_woe['target'],filename=path) 135 | joblib.dump(lr,path+'lr.pkl') 136 | 137 | ######################################## 138 | # 5.评分卡构建 139 | ######################################## 140 | 141 | card = rs.ScoreCard(lr=lr,bins=bins,ml_cols=[i.replace('_woe','') for i in ml_cols.keys()], 142 | score0=600,pdo=50) 143 | card_df = card.score_card() 144 | joblib.dump(card,path+'card.pkl') 145 | ######################################## 146 | # 6.模型评估,真实样本评估 147 | ####################################### 148 | valid['prob'] = lr.predict_proba(valid_woe[ml_cols.keys()])[:,1] 149 | df['prob'] = lr.predict_proba(df_woe[ml_cols.keys()])[:,1] 150 | 151 | print(f'valid evaluate:{rs.model_norm(valid["target"],valid["prob"])}') 152 | print(f'test evaluate:{rs.model_norm(df["target"],df["prob"])}') 153 | 154 | valid['score'] = card.apply_score(valid) 155 | df['score'] = card.apply_score(df) 156 | 157 | ######################################## 158 | # 7.风险决策 159 | ####################################### 160 | cut_off = rs.stragety_score(df=df,step=50,score='score',label='target') 161 | cut_off.to_excel(path+'cut_off.xlsx') 162 | 163 | ``` 164 | 165 | -------------------------------------------------------------------------------- /example.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | 评分卡示例: 4 | 0.数据探索分析,1.数据预处理,2.特征分箱,3.特征选择,4.模型训练,5.评分卡构建,6.模型评估,7.风险决策 5 | """ 6 | 7 | import scorecardpy as sc 8 | import warnings 9 | warnings.filterwarnings('ignore') 10 | import joblib 11 | import riskModel as rs 12 | from sklearn.model_selection import train_test_split 13 | 14 | path = './result/' 15 | # 导入数据 16 | germanCredit = rs.Germancredit() 17 | df = germanCredit.get_data() 18 | germanCredit.get_describe() 19 | df.sample(5) 20 | # 数值化 21 | for col in germanCredit.sub_col: 22 | df[col] = df[col].apply(lambda x:int(str(x)[1:])) 23 | # 替换 24 | df = df.replace(germanCredit.rep_dict) 25 | df['target'] = df['target'].replace({1:0,2:1}) 26 | 27 | all_cols = germanCredit.all_feature 28 | num_cols = germanCredit.num_col 29 | cat_cols = germanCredit.cat_col 30 | 31 | ####################################### 32 | # 0.数据探索分析 33 | ####################################### 34 | bs = rs.BasicStat(df=df) 35 | html_report = bs.get_report() 36 | # 保存 37 | with open(path+'dt_report.html','w',encoding='utf8') as f: 38 | f.write(html_report) 39 | 40 | df_report = bs.get_describe() 41 | df_report.to_excel(path+'df_report.xlsx') 42 | 43 | ####################################### 44 | # 1.数据清洗 45 | ####################################### 46 | pr = rs.Preprocess() 47 | str_s = pr.find_str(df=df,cols=num_cols) 48 | print('字符:',str_s) 49 | sign_s = pr.find_sign(df=df,cols=all_cols) 50 | print('特殊符号:',sign_s) 51 | # 离群值 52 | outliers = pr.outlier_drop(df=df,cols=all_cols,low_percent=0.001,up_percent=0.999,cat_percent=0.01) 53 | print('离群值:',outliers) 54 | # 离群值处理 55 | for k,v in outliers.items(): 56 | if type(v) == dict: 57 | df[k] = df[k].apply(lambda x:v.get('low') if x < v.get('low') else v.get('up') if x > v.get('up') else x) 58 | elif type(v) == list: 59 | df[k] = df[k].replace(v,df[k].mode()[0]) 60 | 61 | # 缺失统计 62 | missm_result = pr.miss_mode_cnt(df=df,cols=all_cols) 63 | print(missm_result) 64 | # 连续变量删除缺失80%+,众数率90%+ 65 | # 分类变量删除缺失率90%,众数率95%+ 66 | num_cols = [i for i in num_cols if missm_result['miss'][i] < 0.8 and missm_result['mode'][i] < 0.8] 67 | cat_cols = [i for i in cat_cols if missm_result['miss'][i] < 0.8 and missm_result['mode'][i] < 0.95] 68 | print(f'drop num cols :{[i for i in all_cols if i not in num_cols+cat_cols]}') 69 | all_cols = num_cols + cat_cols 70 | # 缺失填充 71 | df = pr.fill_nan(df=df,cols=all_cols,values=-99999,min_miss_rate=0.05) 72 | 73 | # 字符变量数值化 74 | df,factorize_dict = pr.factor_map(df=df,cols=cat_cols) 75 | # 过采样 76 | int_cols = cat_cols + [i for i in num_cols if i in germanCredit.int_col] 77 | print('int_cols:',int_cols) 78 | 79 | ds = rs.DataSample(df=df,cols=all_cols,target='target',sampling_strategy='minority') 80 | df_res = ds.over_sample(int_cols=int_cols) 81 | # 分类变量还原 82 | to_factorize = {k: {i:j for j,i in v.items()} for k,v in factorize_dict.items()} 83 | df_res = df_res.replace(to_factorize) 84 | df = df.replace(to_factorize) 85 | ######################################## 86 | # 2.特征工程 87 | ######################################## 88 | # 样本划分 89 | # woe bin 90 | train,valid = train_test_split(df_res,test_size=0.3,random_state=0) 91 | cat_bin,cat_iv = rs.cat_bin(df=train,cols=cat_cols,target='target',specials=['-99999'], 92 | bin_num_limit=5,count_distr_limit=0.05,method='chimerge') 93 | num_bin,num_iv = rs.num_bin(df=train,cols=num_cols,target='target',specials=[-99999], 94 | bin_num_limit=8,count_distr_limit=0.05,sc_method='chimerge', 95 | non_mono_cols=['age_in_years'],init_bins=15,init_min_samples=0.05,init_method='chi') 96 | 97 | bins = {**cat_bin,**num_bin} 98 | ivs = {**cat_iv,**num_iv} 99 | # woe转换 100 | train_woe = sc.woebin_ply(dt=train,bins=bins) 101 | valid_woe = sc.woebin_ply(dt=valid,bins=bins) 102 | df_woe = sc.woebin_ply(dt=df,bins=bins) 103 | 104 | ######################################### 105 | # 3.特征选择 106 | ######################################### 107 | sf = rs.SelectFeature() 108 | high_iv = sf.baseOn_iv(ivd=ivs,thred=0.05,is_draw=False) 109 | low_vif = sf.baseOn_collinear(df=train_woe,high_iv=high_iv,thred=0.7,is_draw=False) 110 | ml_cols, best_C = sf.baseOn_l1(X=train_woe[low_vif.keys()],y=train_woe['target'],Kfold=5,drop_plus=False) 111 | 112 | ######################################### 113 | # 4.模型训练 114 | ######################################### 115 | 116 | lr = rs.Lr(C=best_C) 117 | lr.fiting(X=train_woe[ml_cols.keys()],y=train_woe['target'],filename=path) 118 | joblib.dump(lr,path+'lr.pkl') 119 | 120 | ######################################## 121 | # 5.评分卡构建 122 | ######################################## 123 | 124 | card = rs.ScoreCard(lr=lr,bins=bins,ml_cols=[i.replace('_woe','') for i in ml_cols.keys()], 125 | score0=600,pdo=50) 126 | card_df = card.score_card() 127 | joblib.dump(card,path+'card.pkl') 128 | ######################################## 129 | # 6.模型评估,真实样本评估 130 | ####################################### 131 | valid['prob'] = lr.predict_proba(valid_woe[ml_cols.keys()])[:,1] 132 | df['prob'] = lr.predict_proba(df_woe[ml_cols.keys()])[:,1] 133 | 134 | print(f'valid evaluate:{rs.model_norm(valid["target"],valid["prob"])}') 135 | print(f'test evaluate:{rs.model_norm(df["target"],df["prob"])}') 136 | 137 | valid['score'] = card.apply_score(valid) 138 | df['score'] = card.apply_score(df) 139 | 140 | ######################################## 141 | # 7.风险决策 142 | ####################################### 143 | cut_off = rs.stragety_score(df=df,step=50,score='score',label='target') 144 | cut_off.to_excel(path+'cut_off.xlsx') 145 | 146 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pandas-profiling>=2.4.0 2 | numpy>=1.18.1 3 | matplotlib>=3.1.3 4 | pandas>=1.0.3 5 | scikit-learn>=0.23.1 6 | imbalanced-learn==0.5.0 7 | statsmodels>=0.11.1 8 | scorecardpy>=0.1.9.2 9 | seaborn>=0.10.1 10 | scipy>=1.4.1 11 | toad>=0.0.60 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /riskModel/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/.DS_Store -------------------------------------------------------------------------------- /riskModel/EDA.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2018-01-21 11:22 3 | # @Author : HuangSir 4 | # @FileName: EDA.py 5 | # @Software: PyCharm 6 | 7 | """ 8 | Exploratory analysis 9 | """ 10 | 11 | import pandas as pd 12 | import pandas_profiling 13 | 14 | from toad import detect, quality 15 | 16 | class BasicStat: 17 | def __init__(self, df: pd.DataFrame): 18 | self.df = df 19 | 20 | def get_report(self): 21 | ''' 22 | get data report of html 23 | ''' 24 | # warnings.warn('there are costing much time') 25 | profile = pandas_profiling.ProfileReport(self.df) 26 | report = profile.to_html() 27 | print('finish') 28 | return report 29 | 30 | def get_describe(self): 31 | ''' 32 | get data describe of DataFrame 33 | ''' 34 | report = detect(self.df) 35 | return report 36 | 37 | def get_quality(self, target='target', iv_only=False, **kwargs): 38 | report = quality(self.df, target, iv_only, **kwargs) 39 | return report 40 | -------------------------------------------------------------------------------- /riskModel/FeatureEngineering.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2018-01-21 11:22 3 | # @Author : HuangSir 4 | # @FileName: FeatureEngineering.py 5 | # @Software: PyCharm 6 | 7 | """ 8 | 特征工程 9 | 1. 无序类别变量分箱组合, 有序数值变量分箱组合, 自定义分箱,WOE转换 10 | 2. 基于IV信息值特征选择,基于共线性特征选择, 11 | 基于VIF方差膨胀因子特征选择,基于逐步回归特征选择,基于L1正则化特征选择 12 | """ 13 | import time 14 | import numpy as np 15 | import pandas as pd 16 | from sklearn.linear_model import LogisticRegression 17 | from sklearn.model_selection import GridSearchCV,StratifiedKFold 18 | from toad.transform import Combiner 19 | from scorecardpy import woebin 20 | from statsmodels.stats.outliers_influence import variance_inflation_factor # 共线性检验 21 | # 自定义 22 | from .utils.btl.merge import monotonous_bin 23 | from .utils.PltFunction import PlotFeatureEn 24 | 25 | def cat_bin(df:pd.DataFrame,cols:list=None,target:str='target',specials:list=None, 26 | bin_num_limit:int=5,count_distr_limit:float=0.05,method:str='chimerge',**kwargs): 27 | if not cols: 28 | cols = df.columns.difference([target]).tolist() 29 | 30 | if specials: 31 | specials = {k:specials for k in cols} 32 | 33 | bind, ivd = dict(), dict() 34 | t0 = time.process_time() 35 | for col in cols: 36 | bind[col] = woebin(dt=df,x=col,y=target,special_values=specials,bin_num_limit=bin_num_limit, 37 | count_distr_limit=count_distr_limit,method=method,print_info=False, 38 | **kwargs)[col] 39 | ivd[col] = bind[col]['total_iv'].unique()[0] 40 | print(f'there are bing {len(cols)} using {int((time.process_time() - t0) * 100 / 60)} seconds') 41 | return bind, ivd 42 | 43 | def num_bin(df:pd.DataFrame,cols:list=None,target:str='target',specials:list=None, 44 | bin_num_limit:int=5,count_distr_limit:float=0.05,sc_method='chimerge', 45 | non_mono_cols:list=None,init_bins=10,init_min_samples=0.05,init_method='chi',**kwargs): 46 | 47 | # 粗分箱,单调检验,分箱结果 48 | if not cols: 49 | cols = df.columns.difference([target]).tolist() 50 | 51 | if specials: 52 | specials = {k: specials for k in cols} 53 | 54 | if not non_mono_cols: 55 | non_mono_cols = [] 56 | 57 | bind, ivd = dict(), dict() 58 | t0 = time.process_time() 59 | 60 | for col in cols: 61 | if col in non_mono_cols: 62 | bind[col] = woebin(dt=df, x=col, y=target, special_values=specials, bin_num_limit=bin_num_limit, 63 | count_distr_limit=count_distr_limit, method=sc_method,print_info=False)[col] 64 | ivd[col] = bind[col]['total_iv'].unique()[0] 65 | 66 | else: 67 | c = Combiner() 68 | c.fit(X=df[col], y=df[target],n_bins=init_bins,min_samples=init_min_samples,method=init_method,**kwargs) 69 | init_points = c.export()[col] 70 | breaks_list = monotonous_bin(df=df, col=col, target=target,cutOffPoints=init_points, special_values=specials) 71 | 72 | bind[col] = woebin(dt=df, x=col, y=target, special_values=specials, breaks_list=breaks_list, 73 | bin_num_limit=bin_num_limit,count_distr_limit=count_distr_limit,method=sc_method, 74 | print_info=False)[col] 75 | ivd[col] = bind[col]['total_iv'].unique()[0] 76 | 77 | print(f'there are bing {len(cols)} using {int((time.process_time() - t0) * 100 / 60)} seconds') 78 | return bind, ivd 79 | 80 | class SelectFeature(object): 81 | """特征选择""" 82 | 83 | def baseOn_iv(self, ivd: dict, thred: float = 0.02, is_draw=False): 84 | """ 85 | 选择IV高于阈值的变量, 一般说来,信息值0.02以下表示与目标变量相关性非常弱 86 | """ 87 | high_IV = {k: v for k, v in ivd.items() if v >= thred} 88 | high_IV = {'_'.join([k,'woe']): v for (k, v) in sorted(high_IV.items(), key=lambda x: x[1], reverse=True)} # 排序 89 | if is_draw: 90 | PltF = PlotFeatureEn() 91 | PltF.draw_IV(IV_dict=high_IV, path='./') 92 | return high_IV 93 | 94 | def baseOn_collinear(self, df: pd.DataFrame, high_iv: dict, thred: float = 0.7, is_draw=False): 95 | 96 | # 基于两两相关性共线性检验 97 | # 1,将候选变量按照IV进行降序排列 98 | # 2,计算第i和第i+1的变量的线性相关系数 99 | # 3,对于系数超过阈值的两个变量,剔除IV较低的一个 100 | deleted_feature = [] # 删除的变量 101 | for col1 in high_iv.keys(): 102 | if col1 in deleted_feature: 103 | continue 104 | for col2 in high_iv.keys(): 105 | if col1 == col2 or col2 in deleted_feature: 106 | continue 107 | cor_v = np.corrcoef(df[col1], df[col2])[0, 1] 108 | if abs(cor_v) >= thred: 109 | if high_iv[col1] >= high_iv[col2]: 110 | deleted_feature.append(col2) 111 | print(f'相关性检验,删除变量:{col2}') 112 | else: 113 | deleted_feature.append(col1) 114 | print(f'相关性检验,删除变量:{col1}') 115 | 116 | last_feature = [i for i in high_iv.keys() if i not in deleted_feature] 117 | # 多变量分析:VIF 118 | X = df[last_feature].values 119 | VIF_list = [variance_inflation_factor(X, i) for i in range(X.shape[1])] 120 | max_VIF = max(VIF_list) 121 | print(f'最大方差膨胀因子:{max_VIF}') 122 | feature_VIF = {k: v for k, v in zip(last_feature, VIF_list)} 123 | # 相关性可视化 124 | if is_draw: 125 | PltF = PlotFeatureEn() 126 | PltF.draw_corr(df=df, figsize=(15, 15), path='./') 127 | return feature_VIF 128 | 129 | def baseOn_l1(self, X: pd.DataFrame, y: pd.Series,Kfold:int=5,drop_plus: bool = False): 130 | """ 131 | 基于L1正则选择特征 132 | """ 133 | lr = LogisticRegression(penalty='l1', class_weight='balanced', solver='liblinear') 134 | k = StratifiedKFold(n_splits=Kfold, shuffle=True, random_state=42) 135 | gs = GridSearchCV(estimator=lr,param_grid={'C':np.arange(0.005,0.5,0.005)},scoring='roc_auc',cv=k) 136 | _ = gs.fit(X,y) 137 | print(f'best_scoring:{round(gs.best_score_,3)}') 138 | print(f'best_params:{gs.best_params_}') 139 | C = gs.best_params_['C'] 140 | lr = LogisticRegression(penalty='l1', C=C, class_weight='balanced', solver='liblinear') 141 | _ = lr.fit(X, y) 142 | # 模型系数 143 | features = X.columns.tolist() 144 | paramsEst = pd.Series(lr.coef_.tolist()[0], index=features) 145 | feature_coe = paramsEst.to_dict() 146 | # 变量选择 147 | if drop_plus: 148 | ml_cols = {k: v for k, v in feature_coe.items() if v < 0} 149 | else: 150 | ml_cols = {k: v for k, v in feature_coe.items() if v > 0} 151 | return ml_cols,C 152 | -------------------------------------------------------------------------------- /riskModel/Modeling.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2018-01-21 11:22 3 | # @Author : HuangSir 4 | # @FileName: Modeling.py 5 | # @Software: PyCharm 6 | 7 | """ 8 | 模型训练,模型评估,标准评分卡转换,模型预测(概率预测,评分预测) 9 | """ 10 | import re 11 | import numpy as np 12 | import pandas as pd 13 | from sklearn.linear_model import LogisticRegression 14 | from .utils.tools import model_norm,Prob2Score 15 | from .utils.PltFunction import PlotModel 16 | from scorecardpy import scorecard_ply 17 | 18 | class Lr(LogisticRegression): 19 | """模型实例化""" 20 | def __init__(self,C,**kwargs): 21 | super().__init__(**kwargs) 22 | self.C = C 23 | self.penalty='l1' 24 | self.class_weight='balanced' 25 | self.solver='liblinear' 26 | 27 | def fiting(self,X:pd.DataFrame,y:pd.Series,filename='./'): 28 | """ 29 | lr cv 30 | """ 31 | features = X.columns.tolist() 32 | 33 | if self.penalty == 'l1': 34 | self.solver = 'liblinear' 35 | 36 | # 拟合 37 | self.fit(X,y) 38 | # 评估 39 | y_prob = self.predict_proba(X)[:,1] 40 | norm = model_norm(y_true=y,y_prob=y_prob) 41 | print(f'training model result:\n{norm}') 42 | 43 | # 作图 44 | pltm = PlotModel(y_true=y.values,y_prob=y_prob) 45 | pltm.plot_roc_curve(filename=filename) 46 | pltm.plot_ks_curve(filename=filename) 47 | # 模型系数 48 | paramsEst = pd.Series(self.coef_.tolist()[0], index=features) 49 | paramsEst['intercept'] = self.intercept_.tolist()[0] 50 | print(f'model params:\n{paramsEst}') 51 | 52 | class ScoreCard(object): 53 | """ 54 | 评分卡模型 55 | """ 56 | def __init__(self,lr,bins:dict,ml_cols:list,score0:int=600,pdo:int=50): 57 | 58 | self.model = lr 59 | self.bins = bins 60 | self.model_feature = ml_cols 61 | self.score0 = score0 62 | self.pdo= pdo 63 | 64 | def score_card(self,re_df:bool=True): 65 | ''' 66 | Creating a Scorecard 67 | ------ 68 | `scorecard` creates a scorecard based on the results from `bins` 69 | and LogisticRegression of sklearn.linear_model 70 | 71 | Returns 72 | ------ 73 | DataFrame 74 | scorecard df 75 | ''' 76 | # coefficients 77 | A = self.score0 78 | B = self.pdo / np.log(2) 79 | # bins # if (is.list(bins)) rbindlist(bins) 80 | bins_df = pd.concat(self.bins, ignore_index=True) 81 | 82 | xs = [re.sub('_woe$', '', i) for i in self.model_feature] 83 | # coefficients 84 | coef_df = pd.Series(self.model.coef_[0], index=np.array(xs)).loc[lambda x: x != 0] # .reset_index(drop=True) 85 | 86 | # scorecard 87 | basepoints = A - B * self.model.intercept_[0] # 校准 88 | card = {} 89 | card['baseScore'] = pd.DataFrame({'variable': 'basepoints', 'bin': '基础分', 'points': round(basepoints, 2)},index=[0]) 90 | for i in coef_df.index: 91 | card[i] = bins_df.loc[bins_df['variable'] == i, ['variable', 'bin', 'woe']] \ 92 | .assign(points=lambda x: round(-B * x['woe'] * coef_df[i], 2))[['variable', 'bin', 'points']] 93 | 94 | # 转换为df 95 | df = pd.DataFrame() 96 | for col in card.keys(): 97 | col_df = card[col] 98 | df = pd.concat([df,col_df]) 99 | df.set_index(['variable'], inplace=True) 100 | 101 | if re_df: 102 | return df 103 | else: 104 | return card 105 | 106 | def pred_score(self,df_woe:pd.DataFrame,only_total_score=True): 107 | y_prob = self.model.predict_proba(df_woe[self.model_feature].values)[:,1] 108 | score = Prob2Score(prob=y_prob,basePoint=self.score0,PDO=self.pdo) 109 | df_woe['score'] = score 110 | if only_total_score: 111 | return df_woe['score'] 112 | else: 113 | return df_woe 114 | 115 | def apply_score(self,df,**kwargs): 116 | df_score = scorecard_ply(dt=df,card=self.score_card(re_df=False),**kwargs) 117 | return df_score -------------------------------------------------------------------------------- /riskModel/Preprocessing.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2018-01-21 11:22 3 | # @Author : HuangSir 4 | # @FileName: Preprocessing.py 5 | # @Software: PyCharm 6 | 7 | """ 8 | 1. 变量类型划分--异常值检测--异常值处理--重复行(列)处理--众数处理--缺失处理 9 | 2. 样本采样: 随机采样, 随机平衡采样, Borderline-SMOTE过采样, Easy Ensemble 欠采样. 10 | """ 11 | import pandas as pd 12 | import numpy as np 13 | import numbers 14 | from sklearn.utils import shuffle 15 | from .utils.tools import str2num 16 | import re 17 | from imblearn.over_sampling import BorderlineSMOTE 18 | from collections import Counter 19 | 20 | 21 | class Preprocess(object): 22 | """ 23 | 数据预处理 24 | """ 25 | 26 | def find_str(self, df: pd.DataFrame, cols: list): 27 | """ 28 | 连续数值变量包含字符串 29 | """ 30 | s = set() 31 | for col in cols: 32 | if col in df.columns: 33 | for i in df[col].unique(): 34 | try: 35 | if i is np.nan or isinstance(str2num(i), numbers.Real): 36 | pass 37 | except: 38 | print(f'{col} ---> {i}') 39 | s.add(i) 40 | return s 41 | 42 | def find_sign(self, df: pd.DataFrame, cols: list): 43 | """ 44 | 识别特殊符号 45 | """ 46 | s = set() 47 | for col in cols: 48 | for v in df[col].unique(): 49 | try: 50 | special = r"\$|\(|\)|\*|\+|\[|\]|\?\\|\^|\||\@|\&|\{|\}|u" 51 | t_s = set(re.findall(special, str(v))) 52 | s.add(t_s) 53 | except: 54 | pass 55 | return s 56 | 57 | def outlier_drop(self, df: pd.DataFrame, cols: list, low_percent=0.01, up_percent=0.99, cat_percent=0.001): 58 | """ 59 | 离群值 60 | """ 61 | out_d = dict() 62 | object_cols = df.select_dtypes(include=['object', 'bool', 'category']).columns.tolist() 63 | for col in cols: 64 | if col in object_cols: # 字符型变量 65 | cat_v_p = df[col].value_counts(normalize=True, dropna=False) # 统计分类变量个数占比 66 | del_v = cat_v_p[cat_v_p < cat_percent].index.tolist() # 删除值 67 | print(f'分类变量:{col},离群值:{del_v}') 68 | out_d[col] = del_v 69 | else: 70 | try: 71 | q1 = df[col].quantile(low_percent) # 下分为点 72 | q2 = df[col].quantile(up_percent) # 上分为点 73 | print(f'连续变量:{col},low:{q1},up:{q2}') 74 | out_d[col] = {'low': q1, 'up': q2} 75 | except TypeError: 76 | pass 77 | out_d = {k: v for k, v in out_d.items() if v} 78 | return out_d 79 | 80 | def miss_mode_cnt(self, df: pd.DataFrame, cols: list): 81 | """ 82 | 缺失率和众数率统计 83 | """ 84 | result = {} 85 | result['miss'], result['mode'] = {}, {} 86 | 87 | for col in cols: 88 | miss_rate = df[col].isnull().sum() / len(df) # 缺失率 89 | result['miss'][col] = miss_rate 90 | 91 | mode_values = df[col].mode()[0] # 众数 92 | mode_rate = len(df.loc[df[col] == mode_values, :]) / len(df) # 众数率 93 | result['mode'][col] = mode_rate 94 | 95 | return result 96 | 97 | def fill_nan(self, df: pd.DataFrame, cols: list, values=-9999, min_miss_rate=0.05): 98 | """ 99 | 缺失值填充 100 | """ 101 | miss_mode = self.miss_mode_cnt(df,cols) 102 | for col in cols: 103 | miss_rate = miss_mode['miss'][col] 104 | if miss_rate < min_miss_rate: 105 | mode = df[col].mode()[0] 106 | df[col] = df[col].fillna(mode) 107 | else: 108 | df[col] = df[col].fillna(values) 109 | 110 | return df 111 | 112 | def factor_map(self, df: pd.DataFrame, cols: list): 113 | """ 114 | 字符变量数值化 115 | """ 116 | factorize_dict = {} 117 | for col in cols: 118 | factorize_dict[col] = {} 119 | l = pd.factorize(df[col]) 120 | for i in np.arange(len(l[1])): 121 | factorize_dict[col][l[1][i]] = i # 数值化映射字典 122 | df[col] = l[0] # 数值化 123 | 124 | return df, factorize_dict # 数值数据, 映射字典 125 | 126 | 127 | class DataSample(BorderlineSMOTE): 128 | """ 129 | 数据抽样 130 | """ 131 | 132 | def __init__(self, df: pd.DataFrame, cols: list, target='target', 133 | sampling_strategy='minority', random_state=None, k_neighbors=5, 134 | n_jobs=1, m_neighbors=10, kind='borderline-1'): 135 | super().__init__(sampling_strategy, random_state, 136 | k_neighbors, n_jobs, m_neighbors, kind) 137 | self.df = df 138 | self.cols = cols 139 | self.target = target 140 | 141 | def balance_sample(self, odd, scalar: str = 'good'): 142 | """ 143 | 根据好坏比抽样 144 | """ 145 | bad_df = self.df.loc[self.df[self.target] == 1, :] # 坏样本 146 | good_df = self.df.loc[self.df[self.target] == 0, :] # 好样本 147 | bad = len(bad_df) # 坏样本数 148 | good = len(good_df) # 好样本数 149 | if scalar == 'good': # 对好样本进行抽样 150 | good_new = int(bad * odd) # 所需好样本数 151 | if good_new > good: 152 | good_df_new = good_df.sample(n=good_new, replace=True) 153 | else: 154 | good_df_new = good_df.sample(n=good_new, replace=False) 155 | 156 | good_df = good_df_new 157 | 158 | else: 159 | bad_new = int(good / odd) # 所需坏样本数 160 | if bad_new > bad: 161 | bad_df_new = bad_df.sample(n=bad_new, replace=True) 162 | else: 163 | bad_df_new = bad_df.sample(n=bad_new, replace=False) 164 | 165 | bad_df = bad_df_new 166 | 167 | self.df = pd.concat([bad_df, good_df], axis=0) # 合并新样本 168 | self.df = shuffle(self.df) # 打乱顺序 169 | return self.df 170 | 171 | def over_sample(self,int_cols:list): 172 | """ 173 | 过采样 174 | """ 175 | print(f'Original label shape {Counter(self.df[self.target])}') 176 | 177 | X_res, y_res = self.fit_resample(self.df[self.cols], self.df[self.target]) 178 | 179 | print(f'overSample label shape {Counter(y_res)}') 180 | 181 | data = np.concatenate([X_res, y_res.reshape(-1, 1)], axis=1) 182 | self.df = pd.DataFrame(data=data, columns=self.cols + [self.target]) 183 | # 整数化 184 | for col in int_cols: 185 | self.df[col] = self.df[col].apply(lambda x:int(round(x,0))) 186 | 187 | return self.df 188 | -------------------------------------------------------------------------------- /riskModel/RiskStragety.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2018-01-21 11:22 3 | # @Author : HuangSir 4 | # @FileName: RiskStragety.py 5 | # @Software: PyCharm 6 | 7 | # 风险策略,稳定性评估PSI,评分决策表,KS 8 | # 单变量PSI 9 | 10 | import pandas as pd 11 | import numpy as np 12 | 13 | def caculate_ks(df_score:pd.DataFrame, score:str='score', target:str='target'): 14 | """ 15 | 指标KS,不分组情况下 16 | :return:KS 17 | """ 18 | df = df_score.sort_values(by=score) 19 | total_good = len(df.loc[df[target] == 0, :]) 20 | total_bad = len(df.loc[df[target] == 1, :]) 21 | df_good, df_bad = pd.DataFrame(), pd.DataFrame() 22 | 23 | df_good['score'] = df.loc[df[target] == 0, score] 24 | df_good['sum_good'] = [i + 1 for i in range(len(df.loc[df[target] == 0, target]))] 25 | df_good['sum_good_rate'] = df_good['sum_good'] / total_good 26 | df_good = df_good.drop_duplicates(['score'], keep='last') 27 | 28 | df_bad['sum_bad'] = df.loc[df[target] == 1, target].cumsum() 29 | df_bad['score'] = df.loc[df[target] == 1, score] 30 | df_bad['sum_bad_rate'] = df_bad['sum_bad'] / total_bad 31 | df_bad = df_bad.drop_duplicates(['score'], keep='last') 32 | 33 | df = pd.merge(df_bad, df_good, how='outer', on='score') 34 | df = df.sort_values(by='score') 35 | df = df.fillna(method='ffill') 36 | df = df.fillna(0) 37 | 38 | df['KS'] = df['sum_bad_rate'] - df['sum_good_rate'] 39 | KS = abs(df['KS']).max() 40 | return KS, df 41 | 42 | def var_psi(cols:list,train:pd.DataFrame,test:pd.DataFrame): 43 | """ 44 | 入模变量PSI 45 | """ 46 | psi_dict = {} 47 | for col in cols: 48 | psi_dict[col] = (train[col].value_counts(normalize=True,dropna=False)-test[col].value_counts(normalize=True,dropna=False))*\ 49 | (np.log(train[col].value_counts(normalize=True,dropna=False))/test[col].value_counts(normalize=True,dropna=False)) 50 | psi_dict_var = {} 51 | # 输出每个变量的PSI 52 | for col in cols: 53 | psi_dict_var[col] = psi_dict[col].sum() 54 | return psi_dict_var 55 | 56 | def bin_list(low_line:int,up_line:int,step:int): 57 | """ 58 | 分组 59 | """ 60 | bin = [] # 分组方法 61 | bin.append(float('-inf')) # 极小值 62 | for i in range(int(round((up_line-low_line)/step,0))): 63 | bin.append(low_line+step*i) 64 | bin.append(up_line) 65 | bin.append(float('inf')) # 极大值 66 | return bin 67 | 68 | 69 | def stragety_score(df:pd.DataFrame,step:int=50,score:str='score',label:str='target'): 70 | """ 71 | 风险决策报表 72 | """ 73 | #分组 74 | low_line = round(df[score].min()/step)*step 75 | up_line = int(df[score].max()/step)*step 76 | 77 | bin = bin_list(low_line,up_line,step) #分组列表 78 | # total 每个分数段总计 79 | total_cut = pd.cut(x=df[score],bins=bin,right=False) 80 | total_df = pd.value_counts(total_cut) # 每个分数段总计数 81 | total_sum = len(total_cut) # 总计 82 | 83 | # good 每个分数段的好客户 84 | temp_df = df.loc[df[label]==0,score] 85 | good_cut = pd.cut(x=temp_df,bins=bin,right=False) 86 | good_df = pd.value_counts(good_cut) # 每个分数段好客户计数 87 | good_sum = len(good_cut) # 好客户总数 88 | 89 | # bad 每个分数段的坏客户 90 | temp_df = df.loc[df[label]==1,score] 91 | bad_cut = pd.cut(x=temp_df,bins=bin,right=False) 92 | bad_df = pd.value_counts(bad_cut) # 每个分数段的坏客户计数 93 | bad_sum = len(bad_cut) # 坏客户总数 94 | 95 | # 总计,好,坏 计数合并 96 | df = pd.concat([total_df,good_df,bad_df],axis=1) 97 | df.columns = ['total','good','bad'] 98 | # 累积 99 | df_cumsum = df.cumsum() 100 | df_cumsum.columns = ['sum_total','sum_good','sum_bad'] # 累积总,累积好,累积坏 计数 101 | df = pd.concat([df,df_cumsum],axis=1) 102 | 103 | # 累积率 104 | df['sum_total_rate'] = df['sum_total']/total_sum # 累积坏比率 105 | df['sum_good_rate'] = df['sum_good']/good_sum # 累积好比率 106 | df['sum_bad_rate'] = df["sum_bad"]/bad_sum # 累积坏比率 107 | df['KS'] = df['sum_bad_rate'] - df['sum_good_rate'] # 区分度ks 108 | df['bad_rate'] = df['bad']/df['total'] # 每个分数段的坏比率 109 | df['good_rate'] = df['good']/df['total'] #每个分数段的好比率 110 | df['lift'] = df['sum_bad_rate']/df['sum_total_rate'] # 提升度 111 | return df 112 | 113 | 114 | def score_psi(train:pd.DataFrame,test:pd.DataFrame,low_line:int,up_line:int,step:int=50,score='score'): 115 | 116 | """ 117 | 分数PSI 118 | """ 119 | 120 | #分组 121 | bin = bin_list(low_line=low_line,up_line=up_line,step=step) 122 | train_len = len(train) # 训练集总数 123 | test_len = len(test) # 测试集总数 124 | 125 | train_cut = pd.cut(x=train[score],bins=bin,right=False) # 训练集分组 126 | test_cut = pd.cut(x=test[score],bins=bin,right=False) # 测试集分组结果 127 | train_df = pd.value_counts(train_cut) # 训练集分组计数 128 | test_df = pd.value_counts(test_cut) # 测试集分组计数 129 | df = pd.concat([train_df,test_df],axis=1) # 合并 130 | df.columns = ['train','test'] 131 | df['train_percent'] = df['train']/train_len #每个分数段的计数比例 132 | df['test_percent'] = df['test']/test_len 133 | df['PSI'] = (df['train_percent']-df['test_percent'])*np.log(df['train_percent']/df['test_percent']) #每个分段的psi 134 | PSI = df['PSI'].sum() 135 | return PSI,df 136 | -------------------------------------------------------------------------------- /riskModel/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | __version__ = '1.0.6' 4 | 5 | from .EDA import BasicStat # 数据探索分析 6 | from .Preprocessing import Preprocess,DataSample # 数据清洗, 数据抽样 7 | from .FeatureEngineering import SelectFeature # 特征分箱,特征选择 8 | from .Modeling import Lr,ScoreCard # 模型训练,评分卡构建 9 | from .utils.PltFunction import PlotModel # 模型作图,ks,roc曲线 10 | from .data.germancredit import Germancredit # 导入数据 11 | 12 | # 方法 13 | from .FeatureEngineering import cat_bin,num_bin # 分箱 14 | from .utils.tools import model_norm,Prob2Score # 模型指标,概率转换为分数 15 | from .RiskStragety import caculate_ks,stragety_score,score_psi,var_psi # ks计算,决策报告,评分psi,变量psi 16 | 17 | -------------------------------------------------------------------------------- /riskModel/__pycache__/EDA.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/__pycache__/EDA.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/__pycache__/FeatureEngineering.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/__pycache__/FeatureEngineering.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/__pycache__/Modeling.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/__pycache__/Modeling.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/__pycache__/Preprocessing.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/__pycache__/Preprocessing.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/__pycache__/RiskStragety.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/__pycache__/RiskStragety.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/data/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/data/.DS_Store -------------------------------------------------------------------------------- /riskModel/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/data/__init__.py -------------------------------------------------------------------------------- /riskModel/data/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/data/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/data/__pycache__/germancredit.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/data/__pycache__/germancredit.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/data/german.txt: -------------------------------------------------------------------------------- 1 | Description of the German credit dataset. 2 | 3 | 1. Title: German Credit data 4 | 5 | 2. Source Information 6 | 7 | Professor Dr. Hans Hofmann 8 | Institut f"ur Statistik und "Okonometrie 9 | Universit"at Hamburg 10 | FB Wirtschaftswissenschaften 11 | Von-Melle-Park 5 12 | 2000 Hamburg 13 13 | 14 | 3. Number of Instances: 1000 15 | 16 | Two datasets are provided. the original dataset, in the form provided 17 | by Prof. Hofmann, contains categorical/symbolic attributes and 18 | is in the file "germancredit.csv". 19 | 20 | 6. Number of Attributes german: 20 (7 numerical, 13 categorical) 21 | 22 | 23 | 7. Attribute description for german 24 | 25 | Attribute 1: (qualitative) 26 | Status of existing checking account 27 | 现有的支票状态,有序离散 28 | A11 : ... < 0 DM 29 | A12 : 0 <= ... < 200 DM 30 | A13 : ... >= 200 DM / 31 | salary assignments for at least 1 year 32 | A14 : no checking account 33 | 34 | Attribute 2: (numerical) 35 | Duration in month 36 | 持续时间,连续变量 37 | 38 | Attribute 3: (qualitative) 39 | Credit history 40 | 信用历史,有序离散 41 | A30 : no credits taken/ 42 | all credits paid back duly 43 | A31 : all credits at this bank paid back duly 44 | A32 : existing credits paid back duly till now 45 | A33 : delay in paying off in the past 46 | A34 : critical account/ 47 | other credits existing (not at this bank) 48 | 49 | Attribute 4: (qualitative) 50 | Purpose 51 | 用途,无序离散 52 | A40 : car (new) 53 | A41 : car (used) 54 | A42 : furniture/equipment 55 | A43 : radio/television 56 | A44 : domestic appliances 57 | A45 : repairs 58 | A46 : education 59 | A47 : (vacation - does not exist?) 60 | A48 : retraining 61 | A49 : business 62 | A410 : others 63 | 64 | Attribute 5: (numerical) 65 | Credit amount 66 | 信用额度,连续变量 67 | 68 | Attibute 6: (qualitative) 69 | Savings account/bonds 70 | 储蓄卡存储额度,有序离散 71 | A61 : ... < 100 DM 72 | A62 : 100 <= ... < 500 DM 73 | A63 : 500 <= ... < 1000 DM 74 | A64 : .. >= 1000 DM 75 | A65 : unknown/ no savings account 76 | 77 | Attribute 7: (qualitative) 78 | Present employment since 79 | 工作至今年限,有序离散 80 | A71 : unemployed 81 | A72 : ... < 1 year 82 | A73 : 1 <= ... < 4 years 83 | A74 : 4 <= ... < 7 years 84 | A75 : .. >= 7 years 85 | 86 | Attribute 8: (numerical) 87 | Installment rate in percentage of disposable income 88 | 分期付款利率占可支配收入百分比,连续 89 | 90 | Attribute 9: (qualitative) 91 | Personal status and sex 92 | 婚姻状态和性别,无序离散 93 | A91 : male : divorced/separated 94 | A92 : female : divorced/separated/married 95 | A93 : male : single 96 | A94 : male : married/widowed 97 | A95 : female : single 98 | 99 | Attribute 10: (qualitative) 100 | Other debtors / guarantors 101 | 其他债务或担保,无序离散 102 | A101 : none 103 | A102 : co-applicant 104 | A103 : guarantor 105 | 106 | Attribute 11: (numerical) 107 | Present residence since 108 | 居住至今年限, 连续 109 | 110 | Attribute 12: (qualitative) 111 | Property 112 | 属性,离散 113 | A121 : real estate 114 | A122 : if not A121 : building society savings agreement/ 115 | life insurance 116 | A123 : if not A121/A122 : car or other, not in attribute 6 117 | A124 : unknown / no property 118 | 119 | Attribute 13: (numerical) 120 | Age in years 121 | 年龄,连续 122 | 123 | Attribute 14: (qualitative) 124 | Other installment plans 125 | 其他分期计划,离散 126 | A141 : bank 127 | A142 : stores 128 | A143 : none 129 | 130 | Attribute 15: (qualitative) 131 | Housing 132 | 住房情况,离散 133 | A151 : rent 134 | A152 : own 135 | A153 : for free 136 | 137 | Attribute 16: (numerical) 138 | Number of existing credits at this bank 139 | 现有银行积分数,连续 140 | 141 | Attribute 17: (qualitative) 142 | Job 143 | 工作,有序离散 144 | A171 : unemployed/ unskilled - non-resident 145 | A172 : unskilled - resident 146 | A173 : skilled employee / official 147 | A174 : management/ self-employed/ 148 | highly qualified employee/ officer 149 | 150 | Attribute 18: (numerical) 151 | Number of people being liable to provide maintenance for 152 | 维护服务人数,连续 153 | 154 | Attribute 19: (qualitative) 155 | Telephone 156 | 电话,离散 157 | A191 : none 158 | A192 : yes, registered under the customers name 159 | 160 | Attribute 20: (qualitative) 161 | foreign worker 162 | 国外工作经历,离散 163 | A201 : yes 164 | A202 : no 165 | 166 | 167 | 168 | 8. Cost Matrix 169 | 170 | This dataset requires use of a cost matrix (see below) 171 | 172 | 173 | 1 2 174 | ---------------------------- 175 | 1 0 1 176 | ----------------------- 177 | 2 5 0 178 | 179 | (1 = Good, 2 = Bad) 180 | 181 | the rows represent the actual classification and the columns 182 | the predicted classification. 183 | 184 | It is worse to class a customer as good when they are bad (5), 185 | than it is to class a customer as bad when they are good (1). 186 | 187 | -------------------------------------------------------------------------------- /riskModel/data/germancredit.csv: -------------------------------------------------------------------------------- 1 | A11 6 A34 A43 1169 A65 A75 4 A93 A101 4 A121 67 A143 A152 2 A173 1 A192 A201 1 2 | A12 48 A32 A43 5951 A61 A73 2 A92 A101 2 A121 22 A143 A152 1 A173 1 A191 A201 2 3 | A14 12 A34 A46 2096 A61 A74 2 A93 A101 3 A121 49 A143 A152 1 A172 2 A191 A201 1 4 | A11 42 A32 A42 7882 A61 A74 2 A93 A103 4 A122 45 A143 A153 1 A173 2 A191 A201 1 5 | A11 24 A33 A40 4870 A61 A73 3 A93 A101 4 A124 53 A143 A153 2 A173 2 A191 A201 2 6 | A14 36 A32 A46 9055 A65 A73 2 A93 A101 4 A124 35 A143 A153 1 A172 2 A192 A201 1 7 | A14 24 A32 A42 2835 A63 A75 3 A93 A101 4 A122 53 A143 A152 1 A173 1 A191 A201 1 8 | A12 36 A32 A41 6948 A61 A73 2 A93 A101 2 A123 35 A143 A151 1 A174 1 A192 A201 1 9 | A14 12 A32 A43 3059 A64 A74 2 A91 A101 4 A121 61 A143 A152 1 A172 1 A191 A201 1 10 | A12 30 A34 A40 5234 A61 A71 4 A94 A101 2 A123 28 A143 A152 2 A174 1 A191 A201 2 11 | A12 12 A32 A40 1295 A61 A72 3 A92 A101 1 A123 25 A143 A151 1 A173 1 A191 A201 2 12 | A11 48 A32 A49 4308 A61 A72 3 A92 A101 4 A122 24 A143 A151 1 A173 1 A191 A201 2 13 | A12 12 A32 A43 1567 A61 A73 1 A92 A101 1 A123 22 A143 A152 1 A173 1 A192 A201 1 14 | A11 24 A34 A40 1199 A61 A75 4 A93 A101 4 A123 60 A143 A152 2 A172 1 A191 A201 2 15 | A11 15 A32 A40 1403 A61 A73 2 A92 A101 4 A123 28 A143 A151 1 A173 1 A191 A201 1 16 | A11 24 A32 A43 1282 A62 A73 4 A92 A101 2 A123 32 A143 A152 1 A172 1 A191 A201 2 17 | A14 24 A34 A43 2424 A65 A75 4 A93 A101 4 A122 53 A143 A152 2 A173 1 A191 A201 1 18 | A11 30 A30 A49 8072 A65 A72 2 A93 A101 3 A123 25 A141 A152 3 A173 1 A191 A201 1 19 | A12 24 A32 A41 12579 A61 A75 4 A92 A101 2 A124 44 A143 A153 1 A174 1 A192 A201 2 20 | A14 24 A32 A43 3430 A63 A75 3 A93 A101 2 A123 31 A143 A152 1 A173 2 A192 A201 1 21 | A14 9 A34 A40 2134 A61 A73 4 A93 A101 4 A123 48 A143 A152 3 A173 1 A192 A201 1 22 | A11 6 A32 A43 2647 A63 A73 2 A93 A101 3 A121 44 A143 A151 1 A173 2 A191 A201 1 23 | A11 10 A34 A40 2241 A61 A72 1 A93 A101 3 A121 48 A143 A151 2 A172 2 A191 A202 1 24 | A12 12 A34 A41 1804 A62 A72 3 A93 A101 4 A122 44 A143 A152 1 A173 1 A191 A201 1 25 | A14 10 A34 A42 2069 A65 A73 2 A94 A101 1 A123 26 A143 A152 2 A173 1 A191 A202 1 26 | A11 6 A32 A42 1374 A61 A73 1 A93 A101 2 A121 36 A141 A152 1 A172 1 A192 A201 1 27 | A14 6 A30 A43 426 A61 A75 4 A94 A101 4 A123 39 A143 A152 1 A172 1 A191 A201 1 28 | A13 12 A31 A43 409 A64 A73 3 A92 A101 3 A121 42 A143 A151 2 A173 1 A191 A201 1 29 | A12 7 A32 A43 2415 A61 A73 3 A93 A103 2 A121 34 A143 A152 1 A173 1 A191 A201 1 30 | A11 60 A33 A49 6836 A61 A75 3 A93 A101 4 A124 63 A143 A152 2 A173 1 A192 A201 2 31 | A12 18 A32 A49 1913 A64 A72 3 A94 A101 3 A121 36 A141 A152 1 A173 1 A192 A201 1 32 | A11 24 A32 A42 4020 A61 A73 2 A93 A101 2 A123 27 A142 A152 1 A173 1 A191 A201 1 33 | A12 18 A32 A40 5866 A62 A73 2 A93 A101 2 A123 30 A143 A152 2 A173 1 A192 A201 1 34 | A14 12 A34 A49 1264 A65 A75 4 A93 A101 4 A124 57 A143 A151 1 A172 1 A191 A201 1 35 | A13 12 A32 A42 1474 A61 A72 4 A92 A101 1 A122 33 A141 A152 1 A174 1 A192 A201 1 36 | A12 45 A34 A43 4746 A61 A72 4 A93 A101 2 A122 25 A143 A152 2 A172 1 A191 A201 2 37 | A14 48 A34 A46 6110 A61 A73 1 A93 A101 3 A124 31 A141 A153 1 A173 1 A192 A201 1 38 | A13 18 A32 A43 2100 A61 A73 4 A93 A102 2 A121 37 A142 A152 1 A173 1 A191 A201 2 39 | A13 10 A32 A44 1225 A61 A73 2 A93 A101 2 A123 37 A143 A152 1 A173 1 A192 A201 1 40 | A12 9 A32 A43 458 A61 A73 4 A93 A101 3 A121 24 A143 A152 1 A173 1 A191 A201 1 41 | A14 30 A32 A43 2333 A63 A75 4 A93 A101 2 A123 30 A141 A152 1 A174 1 A191 A201 1 42 | A12 12 A32 A43 1158 A63 A73 3 A91 A101 1 A123 26 A143 A152 1 A173 1 A192 A201 1 43 | A12 18 A33 A45 6204 A61 A73 2 A93 A101 4 A121 44 A143 A152 1 A172 2 A192 A201 1 44 | A11 30 A34 A41 6187 A62 A74 1 A94 A101 4 A123 24 A143 A151 2 A173 1 A191 A201 1 45 | A11 48 A34 A41 6143 A61 A75 4 A92 A101 4 A124 58 A142 A153 2 A172 1 A191 A201 2 46 | A14 11 A34 A40 1393 A61 A72 4 A92 A101 4 A123 35 A143 A152 2 A174 1 A191 A201 1 47 | A14 36 A32 A43 2299 A63 A75 4 A93 A101 4 A123 39 A143 A152 1 A173 1 A191 A201 1 48 | A11 6 A32 A41 1352 A63 A71 1 A92 A101 2 A122 23 A143 A151 1 A171 1 A192 A201 1 49 | A14 11 A34 A40 7228 A61 A73 1 A93 A101 4 A122 39 A143 A152 2 A172 1 A191 A201 1 50 | A14 12 A32 A43 2073 A62 A73 4 A92 A102 2 A121 28 A143 A152 1 A173 1 A191 A201 1 51 | A12 24 A33 A42 2333 A65 A72 4 A93 A101 2 A122 29 A141 A152 1 A172 1 A191 A201 1 52 | A12 27 A33 A41 5965 A61 A75 1 A93 A101 2 A123 30 A143 A152 2 A174 1 A192 A201 1 53 | A14 12 A32 A43 1262 A61 A73 3 A93 A101 2 A123 25 A143 A152 1 A173 1 A191 A201 1 54 | A14 18 A32 A41 3378 A65 A73 2 A93 A101 1 A122 31 A143 A152 1 A173 1 A192 A201 1 55 | A12 36 A33 A40 2225 A61 A75 4 A93 A101 4 A124 57 A141 A153 2 A173 1 A192 A201 2 56 | A14 6 A31 A40 783 A65 A73 1 A93 A103 2 A121 26 A142 A152 1 A172 2 A191 A201 1 57 | A12 12 A32 A43 6468 A65 A71 2 A93 A101 1 A124 52 A143 A152 1 A174 1 A192 A201 2 58 | A14 36 A34 A43 9566 A61 A73 2 A92 A101 2 A123 31 A142 A152 2 A173 1 A191 A201 1 59 | A13 18 A32 A40 1961 A61 A75 3 A92 A101 2 A123 23 A143 A152 1 A174 1 A191 A201 1 60 | A11 36 A34 A42 6229 A61 A72 4 A92 A102 4 A124 23 A143 A151 2 A172 1 A192 A201 2 61 | A12 9 A32 A49 1391 A61 A73 2 A94 A101 1 A121 27 A141 A152 1 A173 1 A192 A201 1 62 | A12 15 A34 A43 1537 A65 A75 4 A93 A103 4 A121 50 A143 A152 2 A173 1 A192 A201 1 63 | A12 36 A30 A49 1953 A61 A75 4 A93 A101 4 A124 61 A143 A153 1 A174 1 A192 A201 2 64 | A12 48 A30 A49 14421 A61 A73 2 A93 A101 2 A123 25 A143 A152 1 A173 1 A192 A201 2 65 | A14 24 A32 A43 3181 A61 A72 4 A92 A101 4 A122 26 A143 A152 1 A173 1 A192 A201 1 66 | A14 27 A32 A45 5190 A65 A75 4 A93 A101 4 A122 48 A143 A152 4 A173 2 A192 A201 1 67 | A14 12 A32 A43 2171 A61 A72 2 A92 A101 2 A123 29 A141 A152 1 A173 1 A191 A201 1 68 | A12 12 A32 A40 1007 A64 A73 4 A94 A101 1 A121 22 A143 A152 1 A173 1 A191 A201 1 69 | A14 36 A32 A46 1819 A61 A73 4 A93 A101 4 A124 37 A142 A153 1 A173 1 A192 A201 2 70 | A14 36 A32 A43 2394 A65 A73 4 A92 A101 4 A123 25 A143 A152 1 A173 1 A191 A201 1 71 | A14 36 A32 A41 8133 A61 A73 1 A92 A101 2 A122 30 A141 A152 1 A173 1 A191 A201 1 72 | A14 7 A34 A43 730 A65 A75 4 A93 A101 2 A122 46 A143 A151 2 A172 1 A192 A201 1 73 | A11 8 A34 A410 1164 A61 A75 3 A93 A101 4 A124 51 A141 A153 2 A174 2 A192 A201 1 74 | A12 42 A34 A49 5954 A61 A74 2 A92 A101 1 A121 41 A141 A152 2 A172 1 A191 A201 1 75 | A11 36 A32 A46 1977 A65 A75 4 A93 A101 4 A124 40 A143 A152 1 A174 1 A192 A201 2 76 | A11 12 A34 A41 1526 A61 A75 4 A93 A101 4 A124 66 A143 A153 2 A174 1 A191 A201 1 77 | A11 42 A32 A43 3965 A61 A72 4 A93 A101 3 A123 34 A143 A152 1 A173 1 A191 A201 2 78 | A12 11 A33 A43 4771 A61 A74 2 A93 A101 4 A122 51 A143 A152 1 A173 1 A191 A201 1 79 | A14 54 A30 A41 9436 A65 A73 2 A93 A101 2 A122 39 A143 A152 1 A172 2 A191 A201 1 80 | A12 30 A32 A42 3832 A61 A72 2 A94 A101 1 A122 22 A143 A152 1 A173 1 A191 A201 1 81 | A14 24 A32 A43 5943 A65 A72 1 A92 A101 1 A123 44 A143 A152 2 A173 1 A192 A201 2 82 | A14 15 A32 A43 1213 A63 A75 4 A93 A101 3 A122 47 A142 A152 1 A173 1 A192 A201 1 83 | A14 18 A32 A49 1568 A62 A73 3 A92 A101 4 A122 24 A143 A151 1 A172 1 A191 A201 1 84 | A11 24 A32 A410 1755 A61 A75 4 A92 A103 4 A121 58 A143 A152 1 A172 1 A192 A201 1 85 | A11 10 A32 A43 2315 A61 A75 3 A93 A101 4 A121 52 A143 A152 1 A172 1 A191 A201 1 86 | A14 12 A34 A49 1412 A61 A73 4 A92 A103 2 A121 29 A143 A152 2 A174 1 A192 A201 1 87 | A12 18 A34 A42 1295 A61 A72 4 A92 A101 1 A122 27 A143 A152 2 A173 1 A191 A201 1 88 | A12 36 A32 A46 12612 A62 A73 1 A93 A101 4 A124 47 A143 A153 1 A173 2 A192 A201 2 89 | A11 18 A32 A40 2249 A62 A74 4 A93 A101 3 A123 30 A143 A152 1 A174 2 A192 A201 1 90 | A11 12 A30 A45 1108 A61 A74 4 A93 A101 3 A121 28 A143 A152 2 A173 1 A191 A201 2 91 | A14 12 A34 A43 618 A61 A75 4 A93 A101 4 A121 56 A143 A152 1 A173 1 A191 A201 1 92 | A11 12 A34 A41 1409 A61 A75 4 A93 A101 3 A121 54 A143 A152 1 A173 1 A191 A201 1 93 | A14 12 A34 A43 797 A65 A75 4 A92 A101 3 A122 33 A141 A152 1 A172 2 A191 A201 2 94 | A13 24 A34 A42 3617 A65 A75 4 A93 A102 4 A124 20 A143 A151 2 A173 1 A191 A201 1 95 | A12 12 A32 A40 1318 A64 A75 4 A93 A101 4 A121 54 A143 A152 1 A173 1 A192 A201 1 96 | A12 54 A30 A49 15945 A61 A72 3 A93 A101 4 A124 58 A143 A151 1 A173 1 A192 A201 2 97 | A14 12 A34 A46 2012 A65 A74 4 A92 A101 2 A123 61 A143 A152 1 A173 1 A191 A201 1 98 | A12 18 A32 A49 2622 A62 A73 4 A93 A101 4 A123 34 A143 A152 1 A173 1 A191 A201 1 99 | A12 36 A34 A43 2337 A61 A75 4 A93 A101 4 A121 36 A143 A152 1 A173 1 A191 A201 1 100 | A12 20 A33 A41 7057 A65 A74 3 A93 A101 4 A122 36 A141 A151 2 A174 2 A192 A201 1 101 | A14 24 A32 A40 1469 A62 A75 4 A94 A101 4 A121 41 A143 A151 1 A172 1 A191 A201 1 102 | A12 36 A32 A43 2323 A61 A74 4 A93 A101 4 A123 24 A143 A151 1 A173 1 A191 A201 1 103 | A14 6 A33 A43 932 A61 A73 3 A92 A101 2 A121 24 A143 A152 1 A173 1 A191 A201 1 104 | A12 9 A34 A42 1919 A61 A74 4 A93 A101 3 A123 35 A143 A151 1 A173 1 A192 A201 1 105 | A14 12 A32 A41 2445 A65 A72 2 A94 A101 4 A123 26 A143 A151 1 A173 1 A192 A201 1 106 | A12 24 A34 A410 11938 A61 A73 2 A93 A102 3 A123 39 A143 A152 2 A174 2 A192 A201 2 107 | A14 18 A31 A40 6458 A61 A75 2 A93 A101 4 A124 39 A141 A152 2 A174 2 A192 A201 2 108 | A12 12 A32 A40 6078 A61 A74 2 A93 A101 2 A123 32 A143 A152 1 A173 1 A191 A201 1 109 | A11 24 A32 A42 7721 A65 A72 1 A92 A101 2 A122 30 A143 A152 1 A173 1 A192 A202 1 110 | A12 14 A32 A49 1410 A63 A75 1 A94 A101 2 A121 35 A143 A152 1 A173 1 A192 A201 1 111 | A12 6 A33 A49 1449 A62 A75 1 A91 A101 2 A123 31 A141 A152 2 A173 2 A191 A201 1 112 | A13 15 A32 A46 392 A61 A72 4 A92 A101 4 A122 23 A143 A151 1 A173 1 A192 A201 1 113 | A12 18 A32 A40 6260 A61 A74 3 A93 A101 3 A121 28 A143 A151 1 A172 1 A191 A201 1 114 | A14 36 A34 A40 7855 A61 A73 4 A92 A101 2 A121 25 A142 A152 2 A173 1 A192 A201 2 115 | A11 12 A32 A43 1680 A63 A75 3 A94 A101 1 A121 35 A143 A152 1 A173 1 A191 A201 1 116 | A14 48 A34 A43 3578 A65 A75 4 A93 A101 1 A121 47 A143 A152 1 A173 1 A192 A201 1 117 | A11 42 A32 A43 7174 A65 A74 4 A92 A101 3 A123 30 A143 A152 1 A174 1 A192 A201 2 118 | A11 10 A34 A42 2132 A65 A72 2 A92 A102 3 A121 27 A143 A151 2 A173 1 A191 A202 1 119 | A11 33 A34 A42 4281 A63 A73 1 A92 A101 4 A123 23 A143 A152 2 A173 1 A191 A201 2 120 | A12 12 A34 A40 2366 A63 A74 3 A91 A101 3 A123 36 A143 A152 1 A174 1 A192 A201 1 121 | A11 21 A32 A43 1835 A61 A73 3 A92 A101 2 A121 25 A143 A152 2 A173 1 A192 A201 2 122 | A14 24 A34 A41 3868 A61 A75 4 A92 A101 2 A123 41 A143 A151 2 A174 1 A192 A201 1 123 | A14 12 A32 A42 1768 A61 A73 3 A93 A101 2 A121 24 A143 A151 1 A172 1 A191 A201 1 124 | A13 10 A34 A40 781 A61 A75 4 A93 A101 4 A124 63 A143 A153 2 A173 1 A192 A201 1 125 | A12 18 A32 A42 1924 A65 A72 4 A92 A101 3 A121 27 A143 A151 1 A173 1 A191 A201 2 126 | A11 12 A34 A40 2121 A61 A73 4 A93 A101 2 A122 30 A143 A152 2 A173 1 A191 A201 1 127 | A11 12 A32 A43 701 A61 A73 4 A94 A101 2 A121 40 A143 A152 1 A172 1 A191 A201 1 128 | A12 12 A32 A45 639 A61 A73 4 A93 A101 2 A123 30 A143 A152 1 A173 1 A191 A201 2 129 | A12 12 A34 A41 1860 A61 A71 4 A93 A101 2 A123 34 A143 A152 2 A174 1 A192 A201 1 130 | A11 12 A34 A40 3499 A61 A73 3 A92 A102 2 A121 29 A143 A152 2 A173 1 A191 A201 2 131 | A12 48 A32 A40 8487 A65 A74 1 A92 A101 2 A123 24 A143 A152 1 A173 1 A191 A201 1 132 | A11 36 A33 A46 6887 A61 A73 4 A93 A101 3 A122 29 A142 A152 1 A173 1 A192 A201 2 133 | A14 15 A32 A42 2708 A61 A72 2 A93 A101 3 A122 27 A141 A152 2 A172 1 A191 A201 1 134 | A14 18 A32 A42 1984 A61 A73 4 A93 A101 4 A124 47 A141 A153 2 A173 1 A191 A201 1 135 | A14 60 A32 A43 10144 A62 A74 2 A92 A101 4 A121 21 A143 A152 1 A173 1 A192 A201 1 136 | A14 12 A34 A43 1240 A65 A75 4 A92 A101 2 A121 38 A143 A152 2 A173 1 A192 A201 1 137 | A14 27 A33 A41 8613 A64 A73 2 A93 A101 2 A123 27 A143 A152 2 A173 1 A191 A201 1 138 | A12 12 A32 A43 766 A63 A73 4 A93 A101 3 A121 66 A143 A152 1 A172 1 A191 A201 2 139 | A12 15 A34 A43 2728 A65 A74 4 A93 A103 2 A121 35 A141 A152 3 A173 1 A192 A201 1 140 | A13 12 A32 A43 1881 A61 A73 2 A92 A101 2 A123 44 A143 A151 1 A172 1 A192 A201 1 141 | A13 6 A32 A40 709 A64 A72 2 A94 A101 2 A121 27 A143 A152 1 A171 1 A191 A202 1 142 | A12 36 A32 A43 4795 A61 A72 4 A92 A101 1 A124 30 A143 A152 1 A174 1 A192 A201 1 143 | A11 27 A32 A43 3416 A61 A73 3 A93 A101 2 A123 27 A143 A152 1 A174 1 A191 A201 1 144 | A11 18 A32 A42 2462 A61 A73 2 A93 A101 2 A123 22 A143 A152 1 A173 1 A191 A201 2 145 | A14 21 A34 A42 2288 A61 A72 4 A92 A101 4 A122 23 A143 A152 1 A173 1 A192 A201 1 146 | A12 48 A31 A49 3566 A62 A74 4 A93 A101 2 A123 30 A143 A152 1 A173 1 A191 A201 1 147 | A11 6 A34 A40 860 A61 A75 1 A92 A101 4 A124 39 A143 A152 2 A173 1 A192 A201 1 148 | A14 12 A34 A40 682 A62 A74 4 A92 A101 3 A123 51 A143 A152 2 A173 1 A192 A201 1 149 | A11 36 A34 A42 5371 A61 A73 3 A93 A103 2 A122 28 A143 A152 2 A173 1 A191 A201 1 150 | A14 18 A34 A43 1582 A64 A75 4 A93 A101 4 A123 46 A143 A152 2 A173 1 A191 A201 1 151 | A14 6 A32 A43 1346 A62 A75 2 A93 A101 4 A124 42 A141 A153 1 A173 2 A192 A201 1 152 | A14 10 A32 A43 1924 A61 A73 1 A93 A101 4 A122 38 A143 A152 1 A173 1 A192 A202 1 153 | A13 36 A32 A43 5848 A61 A73 4 A93 A101 1 A123 24 A143 A152 1 A173 1 A191 A201 1 154 | A12 24 A34 A41 7758 A64 A75 2 A92 A101 4 A124 29 A143 A151 1 A173 1 A191 A201 1 155 | A12 24 A33 A49 6967 A62 A74 4 A93 A101 4 A123 36 A143 A151 1 A174 1 A192 A201 1 156 | A11 12 A32 A42 1282 A61 A73 2 A92 A101 4 A123 20 A143 A151 1 A173 1 A191 A201 2 157 | A11 9 A34 A45 1288 A62 A75 3 A93 A103 4 A121 48 A143 A152 2 A173 2 A191 A202 1 158 | A11 12 A31 A48 339 A61 A75 4 A94 A101 1 A123 45 A141 A152 1 A172 1 A191 A201 1 159 | A12 24 A32 A40 3512 A62 A74 2 A93 A101 3 A123 38 A141 A152 2 A173 1 A192 A201 1 160 | A14 6 A34 A43 1898 A65 A73 1 A93 A101 2 A121 34 A143 A152 2 A172 2 A191 A201 1 161 | A14 24 A34 A43 2872 A62 A75 3 A93 A101 4 A121 36 A143 A152 1 A173 2 A192 A201 1 162 | A14 18 A34 A40 1055 A61 A72 4 A92 A101 1 A122 30 A143 A152 2 A173 1 A191 A201 1 163 | A14 15 A32 A44 1262 A63 A74 4 A93 A101 3 A122 36 A143 A152 2 A173 1 A192 A201 1 164 | A12 10 A32 A40 7308 A61 A71 2 A93 A101 4 A124 70 A141 A153 1 A174 1 A192 A201 1 165 | A14 36 A32 A40 909 A63 A75 4 A93 A101 4 A122 36 A143 A152 1 A173 1 A191 A201 1 166 | A14 6 A32 A42 2978 A63 A73 1 A93 A101 2 A123 32 A143 A152 1 A173 1 A192 A201 1 167 | A11 18 A32 A42 1131 A61 A71 4 A92 A101 2 A123 33 A143 A152 1 A173 1 A191 A201 2 168 | A12 11 A32 A42 1577 A64 A72 4 A92 A101 1 A121 20 A143 A152 1 A173 1 A191 A201 1 169 | A14 24 A32 A42 3972 A61 A74 2 A92 A101 4 A122 25 A143 A151 1 A173 1 A192 A201 1 170 | A12 24 A34 A49 1935 A61 A75 4 A91 A101 4 A121 31 A143 A152 2 A173 1 A192 A201 2 171 | A11 15 A30 A40 950 A61 A75 4 A93 A101 3 A123 33 A143 A151 2 A173 2 A191 A201 2 172 | A14 12 A32 A42 763 A61 A73 4 A92 A101 1 A121 26 A143 A152 1 A173 1 A192 A201 1 173 | A12 24 A33 A42 2064 A61 A71 3 A92 A101 2 A122 34 A143 A152 1 A174 1 A192 A201 2 174 | A12 8 A32 A43 1414 A61 A73 4 A93 A103 2 A121 33 A143 A152 1 A173 1 A191 A202 1 175 | A11 21 A33 A46 3414 A61 A72 2 A93 A101 1 A122 26 A143 A152 2 A173 1 A191 A201 2 176 | A14 30 A31 A41 7485 A65 A71 4 A92 A101 1 A121 53 A141 A152 1 A174 1 A192 A201 2 177 | A11 12 A32 A42 2577 A61 A73 2 A91 A101 1 A123 42 A143 A152 1 A173 1 A191 A201 1 178 | A11 6 A34 A43 338 A63 A75 4 A93 A101 4 A123 52 A143 A152 2 A173 1 A191 A201 1 179 | A14 12 A32 A43 1963 A61 A74 4 A93 A101 2 A123 31 A143 A151 2 A174 2 A192 A201 1 180 | A11 21 A34 A40 571 A61 A75 4 A93 A101 4 A121 65 A143 A152 2 A173 1 A191 A201 1 181 | A14 36 A33 A49 9572 A61 A72 1 A91 A101 1 A123 28 A143 A152 2 A173 1 A191 A201 2 182 | A12 36 A33 A49 4455 A61 A73 2 A91 A101 2 A121 30 A142 A152 2 A174 1 A192 A201 2 183 | A11 21 A31 A40 1647 A65 A73 4 A93 A101 2 A122 40 A143 A152 2 A172 2 A191 A201 2 184 | A14 24 A34 A42 3777 A64 A73 4 A93 A101 4 A121 50 A143 A152 1 A173 1 A192 A201 1 185 | A12 18 A34 A40 884 A61 A75 4 A93 A101 4 A123 36 A141 A152 1 A173 2 A192 A201 2 186 | A14 15 A34 A43 1360 A61 A73 4 A93 A101 2 A122 31 A143 A152 2 A173 1 A191 A201 1 187 | A12 9 A31 A41 5129 A61 A75 2 A92 A101 4 A124 74 A141 A153 1 A174 2 A192 A201 2 188 | A12 16 A34 A40 1175 A61 A71 2 A93 A101 3 A123 68 A143 A153 3 A171 1 A192 A201 1 189 | A11 12 A32 A43 674 A62 A74 4 A94 A101 1 A122 20 A143 A152 1 A173 1 A191 A201 2 190 | A12 18 A30 A42 3244 A61 A73 1 A92 A101 4 A123 33 A141 A152 2 A173 1 A192 A201 1 191 | A14 24 A32 A49 4591 A64 A73 2 A93 A101 3 A122 54 A143 A152 3 A174 1 A192 A201 2 192 | A12 48 A30 A49 3844 A62 A74 4 A93 A101 4 A124 34 A143 A153 1 A172 2 A191 A201 2 193 | A12 27 A32 A49 3915 A61 A73 4 A93 A101 2 A123 36 A143 A152 1 A173 2 A192 A201 2 194 | A14 6 A32 A43 2108 A61 A74 2 A94 A101 2 A121 29 A143 A151 1 A173 1 A191 A201 1 195 | A12 45 A32 A43 3031 A62 A73 4 A93 A103 4 A122 21 A143 A151 1 A173 1 A191 A201 2 196 | A12 9 A34 A46 1501 A61 A75 2 A92 A101 3 A123 34 A143 A152 2 A174 1 A192 A201 2 197 | A14 6 A34 A43 1382 A61 A73 1 A92 A101 1 A123 28 A143 A152 2 A173 1 A192 A201 1 198 | A12 12 A32 A42 951 A62 A72 4 A92 A101 4 A123 27 A141 A151 4 A173 1 A191 A201 2 199 | A12 24 A32 A41 2760 A65 A75 4 A93 A101 4 A124 36 A141 A153 1 A173 1 A192 A201 1 200 | A12 18 A33 A42 4297 A61 A75 4 A91 A101 3 A124 40 A143 A152 1 A174 1 A192 A201 2 201 | A14 9 A34 A46 936 A63 A75 4 A93 A101 2 A123 52 A143 A152 2 A173 1 A192 A201 1 202 | A11 12 A32 A40 1168 A61 A73 4 A94 A101 3 A121 27 A143 A152 1 A172 1 A191 A201 1 203 | A14 27 A33 A49 5117 A61 A74 3 A93 A101 4 A123 26 A143 A152 2 A173 1 A191 A201 1 204 | A11 12 A32 A48 902 A61 A74 4 A94 A101 4 A122 21 A143 A151 1 A173 1 A191 A201 2 205 | A14 12 A34 A40 1495 A61 A75 4 A93 A101 1 A121 38 A143 A152 2 A172 2 A191 A201 1 206 | A11 30 A34 A41 10623 A61 A75 3 A93 A101 4 A124 38 A143 A153 3 A174 2 A192 A201 1 207 | A14 12 A34 A42 1935 A61 A75 4 A93 A101 4 A121 43 A143 A152 3 A173 1 A192 A201 1 208 | A12 12 A34 A44 1424 A61 A74 4 A93 A101 3 A122 26 A143 A152 1 A173 1 A191 A201 1 209 | A11 24 A32 A49 6568 A61 A73 2 A94 A101 2 A123 21 A142 A152 1 A172 1 A191 A201 1 210 | A14 12 A32 A41 1413 A64 A74 3 A93 A101 2 A122 55 A143 A152 1 A173 1 A191 A202 1 211 | A14 9 A34 A43 3074 A65 A73 1 A93 A101 2 A121 33 A143 A152 2 A173 2 A191 A201 1 212 | A14 36 A32 A43 3835 A65 A75 2 A92 A101 4 A121 45 A143 A152 1 A172 1 A192 A201 1 213 | A11 27 A30 A49 5293 A61 A71 2 A93 A101 4 A122 50 A142 A152 2 A173 1 A192 A201 2 214 | A13 30 A33 A49 1908 A61 A75 4 A93 A101 4 A121 66 A143 A152 1 A174 1 A192 A201 2 215 | A14 36 A34 A43 3342 A65 A75 4 A93 A101 2 A123 51 A143 A152 1 A173 1 A192 A201 1 216 | A12 6 A34 A48 932 A65 A74 1 A92 A101 3 A122 39 A143 A152 2 A172 1 A191 A201 1 217 | A11 18 A30 A49 3104 A61 A74 3 A93 A101 1 A122 31 A141 A152 1 A173 1 A192 A201 1 218 | A13 36 A32 A43 3913 A61 A73 2 A93 A101 2 A121 23 A143 A152 1 A173 1 A192 A201 1 219 | A11 24 A32 A42 3021 A61 A73 2 A91 A101 2 A121 24 A143 A151 1 A172 1 A191 A201 1 220 | A14 10 A32 A40 1364 A61 A73 2 A92 A101 4 A123 64 A143 A152 1 A173 1 A192 A201 1 221 | A12 12 A32 A43 625 A61 A72 4 A94 A103 1 A121 26 A141 A152 1 A172 1 A191 A201 1 222 | A11 12 A32 A46 1200 A65 A73 4 A92 A101 4 A122 23 A141 A151 1 A173 1 A192 A201 1 223 | A14 12 A32 A43 707 A61 A73 4 A93 A101 2 A121 30 A141 A152 2 A173 1 A191 A201 1 224 | A14 24 A33 A49 2978 A65 A73 4 A93 A101 4 A121 32 A143 A152 2 A173 2 A192 A201 1 225 | A14 15 A32 A41 4657 A61 A73 3 A93 A101 2 A123 30 A143 A152 1 A173 1 A192 A201 1 226 | A14 36 A30 A45 2613 A61 A73 4 A93 A101 2 A123 27 A143 A152 2 A173 1 A191 A201 1 227 | A12 48 A32 A43 10961 A64 A74 1 A93 A102 2 A124 27 A141 A152 2 A173 1 A192 A201 2 228 | A11 12 A32 A42 7865 A61 A75 4 A93 A101 4 A124 53 A143 A153 1 A174 1 A192 A201 2 229 | A14 9 A32 A43 1478 A61 A74 4 A93 A101 2 A123 22 A143 A152 1 A173 1 A191 A201 2 230 | A11 24 A32 A42 3149 A61 A72 4 A93 A101 1 A124 22 A141 A153 1 A173 1 A191 A201 1 231 | A13 36 A32 A43 4210 A61 A73 4 A93 A101 2 A123 26 A143 A152 1 A173 1 A191 A201 2 232 | A14 9 A32 A40 2507 A63 A75 2 A93 A101 4 A124 51 A143 A153 1 A172 1 A191 A201 1 233 | A14 12 A32 A43 2141 A62 A74 3 A93 A101 1 A124 35 A143 A152 1 A173 1 A191 A201 1 234 | A12 18 A32 A43 866 A61 A73 4 A94 A103 2 A121 25 A143 A152 1 A172 1 A191 A201 1 235 | A14 4 A34 A43 1544 A61 A74 2 A93 A101 1 A121 42 A143 A152 3 A172 2 A191 A201 1 236 | A11 24 A32 A43 1823 A61 A71 4 A93 A101 2 A123 30 A142 A152 1 A174 2 A191 A201 2 237 | A12 6 A32 A40 14555 A65 A71 1 A93 A101 2 A122 23 A143 A152 1 A171 1 A192 A201 2 238 | A12 21 A32 A49 2767 A62 A75 4 A91 A101 2 A123 61 A141 A151 2 A172 1 A191 A201 2 239 | A14 12 A34 A43 1291 A61 A73 4 A92 A101 2 A122 35 A143 A152 2 A173 1 A191 A201 1 240 | A11 30 A32 A43 2522 A61 A75 1 A93 A103 3 A122 39 A143 A152 1 A173 2 A191 A201 1 241 | A11 24 A32 A40 915 A65 A75 4 A92 A101 2 A123 29 A141 A152 1 A173 1 A191 A201 2 242 | A14 6 A32 A43 1595 A61 A74 3 A93 A101 2 A122 51 A143 A152 1 A173 2 A191 A201 1 243 | A11 48 A30 A41 4605 A61 A75 3 A93 A101 4 A124 24 A143 A153 2 A173 2 A191 A201 2 244 | A14 12 A34 A49 1185 A61 A73 3 A92 A101 2 A121 27 A143 A152 2 A173 1 A191 A201 1 245 | A14 12 A31 A48 3447 A63 A73 4 A92 A101 3 A121 35 A143 A152 1 A172 2 A191 A201 1 246 | A14 24 A32 A49 1258 A61 A74 4 A93 A101 1 A121 25 A143 A152 1 A173 1 A192 A201 1 247 | A14 12 A34 A43 717 A61 A75 4 A93 A101 4 A121 52 A143 A152 3 A173 1 A191 A201 1 248 | A14 6 A30 A40 1204 A62 A73 4 A93 A101 1 A124 35 A141 A151 1 A173 1 A191 A202 1 249 | A13 24 A32 A42 1925 A61 A73 2 A93 A101 2 A121 26 A143 A152 1 A173 1 A191 A201 1 250 | A14 18 A32 A43 433 A61 A71 3 A92 A102 4 A121 22 A143 A151 1 A173 1 A191 A201 2 251 | A11 6 A34 A40 666 A64 A74 3 A92 A101 4 A121 39 A143 A152 2 A172 1 A192 A201 1 252 | A13 12 A32 A42 2251 A61 A73 1 A92 A101 2 A123 46 A143 A152 1 A172 1 A191 A201 1 253 | A12 30 A32 A40 2150 A61 A73 4 A92 A103 2 A124 24 A141 A152 1 A173 1 A191 A201 2 254 | A14 24 A33 A42 4151 A62 A73 2 A93 A101 3 A122 35 A143 A152 2 A173 1 A191 A201 1 255 | A12 9 A32 A42 2030 A65 A74 2 A93 A101 1 A123 24 A143 A152 1 A173 1 A192 A201 1 256 | A12 60 A33 A43 7418 A65 A73 1 A93 A101 1 A121 27 A143 A152 1 A172 1 A191 A201 1 257 | A14 24 A34 A43 2684 A61 A73 4 A93 A101 2 A121 35 A143 A152 2 A172 1 A191 A201 1 258 | A11 12 A31 A43 2149 A61 A73 4 A91 A101 1 A124 29 A143 A153 1 A173 1 A191 A201 2 259 | A14 15 A32 A41 3812 A62 A72 1 A92 A101 4 A123 23 A143 A152 1 A173 1 A192 A201 1 260 | A14 11 A34 A43 1154 A62 A71 4 A92 A101 4 A121 57 A143 A152 3 A172 1 A191 A201 1 261 | A11 12 A32 A42 1657 A61 A73 2 A93 A101 2 A121 27 A143 A152 1 A173 1 A191 A201 1 262 | A11 24 A32 A43 1603 A61 A75 4 A92 A101 4 A123 55 A143 A152 1 A173 1 A191 A201 1 263 | A11 18 A34 A40 5302 A61 A75 2 A93 A101 4 A124 36 A143 A153 3 A174 1 A192 A201 1 264 | A14 12 A34 A46 2748 A61 A75 2 A92 A101 4 A124 57 A141 A153 3 A172 1 A191 A201 1 265 | A14 10 A34 A40 1231 A61 A75 3 A93 A101 4 A121 32 A143 A152 2 A172 2 A191 A202 1 266 | A12 15 A32 A43 802 A61 A75 4 A93 A101 3 A123 37 A143 A152 1 A173 2 A191 A201 2 267 | A14 36 A34 A49 6304 A65 A75 4 A93 A101 4 A121 36 A143 A152 2 A173 1 A191 A201 1 268 | A14 24 A32 A43 1533 A61 A72 4 A92 A101 3 A123 38 A142 A152 1 A173 1 A192 A201 1 269 | A11 14 A32 A40 8978 A61 A75 1 A91 A101 4 A122 45 A143 A152 1 A174 1 A192 A202 2 270 | A14 24 A32 A43 999 A65 A75 4 A93 A101 2 A123 25 A143 A152 2 A173 1 A191 A201 1 271 | A14 18 A32 A40 2662 A65 A74 4 A93 A101 3 A122 32 A143 A152 1 A173 1 A191 A202 1 272 | A14 12 A34 A42 1402 A63 A74 3 A92 A101 4 A123 37 A143 A151 1 A173 1 A192 A201 1 273 | A12 48 A31 A40 12169 A65 A71 4 A93 A102 4 A124 36 A143 A153 1 A174 1 A192 A201 1 274 | A12 48 A32 A43 3060 A61 A74 4 A93 A101 4 A121 28 A143 A152 2 A173 1 A191 A201 2 275 | A11 30 A32 A45 11998 A61 A72 1 A91 A101 1 A124 34 A143 A152 1 A172 1 A192 A201 2 276 | A14 9 A32 A43 2697 A61 A73 1 A93 A101 2 A121 32 A143 A152 1 A173 2 A191 A201 1 277 | A14 18 A34 A43 2404 A61 A73 2 A92 A101 2 A123 26 A143 A152 2 A173 1 A191 A201 1 278 | A11 12 A32 A42 1262 A65 A75 2 A91 A101 4 A122 49 A143 A152 1 A172 1 A192 A201 1 279 | A14 6 A32 A42 4611 A61 A72 1 A92 A101 4 A122 32 A143 A152 1 A173 1 A191 A201 2 280 | A14 24 A32 A43 1901 A62 A73 4 A93 A101 4 A123 29 A143 A151 1 A174 1 A192 A201 1 281 | A14 15 A34 A41 3368 A64 A75 3 A93 A101 4 A124 23 A143 A151 2 A173 1 A192 A201 1 282 | A14 12 A32 A42 1574 A61 A73 4 A93 A101 2 A121 50 A143 A152 1 A173 1 A191 A201 1 283 | A13 18 A31 A43 1445 A65 A74 4 A93 A101 4 A123 49 A141 A152 1 A172 1 A191 A201 1 284 | A14 15 A34 A42 1520 A65 A75 4 A93 A101 4 A122 63 A143 A152 1 A173 1 A191 A201 1 285 | A12 24 A34 A40 3878 A62 A72 4 A91 A101 2 A123 37 A143 A152 1 A173 1 A192 A201 1 286 | A11 47 A32 A40 10722 A61 A72 1 A92 A101 1 A121 35 A143 A152 1 A172 1 A192 A201 1 287 | A11 48 A32 A41 4788 A61 A74 4 A93 A101 3 A122 26 A143 A152 1 A173 2 A191 A201 1 288 | A12 48 A33 A410 7582 A62 A71 2 A93 A101 4 A124 31 A143 A153 1 A174 1 A192 A201 1 289 | A12 12 A32 A43 1092 A61 A73 4 A92 A103 4 A121 49 A143 A152 2 A173 1 A192 A201 1 290 | A11 24 A33 A43 1024 A61 A72 4 A94 A101 4 A121 48 A142 A152 1 A173 1 A191 A201 2 291 | A14 12 A32 A49 1076 A61 A73 2 A94 A101 2 A121 26 A143 A152 1 A173 1 A192 A202 1 292 | A12 36 A32 A41 9398 A61 A72 1 A94 A101 4 A123 28 A143 A151 1 A174 1 A192 A201 2 293 | A11 24 A34 A41 6419 A61 A75 2 A92 A101 4 A124 44 A143 A153 2 A174 2 A192 A201 1 294 | A13 42 A34 A41 4796 A61 A75 4 A93 A101 4 A124 56 A143 A153 1 A173 1 A191 A201 1 295 | A14 48 A34 A49 7629 A65 A75 4 A91 A101 2 A123 46 A141 A152 2 A174 2 A191 A201 1 296 | A12 48 A32 A42 9960 A61 A72 1 A92 A101 2 A123 26 A143 A152 1 A173 1 A192 A201 2 297 | A14 12 A32 A41 4675 A65 A72 1 A92 A101 4 A123 20 A143 A151 1 A173 1 A191 A201 1 298 | A14 10 A32 A40 1287 A65 A75 4 A93 A102 2 A122 45 A143 A152 1 A172 1 A191 A202 1 299 | A14 18 A32 A42 2515 A61 A73 3 A93 A101 4 A121 43 A143 A152 1 A173 1 A192 A201 1 300 | A12 21 A34 A42 2745 A64 A74 3 A93 A101 2 A123 32 A143 A152 2 A173 1 A192 A201 1 301 | A14 6 A32 A40 672 A61 A71 1 A92 A101 4 A121 54 A143 A152 1 A171 1 A192 A201 1 302 | A12 36 A30 A43 3804 A61 A73 4 A92 A101 1 A123 42 A143 A152 1 A173 1 A192 A201 2 303 | A13 24 A34 A40 1344 A65 A74 4 A93 A101 2 A121 37 A141 A152 2 A172 2 A191 A201 2 304 | A11 10 A34 A40 1038 A61 A74 4 A93 A102 3 A122 49 A143 A152 2 A173 1 A192 A201 1 305 | A14 48 A34 A40 10127 A63 A73 2 A93 A101 2 A124 44 A141 A153 1 A173 1 A191 A201 2 306 | A14 6 A32 A42 1543 A64 A73 4 A91 A101 2 A121 33 A143 A152 1 A173 1 A191 A201 1 307 | A14 30 A32 A41 4811 A65 A74 2 A92 A101 4 A122 24 A142 A151 1 A172 1 A191 A201 1 308 | A11 12 A32 A43 727 A62 A72 4 A94 A101 3 A124 33 A143 A152 1 A172 1 A192 A201 2 309 | A12 8 A32 A42 1237 A61 A73 3 A92 A101 4 A121 24 A143 A152 1 A173 1 A191 A201 2 310 | A12 9 A32 A40 276 A61 A73 4 A94 A101 4 A121 22 A143 A151 1 A172 1 A191 A201 1 311 | A12 48 A32 A410 5381 A65 A71 3 A93 A101 4 A124 40 A141 A153 1 A171 1 A192 A201 1 312 | A14 24 A32 A42 5511 A62 A73 4 A93 A101 1 A123 25 A142 A152 1 A173 1 A191 A201 1 313 | A13 24 A32 A42 3749 A61 A72 2 A92 A101 4 A123 26 A143 A152 1 A173 1 A191 A201 1 314 | A12 12 A32 A40 685 A61 A74 2 A94 A101 3 A123 25 A141 A152 1 A172 1 A191 A201 2 315 | A13 4 A32 A40 1494 A65 A72 1 A93 A101 2 A121 29 A143 A152 1 A172 2 A191 A202 1 316 | A11 36 A31 A42 2746 A61 A75 4 A93 A101 4 A123 31 A141 A152 1 A173 1 A191 A201 2 317 | A11 12 A32 A42 708 A61 A73 2 A93 A103 3 A122 38 A143 A152 1 A172 2 A191 A201 1 318 | A12 24 A32 A42 4351 A65 A73 1 A92 A101 4 A122 48 A143 A152 1 A172 1 A192 A201 1 319 | A14 12 A34 A46 701 A61 A73 4 A93 A101 2 A123 32 A143 A152 2 A173 1 A191 A201 1 320 | A11 15 A33 A42 3643 A61 A75 1 A92 A101 4 A122 27 A143 A152 2 A172 1 A191 A201 1 321 | A12 30 A34 A40 4249 A61 A71 4 A94 A101 2 A123 28 A143 A152 2 A174 1 A191 A201 2 322 | A11 24 A32 A43 1938 A61 A72 4 A91 A101 3 A122 32 A143 A152 1 A173 1 A191 A201 2 323 | A11 24 A32 A41 2910 A61 A74 2 A93 A101 1 A124 34 A143 A153 1 A174 1 A192 A201 1 324 | A11 18 A32 A42 2659 A64 A73 4 A93 A101 2 A123 28 A143 A152 1 A173 1 A191 A201 1 325 | A14 18 A34 A40 1028 A61 A73 4 A92 A101 3 A121 36 A143 A152 2 A173 1 A191 A201 1 326 | A11 8 A34 A40 3398 A61 A74 1 A93 A101 4 A121 39 A143 A152 2 A172 1 A191 A202 1 327 | A14 12 A34 A42 5801 A65 A75 2 A93 A101 4 A122 49 A143 A151 1 A173 1 A192 A201 1 328 | A14 24 A32 A40 1525 A64 A74 4 A92 A101 3 A123 34 A143 A152 1 A173 2 A192 A201 1 329 | A13 36 A32 A43 4473 A61 A75 4 A93 A101 2 A123 31 A143 A152 1 A173 1 A191 A201 1 330 | A12 6 A32 A43 1068 A61 A75 4 A93 A101 4 A123 28 A143 A152 1 A173 2 A191 A201 1 331 | A11 24 A34 A41 6615 A61 A71 2 A93 A101 4 A124 75 A143 A153 2 A174 1 A192 A201 1 332 | A14 18 A34 A46 1864 A62 A73 4 A92 A101 2 A121 30 A143 A152 2 A173 1 A191 A201 2 333 | A12 60 A32 A40 7408 A62 A72 4 A92 A101 2 A122 24 A143 A152 1 A174 1 A191 A201 2 334 | A14 48 A34 A41 11590 A62 A73 2 A92 A101 4 A123 24 A141 A151 2 A172 1 A191 A201 2 335 | A11 24 A30 A42 4110 A61 A75 3 A93 A101 4 A124 23 A141 A151 2 A173 2 A191 A201 2 336 | A11 6 A34 A42 3384 A61 A73 1 A91 A101 4 A121 44 A143 A151 1 A174 1 A192 A201 2 337 | A12 13 A32 A43 2101 A61 A72 2 A92 A103 4 A122 23 A143 A152 1 A172 1 A191 A201 1 338 | A11 15 A32 A44 1275 A65 A73 4 A92 A101 2 A123 24 A143 A151 1 A173 1 A191 A201 2 339 | A11 24 A32 A42 4169 A61 A73 4 A93 A101 4 A122 28 A143 A152 1 A173 1 A191 A201 1 340 | A12 10 A32 A42 1521 A61 A73 4 A91 A101 2 A123 31 A143 A152 1 A172 1 A191 A201 1 341 | A12 24 A34 A46 5743 A61 A72 2 A92 A101 4 A124 24 A143 A153 2 A173 1 A192 A201 1 342 | A11 21 A32 A42 3599 A61 A74 1 A92 A101 4 A123 26 A143 A151 1 A172 1 A191 A201 1 343 | A12 18 A32 A43 3213 A63 A72 1 A94 A101 3 A121 25 A143 A151 1 A173 1 A191 A201 1 344 | A12 18 A32 A49 4439 A61 A75 1 A93 A102 1 A121 33 A141 A152 1 A174 1 A192 A201 1 345 | A13 10 A32 A40 3949 A61 A72 1 A93 A103 1 A122 37 A143 A152 1 A172 2 A191 A201 1 346 | A14 15 A34 A43 1459 A61 A73 4 A92 A101 2 A123 43 A143 A152 1 A172 1 A191 A201 1 347 | A12 13 A34 A43 882 A61 A72 4 A93 A103 4 A121 23 A143 A152 2 A173 1 A191 A201 1 348 | A12 24 A32 A43 3758 A63 A71 1 A92 A101 4 A124 23 A143 A151 1 A171 1 A191 A201 1 349 | A14 6 A33 A49 1743 A62 A73 1 A93 A101 2 A121 34 A143 A152 2 A172 1 A191 A201 1 350 | A12 9 A34 A46 1136 A64 A75 4 A93 A101 3 A124 32 A143 A153 2 A173 2 A191 A201 2 351 | A14 9 A32 A44 1236 A61 A72 1 A92 A101 4 A121 23 A143 A151 1 A173 1 A192 A201 1 352 | A12 9 A32 A42 959 A61 A73 1 A92 A101 2 A123 29 A143 A152 1 A173 1 A191 A202 2 353 | A14 18 A34 A41 3229 A65 A71 2 A93 A101 4 A124 38 A143 A152 1 A174 1 A192 A201 1 354 | A11 12 A30 A43 6199 A61 A73 4 A93 A101 2 A122 28 A143 A151 2 A173 1 A192 A201 2 355 | A14 10 A32 A46 727 A63 A75 4 A93 A101 4 A124 46 A143 A153 1 A173 1 A192 A201 1 356 | A12 24 A32 A40 1246 A61 A72 4 A93 A101 2 A121 23 A142 A152 1 A172 1 A191 A201 2 357 | A14 12 A34 A43 2331 A65 A75 1 A93 A102 4 A121 49 A143 A152 1 A173 1 A192 A201 1 358 | A14 36 A33 A43 4463 A61 A73 4 A93 A101 2 A123 26 A143 A152 2 A174 1 A192 A201 2 359 | A14 12 A32 A43 776 A61 A73 4 A94 A101 2 A121 28 A143 A152 1 A173 1 A191 A201 1 360 | A11 30 A32 A42 2406 A61 A74 4 A92 A101 4 A121 23 A143 A151 1 A173 1 A191 A201 2 361 | A12 18 A32 A46 1239 A65 A73 4 A93 A101 4 A124 61 A143 A153 1 A173 1 A191 A201 1 362 | A13 12 A32 A43 3399 A65 A75 2 A93 A101 3 A123 37 A143 A152 1 A174 1 A191 A201 1 363 | A13 12 A33 A40 2247 A61 A73 2 A92 A101 2 A123 36 A142 A152 2 A173 1 A192 A201 1 364 | A14 6 A32 A42 1766 A61 A73 1 A94 A101 2 A122 21 A143 A151 1 A173 1 A191 A201 1 365 | A11 18 A32 A42 2473 A61 A71 4 A93 A101 1 A123 25 A143 A152 1 A171 1 A191 A201 2 366 | A14 12 A32 A49 1542 A61 A74 2 A93 A101 4 A123 36 A143 A152 1 A173 1 A192 A201 1 367 | A14 18 A34 A41 3850 A61 A74 3 A93 A101 1 A123 27 A143 A152 2 A173 1 A191 A201 1 368 | A11 18 A32 A42 3650 A61 A72 1 A92 A101 4 A123 22 A143 A151 1 A173 1 A191 A201 1 369 | A11 36 A32 A42 3446 A61 A75 4 A93 A101 2 A123 42 A143 A152 1 A173 2 A191 A201 2 370 | A12 18 A32 A42 3001 A61 A74 2 A92 A101 4 A121 40 A143 A151 1 A173 1 A191 A201 1 371 | A14 36 A32 A40 3079 A65 A73 4 A93 A101 4 A121 36 A143 A152 1 A173 1 A191 A201 1 372 | A14 18 A34 A43 6070 A61 A75 3 A93 A101 4 A123 33 A143 A152 2 A173 1 A192 A201 1 373 | A14 10 A34 A42 2146 A61 A72 1 A92 A101 3 A121 23 A143 A151 2 A173 1 A191 A201 1 374 | A14 60 A34 A40 13756 A65 A75 2 A93 A101 4 A124 63 A141 A153 1 A174 1 A192 A201 1 375 | A12 60 A31 A410 14782 A62 A75 3 A92 A101 4 A124 60 A141 A153 2 A174 1 A192 A201 2 376 | A11 48 A31 A49 7685 A61 A74 2 A92 A103 4 A123 37 A143 A151 1 A173 1 A191 A201 2 377 | A14 18 A33 A43 2320 A61 A71 2 A94 A101 3 A121 34 A143 A152 2 A173 1 A191 A201 1 378 | A14 7 A33 A43 846 A65 A75 3 A93 A101 4 A124 36 A143 A153 1 A173 1 A191 A201 1 379 | A12 36 A32 A40 14318 A61 A75 4 A93 A101 2 A124 57 A143 A153 1 A174 1 A192 A201 2 380 | A14 6 A34 A40 362 A62 A73 4 A92 A101 4 A123 52 A143 A152 2 A172 1 A191 A201 1 381 | A11 20 A32 A42 2212 A65 A74 4 A93 A101 4 A123 39 A143 A152 1 A173 1 A192 A201 1 382 | A12 18 A32 A41 12976 A61 A71 3 A92 A101 4 A124 38 A143 A153 1 A174 1 A192 A201 2 383 | A14 22 A32 A40 1283 A65 A74 4 A92 A101 4 A122 25 A143 A151 1 A173 1 A191 A201 1 384 | A13 12 A32 A40 1330 A61 A72 4 A93 A101 1 A121 26 A143 A152 1 A173 1 A191 A201 1 385 | A14 30 A33 A49 4272 A62 A73 2 A93 A101 2 A122 26 A143 A152 2 A172 1 A191 A201 1 386 | A14 18 A34 A43 2238 A61 A73 2 A92 A101 1 A123 25 A143 A152 2 A173 1 A191 A201 1 387 | A14 18 A32 A43 1126 A65 A72 4 A92 A101 2 A121 21 A143 A151 1 A173 1 A192 A201 1 388 | A12 18 A34 A42 7374 A61 A71 4 A93 A101 4 A122 40 A142 A152 2 A174 1 A192 A201 1 389 | A12 15 A34 A49 2326 A63 A73 2 A93 A101 4 A123 27 A141 A152 1 A173 1 A191 A201 1 390 | A14 9 A32 A49 1449 A61 A74 3 A92 A101 2 A123 27 A143 A152 2 A173 1 A191 A201 1 391 | A14 18 A32 A40 1820 A61 A73 2 A94 A101 2 A122 30 A143 A152 1 A174 1 A192 A201 1 392 | A12 12 A32 A42 983 A64 A72 1 A92 A101 4 A121 19 A143 A151 1 A172 1 A191 A201 1 393 | A11 36 A32 A40 3249 A61 A74 2 A93 A101 4 A124 39 A141 A153 1 A174 2 A192 A201 1 394 | A11 6 A34 A43 1957 A61 A74 1 A92 A101 4 A123 31 A143 A152 1 A173 1 A191 A201 1 395 | A14 9 A34 A42 2406 A61 A71 2 A93 A101 3 A123 31 A143 A152 1 A174 1 A191 A201 1 396 | A12 39 A33 A46 11760 A62 A74 2 A93 A101 3 A124 32 A143 A151 1 A173 1 A192 A201 1 397 | A11 12 A32 A42 2578 A61 A71 3 A92 A101 4 A124 55 A143 A153 1 A174 1 A191 A201 1 398 | A11 36 A34 A42 2348 A61 A73 3 A94 A101 2 A122 46 A143 A152 2 A173 1 A192 A201 1 399 | A12 12 A32 A40 1223 A61 A75 1 A91 A101 1 A121 46 A143 A151 2 A173 1 A191 A201 2 400 | A14 24 A34 A43 1516 A64 A73 4 A92 A101 1 A121 43 A143 A152 2 A172 1 A191 A201 1 401 | A14 18 A32 A43 1473 A61 A72 3 A94 A101 4 A121 39 A143 A152 1 A173 1 A192 A201 1 402 | A12 18 A34 A49 1887 A65 A73 4 A94 A101 4 A121 28 A141 A152 2 A173 1 A191 A201 1 403 | A14 24 A33 A49 8648 A61 A72 2 A93 A101 2 A123 27 A141 A152 2 A173 1 A192 A201 2 404 | A14 14 A33 A40 802 A61 A73 4 A93 A101 2 A123 27 A143 A152 2 A172 1 A191 A201 1 405 | A12 18 A33 A40 2899 A65 A75 4 A93 A101 4 A123 43 A143 A152 1 A173 2 A191 A201 1 406 | A12 24 A32 A43 2039 A61 A72 1 A94 A101 1 A122 22 A143 A152 1 A173 1 A192 A201 2 407 | A14 24 A34 A41 2197 A65 A74 4 A93 A101 4 A123 43 A143 A152 2 A173 2 A192 A201 1 408 | A11 15 A32 A43 1053 A61 A72 4 A94 A101 2 A121 27 A143 A152 1 A173 1 A191 A202 1 409 | A14 24 A32 A43 3235 A63 A75 3 A91 A101 2 A123 26 A143 A152 1 A174 1 A192 A201 1 410 | A13 12 A34 A40 939 A63 A74 4 A94 A101 2 A121 28 A143 A152 3 A173 1 A192 A201 2 411 | A12 24 A32 A43 1967 A61 A75 4 A92 A101 4 A123 20 A143 A152 1 A173 1 A192 A201 1 412 | A14 33 A34 A41 7253 A61 A74 3 A93 A101 2 A123 35 A143 A152 2 A174 1 A192 A201 1 413 | A14 12 A34 A49 2292 A61 A71 4 A93 A101 2 A123 42 A142 A152 2 A174 1 A192 A201 2 414 | A14 10 A32 A40 1597 A63 A73 3 A93 A101 2 A124 40 A143 A151 1 A172 2 A191 A202 1 415 | A11 24 A32 A40 1381 A65 A73 4 A92 A101 2 A122 35 A143 A152 1 A173 1 A191 A201 2 416 | A14 36 A34 A41 5842 A61 A75 2 A93 A101 2 A122 35 A143 A152 2 A173 2 A192 A201 1 417 | A11 12 A32 A40 2579 A61 A72 4 A93 A101 1 A121 33 A143 A152 1 A172 2 A191 A201 2 418 | A11 18 A33 A46 8471 A65 A73 1 A92 A101 2 A123 23 A143 A151 2 A173 1 A192 A201 1 419 | A14 21 A32 A40 2782 A63 A74 1 A92 A101 2 A123 31 A141 A152 1 A174 1 A191 A201 1 420 | A12 18 A32 A40 1042 A65 A73 4 A92 A101 2 A122 33 A143 A152 1 A173 1 A191 A201 2 421 | A14 15 A32 A40 3186 A64 A74 2 A92 A101 3 A123 20 A143 A151 1 A173 1 A191 A201 1 422 | A12 12 A32 A41 2028 A65 A73 4 A93 A101 2 A123 30 A143 A152 1 A173 1 A191 A201 1 423 | A12 12 A34 A40 958 A61 A74 2 A93 A101 3 A121 47 A143 A152 2 A172 2 A191 A201 1 424 | A14 21 A33 A42 1591 A62 A74 4 A93 A101 3 A121 34 A143 A152 2 A174 1 A191 A201 1 425 | A12 12 A32 A42 2762 A65 A75 1 A92 A101 2 A122 25 A141 A152 1 A173 1 A192 A201 2 426 | A12 18 A32 A41 2779 A61 A73 1 A94 A101 3 A123 21 A143 A151 1 A173 1 A192 A201 1 427 | A14 28 A34 A43 2743 A61 A75 4 A93 A101 2 A123 29 A143 A152 2 A173 1 A191 A201 1 428 | A14 18 A34 A43 1149 A64 A73 4 A93 A101 3 A121 46 A143 A152 2 A173 1 A191 A201 1 429 | A14 9 A32 A42 1313 A61 A75 1 A93 A101 4 A123 20 A143 A152 1 A173 1 A191 A201 1 430 | A11 18 A34 A45 1190 A61 A71 2 A92 A101 4 A124 55 A143 A153 3 A171 2 A191 A201 2 431 | A14 5 A32 A49 3448 A61 A74 1 A93 A101 4 A121 74 A143 A152 1 A172 1 A191 A201 1 432 | A12 24 A32 A410 11328 A61 A73 2 A93 A102 3 A123 29 A141 A152 2 A174 1 A192 A201 2 433 | A11 6 A34 A42 1872 A61 A71 4 A93 A101 4 A124 36 A143 A153 3 A174 1 A192 A201 1 434 | A14 24 A34 A45 2058 A61 A73 4 A91 A101 2 A121 33 A143 A152 2 A173 1 A192 A201 1 435 | A11 9 A32 A42 2136 A61 A73 3 A93 A101 2 A121 25 A143 A152 1 A173 1 A191 A201 1 436 | A12 12 A32 A43 1484 A65 A73 2 A94 A101 1 A121 25 A143 A152 1 A173 1 A192 A201 2 437 | A14 6 A32 A45 660 A63 A74 2 A94 A101 4 A121 23 A143 A151 1 A172 1 A191 A201 1 438 | A14 24 A34 A40 1287 A64 A75 4 A92 A101 4 A121 37 A143 A152 2 A173 1 A192 A201 1 439 | A11 42 A34 A45 3394 A61 A71 4 A93 A102 4 A123 65 A143 A152 2 A171 1 A191 A201 1 440 | A13 12 A31 A49 609 A61 A72 4 A92 A101 1 A121 26 A143 A152 1 A171 1 A191 A201 2 441 | A14 12 A32 A40 1884 A61 A75 4 A93 A101 4 A123 39 A143 A152 1 A174 1 A192 A201 1 442 | A11 12 A32 A42 1620 A61 A73 2 A92 A102 3 A122 30 A143 A152 1 A173 1 A191 A201 1 443 | A12 20 A33 A410 2629 A61 A73 2 A93 A101 3 A123 29 A141 A152 2 A173 1 A192 A201 1 444 | A14 12 A32 A46 719 A61 A75 4 A93 A101 4 A123 41 A141 A152 1 A172 2 A191 A201 2 445 | A12 48 A34 A42 5096 A61 A73 2 A92 A101 3 A123 30 A143 A152 1 A174 1 A192 A201 2 446 | A14 9 A34 A46 1244 A65 A75 4 A92 A101 4 A122 41 A143 A151 2 A172 1 A191 A201 1 447 | A11 36 A32 A40 1842 A61 A72 4 A92 A101 4 A123 34 A143 A152 1 A173 1 A192 A201 2 448 | A12 7 A32 A43 2576 A61 A73 2 A93 A103 2 A121 35 A143 A152 1 A173 1 A191 A201 1 449 | A13 12 A32 A42 1424 A65 A75 3 A92 A101 4 A121 55 A143 A152 1 A174 1 A192 A201 1 450 | A12 15 A33 A45 1512 A64 A73 3 A94 A101 3 A122 61 A142 A152 2 A173 1 A191 A201 2 451 | A14 36 A34 A41 11054 A65 A73 4 A93 A101 2 A123 30 A143 A152 1 A174 1 A192 A201 1 452 | A14 6 A32 A43 518 A61 A73 3 A92 A101 1 A121 29 A143 A152 1 A173 1 A191 A201 1 453 | A14 12 A30 A42 2759 A61 A75 2 A93 A101 4 A122 34 A143 A152 2 A173 1 A191 A201 1 454 | A14 24 A32 A41 2670 A61 A75 4 A93 A101 4 A123 35 A143 A152 1 A174 1 A192 A201 1 455 | A11 24 A32 A40 4817 A61 A74 2 A93 A102 3 A122 31 A143 A152 1 A173 1 A192 A201 2 456 | A14 24 A32 A41 2679 A61 A72 4 A92 A101 1 A124 29 A143 A152 1 A174 1 A192 A201 1 457 | A11 11 A34 A40 3905 A61 A73 2 A93 A101 2 A121 36 A143 A151 2 A173 2 A191 A201 1 458 | A11 12 A32 A41 3386 A61 A75 3 A93 A101 4 A124 35 A143 A153 1 A173 1 A192 A201 2 459 | A11 6 A32 A44 343 A61 A72 4 A92 A101 1 A121 27 A143 A152 1 A173 1 A191 A201 1 460 | A14 18 A32 A43 4594 A61 A72 3 A93 A101 2 A123 32 A143 A152 1 A173 1 A192 A201 1 461 | A11 36 A32 A42 3620 A61 A73 1 A93 A103 2 A122 37 A143 A152 1 A173 2 A191 A201 1 462 | A11 15 A32 A40 1721 A61 A72 2 A93 A101 3 A121 36 A143 A152 1 A173 1 A191 A201 1 463 | A12 12 A32 A42 3017 A61 A72 3 A92 A101 1 A121 34 A143 A151 1 A174 1 A191 A201 1 464 | A12 12 A32 A48 754 A65 A75 4 A93 A101 4 A122 38 A143 A152 2 A173 1 A191 A201 1 465 | A14 18 A32 A49 1950 A61 A74 4 A93 A101 1 A123 34 A142 A152 2 A173 1 A192 A201 1 466 | A11 24 A32 A41 2924 A61 A73 3 A93 A103 4 A124 63 A141 A152 1 A173 2 A192 A201 1 467 | A11 24 A33 A43 1659 A61 A72 4 A92 A101 2 A123 29 A143 A151 1 A172 1 A192 A201 2 468 | A14 48 A33 A43 7238 A65 A75 3 A93 A101 3 A123 32 A141 A152 2 A173 2 A191 A201 1 469 | A14 33 A33 A49 2764 A61 A73 2 A92 A101 2 A123 26 A143 A152 2 A173 1 A192 A201 1 470 | A14 24 A33 A41 4679 A61 A74 3 A93 A101 3 A123 35 A143 A152 2 A172 1 A192 A201 1 471 | A12 24 A32 A43 3092 A62 A72 3 A94 A101 2 A123 22 A143 A151 1 A173 1 A192 A201 2 472 | A11 6 A32 A46 448 A61 A72 4 A92 A101 4 A122 23 A143 A152 1 A173 1 A191 A201 2 473 | A11 9 A32 A40 654 A61 A73 4 A93 A101 3 A123 28 A143 A152 1 A172 1 A191 A201 2 474 | A14 6 A32 A48 1238 A65 A71 4 A93 A101 4 A122 36 A143 A152 1 A174 2 A192 A201 1 475 | A12 18 A34 A43 1245 A61 A73 4 A94 A101 2 A123 33 A143 A152 1 A173 1 A191 A201 2 476 | A11 18 A30 A42 3114 A61 A72 1 A92 A101 4 A122 26 A143 A151 1 A173 1 A191 A201 2 477 | A14 39 A32 A41 2569 A63 A73 4 A93 A101 4 A123 24 A143 A152 1 A173 1 A191 A201 1 478 | A13 24 A32 A43 5152 A61 A74 4 A93 A101 2 A123 25 A141 A152 1 A173 1 A191 A201 1 479 | A12 12 A32 A49 1037 A62 A74 3 A93 A101 4 A121 39 A143 A152 1 A172 1 A191 A201 1 480 | A11 15 A34 A42 1478 A61 A75 4 A93 A101 4 A123 44 A143 A152 2 A173 2 A192 A201 1 481 | A12 12 A34 A43 3573 A61 A73 1 A92 A101 1 A121 23 A143 A152 1 A172 1 A191 A201 1 482 | A12 24 A32 A40 1201 A61 A72 4 A93 A101 1 A122 26 A143 A152 1 A173 1 A191 A201 1 483 | A11 30 A32 A42 3622 A64 A75 4 A92 A101 4 A122 57 A143 A151 2 A173 1 A192 A201 1 484 | A14 15 A33 A42 960 A64 A74 3 A92 A101 2 A122 30 A143 A152 2 A173 1 A191 A201 1 485 | A14 12 A34 A40 1163 A63 A73 4 A93 A101 4 A121 44 A143 A152 1 A173 1 A192 A201 1 486 | A12 6 A33 A40 1209 A61 A71 4 A93 A101 4 A122 47 A143 A152 1 A174 1 A192 A201 2 487 | A14 12 A32 A43 3077 A61 A73 2 A93 A101 4 A123 52 A143 A152 1 A173 1 A192 A201 1 488 | A14 24 A32 A40 3757 A61 A75 4 A92 A102 4 A124 62 A143 A153 1 A173 1 A192 A201 1 489 | A14 10 A32 A40 1418 A62 A73 3 A93 A101 2 A121 35 A143 A151 1 A172 1 A191 A202 1 490 | A14 6 A32 A40 3518 A61 A73 2 A93 A103 3 A122 26 A143 A151 1 A173 1 A191 A201 1 491 | A14 12 A34 A43 1934 A61 A75 2 A93 A101 2 A124 26 A143 A152 2 A173 1 A191 A201 1 492 | A12 27 A30 A49 8318 A61 A75 2 A92 A101 4 A124 42 A143 A153 2 A174 1 A192 A201 2 493 | A14 6 A34 A43 1237 A62 A73 1 A92 A101 1 A122 27 A143 A152 2 A173 1 A191 A201 1 494 | A12 6 A32 A43 368 A65 A75 4 A93 A101 4 A122 38 A143 A152 1 A173 1 A191 A201 1 495 | A11 12 A34 A40 2122 A61 A73 3 A93 A101 2 A121 39 A143 A151 2 A172 2 A191 A202 1 496 | A11 24 A32 A42 2996 A65 A73 2 A94 A101 4 A123 20 A143 A152 1 A173 1 A191 A201 2 497 | A12 36 A32 A42 9034 A62 A72 4 A93 A102 1 A124 29 A143 A151 1 A174 1 A192 A201 2 498 | A14 24 A34 A42 1585 A61 A74 4 A93 A101 3 A122 40 A143 A152 2 A173 1 A191 A201 1 499 | A12 18 A32 A43 1301 A61 A75 4 A94 A103 2 A121 32 A143 A152 1 A172 1 A191 A201 1 500 | A13 6 A34 A40 1323 A62 A75 2 A91 A101 4 A123 28 A143 A152 2 A173 2 A192 A201 1 501 | A11 24 A32 A40 3123 A61 A72 4 A92 A101 1 A122 27 A143 A152 1 A173 1 A191 A201 2 502 | A11 36 A32 A41 5493 A61 A75 2 A93 A101 4 A124 42 A143 A153 1 A173 2 A191 A201 1 503 | A13 9 A32 A43 1126 A62 A75 2 A91 A101 4 A121 49 A143 A152 1 A173 1 A191 A201 1 504 | A12 24 A34 A43 1216 A62 A72 4 A93 A101 4 A124 38 A141 A152 2 A173 2 A191 A201 2 505 | A11 24 A32 A40 1207 A61 A72 4 A92 A101 4 A122 24 A143 A151 1 A173 1 A191 A201 2 506 | A14 10 A32 A40 1309 A65 A73 4 A93 A103 4 A122 27 A143 A152 1 A172 1 A191 A201 2 507 | A13 15 A34 A41 2360 A63 A73 2 A93 A101 2 A123 36 A143 A152 1 A173 1 A192 A201 1 508 | A12 15 A31 A40 6850 A62 A71 1 A93 A101 2 A122 34 A143 A152 1 A174 2 A192 A201 2 509 | A14 24 A32 A43 1413 A61 A73 4 A94 A101 2 A122 28 A143 A152 1 A173 1 A191 A201 1 510 | A14 39 A32 A41 8588 A62 A75 4 A93 A101 2 A123 45 A143 A152 1 A174 1 A192 A201 1 511 | A11 12 A32 A40 759 A61 A74 4 A93 A101 2 A121 26 A143 A152 1 A173 1 A191 A201 2 512 | A14 36 A32 A41 4686 A61 A73 2 A93 A101 2 A124 32 A143 A153 1 A174 1 A192 A201 1 513 | A13 15 A32 A49 2687 A61 A74 2 A93 A101 4 A122 26 A143 A151 1 A173 1 A192 A201 1 514 | A12 12 A33 A43 585 A61 A73 4 A94 A102 4 A121 20 A143 A151 2 A173 1 A191 A201 1 515 | A14 24 A32 A40 2255 A65 A72 4 A93 A101 1 A122 54 A143 A152 1 A173 1 A191 A201 1 516 | A11 6 A34 A40 609 A61 A74 4 A92 A101 3 A122 37 A143 A152 2 A173 1 A191 A202 1 517 | A11 6 A34 A40 1361 A61 A72 2 A93 A101 4 A121 40 A143 A152 1 A172 2 A191 A202 1 518 | A14 36 A34 A42 7127 A61 A72 2 A92 A101 4 A122 23 A143 A151 2 A173 1 A192 A201 2 519 | A11 6 A32 A40 1203 A62 A75 3 A93 A101 2 A122 43 A143 A152 1 A173 1 A192 A201 1 520 | A14 6 A34 A43 700 A65 A75 4 A93 A101 4 A124 36 A143 A153 2 A173 1 A191 A201 1 521 | A14 24 A34 A45 5507 A61 A75 3 A93 A101 4 A124 44 A143 A153 2 A173 1 A191 A201 1 522 | A11 18 A32 A43 3190 A61 A73 2 A92 A101 2 A121 24 A143 A152 1 A173 1 A191 A201 2 523 | A11 48 A30 A42 7119 A61 A73 3 A93 A101 4 A124 53 A143 A153 2 A173 2 A191 A201 2 524 | A14 24 A32 A41 3488 A62 A74 3 A92 A101 4 A123 23 A143 A152 1 A173 1 A191 A201 1 525 | A12 18 A32 A43 1113 A61 A73 4 A92 A103 4 A121 26 A143 A152 1 A172 2 A191 A201 1 526 | A12 26 A32 A41 7966 A61 A72 2 A93 A101 3 A123 30 A143 A152 2 A173 1 A191 A201 1 527 | A14 15 A34 A46 1532 A62 A73 4 A92 A101 3 A123 31 A143 A152 1 A173 1 A191 A201 1 528 | A14 4 A34 A43 1503 A61 A74 2 A93 A101 1 A121 42 A143 A152 2 A172 2 A191 A201 1 529 | A11 36 A32 A43 2302 A61 A73 4 A91 A101 4 A123 31 A143 A151 1 A173 1 A191 A201 2 530 | A11 6 A32 A40 662 A61 A72 3 A93 A101 4 A121 41 A143 A152 1 A172 2 A192 A201 1 531 | A12 36 A32 A46 2273 A61 A74 3 A93 A101 1 A123 32 A143 A152 2 A173 2 A191 A201 1 532 | A12 15 A32 A40 2631 A62 A73 2 A92 A101 4 A123 28 A143 A151 2 A173 1 A192 A201 2 533 | A14 12 A33 A41 1503 A61 A73 4 A94 A101 4 A121 41 A143 A151 1 A173 1 A191 A201 1 534 | A14 24 A32 A43 1311 A62 A74 4 A94 A101 3 A122 26 A143 A152 1 A173 1 A192 A201 1 535 | A14 24 A32 A43 3105 A65 A72 4 A93 A101 2 A123 25 A143 A152 2 A173 1 A191 A201 1 536 | A13 21 A34 A46 2319 A61 A72 2 A91 A101 1 A123 33 A143 A151 1 A173 1 A191 A201 2 537 | A11 6 A32 A40 1374 A65 A71 4 A92 A101 3 A122 75 A143 A152 1 A174 1 A192 A201 1 538 | A12 18 A34 A42 3612 A61 A75 3 A92 A101 4 A122 37 A143 A152 1 A173 1 A192 A201 1 539 | A11 48 A32 A40 7763 A61 A75 4 A93 A101 4 A124 42 A141 A153 1 A174 1 A191 A201 2 540 | A13 18 A32 A42 3049 A61 A72 1 A92 A101 1 A122 45 A142 A152 1 A172 1 A191 A201 1 541 | A12 12 A32 A43 1534 A61 A72 1 A94 A101 1 A121 23 A143 A151 1 A173 1 A191 A201 2 542 | A14 24 A33 A40 2032 A61 A75 4 A93 A101 4 A124 60 A143 A153 2 A173 1 A192 A201 1 543 | A11 30 A32 A42 6350 A65 A75 4 A93 A101 4 A122 31 A143 A152 1 A173 1 A191 A201 2 544 | A13 18 A32 A42 2864 A61 A73 2 A93 A101 1 A121 34 A143 A152 1 A172 2 A191 A201 2 545 | A14 12 A34 A40 1255 A61 A75 4 A93 A101 4 A121 61 A143 A152 2 A172 1 A191 A201 1 546 | A11 24 A33 A40 1333 A61 A71 4 A93 A101 2 A121 43 A143 A153 2 A173 2 A191 A201 2 547 | A14 24 A34 A40 2022 A61 A73 4 A92 A101 4 A123 37 A143 A152 1 A173 1 A192 A201 1 548 | A14 24 A32 A43 1552 A61 A74 3 A93 A101 1 A123 32 A141 A152 1 A173 2 A191 A201 1 549 | A11 12 A31 A43 626 A61 A73 4 A92 A101 4 A121 24 A141 A152 1 A172 1 A191 A201 2 550 | A14 48 A34 A41 8858 A65 A74 2 A93 A101 1 A124 35 A143 A153 2 A173 1 A192 A201 1 551 | A14 12 A34 A45 996 A65 A74 4 A92 A101 4 A121 23 A143 A152 2 A173 1 A191 A201 1 552 | A14 6 A31 A43 1750 A63 A75 2 A93 A101 4 A122 45 A141 A152 1 A172 2 A191 A201 1 553 | A11 48 A32 A43 6999 A61 A74 1 A94 A103 1 A121 34 A143 A152 2 A173 1 A192 A201 2 554 | A12 12 A34 A40 1995 A62 A72 4 A93 A101 1 A123 27 A143 A152 1 A173 1 A191 A201 1 555 | A12 9 A32 A46 1199 A61 A74 4 A92 A101 4 A122 67 A143 A152 2 A174 1 A192 A201 1 556 | A12 12 A32 A43 1331 A61 A72 2 A93 A101 1 A123 22 A142 A152 1 A173 1 A191 A201 2 557 | A12 18 A30 A40 2278 A62 A72 3 A92 A101 3 A123 28 A143 A152 2 A173 1 A191 A201 2 558 | A14 21 A30 A40 5003 A65 A73 1 A92 A101 4 A122 29 A141 A152 2 A173 1 A192 A201 2 559 | A11 24 A31 A42 3552 A61 A74 3 A93 A101 4 A123 27 A141 A152 1 A173 1 A191 A201 2 560 | A12 18 A34 A42 1928 A61 A72 2 A93 A101 2 A121 31 A143 A152 2 A172 1 A191 A201 2 561 | A11 24 A32 A41 2964 A65 A75 4 A93 A101 4 A124 49 A141 A153 1 A173 2 A192 A201 1 562 | A11 24 A31 A43 1546 A61 A74 4 A93 A103 4 A123 24 A141 A151 1 A172 1 A191 A201 2 563 | A13 6 A33 A43 683 A61 A72 2 A92 A101 1 A122 29 A141 A152 1 A173 1 A191 A201 1 564 | A12 36 A32 A40 12389 A65 A73 1 A93 A101 4 A124 37 A143 A153 1 A173 1 A192 A201 2 565 | A12 24 A33 A49 4712 A65 A73 4 A93 A101 2 A122 37 A141 A152 2 A174 1 A192 A201 1 566 | A12 24 A33 A43 1553 A62 A74 3 A92 A101 2 A122 23 A143 A151 2 A173 1 A192 A201 1 567 | A11 12 A32 A40 1372 A61 A74 2 A91 A101 3 A123 36 A143 A152 1 A173 1 A191 A201 2 568 | A14 24 A34 A43 2578 A64 A75 2 A93 A101 2 A123 34 A143 A152 1 A173 1 A191 A201 1 569 | A12 48 A32 A43 3979 A65 A74 4 A93 A101 1 A123 41 A143 A152 2 A173 2 A192 A201 1 570 | A11 48 A32 A43 6758 A61 A73 3 A92 A101 2 A123 31 A143 A152 1 A173 1 A192 A201 2 571 | A11 24 A32 A42 3234 A61 A72 4 A92 A101 4 A121 23 A143 A151 1 A172 1 A192 A201 2 572 | A14 30 A34 A43 5954 A61 A74 3 A93 A102 2 A123 38 A143 A152 1 A173 1 A191 A201 1 573 | A14 24 A32 A41 5433 A65 A71 2 A92 A101 4 A122 26 A143 A151 1 A174 1 A192 A201 1 574 | A11 15 A32 A49 806 A61 A73 4 A92 A101 4 A122 22 A143 A152 1 A172 1 A191 A201 1 575 | A12 9 A32 A43 1082 A61 A75 4 A93 A101 4 A123 27 A143 A152 2 A172 1 A191 A201 1 576 | A14 15 A34 A42 2788 A61 A74 2 A92 A102 3 A123 24 A141 A152 2 A173 1 A191 A201 1 577 | A12 12 A32 A43 2930 A61 A74 2 A92 A101 1 A121 27 A143 A152 1 A173 1 A191 A201 1 578 | A14 24 A34 A46 1927 A65 A73 3 A92 A101 2 A123 33 A143 A152 2 A173 1 A192 A201 1 579 | A12 36 A34 A40 2820 A61 A72 4 A91 A101 4 A123 27 A143 A152 2 A173 1 A191 A201 2 580 | A14 24 A32 A48 937 A61 A72 4 A94 A101 3 A123 27 A143 A152 2 A172 1 A191 A201 1 581 | A12 18 A34 A40 1056 A61 A75 3 A93 A103 3 A121 30 A141 A152 2 A173 1 A191 A201 2 582 | A12 12 A34 A40 3124 A61 A72 1 A93 A101 3 A121 49 A141 A152 2 A172 2 A191 A201 1 583 | A14 9 A32 A42 1388 A61 A73 4 A92 A101 2 A121 26 A143 A151 1 A173 1 A191 A201 1 584 | A12 36 A32 A45 2384 A61 A72 4 A93 A101 1 A124 33 A143 A151 1 A172 1 A191 A201 2 585 | A14 12 A32 A40 2133 A65 A75 4 A92 A101 4 A124 52 A143 A153 1 A174 1 A192 A201 1 586 | A11 18 A32 A42 2039 A61 A73 1 A92 A101 4 A121 20 A141 A151 1 A173 1 A191 A201 2 587 | A11 9 A34 A40 2799 A61 A73 2 A93 A101 2 A121 36 A143 A151 2 A173 2 A191 A201 1 588 | A11 12 A32 A42 1289 A61 A73 4 A93 A103 1 A122 21 A143 A152 1 A172 1 A191 A201 1 589 | A11 18 A32 A44 1217 A61 A73 4 A94 A101 3 A121 47 A143 A152 1 A172 1 A192 A201 2 590 | A11 12 A34 A42 2246 A61 A75 3 A93 A101 3 A122 60 A143 A152 2 A173 1 A191 A201 2 591 | A11 12 A34 A43 385 A61 A74 4 A92 A101 3 A121 58 A143 A152 4 A172 1 A192 A201 1 592 | A12 24 A33 A40 1965 A65 A73 4 A92 A101 4 A123 42 A143 A151 2 A173 1 A192 A201 1 593 | A14 21 A32 A49 1572 A64 A75 4 A92 A101 4 A121 36 A141 A152 1 A172 1 A191 A201 1 594 | A12 24 A32 A40 2718 A61 A73 3 A92 A101 4 A122 20 A143 A151 1 A172 1 A192 A201 2 595 | A11 24 A31 A410 1358 A65 A75 4 A93 A101 3 A123 40 A142 A152 1 A174 1 A192 A201 2 596 | A12 6 A31 A40 931 A62 A72 1 A92 A101 1 A122 32 A142 A152 1 A172 1 A191 A201 2 597 | A11 24 A32 A40 1442 A61 A74 4 A92 A101 4 A123 23 A143 A151 2 A173 1 A191 A201 2 598 | A12 24 A30 A49 4241 A61 A73 1 A93 A101 4 A121 36 A143 A152 3 A172 1 A192 A201 2 599 | A14 18 A34 A40 2775 A61 A74 2 A93 A101 2 A122 31 A141 A152 2 A173 1 A191 A201 2 600 | A14 24 A33 A49 3863 A61 A73 1 A93 A101 2 A124 32 A143 A153 1 A173 1 A191 A201 1 601 | A12 7 A32 A43 2329 A61 A72 1 A92 A103 1 A121 45 A143 A152 1 A173 1 A191 A201 1 602 | A12 9 A32 A42 918 A61 A73 4 A92 A101 1 A122 30 A143 A152 1 A173 1 A191 A201 2 603 | A12 24 A31 A46 1837 A61 A74 4 A92 A101 4 A124 34 A141 A153 1 A172 1 A191 A201 2 604 | A14 36 A32 A42 3349 A61 A73 4 A92 A101 2 A123 28 A143 A152 1 A174 1 A192 A201 2 605 | A13 10 A32 A42 1275 A61 A72 4 A92 A101 2 A122 23 A143 A152 1 A173 1 A191 A201 1 606 | A11 24 A31 A42 2828 A63 A73 4 A93 A101 4 A121 22 A142 A152 1 A173 1 A192 A201 1 607 | A14 24 A34 A49 4526 A61 A73 3 A93 A101 2 A121 74 A143 A152 1 A174 1 A192 A201 1 608 | A12 36 A32 A43 2671 A62 A73 4 A92 A102 4 A124 50 A143 A153 1 A173 1 A191 A201 2 609 | A14 18 A32 A43 2051 A61 A72 4 A93 A101 1 A121 33 A143 A152 1 A173 1 A191 A201 1 610 | A14 15 A32 A41 1300 A65 A75 4 A93 A101 4 A124 45 A141 A153 1 A173 2 A191 A201 1 611 | A11 12 A32 A44 741 A62 A71 4 A92 A101 3 A122 22 A143 A152 1 A173 1 A191 A201 2 612 | A13 10 A32 A40 1240 A62 A75 1 A92 A101 4 A124 48 A143 A153 1 A172 2 A191 A201 2 613 | A11 21 A32 A43 3357 A64 A72 4 A92 A101 2 A123 29 A141 A152 1 A173 1 A191 A201 1 614 | A11 24 A31 A41 3632 A61 A73 1 A92 A103 4 A123 22 A141 A151 1 A173 1 A191 A202 1 615 | A14 18 A33 A42 1808 A61 A74 4 A92 A101 1 A121 22 A143 A152 1 A173 1 A191 A201 2 616 | A12 48 A30 A49 12204 A65 A73 2 A93 A101 2 A123 48 A141 A152 1 A174 1 A192 A201 1 617 | A12 60 A33 A43 9157 A65 A73 2 A93 A101 2 A124 27 A143 A153 1 A174 1 A191 A201 1 618 | A11 6 A34 A40 3676 A61 A73 1 A93 A101 3 A121 37 A143 A151 3 A173 2 A191 A201 1 619 | A12 30 A32 A42 3441 A62 A73 2 A92 A102 4 A123 21 A143 A151 1 A173 1 A191 A201 2 620 | A14 12 A32 A40 640 A61 A73 4 A91 A101 2 A121 49 A143 A152 1 A172 1 A191 A201 1 621 | A12 21 A34 A49 3652 A61 A74 2 A93 A101 3 A122 27 A143 A152 2 A173 1 A191 A201 1 622 | A14 18 A34 A40 1530 A61 A73 3 A93 A101 2 A122 32 A141 A152 2 A173 1 A191 A201 2 623 | A14 48 A32 A49 3914 A65 A73 4 A91 A101 2 A121 38 A141 A152 1 A173 1 A191 A201 2 624 | A11 12 A32 A42 1858 A61 A72 4 A92 A101 1 A123 22 A143 A151 1 A173 1 A191 A201 1 625 | A11 18 A32 A43 2600 A61 A73 4 A93 A101 4 A124 65 A143 A153 2 A173 1 A191 A201 2 626 | A14 15 A32 A43 1979 A65 A75 4 A93 A101 2 A123 35 A143 A152 1 A173 1 A191 A201 1 627 | A13 6 A32 A42 2116 A61 A73 2 A93 A101 2 A121 41 A143 A152 1 A173 1 A192 A201 1 628 | A12 9 A31 A40 1437 A62 A74 2 A93 A101 3 A124 29 A143 A152 1 A173 1 A191 A201 2 629 | A14 42 A34 A42 4042 A63 A73 4 A93 A101 4 A121 36 A143 A152 2 A173 1 A192 A201 1 630 | A14 9 A32 A46 3832 A65 A75 1 A93 A101 4 A121 64 A143 A152 1 A172 1 A191 A201 1 631 | A11 24 A32 A43 3660 A61 A73 2 A92 A101 4 A123 28 A143 A152 1 A173 1 A191 A201 1 632 | A11 18 A31 A42 1553 A61 A73 4 A93 A101 3 A123 44 A141 A152 1 A173 1 A191 A201 2 633 | A12 15 A32 A43 1444 A65 A72 4 A93 A101 1 A122 23 A143 A152 1 A173 1 A191 A201 1 634 | A14 9 A32 A42 1980 A61 A72 2 A92 A102 2 A123 19 A143 A151 2 A173 1 A191 A201 2 635 | A12 24 A32 A40 1355 A61 A72 3 A92 A101 4 A123 25 A143 A152 1 A172 1 A192 A201 2 636 | A14 12 A32 A46 1393 A61 A75 4 A93 A101 4 A122 47 A141 A152 3 A173 2 A192 A201 1 637 | A14 24 A32 A43 1376 A63 A74 4 A92 A101 1 A123 28 A143 A152 1 A173 1 A191 A201 1 638 | A14 60 A33 A43 15653 A61 A74 2 A93 A101 4 A123 21 A143 A152 2 A173 1 A192 A201 1 639 | A14 12 A32 A43 1493 A61 A72 4 A92 A101 3 A123 34 A143 A152 1 A173 2 A191 A201 1 640 | A11 42 A33 A43 4370 A61 A74 3 A93 A101 2 A122 26 A141 A152 2 A173 2 A192 A201 2 641 | A11 18 A32 A46 750 A61 A71 4 A92 A101 1 A121 27 A143 A152 1 A171 1 A191 A201 2 642 | A12 15 A32 A45 1308 A61 A75 4 A93 A101 4 A123 38 A143 A152 2 A172 1 A191 A201 1 643 | A14 15 A32 A46 4623 A62 A73 3 A93 A101 2 A122 40 A143 A152 1 A174 1 A192 A201 2 644 | A14 24 A34 A43 1851 A61 A74 4 A94 A103 2 A123 33 A143 A152 2 A173 1 A192 A201 1 645 | A11 18 A34 A43 1880 A61 A74 4 A94 A101 1 A122 32 A143 A152 2 A174 1 A192 A201 1 646 | A14 36 A33 A49 7980 A65 A72 4 A93 A101 4 A123 27 A143 A151 2 A173 1 A192 A201 2 647 | A11 30 A30 A42 4583 A61 A73 2 A91 A103 2 A121 32 A143 A152 2 A173 1 A191 A201 1 648 | A14 12 A32 A40 1386 A63 A73 2 A92 A101 2 A122 26 A143 A152 1 A173 1 A191 A201 2 649 | A13 24 A32 A40 947 A61 A74 4 A93 A101 3 A124 38 A141 A153 1 A173 2 A191 A201 2 650 | A11 12 A32 A46 684 A61 A73 4 A93 A101 4 A123 40 A143 A151 1 A172 2 A191 A201 2 651 | A11 48 A32 A46 7476 A61 A74 4 A93 A101 1 A124 50 A143 A153 1 A174 1 A192 A201 1 652 | A12 12 A32 A42 1922 A61 A73 4 A93 A101 2 A122 37 A143 A152 1 A172 1 A191 A201 2 653 | A11 24 A32 A40 2303 A61 A75 4 A93 A102 1 A121 45 A143 A152 1 A173 1 A191 A201 2 654 | A12 36 A33 A40 8086 A62 A75 2 A93 A101 4 A123 42 A143 A152 4 A174 1 A192 A201 2 655 | A14 24 A34 A41 2346 A61 A74 4 A93 A101 3 A123 35 A143 A152 2 A173 1 A192 A201 1 656 | A11 14 A32 A40 3973 A61 A71 1 A93 A101 4 A124 22 A143 A153 1 A173 1 A191 A201 1 657 | A12 12 A32 A40 888 A61 A75 4 A93 A101 4 A123 41 A141 A152 1 A172 2 A191 A201 2 658 | A14 48 A32 A43 10222 A65 A74 4 A93 A101 3 A123 37 A142 A152 1 A173 1 A192 A201 1 659 | A12 30 A30 A49 4221 A61 A73 2 A92 A101 1 A123 28 A143 A152 2 A173 1 A191 A201 1 660 | A12 18 A34 A42 6361 A61 A75 2 A93 A101 1 A124 41 A143 A152 1 A173 1 A192 A201 1 661 | A13 12 A32 A43 1297 A61 A73 3 A94 A101 4 A121 23 A143 A151 1 A173 1 A191 A201 1 662 | A11 12 A32 A40 900 A65 A73 4 A94 A101 2 A123 23 A143 A152 1 A173 1 A191 A201 2 663 | A14 21 A32 A42 2241 A61 A75 4 A93 A101 2 A121 50 A143 A152 2 A173 1 A191 A201 1 664 | A12 6 A33 A42 1050 A61 A71 4 A93 A101 1 A122 35 A142 A152 2 A174 1 A192 A201 1 665 | A13 6 A34 A46 1047 A61 A73 2 A92 A101 4 A122 50 A143 A152 1 A172 1 A191 A201 1 666 | A14 24 A34 A410 6314 A61 A71 4 A93 A102 2 A124 27 A141 A152 2 A174 1 A192 A201 1 667 | A12 30 A31 A42 3496 A64 A73 4 A93 A101 2 A123 34 A142 A152 1 A173 2 A192 A201 1 668 | A14 48 A31 A49 3609 A61 A73 1 A92 A101 1 A121 27 A142 A152 1 A173 1 A191 A201 1 669 | A11 12 A34 A40 4843 A61 A75 3 A93 A102 4 A122 43 A143 A151 2 A173 1 A192 A201 2 670 | A13 30 A34 A43 3017 A61 A75 4 A93 A101 4 A122 47 A143 A152 1 A173 1 A191 A201 1 671 | A14 24 A34 A49 4139 A62 A73 3 A93 A101 3 A122 27 A143 A152 2 A172 1 A192 A201 1 672 | A14 36 A32 A49 5742 A62 A74 2 A93 A101 2 A123 31 A143 A152 2 A173 1 A192 A201 1 673 | A14 60 A32 A40 10366 A61 A75 2 A93 A101 4 A122 42 A143 A152 1 A174 1 A192 A201 1 674 | A14 6 A34 A40 2080 A63 A73 1 A94 A101 2 A123 24 A143 A152 1 A173 1 A191 A201 1 675 | A14 21 A33 A49 2580 A63 A72 4 A93 A101 2 A121 41 A141 A152 1 A172 2 A191 A201 2 676 | A14 30 A34 A43 4530 A61 A74 4 A92 A101 4 A123 26 A143 A151 1 A174 1 A192 A201 1 677 | A14 24 A34 A42 5150 A61 A75 4 A93 A101 4 A123 33 A143 A152 1 A173 1 A192 A201 1 678 | A12 72 A32 A43 5595 A62 A73 2 A94 A101 2 A123 24 A143 A152 1 A173 1 A191 A201 2 679 | A11 24 A32 A43 2384 A61 A75 4 A93 A101 4 A121 64 A141 A151 1 A172 1 A191 A201 1 680 | A14 18 A32 A43 1453 A61 A72 3 A92 A101 1 A121 26 A143 A152 1 A173 1 A191 A201 1 681 | A14 6 A32 A46 1538 A61 A72 1 A92 A101 2 A124 56 A143 A152 1 A173 1 A191 A201 1 682 | A14 12 A32 A43 2279 A65 A73 4 A93 A101 4 A124 37 A143 A153 1 A173 1 A192 A201 1 683 | A14 15 A33 A43 1478 A61 A73 4 A94 A101 3 A121 33 A141 A152 2 A173 1 A191 A201 1 684 | A14 24 A34 A43 5103 A61 A72 3 A94 A101 3 A124 47 A143 A153 3 A173 1 A192 A201 1 685 | A12 36 A33 A49 9857 A62 A74 1 A93 A101 3 A122 31 A143 A152 2 A172 2 A192 A201 1 686 | A14 60 A32 A40 6527 A65 A73 4 A93 A101 4 A124 34 A143 A153 1 A173 2 A192 A201 1 687 | A13 10 A34 A43 1347 A65 A74 4 A93 A101 2 A122 27 A143 A152 2 A173 1 A192 A201 1 688 | A12 36 A33 A40 2862 A62 A75 4 A93 A101 3 A124 30 A143 A153 1 A173 1 A191 A201 1 689 | A14 9 A32 A43 2753 A62 A75 3 A93 A102 4 A123 35 A143 A152 1 A173 1 A192 A201 1 690 | A11 12 A32 A40 3651 A64 A73 1 A93 A101 3 A122 31 A143 A152 1 A173 2 A191 A201 1 691 | A11 15 A34 A42 975 A61 A73 2 A91 A101 3 A122 25 A143 A152 2 A173 1 A191 A201 1 692 | A12 15 A32 A45 2631 A62 A73 3 A92 A101 2 A121 25 A143 A152 1 A172 1 A191 A201 1 693 | A12 24 A32 A43 2896 A62 A72 2 A93 A101 1 A123 29 A143 A152 1 A173 1 A191 A201 1 694 | A11 6 A34 A40 4716 A65 A72 1 A93 A101 3 A121 44 A143 A152 2 A172 2 A191 A201 1 695 | A14 24 A32 A43 2284 A61 A74 4 A93 A101 2 A123 28 A143 A152 1 A173 1 A192 A201 1 696 | A14 6 A32 A41 1236 A63 A73 2 A93 A101 4 A122 50 A143 A151 1 A173 1 A191 A201 1 697 | A12 12 A32 A43 1103 A61 A74 4 A93 A103 3 A121 29 A143 A152 2 A173 1 A191 A202 1 698 | A14 12 A34 A40 926 A61 A71 1 A92 A101 2 A122 38 A143 A152 1 A171 1 A191 A201 1 699 | A14 18 A34 A43 1800 A61 A73 4 A93 A101 2 A123 24 A143 A152 2 A173 1 A191 A201 1 700 | A13 15 A32 A46 1905 A61 A75 4 A93 A101 4 A123 40 A143 A151 1 A174 1 A192 A201 1 701 | A14 12 A32 A42 1123 A63 A73 4 A92 A101 4 A123 29 A143 A151 1 A172 1 A191 A201 2 702 | A11 48 A34 A41 6331 A61 A75 4 A93 A101 4 A124 46 A143 A153 2 A173 1 A192 A201 2 703 | A13 24 A32 A43 1377 A62 A75 4 A92 A101 2 A124 47 A143 A153 1 A173 1 A192 A201 1 704 | A12 30 A33 A49 2503 A62 A75 4 A93 A101 2 A122 41 A142 A152 2 A173 1 A191 A201 1 705 | A12 27 A32 A49 2528 A61 A72 4 A92 A101 1 A122 32 A143 A152 1 A173 2 A192 A201 1 706 | A14 15 A32 A40 5324 A63 A75 1 A92 A101 4 A124 35 A143 A153 1 A173 1 A191 A201 1 707 | A12 48 A32 A40 6560 A62 A74 3 A93 A101 2 A122 24 A143 A152 1 A173 1 A191 A201 2 708 | A12 12 A30 A42 2969 A61 A72 4 A92 A101 3 A122 25 A143 A151 2 A173 1 A191 A201 2 709 | A12 9 A32 A43 1206 A61 A75 4 A92 A101 4 A121 25 A143 A152 1 A173 1 A191 A201 1 710 | A12 9 A32 A43 2118 A61 A73 2 A93 A101 2 A121 37 A143 A152 1 A172 2 A191 A201 1 711 | A14 18 A34 A43 629 A63 A75 4 A93 A101 3 A122 32 A141 A152 2 A174 1 A192 A201 1 712 | A11 6 A31 A46 1198 A61 A75 4 A92 A101 4 A124 35 A143 A153 1 A173 1 A191 A201 2 713 | A14 21 A32 A41 2476 A65 A75 4 A93 A101 4 A121 46 A143 A152 1 A174 1 A192 A201 1 714 | A11 9 A34 A43 1138 A61 A73 4 A93 A101 4 A121 25 A143 A152 2 A172 1 A191 A201 1 715 | A12 60 A32 A40 14027 A61 A74 4 A93 A101 2 A124 27 A143 A152 1 A174 1 A192 A201 2 716 | A14 30 A34 A41 7596 A65 A75 1 A93 A101 4 A123 63 A143 A152 2 A173 1 A191 A201 1 717 | A14 30 A34 A43 3077 A65 A75 3 A93 A101 2 A123 40 A143 A152 2 A173 2 A192 A201 1 718 | A14 18 A32 A43 1505 A61 A73 4 A93 A101 2 A124 32 A143 A153 1 A174 1 A192 A201 1 719 | A13 24 A34 A43 3148 A65 A73 3 A93 A101 2 A123 31 A143 A152 2 A173 1 A192 A201 1 720 | A12 20 A30 A41 6148 A62 A75 3 A94 A101 4 A123 31 A141 A152 2 A173 1 A192 A201 1 721 | A13 9 A30 A43 1337 A61 A72 4 A93 A101 2 A123 34 A143 A152 2 A174 1 A192 A201 2 722 | A12 6 A31 A46 433 A64 A72 4 A92 A101 2 A122 24 A141 A151 1 A173 2 A191 A201 2 723 | A11 12 A32 A40 1228 A61 A73 4 A92 A101 2 A121 24 A143 A152 1 A172 1 A191 A201 2 724 | A12 9 A32 A43 790 A63 A73 4 A92 A101 3 A121 66 A143 A152 1 A172 1 A191 A201 1 725 | A14 27 A32 A40 2570 A61 A73 3 A92 A101 3 A121 21 A143 A151 1 A173 1 A191 A201 2 726 | A14 6 A34 A40 250 A64 A73 2 A92 A101 2 A121 41 A141 A152 2 A172 1 A191 A201 1 727 | A14 15 A34 A43 1316 A63 A73 2 A94 A101 2 A122 47 A143 A152 2 A172 1 A191 A201 1 728 | A11 18 A32 A43 1882 A61 A73 4 A92 A101 4 A123 25 A141 A151 2 A173 1 A191 A201 2 729 | A12 48 A31 A49 6416 A61 A75 4 A92 A101 3 A124 59 A143 A151 1 A173 1 A191 A201 2 730 | A13 24 A34 A49 1275 A64 A73 2 A91 A101 4 A121 36 A143 A152 2 A173 1 A192 A201 1 731 | A12 24 A33 A43 6403 A61 A72 1 A93 A101 2 A123 33 A143 A152 1 A173 1 A191 A201 1 732 | A11 24 A32 A43 1987 A61 A73 2 A93 A101 4 A121 21 A143 A151 1 A172 2 A191 A201 2 733 | A12 8 A32 A43 760 A61 A74 4 A92 A103 2 A121 44 A143 A152 1 A172 1 A191 A201 1 734 | A14 24 A32 A41 2603 A64 A73 2 A92 A101 4 A123 28 A143 A151 1 A173 1 A192 A201 1 735 | A14 4 A34 A40 3380 A61 A74 1 A92 A101 1 A121 37 A143 A152 1 A173 2 A191 A201 1 736 | A12 36 A31 A44 3990 A65 A72 3 A92 A101 2 A124 29 A141 A152 1 A171 1 A191 A201 1 737 | A12 24 A32 A41 11560 A61 A73 1 A92 A101 4 A123 23 A143 A151 2 A174 1 A191 A201 2 738 | A11 18 A32 A40 4380 A62 A73 3 A93 A101 4 A123 35 A143 A152 1 A172 2 A192 A201 1 739 | A14 6 A34 A40 6761 A61 A74 1 A93 A101 3 A124 45 A143 A152 2 A174 2 A192 A201 1 740 | A12 30 A30 A49 4280 A62 A73 4 A92 A101 4 A123 26 A143 A151 2 A172 1 A191 A201 2 741 | A11 24 A31 A40 2325 A62 A74 2 A93 A101 3 A123 32 A141 A152 1 A173 1 A191 A201 1 742 | A12 10 A31 A43 1048 A61 A73 4 A93 A101 4 A121 23 A142 A152 1 A172 1 A191 A201 1 743 | A14 21 A32 A43 3160 A65 A75 4 A93 A101 3 A122 41 A143 A152 1 A173 1 A192 A201 1 744 | A11 24 A31 A42 2483 A63 A73 4 A93 A101 4 A121 22 A142 A152 1 A173 1 A192 A201 1 745 | A11 39 A34 A42 14179 A65 A74 4 A93 A101 4 A122 30 A143 A152 2 A174 1 A192 A201 1 746 | A11 13 A34 A49 1797 A61 A72 3 A93 A101 1 A122 28 A141 A152 2 A172 1 A191 A201 1 747 | A11 15 A32 A40 2511 A61 A71 1 A92 A101 4 A123 23 A143 A151 1 A173 1 A191 A201 1 748 | A11 12 A32 A40 1274 A61 A72 3 A92 A101 1 A121 37 A143 A152 1 A172 1 A191 A201 2 749 | A14 21 A32 A41 5248 A65 A73 1 A93 A101 3 A123 26 A143 A152 1 A173 1 A191 A201 1 750 | A14 15 A32 A41 3029 A61 A74 2 A93 A101 2 A123 33 A143 A152 1 A173 1 A191 A201 1 751 | A11 6 A32 A42 428 A61 A75 2 A92 A101 1 A122 49 A141 A152 1 A173 1 A192 A201 1 752 | A11 18 A32 A40 976 A61 A72 1 A92 A101 2 A123 23 A143 A152 1 A172 1 A191 A201 2 753 | A12 12 A32 A49 841 A62 A74 2 A92 A101 4 A121 23 A143 A151 1 A172 1 A191 A201 1 754 | A14 30 A34 A43 5771 A61 A74 4 A92 A101 2 A123 25 A143 A152 2 A173 1 A191 A201 1 755 | A14 12 A33 A45 1555 A64 A75 4 A93 A101 4 A124 55 A143 A153 2 A173 2 A191 A201 2 756 | A11 24 A32 A40 1285 A65 A74 4 A92 A101 4 A124 32 A143 A151 1 A173 1 A191 A201 2 757 | A13 6 A34 A40 1299 A61 A73 1 A93 A101 1 A121 74 A143 A152 3 A171 2 A191 A202 1 758 | A13 15 A34 A43 1271 A65 A73 3 A93 A101 4 A124 39 A143 A153 2 A173 1 A192 A201 2 759 | A14 24 A32 A40 1393 A61 A73 2 A93 A103 2 A121 31 A143 A152 1 A173 1 A192 A201 1 760 | A11 12 A34 A40 691 A61 A75 4 A93 A101 3 A122 35 A143 A152 2 A173 1 A191 A201 2 761 | A14 15 A34 A40 5045 A65 A75 1 A92 A101 4 A123 59 A143 A152 1 A173 1 A192 A201 1 762 | A11 18 A34 A42 2124 A61 A73 4 A92 A101 4 A121 24 A143 A151 2 A173 1 A191 A201 2 763 | A11 12 A32 A43 2214 A61 A73 4 A93 A101 3 A122 24 A143 A152 1 A172 1 A191 A201 1 764 | A14 21 A34 A40 12680 A65 A75 4 A93 A101 4 A124 30 A143 A153 1 A174 1 A192 A201 2 765 | A14 24 A34 A40 2463 A62 A74 4 A94 A101 3 A122 27 A143 A152 2 A173 1 A192 A201 1 766 | A12 12 A32 A43 1155 A61 A75 3 A94 A103 3 A121 40 A141 A152 2 A172 1 A191 A201 1 767 | A11 30 A32 A42 3108 A61 A72 2 A91 A101 4 A122 31 A143 A152 1 A172 1 A191 A201 2 768 | A14 10 A32 A41 2901 A65 A72 1 A92 A101 4 A121 31 A143 A151 1 A173 1 A191 A201 1 769 | A12 12 A34 A42 3617 A61 A75 1 A93 A101 4 A123 28 A143 A151 3 A173 1 A192 A201 1 770 | A14 12 A34 A43 1655 A61 A75 2 A93 A101 4 A121 63 A143 A152 2 A172 1 A192 A201 1 771 | A11 24 A32 A41 2812 A65 A75 2 A92 A101 4 A121 26 A143 A151 1 A173 1 A191 A201 1 772 | A11 36 A34 A46 8065 A61 A73 3 A92 A101 2 A124 25 A143 A152 2 A174 1 A192 A201 2 773 | A14 21 A34 A41 3275 A61 A75 1 A93 A101 4 A123 36 A143 A152 1 A174 1 A192 A201 1 774 | A14 24 A34 A43 2223 A62 A75 4 A93 A101 4 A122 52 A141 A152 2 A173 1 A191 A201 1 775 | A13 12 A34 A40 1480 A63 A71 2 A93 A101 4 A124 66 A141 A153 3 A171 1 A191 A201 1 776 | A11 24 A32 A40 1371 A65 A73 4 A92 A101 4 A121 25 A143 A151 1 A173 1 A191 A201 2 777 | A14 36 A34 A40 3535 A61 A74 4 A93 A101 4 A123 37 A143 A152 2 A173 1 A192 A201 1 778 | A11 18 A32 A43 3509 A61 A74 4 A92 A103 1 A121 25 A143 A152 1 A173 1 A191 A201 1 779 | A14 36 A34 A41 5711 A64 A75 4 A93 A101 2 A123 38 A143 A152 2 A174 1 A192 A201 1 780 | A12 18 A32 A45 3872 A61 A71 2 A92 A101 4 A123 67 A143 A152 1 A173 1 A192 A201 1 781 | A12 39 A34 A43 4933 A61 A74 2 A93 A103 2 A121 25 A143 A152 2 A173 1 A191 A201 2 782 | A14 24 A34 A40 1940 A64 A75 4 A93 A101 4 A121 60 A143 A152 1 A173 1 A192 A201 1 783 | A12 12 A30 A48 1410 A61 A73 2 A93 A101 2 A121 31 A143 A152 1 A172 1 A192 A201 1 784 | A12 12 A32 A40 836 A62 A72 4 A92 A101 2 A122 23 A141 A152 1 A172 1 A191 A201 2 785 | A12 20 A32 A41 6468 A65 A71 1 A91 A101 4 A121 60 A143 A152 1 A174 1 A192 A201 1 786 | A12 18 A32 A49 1941 A64 A73 4 A93 A101 2 A122 35 A143 A152 1 A172 1 A192 A201 1 787 | A14 22 A32 A43 2675 A63 A75 3 A93 A101 4 A123 40 A143 A152 1 A173 1 A191 A201 1 788 | A14 48 A34 A41 2751 A65 A75 4 A93 A101 3 A123 38 A143 A152 2 A173 2 A192 A201 1 789 | A12 48 A33 A46 6224 A61 A75 4 A93 A101 4 A124 50 A143 A153 1 A173 1 A191 A201 2 790 | A11 40 A34 A46 5998 A61 A73 4 A93 A101 3 A124 27 A141 A152 1 A173 1 A192 A201 2 791 | A12 21 A32 A49 1188 A61 A75 2 A92 A101 4 A122 39 A143 A152 1 A173 2 A191 A201 2 792 | A14 24 A32 A41 6313 A65 A75 3 A93 A101 4 A123 41 A143 A152 1 A174 2 A192 A201 1 793 | A14 6 A34 A42 1221 A65 A73 1 A94 A101 2 A122 27 A143 A152 2 A173 1 A191 A201 1 794 | A13 24 A32 A42 2892 A61 A75 3 A91 A101 4 A124 51 A143 A153 1 A173 1 A191 A201 1 795 | A14 24 A32 A42 3062 A63 A75 4 A93 A101 3 A124 32 A143 A151 1 A173 1 A192 A201 1 796 | A14 9 A32 A42 2301 A62 A72 2 A92 A101 4 A122 22 A143 A151 1 A173 1 A191 A201 1 797 | A11 18 A32 A41 7511 A65 A75 1 A93 A101 4 A122 51 A143 A153 1 A173 2 A192 A201 2 798 | A14 12 A34 A42 1258 A61 A72 2 A92 A101 4 A122 22 A143 A151 2 A172 1 A191 A201 1 799 | A14 24 A33 A40 717 A65 A75 4 A94 A101 4 A123 54 A143 A152 2 A173 1 A192 A201 1 800 | A12 9 A32 A40 1549 A65 A72 4 A93 A101 2 A121 35 A143 A152 1 A171 1 A191 A201 1 801 | A14 24 A34 A46 1597 A61 A75 4 A93 A101 4 A124 54 A143 A153 2 A173 2 A191 A201 1 802 | A12 18 A34 A43 1795 A61 A75 3 A92 A103 4 A121 48 A141 A151 2 A172 1 A192 A201 1 803 | A11 20 A34 A42 4272 A61 A75 1 A92 A101 4 A122 24 A143 A152 2 A173 1 A191 A201 1 804 | A14 12 A34 A43 976 A65 A75 4 A93 A101 4 A123 35 A143 A152 2 A173 1 A191 A201 1 805 | A12 12 A32 A40 7472 A65 A71 1 A92 A101 2 A121 24 A143 A151 1 A171 1 A191 A201 1 806 | A11 36 A32 A40 9271 A61 A74 2 A93 A101 1 A123 24 A143 A152 1 A173 1 A192 A201 2 807 | A12 6 A32 A43 590 A61 A72 3 A94 A101 3 A121 26 A143 A152 1 A172 1 A191 A202 1 808 | A14 12 A34 A43 930 A65 A75 4 A93 A101 4 A121 65 A143 A152 4 A173 1 A191 A201 1 809 | A12 42 A31 A41 9283 A61 A71 1 A93 A101 2 A124 55 A141 A153 1 A174 1 A192 A201 1 810 | A12 15 A30 A40 1778 A61 A72 2 A92 A101 1 A121 26 A143 A151 2 A171 1 A191 A201 2 811 | A12 8 A32 A49 907 A61 A72 3 A94 A101 2 A121 26 A143 A152 1 A173 1 A192 A201 1 812 | A12 6 A32 A43 484 A61 A74 3 A94 A103 3 A121 28 A141 A152 1 A172 1 A191 A201 1 813 | A11 36 A34 A41 9629 A61 A74 4 A93 A101 4 A123 24 A143 A152 2 A173 1 A192 A201 2 814 | A11 48 A32 A44 3051 A61 A73 3 A93 A101 4 A123 54 A143 A152 1 A173 1 A191 A201 2 815 | A11 48 A32 A40 3931 A61 A74 4 A93 A101 4 A124 46 A143 A153 1 A173 2 A191 A201 2 816 | A12 36 A33 A40 7432 A61 A73 2 A92 A101 2 A122 54 A143 A151 1 A173 1 A191 A201 1 817 | A14 6 A32 A44 1338 A63 A73 1 A91 A101 4 A121 62 A143 A152 1 A173 1 A191 A201 1 818 | A14 6 A34 A43 1554 A61 A74 1 A92 A101 2 A123 24 A143 A151 2 A173 1 A192 A201 1 819 | A11 36 A32 A410 15857 A61 A71 2 A91 A102 3 A123 43 A143 A152 1 A174 1 A191 A201 1 820 | A11 18 A32 A43 1345 A61 A73 4 A94 A101 3 A121 26 A141 A152 1 A173 1 A191 A201 2 821 | A14 12 A32 A40 1101 A61 A73 3 A94 A101 2 A121 27 A143 A152 2 A173 1 A192 A201 1 822 | A13 12 A32 A43 3016 A61 A73 3 A94 A101 1 A123 24 A143 A152 1 A173 1 A191 A201 1 823 | A11 36 A32 A42 2712 A61 A75 2 A93 A101 2 A122 41 A141 A152 1 A173 2 A191 A201 2 824 | A11 8 A34 A40 731 A61 A75 4 A93 A101 4 A121 47 A143 A152 2 A172 1 A191 A201 1 825 | A14 18 A34 A42 3780 A61 A72 3 A91 A101 2 A123 35 A143 A152 2 A174 1 A192 A201 1 826 | A11 21 A34 A40 1602 A61 A75 4 A94 A101 3 A123 30 A143 A152 2 A173 1 A192 A201 1 827 | A11 18 A34 A40 3966 A61 A75 1 A92 A101 4 A121 33 A141 A151 3 A173 1 A192 A201 2 828 | A14 18 A30 A49 4165 A61 A73 2 A93 A101 2 A123 36 A142 A152 2 A173 2 A191 A201 2 829 | A11 36 A32 A41 8335 A65 A75 3 A93 A101 4 A124 47 A143 A153 1 A173 1 A191 A201 2 830 | A12 48 A33 A49 6681 A65 A73 4 A93 A101 4 A124 38 A143 A153 1 A173 2 A192 A201 1 831 | A14 24 A33 A49 2375 A63 A73 4 A93 A101 2 A123 44 A143 A152 2 A173 2 A192 A201 1 832 | A11 18 A32 A40 1216 A61 A72 4 A92 A101 3 A123 23 A143 A151 1 A173 1 A192 A201 2 833 | A11 45 A30 A49 11816 A61 A75 2 A93 A101 4 A123 29 A143 A151 2 A173 1 A191 A201 2 834 | A12 24 A32 A43 5084 A65 A75 2 A92 A101 4 A123 42 A143 A152 1 A173 1 A192 A201 1 835 | A13 15 A32 A43 2327 A61 A72 2 A92 A101 3 A121 25 A143 A152 1 A172 1 A191 A201 2 836 | A11 12 A30 A40 1082 A61 A73 4 A93 A101 4 A123 48 A141 A152 2 A173 1 A191 A201 2 837 | A14 12 A32 A43 886 A65 A73 4 A92 A101 2 A123 21 A143 A152 1 A173 1 A191 A201 1 838 | A14 4 A32 A42 601 A61 A72 1 A92 A101 3 A121 23 A143 A151 1 A172 2 A191 A201 1 839 | A11 24 A34 A41 2957 A61 A75 4 A93 A101 4 A122 63 A143 A152 2 A173 1 A192 A201 1 840 | A14 24 A34 A43 2611 A61 A75 4 A94 A102 3 A121 46 A143 A152 2 A173 1 A191 A201 1 841 | A11 36 A32 A42 5179 A61 A74 4 A93 A101 2 A122 29 A143 A152 1 A173 1 A191 A201 2 842 | A14 21 A33 A41 2993 A61 A73 3 A93 A101 2 A121 28 A142 A152 2 A172 1 A191 A201 1 843 | A14 18 A32 A45 1943 A61 A72 4 A92 A101 4 A121 23 A143 A152 1 A173 1 A191 A201 2 844 | A14 24 A31 A49 1559 A61 A74 4 A93 A101 4 A123 50 A141 A152 1 A173 1 A192 A201 1 845 | A14 18 A32 A42 3422 A61 A75 4 A93 A101 4 A122 47 A141 A152 3 A173 2 A192 A201 1 846 | A12 21 A32 A42 3976 A65 A74 2 A93 A101 3 A123 35 A143 A152 1 A173 1 A192 A201 1 847 | A14 18 A32 A40 6761 A65 A73 2 A93 A101 4 A123 68 A143 A151 2 A173 1 A191 A201 2 848 | A14 24 A32 A40 1249 A61 A72 4 A94 A101 2 A121 28 A143 A152 1 A173 1 A191 A201 1 849 | A11 9 A32 A43 1364 A61 A74 3 A93 A101 4 A121 59 A143 A152 1 A173 1 A191 A201 1 850 | A11 12 A32 A43 709 A61 A75 4 A93 A101 4 A121 57 A142 A152 1 A172 1 A191 A201 2 851 | A11 20 A34 A40 2235 A61 A73 4 A94 A103 2 A122 33 A141 A151 2 A173 1 A191 A202 2 852 | A14 24 A34 A41 4042 A65 A74 3 A93 A101 4 A122 43 A143 A152 2 A173 1 A192 A201 1 853 | A14 15 A34 A43 1471 A61 A73 4 A93 A101 4 A124 35 A143 A153 2 A173 1 A192 A201 1 854 | A11 18 A31 A40 1442 A61 A74 4 A93 A101 4 A124 32 A143 A153 2 A172 2 A191 A201 2 855 | A14 36 A33 A40 10875 A61 A75 2 A93 A101 2 A123 45 A143 A152 2 A173 2 A192 A201 1 856 | A14 24 A32 A40 1474 A62 A72 4 A94 A101 3 A121 33 A143 A152 1 A173 1 A192 A201 1 857 | A14 10 A32 A48 894 A65 A74 4 A92 A101 3 A122 40 A143 A152 1 A173 1 A192 A201 1 858 | A14 15 A34 A42 3343 A61 A73 4 A93 A101 2 A124 28 A143 A153 1 A173 1 A192 A201 1 859 | A11 15 A32 A40 3959 A61 A73 3 A92 A101 2 A122 29 A143 A152 1 A173 1 A192 A201 2 860 | A14 9 A32 A40 3577 A62 A73 1 A93 A103 2 A121 26 A143 A151 1 A173 2 A191 A202 1 861 | A14 24 A34 A41 5804 A64 A73 4 A93 A101 2 A121 27 A143 A152 2 A173 1 A191 A201 1 862 | A14 18 A33 A49 2169 A61 A73 4 A94 A101 2 A123 28 A143 A152 1 A173 1 A192 A201 2 863 | A11 24 A32 A43 2439 A61 A72 4 A92 A101 4 A121 35 A143 A152 1 A173 1 A192 A201 2 864 | A14 27 A34 A42 4526 A64 A72 4 A93 A101 2 A121 32 A142 A152 2 A172 2 A192 A201 1 865 | A14 10 A32 A42 2210 A61 A73 2 A93 A101 2 A121 25 A141 A151 1 A172 1 A191 A201 2 866 | A14 15 A32 A42 2221 A63 A73 2 A92 A101 4 A123 20 A143 A151 1 A173 1 A191 A201 1 867 | A11 18 A32 A43 2389 A61 A72 4 A92 A101 1 A123 27 A142 A152 1 A173 1 A191 A201 1 868 | A14 12 A34 A42 3331 A61 A75 2 A93 A101 4 A122 42 A142 A152 1 A173 1 A191 A201 1 869 | A14 36 A32 A49 7409 A65 A75 3 A93 A101 2 A122 37 A143 A152 2 A173 1 A191 A201 1 870 | A11 12 A32 A42 652 A61 A75 4 A92 A101 4 A122 24 A143 A151 1 A173 1 A191 A201 1 871 | A14 36 A33 A42 7678 A63 A74 2 A92 A101 4 A123 40 A143 A152 2 A173 1 A192 A201 1 872 | A13 6 A34 A40 1343 A61 A75 1 A93 A101 4 A121 46 A143 A152 2 A173 2 A191 A202 1 873 | A11 24 A34 A49 1382 A62 A74 4 A93 A101 1 A121 26 A143 A152 2 A173 1 A192 A201 1 874 | A14 15 A32 A44 874 A65 A72 4 A92 A101 1 A121 24 A143 A152 1 A173 1 A191 A201 1 875 | A11 12 A32 A42 3590 A61 A73 2 A93 A102 2 A122 29 A143 A152 1 A172 2 A191 A201 1 876 | A12 11 A34 A40 1322 A64 A73 4 A92 A101 4 A123 40 A143 A152 2 A173 1 A191 A201 1 877 | A11 18 A31 A43 1940 A61 A72 3 A93 A102 4 A124 36 A141 A153 1 A174 1 A192 A201 1 878 | A14 36 A32 A43 3595 A61 A75 4 A93 A101 2 A123 28 A143 A152 1 A173 1 A191 A201 1 879 | A11 9 A32 A40 1422 A61 A72 3 A93 A101 2 A124 27 A143 A153 1 A174 1 A192 A201 2 880 | A14 30 A34 A43 6742 A65 A74 2 A93 A101 3 A122 36 A143 A152 2 A173 1 A191 A201 1 881 | A14 24 A32 A41 7814 A61 A74 3 A93 A101 3 A123 38 A143 A152 1 A174 1 A192 A201 1 882 | A14 24 A32 A41 9277 A65 A73 2 A91 A101 4 A124 48 A143 A153 1 A173 1 A192 A201 1 883 | A12 30 A34 A40 2181 A65 A75 4 A93 A101 4 A121 36 A143 A152 2 A173 1 A191 A201 1 884 | A14 18 A34 A43 1098 A61 A71 4 A92 A101 4 A123 65 A143 A152 2 A171 1 A191 A201 1 885 | A12 24 A32 A42 4057 A61 A74 3 A91 A101 3 A123 43 A143 A152 1 A173 1 A192 A201 2 886 | A11 12 A32 A46 795 A61 A72 4 A92 A101 4 A122 53 A143 A152 1 A173 1 A191 A201 2 887 | A12 24 A34 A49 2825 A65 A74 4 A93 A101 3 A124 34 A143 A152 2 A173 2 A192 A201 1 888 | A12 48 A32 A49 15672 A61 A73 2 A93 A101 2 A123 23 A143 A152 1 A173 1 A192 A201 2 889 | A14 36 A34 A40 6614 A61 A75 4 A93 A101 4 A123 34 A143 A152 2 A174 1 A192 A201 1 890 | A14 28 A31 A41 7824 A65 A72 3 A93 A103 4 A121 40 A141 A151 2 A173 2 A192 A201 1 891 | A11 27 A34 A49 2442 A61 A75 4 A93 A101 4 A123 43 A142 A152 4 A174 2 A192 A201 1 892 | A14 15 A34 A43 1829 A61 A75 4 A93 A101 4 A123 46 A143 A152 2 A173 1 A192 A201 1 893 | A11 12 A34 A40 2171 A61 A73 4 A93 A101 4 A122 38 A141 A152 2 A172 1 A191 A202 1 894 | A12 36 A34 A41 5800 A61 A73 3 A93 A101 4 A123 34 A143 A152 2 A173 1 A192 A201 1 895 | A14 18 A34 A43 1169 A65 A73 4 A93 A101 3 A122 29 A143 A152 2 A173 1 A192 A201 1 896 | A14 36 A33 A41 8947 A65 A74 3 A93 A101 2 A123 31 A142 A152 1 A174 2 A192 A201 1 897 | A11 21 A32 A43 2606 A61 A72 4 A92 A101 4 A122 28 A143 A151 1 A174 1 A192 A201 1 898 | A14 12 A34 A42 1592 A64 A74 3 A92 A101 2 A122 35 A143 A152 1 A173 1 A191 A202 1 899 | A14 15 A32 A42 2186 A65 A74 1 A92 A101 4 A121 33 A141 A151 1 A172 1 A191 A201 1 900 | A11 18 A32 A42 4153 A61 A73 2 A93 A102 3 A123 42 A143 A152 1 A173 1 A191 A201 2 901 | A11 16 A34 A40 2625 A61 A75 2 A93 A103 4 A122 43 A141 A151 1 A173 1 A192 A201 2 902 | A14 20 A34 A40 3485 A65 A72 2 A91 A101 4 A121 44 A143 A152 2 A173 1 A192 A201 1 903 | A14 36 A34 A41 10477 A65 A75 2 A93 A101 4 A124 42 A143 A153 2 A173 1 A191 A201 1 904 | A14 15 A32 A43 1386 A65 A73 4 A94 A101 2 A121 40 A143 A151 1 A173 1 A192 A201 1 905 | A14 24 A32 A43 1278 A61 A75 4 A93 A101 1 A121 36 A143 A152 1 A174 1 A192 A201 1 906 | A11 12 A32 A43 1107 A61 A73 2 A93 A101 2 A121 20 A143 A151 1 A174 2 A192 A201 1 907 | A11 21 A32 A40 3763 A65 A74 2 A93 A102 2 A121 24 A143 A152 1 A172 1 A191 A202 1 908 | A12 36 A32 A46 3711 A65 A73 2 A94 A101 2 A123 27 A143 A152 1 A173 1 A191 A201 1 909 | A14 15 A33 A41 3594 A61 A72 1 A92 A101 2 A122 46 A143 A152 2 A172 1 A191 A201 1 910 | A12 9 A32 A40 3195 A65 A73 1 A92 A101 2 A121 33 A143 A152 1 A172 1 A191 A201 1 911 | A14 36 A33 A43 4454 A61 A73 4 A92 A101 4 A121 34 A143 A152 2 A173 1 A191 A201 1 912 | A12 24 A34 A42 4736 A61 A72 2 A92 A101 4 A123 25 A141 A152 1 A172 1 A191 A201 2 913 | A12 30 A32 A43 2991 A65 A75 2 A92 A101 4 A123 25 A143 A152 1 A173 1 A191 A201 1 914 | A14 11 A32 A49 2142 A64 A75 1 A91 A101 2 A121 28 A143 A152 1 A173 1 A192 A201 1 915 | A11 24 A31 A49 3161 A61 A73 4 A93 A101 2 A122 31 A143 A151 1 A173 1 A192 A201 2 916 | A12 48 A30 A410 18424 A61 A73 1 A92 A101 2 A122 32 A141 A152 1 A174 1 A192 A202 2 917 | A14 10 A32 A41 2848 A62 A73 1 A93 A102 2 A121 32 A143 A152 1 A173 2 A191 A201 1 918 | A11 6 A32 A40 14896 A61 A75 1 A93 A101 4 A124 68 A141 A152 1 A174 1 A192 A201 2 919 | A11 24 A32 A42 2359 A62 A71 1 A91 A101 1 A122 33 A143 A152 1 A173 1 A191 A201 2 920 | A11 24 A32 A42 3345 A61 A75 4 A93 A101 2 A122 39 A143 A151 1 A174 1 A192 A201 2 921 | A14 18 A34 A42 1817 A61 A73 4 A92 A101 2 A124 28 A143 A152 2 A173 1 A191 A201 1 922 | A14 48 A33 A43 12749 A63 A74 4 A93 A101 1 A123 37 A143 A152 1 A174 1 A192 A201 1 923 | A11 9 A32 A43 1366 A61 A72 3 A92 A101 4 A122 22 A143 A151 1 A173 1 A191 A201 2 924 | A12 12 A32 A40 2002 A61 A74 3 A93 A101 4 A122 30 A143 A151 1 A173 2 A192 A201 1 925 | A11 24 A31 A42 6872 A61 A72 2 A91 A101 1 A122 55 A141 A152 1 A173 1 A192 A201 2 926 | A11 12 A31 A40 697 A61 A72 4 A93 A101 2 A123 46 A141 A152 2 A173 1 A192 A201 2 927 | A11 18 A34 A42 1049 A61 A72 4 A92 A101 4 A122 21 A143 A151 1 A173 1 A191 A201 1 928 | A11 48 A32 A41 10297 A61 A74 4 A93 A101 4 A124 39 A142 A153 3 A173 2 A192 A201 2 929 | A14 30 A32 A43 1867 A65 A75 4 A93 A101 4 A123 58 A143 A152 1 A173 1 A192 A201 1 930 | A11 12 A33 A40 1344 A61 A73 4 A93 A101 2 A121 43 A143 A152 2 A172 2 A191 A201 1 931 | A11 24 A32 A42 1747 A61 A72 4 A93 A102 1 A122 24 A143 A152 1 A172 1 A191 A202 1 932 | A12 9 A32 A43 1670 A61 A72 4 A92 A101 2 A123 22 A143 A152 1 A173 1 A192 A201 2 933 | A14 9 A34 A40 1224 A61 A73 3 A93 A101 1 A121 30 A143 A152 2 A173 1 A191 A201 1 934 | A14 12 A34 A43 522 A63 A75 4 A93 A101 4 A122 42 A143 A152 2 A173 2 A192 A201 1 935 | A11 12 A32 A43 1498 A61 A73 4 A92 A101 1 A123 23 A141 A152 1 A173 1 A191 A201 1 936 | A12 30 A33 A43 1919 A62 A72 4 A93 A101 3 A124 30 A142 A152 2 A174 1 A191 A201 2 937 | A13 9 A32 A43 745 A61 A73 3 A92 A101 2 A121 28 A143 A152 1 A172 1 A191 A201 2 938 | A12 6 A32 A43 2063 A61 A72 4 A94 A101 3 A123 30 A143 A151 1 A174 1 A192 A201 1 939 | A12 60 A32 A46 6288 A61 A73 4 A93 A101 4 A124 42 A143 A153 1 A173 1 A191 A201 2 940 | A14 24 A34 A41 6842 A65 A73 2 A93 A101 4 A122 46 A143 A152 2 A174 2 A192 A201 1 941 | A14 12 A32 A40 3527 A65 A72 2 A93 A101 3 A122 45 A143 A152 1 A174 2 A192 A201 1 942 | A14 10 A32 A40 1546 A61 A73 3 A93 A101 2 A121 31 A143 A152 1 A172 2 A191 A202 1 943 | A14 24 A32 A42 929 A65 A74 4 A93 A101 2 A123 31 A142 A152 1 A173 1 A192 A201 1 944 | A14 4 A34 A40 1455 A61 A74 2 A93 A101 1 A121 42 A143 A152 3 A172 2 A191 A201 1 945 | A11 15 A32 A42 1845 A61 A72 4 A92 A103 1 A122 46 A143 A151 1 A173 1 A191 A201 1 946 | A12 48 A30 A40 8358 A63 A72 1 A92 A101 1 A123 30 A143 A152 2 A173 1 A191 A201 1 947 | A11 24 A31 A42 3349 A63 A72 4 A93 A101 4 A124 30 A143 A153 1 A173 2 A192 A201 2 948 | A14 12 A32 A40 2859 A65 A71 4 A93 A101 4 A124 38 A143 A152 1 A174 1 A192 A201 1 949 | A14 18 A32 A42 1533 A61 A72 4 A94 A102 1 A122 43 A143 A152 1 A172 2 A191 A201 2 950 | A14 24 A32 A43 3621 A62 A75 2 A93 A101 4 A123 31 A143 A152 2 A173 1 A191 A201 2 951 | A12 18 A34 A49 3590 A61 A71 3 A94 A101 3 A123 40 A143 A152 3 A171 2 A192 A201 1 952 | A11 36 A33 A49 2145 A61 A74 2 A93 A101 1 A123 24 A143 A152 2 A173 1 A192 A201 2 953 | A12 24 A32 A41 4113 A63 A72 3 A92 A101 4 A123 28 A143 A151 1 A173 1 A191 A201 2 954 | A14 36 A32 A42 10974 A61 A71 4 A92 A101 2 A123 26 A143 A152 2 A174 1 A192 A201 2 955 | A11 12 A32 A40 1893 A61 A73 4 A92 A103 4 A122 29 A143 A152 1 A173 1 A192 A201 1 956 | A11 24 A34 A43 1231 A64 A75 4 A92 A101 4 A122 57 A143 A151 2 A174 1 A192 A201 1 957 | A13 30 A34 A43 3656 A65 A75 4 A93 A101 4 A122 49 A142 A152 2 A172 1 A191 A201 1 958 | A12 9 A34 A43 1154 A61 A75 2 A93 A101 4 A121 37 A143 A152 3 A172 1 A191 A201 1 959 | A11 28 A32 A40 4006 A61 A73 3 A93 A101 2 A123 45 A143 A152 1 A172 1 A191 A201 2 960 | A12 24 A32 A42 3069 A62 A75 4 A93 A101 4 A124 30 A143 A153 1 A173 1 A191 A201 1 961 | A14 6 A34 A43 1740 A61 A75 2 A94 A101 2 A121 30 A143 A151 2 A173 1 A191 A201 1 962 | A12 21 A33 A40 2353 A61 A73 1 A91 A101 4 A122 47 A143 A152 2 A173 1 A191 A201 1 963 | A14 15 A32 A40 3556 A65 A73 3 A93 A101 2 A124 29 A143 A152 1 A173 1 A191 A201 1 964 | A14 24 A32 A43 2397 A63 A75 3 A93 A101 2 A123 35 A141 A152 2 A173 1 A192 A201 2 965 | A12 6 A32 A45 454 A61 A72 3 A94 A101 1 A122 22 A143 A152 1 A172 1 A191 A201 1 966 | A12 30 A32 A43 1715 A65 A73 4 A92 A101 1 A123 26 A143 A152 1 A173 1 A191 A201 1 967 | A12 27 A34 A43 2520 A63 A73 4 A93 A101 2 A122 23 A143 A152 2 A172 1 A191 A201 2 968 | A14 15 A32 A43 3568 A61 A75 4 A92 A101 2 A123 54 A141 A151 1 A174 1 A192 A201 1 969 | A14 42 A32 A43 7166 A65 A74 2 A94 A101 4 A122 29 A143 A151 1 A173 1 A192 A201 1 970 | A11 11 A34 A40 3939 A61 A73 1 A93 A101 2 A121 40 A143 A152 2 A172 2 A191 A201 1 971 | A12 15 A32 A45 1514 A62 A73 4 A93 A103 2 A121 22 A143 A152 1 A173 1 A191 A201 1 972 | A14 24 A32 A40 7393 A61 A73 1 A93 A101 4 A122 43 A143 A152 1 A172 2 A191 A201 1 973 | A11 24 A31 A40 1193 A61 A71 1 A92 A102 4 A124 29 A143 A151 2 A171 1 A191 A201 2 974 | A11 60 A32 A49 7297 A61 A75 4 A93 A102 4 A124 36 A143 A151 1 A173 1 A191 A201 2 975 | A14 30 A34 A43 2831 A61 A73 4 A92 A101 2 A123 33 A143 A152 1 A173 1 A192 A201 1 976 | A13 24 A32 A43 1258 A63 A73 3 A92 A101 3 A123 57 A143 A152 1 A172 1 A191 A201 1 977 | A12 6 A32 A43 753 A61 A73 2 A92 A103 3 A121 64 A143 A152 1 A173 1 A191 A201 1 978 | A12 18 A33 A49 2427 A65 A75 4 A93 A101 2 A122 42 A143 A152 2 A173 1 A191 A201 1 979 | A14 24 A33 A40 2538 A61 A75 4 A93 A101 4 A123 47 A143 A152 2 A172 2 A191 A201 2 980 | A12 15 A31 A40 1264 A62 A73 2 A94 A101 2 A122 25 A143 A151 1 A173 1 A191 A201 2 981 | A12 30 A34 A42 8386 A61 A74 2 A93 A101 2 A122 49 A143 A152 1 A173 1 A191 A201 2 982 | A14 48 A32 A49 4844 A61 A71 3 A93 A101 2 A123 33 A141 A151 1 A174 1 A192 A201 2 983 | A13 21 A32 A40 2923 A62 A73 1 A92 A101 1 A123 28 A141 A152 1 A174 1 A192 A201 1 984 | A11 36 A32 A41 8229 A61 A73 2 A93 A101 2 A122 26 A143 A152 1 A173 2 A191 A201 2 985 | A14 24 A34 A42 2028 A61 A74 2 A93 A101 2 A122 30 A143 A152 2 A172 1 A191 A201 1 986 | A11 15 A34 A42 1433 A61 A73 4 A92 A101 3 A122 25 A143 A151 2 A173 1 A191 A201 1 987 | A13 42 A30 A49 6289 A61 A72 2 A91 A101 1 A122 33 A143 A152 2 A173 1 A191 A201 1 988 | A14 13 A32 A43 1409 A62 A71 2 A92 A101 4 A121 64 A143 A152 1 A173 1 A191 A201 1 989 | A11 24 A32 A41 6579 A61 A71 4 A93 A101 2 A124 29 A143 A153 1 A174 1 A192 A201 1 990 | A12 24 A34 A43 1743 A61 A75 4 A93 A101 2 A122 48 A143 A152 2 A172 1 A191 A201 1 991 | A14 12 A34 A46 3565 A65 A72 2 A93 A101 1 A122 37 A143 A152 2 A172 2 A191 A201 1 992 | A14 15 A31 A43 1569 A62 A75 4 A93 A101 4 A123 34 A141 A152 1 A172 2 A191 A201 1 993 | A11 18 A32 A43 1936 A65 A74 2 A94 A101 4 A123 23 A143 A151 2 A172 1 A191 A201 1 994 | A11 36 A32 A42 3959 A61 A71 4 A93 A101 3 A122 30 A143 A152 1 A174 1 A192 A201 1 995 | A14 12 A32 A40 2390 A65 A75 4 A93 A101 3 A123 50 A143 A152 1 A173 1 A192 A201 1 996 | A14 12 A32 A42 1736 A61 A74 3 A92 A101 4 A121 31 A143 A152 1 A172 1 A191 A201 1 997 | A11 30 A32 A41 3857 A61 A73 4 A91 A101 4 A122 40 A143 A152 1 A174 1 A192 A201 1 998 | A14 12 A32 A43 804 A61 A75 4 A93 A101 4 A123 38 A143 A152 1 A173 1 A191 A201 1 999 | A11 45 A32 A43 1845 A61 A73 4 A93 A101 4 A124 23 A143 A153 1 A173 1 A192 A201 2 1000 | A12 45 A34 A41 4576 A62 A71 3 A93 A101 4 A123 27 A143 A152 1 A173 1 A191 A201 1 1001 | -------------------------------------------------------------------------------- /riskModel/data/germancredit.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import pandas as pd 4 | import pkg_resources 5 | import numpy as np 6 | 7 | class Germancredit(object): 8 | # 所有变量 9 | def __init__(self): 10 | self.all_feature = ['status_of_existing_checking_account', 'duration_in_month', 'credit_history', 'purpose', 'credit_amount', 11 | 'savings_account_and_bonds', 12 | 'present_employment_since', 'installment_rate_in_percentage_of_disposable_income', 13 | 'personal_status_and_sex', 'other_debtors_or_guarantors', 14 | 'present_residence_since', 'property', 'age_in_years', 'other_installment_plans', 'housing', 15 | 'number_of_existing_credits_at_this_bank', 'job', 16 | 'number_of_people_being_liable_to_provide_maintenance_for', 'telephone', 'foreign_worker'] 17 | # 类别变量 18 | self.cat_col = ['purpose', 'personal_status_and_sex', 'other_debtors_or_guarantors', 'property', 'other_installment_plans', 19 | 'housing', 'telephone', 'foreign_worker'] 20 | # 数值变量 21 | self.num_col = [i for i in self.all_feature if i not in self.cat_col] 22 | # 整型变量 23 | self.int_col = self.cat_col + ['status_of_existing_checking_account', 'credit_history', 'savings_account_and_bonds', 'job'] 24 | # 需要处理的数值变量 25 | self.sub_col = ['status_of_existing_checking_account', 'credit_history', 'savings_account_and_bonds', 26 | 'present_employment_since', 'job'] 27 | # 需要替换的变量 28 | self.rep_dict = { 29 | 'status_of_existing_checking_account': {4: 0}, 30 | 'savings_account_and_bonds': {5: np.nan}, 31 | 'purpose': {'A124': np.nan} 32 | } 33 | 34 | def get_data(self): 35 | DATA_FILE = pkg_resources.resource_filename('riskModel', 'data/germancredit.csv') 36 | data = pd.read_csv(DATA_FILE,encoding='utf-8', sep=' ', header=None,names= self.all_feature + ['target']) 37 | return data 38 | 39 | def get_describe(self): 40 | DATA_FILE = pkg_resources.resource_filename('riskModel', 'data/german.txt') 41 | with open(DATA_FILE,'r+') as f: 42 | print(f.read()) 43 | -------------------------------------------------------------------------------- /riskModel/utils/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/utils/.DS_Store -------------------------------------------------------------------------------- /riskModel/utils/PltFunction.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | 画图函数 4 | """ 5 | 6 | import numpy as np 7 | import matplotlib.pyplot as plt 8 | plt.rcParams['backend'] = 'Agg' 9 | import seaborn as sns 10 | from sklearn.metrics import roc_curve,confusion_matrix,auc 11 | import itertools 12 | from .tools import best_prob 13 | 14 | class PlotFeatureEn(object): 15 | """特征工程作图函数""" 16 | 17 | def draw_IV(self,IV_dict, path, xlabel=None, figsize=(15, 7), is_save=False): 18 | """ 19 | 信息值IV柱状图 20 | --------------------- 21 | param 22 | IV_dict: dict IV值字典 23 | path: str 文件存储地址 24 | xlabel: list x轴标签 25 | figsize: tupe 图片大小 26 | _____________________ 27 | return 28 | draw_iv 29 | """ 30 | IV_dict_sorted = sorted(IV_dict.items(), key=lambda x: x[1], reverse=True) 31 | ivlist = [i[1] for i in IV_dict_sorted] 32 | index = [i[0] for i in IV_dict_sorted] 33 | fig1 = plt.figure(figsize=figsize) 34 | ax1 = fig1.add_subplot(1, 1, 1) 35 | x = np.arange(len(index)) + 1 36 | ax1.bar(x, ivlist, width=0.5) # 生成柱状图 37 | ax1.set_xticks(x) 38 | if xlabel: 39 | ax1.set_xticklabels(index, rotation=0, fontsize=8) 40 | 41 | ax1.set_ylabel('IV(Information Value)', fontsize=14) 42 | # 在柱状图上添加数字标签 43 | for a, b in zip(x, ivlist): 44 | plt.text(a, b + 0.01, '%.4f' % b, ha='center', va='bottom', fontsize=10) 45 | 46 | if is_save: 47 | plt.savefig(path + "high_iv.png") 48 | plt.show() 49 | plt.close() 50 | 51 | def draw_importance(self,importance, features, figsize, path): 52 | """特征重要度""" 53 | plt.style.use('fivethirtyeight') 54 | plt.rcParams['figure.figsize'] = figsize 55 | sns.set_style("darkgrid", {"font.sans-serif": ["simhei", "Arial"]}) 56 | indices = np.argsort(importance)[::-1] 57 | plt.figure(figsize=figsize) 58 | plt.title("feature importance") 59 | plt.bar(range(len(indices)), importance[indices], color='lightblue', align="center") 60 | plt.step(range(len(indices)), np.cumsum(importance[indices]), where='mid', label='Cumulative') 61 | plt.xticks(range(len(indices)), features[indices], rotation='vertical', fontsize=14) 62 | plt.xlim([-1, len(indices)]) 63 | plt.savefig(path + "feature_importance.png") 64 | plt.show() 65 | plt.close() 66 | 67 | def draw_corr(self,df, figsize: tuple, path: str): 68 | """ 69 | 特征相关系数 70 | ------------------------ 71 | parameter: 72 | data_new: dataFrame,columns must be number 73 | figsize: tupe,two number 74 | return: 75 | heatmap 76 | """ 77 | # 相关系数分析 78 | colormap = plt.cm.viridis 79 | plt.figure(figsize=figsize) 80 | plt.title('皮尔森相关性系数', y=1.05, size=8) 81 | mask = np.zeros_like(df.corr(), dtype=np.bool) 82 | mask[np.triu_indices_from(mask)] = True 83 | sns.heatmap(df.corr(), linewidths=0.1, vmax=1.0, square=True, cmap=colormap, linecolor='white', annot=True, 84 | mask=mask) 85 | plt.savefig(path + "feature_corr.png") 86 | plt.show() 87 | plt.close() 88 | 89 | class PlotModel(object): 90 | """模型作图""" 91 | def __init__(self,y_true,y_prob): 92 | """ 93 | :param y_true:array, 真实y 94 | :param y_prob: array, 预测概率y 95 | """ 96 | self.y_true = y_true 97 | self.y_prob = y_prob 98 | 99 | def plot_roc_curve(self,filename='./'): 100 | """ 101 | """ 102 | fpr, tpr, _ = roc_curve(self.y_true, self.y_prob) 103 | c_stats = auc(fpr, tpr) 104 | plt.plot([0, 1], [0, 1], 'r--') 105 | plt.plot(fpr, tpr, label="ROC curve") 106 | auc_value = "AUC = %.3f" % c_stats 107 | plt.text(0.8, 0.2, auc_value, bbox=dict(facecolor='r', alpha=0.5)) 108 | plt.xlabel('False positive rate') # 假正率 109 | plt.ylabel('True positive rate') # 真正率 110 | plt.title('ROC curve') # ROC 曲线 111 | plt.legend(loc='best') 112 | plt.savefig(filename+"roc_curve.png") 113 | plt.show() 114 | plt.close() 115 | return auc_value 116 | 117 | def plot_ks_curve(self,filename='./'): 118 | """ 119 | """ 120 | fpr, tpr, thr = roc_curve(self.y_true, self.y_prob) # 假正率 真正率 概率阈值 121 | thr = np.array(sorted(thr)) 122 | ks = abs(fpr - tpr) # ks 序列 123 | ks_value = "KS = %.3f" % max(ks) # ks值 124 | cut_prob = best_prob(self.y_true, self.y_prob) # 最佳切分概率 125 | plt.plot(thr, fpr, label='cum_good', color='blue', linestyle='-', linewidth=2) # 假正率 累计好 126 | plt.plot(thr, tpr, label='cum_bad', color='red', linestyle='-', linewidth=2) # 真正率,累计坏 127 | plt.plot(thr, ks, label='ks', color='green', linestyle='-', linewidth=2) # ks曲线 128 | plt.plot(thr, [max(ks)] * len(thr), color='green', linestyle='--') # ks值直线 129 | plt.axvline(cut_prob, color='gray', linestyle='--') # 最佳切分概率直线 130 | plt.title('{}'.format(ks_value), fontsize=15) 131 | plt.xlim((0.0, 1)) 132 | plt.savefig(filename+"ks_curve.png") # 保存 133 | plt.show() 134 | plt.close() 135 | return ks_value 136 | 137 | def plot_confusion_matrix(self,labels:list,normalize=False,filename='./'): 138 | """ 139 | 混淆矩阵 140 | ------------------------------------------ 141 | Params 142 | labels: list, labels class 143 | normalize: bool, True means trans results to percent 144 | """ 145 | cut_prob = best_prob(self.y_true, self.y_prob) # 最佳切分概率 146 | y_pred = np.array([1 if i >= cut_prob else 0 for i in self.y_prob]) 147 | matrix = confusion_matrix(y_true=self.y_true, y_pred=y_pred, labels=labels) 148 | plt.imshow(matrix, interpolation='nearest', cmap=plt.cm.Blues_r) # 在指定的轴上展示图像 149 | plt.colorbar() # 增加色柱 150 | tick_marks = np.arange(len(labels)) 151 | plt.xticks(tick_marks, labels, rotation=45) # 设置坐标轴标签 152 | plt.yticks(tick_marks, labels) 153 | 154 | if normalize: 155 | matrix = matrix.astype('float') / matrix.sum(axis=1)[:, np.newaxis] 156 | thresh = matrix.max() / 2. 157 | for i, j in itertools.product(range(matrix.shape[0]), range(matrix.shape[1])): 158 | plt.text(j, i, matrix[i, j], fontsize=12, 159 | horizontalalignment="center", 160 | color="white" if matrix[i, j] > thresh else "black") 161 | 162 | plt.tight_layout() 163 | plt.ylabel('True') 164 | plt.xlabel('Predicted') 165 | plt.title("confusion matrix") 166 | plt.savefig(filename+"matrix.png") 167 | plt.show() 168 | plt.close() -------------------------------------------------------------------------------- /riskModel/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/utils/__init__.py -------------------------------------------------------------------------------- /riskModel/utils/__pycache__/PltFunction.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/utils/__pycache__/PltFunction.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/utils/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/utils/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/utils/__pycache__/tools.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/utils/__pycache__/tools.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/utils/btl/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/utils/btl/.DS_Store -------------------------------------------------------------------------------- /riskModel/utils/btl/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/utils/btl/__init__.py -------------------------------------------------------------------------------- /riskModel/utils/btl/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/utils/btl/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/utils/btl/__pycache__/merge.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/utils/btl/__pycache__/merge.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/utils/btl/__pycache__/monotous.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxianyang/risk-model/468b57af341f6f9e887d284cc551b2428f709fe3/riskModel/utils/btl/__pycache__/monotous.cpython-37.pyc -------------------------------------------------------------------------------- /riskModel/utils/btl/merge.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | 单调性检验之合并,分箱 4 | """ 5 | 6 | from .monotous import (_FeatureMonotone,_BinBadRate,_BadRateMonotone,_AssignBin) 7 | import numpy as np 8 | 9 | def monotone_merge(df, target, col): 10 | ''' 11 | 合并方案 12 | :return:将数据集df中,不满足坏样本率单调性的变量col进行合并,使得合并后的新的变量中,坏样本率单调,输出合并方案。 13 | 例如,col=[Bin0, Bin1, Bin2, Bin3, Bin4]是不满足坏样本率单调性的。合并后的col是: 14 | [Bin0&Bin1, Bin2, Bin3, Bin4]. 15 | 合并只能在相邻的箱中进行。 16 | 迭代地寻找最优合并方案。每一步迭代时,都尝试将所有非单调的箱进行合并,每一次尝试的合并都是跟前后箱进行合并再做比较 17 | ''' 18 | def _merge_matrix(m, i,j,k): 19 | ''' 20 | :param m: 需要合并行的矩阵 21 | :param i,j: 合并第i和j行 22 | :param k: 删除第k行 23 | :return: 合并后的矩阵 24 | ''' 25 | m[i, :] = m[i, :] + m[j, :] 26 | m = np.delete(m, k, axis=0) 27 | return m 28 | 29 | def _merge_adjacent_rows(i, bad_by_bin_current, bins_list_current, not_monotone_count_current): 30 | ''' 31 | :param i: 需要将第i行与前、后的行分别进行合并,比较哪种合并方案最佳。判断准则是,合并后非单调性程度减轻,且更加均匀 32 | :param bad_by_bin_current:合并前的分箱矩阵,包括每一箱的样本个数、坏样本个数和坏样本率 33 | :param bins_list_current: 合并前的分箱方案 34 | :param not_monotone_count_current:合并前的非单调性元素个数 35 | :return:分箱后的分箱矩阵、分箱方案、非单调性元素个数和衡量均匀性的指标balance 36 | ''' 37 | i_prev = i - 1 38 | i_next = i + 1 39 | bins_list = bins_list_current.copy() 40 | bad_by_bin = bad_by_bin_current.copy() 41 | #合并方案a:将第i箱与前一箱进行合并 42 | bad_by_bin2a = _merge_matrix(bad_by_bin.copy(), i_prev, i, i) 43 | bad_by_bin2a[i_prev, -1] = bad_by_bin2a[i_prev, -2] / bad_by_bin2a[i_prev, -3] 44 | not_monotone_count2a = _FeatureMonotone(bad_by_bin2a[:, -1])['count_of_nonmonotone'] 45 | # 合并方案b:将第i行与后一行进行合并 46 | bad_by_bin2b = _merge_matrix(bad_by_bin.copy(), i, i_next, i_next) 47 | bad_by_bin2b[i, -1] = bad_by_bin2b[i, -2] / bad_by_bin2b[i, -3] 48 | not_monotone_count2b = _FeatureMonotone(bad_by_bin2b[:, -1])['count_of_nonmonotone'] 49 | # balance = ((bad_by_bin[:, 1] / N).T * (bad_by_bin[:, 1] / N))[0, 0] 50 | balance_a = ((bad_by_bin2a[:, 1] / N).T * (bad_by_bin2a[:, 1] / N))[0, 0] 51 | balance_b = ((bad_by_bin2b[:, 1] / N).T * (bad_by_bin2b[:, 1] / N))[0, 0] 52 | # 满足下述2种情况时返回方案a:(1)方案a能减轻非单调性而方案b不能;(2)方案a和b都能减轻非单调性,但是方案a的样本均匀性优于方案b 53 | if not_monotone_count2a < not_monotone_count_current and not_monotone_count2b >= not_monotone_count_current or \ 54 | not_monotone_count2a < not_monotone_count_current and not_monotone_count2b < not_monotone_count_current and balance_a < balance_b: 55 | bins_list[i_prev] = bins_list[i_prev] + bins_list[i] 56 | bins_list.remove(bins_list[i]) 57 | bad_by_bin = bad_by_bin2a 58 | not_monotone_count = not_monotone_count2a 59 | balance = balance_a 60 | # 同样地,满足下述2种情况时返回方案b:(1)方案b能减轻非单调性而方案a不能;(2)方案a和b都能减轻非单调性,但是方案b的样本均匀性优于方案a 61 | elif not_monotone_count2a >= not_monotone_count_current and not_monotone_count2b < not_monotone_count_current or \ 62 | not_monotone_count2a < not_monotone_count_current and not_monotone_count2b < not_monotone_count_current and balance_a > balance_b: 63 | bins_list[i] = bins_list[i] + bins_list[i_next] 64 | bins_list.remove(bins_list[i_next]) 65 | bad_by_bin = bad_by_bin2b 66 | not_monotone_count = not_monotone_count2b 67 | balance = balance_b 68 | # 如果方案a和b都不能减轻非单调性,返回均匀性更优的合并方案 69 | else: 70 | if balance_a< balance_b: 71 | bins_list[i] = bins_list[i] + bins_list[i_next] 72 | bins_list.remove(bins_list[i_next]) 73 | bad_by_bin = bad_by_bin2b 74 | not_monotone_count = not_monotone_count2b 75 | balance = balance_b 76 | else: 77 | bins_list[i] = bins_list[i] + bins_list[i_next] 78 | bins_list.remove(bins_list[i_next]) 79 | bad_by_bin = bad_by_bin2b 80 | not_monotone_count = not_monotone_count2b 81 | balance = balance_b 82 | return {'bins_list': bins_list, 'bad_by_bin': bad_by_bin, 'not_monotone_count': not_monotone_count, 83 | 'balance': balance} 84 | 85 | 86 | N = df.shape[0] 87 | [badrate_bin, bad_by_bin] = _BinBadRate(df, col, target) 88 | bins = list(bad_by_bin[col]) 89 | bins_list = [[i] for i in bins] 90 | badRate = sorted(badrate_bin.items(), key=lambda x: x[0]) 91 | badRate = [i[1] for i in badRate] 92 | not_monotone_count, not_monotone_position = _FeatureMonotone(badRate)['count_of_nonmonotone'], _FeatureMonotone(badRate)['index_of_nonmonotone'] 93 | # 迭代地寻找最优合并方案,终止条件是:当前的坏样本率已经单调,或者当前只有2箱 94 | while (not_monotone_count > 0 and len(bins_list)>2): 95 | # 当非单调的箱的个数超过1个时,每一次迭代中都尝试每一个箱的最优合并方案 96 | all_possible_merging = [] 97 | for i in not_monotone_position: 98 | merge_adjacent_rows = _merge_adjacent_rows(i, np.mat(bad_by_bin), bins_list, not_monotone_count) 99 | all_possible_merging.append(merge_adjacent_rows) 100 | balance_list = [i['balance'] for i in all_possible_merging] 101 | not_monotone_count_new = [i['not_monotone_count'] for i in all_possible_merging] 102 | # 如果所有的合并方案都不能减轻当前的非单调性,就选择更加均匀的合并方案 103 | if min(not_monotone_count_new) >= not_monotone_count: 104 | best_merging_position = balance_list.index(min(balance_list)) 105 | # 如果有多个合并方案都能减轻当前的非单调性,也选择更加均匀的合并方案 106 | else: 107 | better_merging_index = [i for i in range(len(not_monotone_count_new)) if not_monotone_count_new[i] < not_monotone_count] 108 | better_balance = [balance_list[i] for i in better_merging_index] 109 | best_balance_index = better_balance.index(min(better_balance)) 110 | best_merging_position = better_merging_index[best_balance_index] 111 | bins_list = all_possible_merging[best_merging_position]['bins_list'] 112 | bad_by_bin = all_possible_merging[best_merging_position]['bad_by_bin'] 113 | not_monotone_count = all_possible_merging[best_merging_position]['not_monotone_count'] 114 | not_monotone_position = _FeatureMonotone(bad_by_bin[:, 3])['index_of_nonmonotone'] 115 | return bins_list 116 | 117 | 118 | def monotonous_bin(df,col,cutOffPoints,target,special_values): 119 | 120 | #单调性检验 121 | var_cutoff = {} 122 | col1 = col + '_Bin' # 检验单调性 123 | df[col1] = df[col].map(lambda x: _AssignBin(x, cutOffPoints=cutOffPoints,special_attribute=special_values)) 124 | BRM = _BadRateMonotone(df, col1, target, special_attribute=special_values) # 是否单调 125 | if not BRM: 126 | # 合并方案 127 | if special_values == []: 128 | bin_merged = monotone_merge(df, target, col1) 129 | removed_index = [] 130 | for bin in bin_merged: 131 | if len(bin) > 1: 132 | indices = [int(b.replace('Bin', '')) for b in bin] 133 | removed_index = removed_index + indices[0:-1] 134 | removed_point = [cutOffPoints[k] for k in range(len(cutOffPoints)) if k in removed_index] 135 | # removed_point = [cutOffPoints[k] for k in removed_index] 136 | for p in removed_point: 137 | cutOffPoints.remove(p) 138 | var_cutoff[col] = cutOffPoints 139 | else: 140 | cutOffPoints2 = [i for i in cutOffPoints if i not in special_values] 141 | temp = df.loc[~df[col].isin(special_values)] 142 | bin_merged = monotone_merge(temp, target, col1) 143 | removed_index = [] 144 | for bin in bin_merged: 145 | if len(bin) > 1: 146 | indices = [int(b.replace('Bin', '')) for b in bin] 147 | removed_index = removed_index + indices[0:-1] 148 | # print("removed_index:",removed_index) # 调试 149 | # print("cutOffPoints2:",cutOffPoints2) # 调试 150 | removed_point = [cutOffPoints2[k] for k in range(len(cutOffPoints2)) if k in removed_index] 151 | # removed_point = [cutOffPoints2[k] for k in removed_index] 152 | for p in removed_point: 153 | cutOffPoints2.remove(p) 154 | # cutOffPoints2 = cutOffPoints2 + special_values 155 | var_cutoff[col] = cutOffPoints2 # 单调性检验结果 156 | return var_cutoff 157 | -------------------------------------------------------------------------------- /riskModel/utils/btl/monotous.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | 单调性检验工具 4 | """ 5 | 6 | import pandas as pd 7 | 8 | 9 | def _AssignBin(x, cutOffPoints, special_attribute=None): 10 | 11 | ''' 12 | 分箱转换 13 | :param x: 某个变量的某个取值 14 | :param cutOffPoints: list 上述变量的分箱结果,用切分点表示 15 | :param special_attribute:list 不参与分箱的特殊取值 16 | :return: 分箱后的对应的第几个箱,从0开始 17 | 例如, cutOffPoints = [10,20,30], 对于 x = 7, 返回 Bin0;对于x=23,返回Bin2; 对于x = 35, return Bin3。 18 | 对于特殊值,返回的序列数前加"-" 19 | ''' 20 | cutOffPoints2 = [i for i in cutOffPoints if i not in special_attribute] 21 | numBin = len(cutOffPoints2) 22 | if x in special_attribute: 23 | i = special_attribute.index(x)+1 24 | return 'Bin{}'.format(0-i) 25 | if x<=cutOffPoints2[0]: 26 | return 'Bin0' 27 | elif x > cutOffPoints2[-1]: 28 | return 'Bin{}'.format(numBin) 29 | else: 30 | for i in range(0,numBin): 31 | if cutOffPoints2[i] < x <= cutOffPoints2[i+1]: 32 | return 'Bin{}'.format(i+1) 33 | 34 | 35 | def _FeatureMonotone(x): 36 | ''' 37 | 检验BadRate单调性 38 | Param x: list cut off list 39 | :return: 返回序列x中有几个元素不满足单调性,以及这些元素的位置。 40 | 例如,x=[1,3,2,5], 元素3比前后两个元素都大,不满足单调性;元素2比前后两个元素都小,也不满足单调性。 41 | 故返回的不满足单调性的元素个数为2,位置为1和2. 42 | ''' 43 | monotone = [x[i]x[i+1] and x[i] > x[i-1] for i in range(1,len(x)-1)] 44 | index_of_nonmonotone = [i+1 for i in range(len(monotone)) if monotone[i]] 45 | return {'count_of_nonmonotone':monotone.count(True), 'index_of_nonmonotone':index_of_nonmonotone} 46 | 47 | 48 | def _BinBadRate(df, col, target, grantRateIndicator=0): 49 | ''' 50 | 标签类别计数统计 51 | :param df: 需要计算好坏比率的数据集 52 | :param col: 需要计算好坏比率的特征 53 | :param target: 好坏标签 54 | :param grantRateIndicator: 1返回总体的坏样本率,0不返回 55 | :return: 每箱的坏样本率,以及总体的坏样本率(当grantRateIndicator==1时) 56 | ''' 57 | total = df.groupby([col])[target].count() 58 | total = pd.DataFrame({'total': total}) 59 | bad = df.groupby([col])[target].sum() 60 | bad = pd.DataFrame({'bad': bad}) 61 | regroup = total.merge(bad, left_index=True, right_index=True, how='left') 62 | regroup.reset_index(drop=False, inplace=True) 63 | regroup['bad_rate'] = regroup.apply(lambda x: x.bad / x.total, axis=1) 64 | dicts = dict(zip(regroup[col],regroup['bad_rate'])) 65 | if grantRateIndicator==0: 66 | return (dicts, regroup) 67 | N = sum(regroup['total']) 68 | B = sum(regroup['bad']) 69 | overallRate = B * 1.0 / N 70 | return (dicts, regroup, overallRate) 71 | 72 | def _BadRateMonotone(df, sortByVar, target,special_attribute = []): 73 | ''' 74 | 返回是否单调结果 75 | :param df: 包含检验坏样本率的变量,和目标变量 76 | :param sortByVar: 需要检验坏样本率的变量 77 | :param target: 目标变量,0、1表示好、坏 78 | :param special_attribute: 不参与检验的特殊值 79 | :return: 坏样本率单调与否 80 | ''' 81 | df2 = df.loc[~df[sortByVar].isin(special_attribute)] 82 | if len(set(df2[sortByVar])) <= 2: 83 | return True 84 | regroup = _BinBadRate(df2, sortByVar, target)[1] 85 | combined = zip(regroup['total'],regroup['bad']) 86 | badRate = [x[1]*1.0/x[0] for x in combined] 87 | badRateNotMonotone = _FeatureMonotone(badRate)['count_of_nonmonotone'] 88 | if badRateNotMonotone > 0: 89 | return False 90 | else: 91 | return True -------------------------------------------------------------------------------- /riskModel/utils/tools.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | 小工具类 4 | """ 5 | import math 6 | import pandas as pd 7 | import numpy as np 8 | from sklearn.metrics import roc_curve,auc,f1_score,recall_score,precision_score,accuracy_score 9 | 10 | def Prob2Score(prob,basePoint=600,PDO=50,odds=20): 11 | # 将概率转化成分数且为正整数 12 | y = np.log(prob/(1-prob)) 13 | a = basePoint - y * np.log(odds) 14 | y2 = a - PDO/np.log(2)*(y) 15 | score = y2.astype('int') 16 | return score 17 | 18 | def str2num(s): 19 | """ 20 | 字符转换为数字 21 | """ 22 | try: 23 | if '.' in str(s): 24 | return float(s) 25 | else: 26 | return int(s) 27 | except: 28 | return s 29 | 30 | def feature_subgroup(df, index,columns): 31 | 32 | """ 33 | 特征分组 34 | :param index:list 35 | :param columns:list 36 | :return: df 37 | """ 38 | g = df.groupby(index).agg({col: 'nunique' for col in columns}) 39 | if g[g > 1].dropna().shape[0] != 0: 40 | print("index非唯一值.") 41 | return df.groupby(index).agg({col: 'max' for col in columns}) 42 | 43 | def groupby_key(df,user_id,content,label): 44 | """ 45 | 根据user_id 合并content 和label列 46 | :param data: dataframe 47 | :param user_id: 48 | :param content: 文本列 49 | :param label:目标文件 50 | :return: dataframe 51 | """ 52 | df[content] = df[content].astype("str") 53 | content_Series = df.groupby(by=user_id)[content].sum() 54 | content_df = pd.DataFrame({"user_id":content_Series.index,"content":content_Series.values}) 55 | label_df = df[[user_id,label]].drop_duplicates() 56 | df= pd.merge(content_df,label_df,on=user_id,how="inner") 57 | return df 58 | 59 | 60 | def best_prob(y_true,y_prob): 61 | """ 62 | cut best prob 63 | :param y_prob: y of prediction 64 | :param y_true: real y 65 | :return: ks_value and draw ks 66 | """ 67 | fpr, tpr, thr = roc_curve(y_true, y_prob) 68 | max_ks = 0 69 | cut_prob = 0.5 70 | for i in range(len(thr)): 71 | if abs(fpr[i] - tpr[i]) > max_ks: 72 | max_ks = abs(fpr[i] - tpr[i]) 73 | cut_prob = thr[i] 74 | return cut_prob 75 | 76 | def model_norm(y_true,y_prob): 77 | """ 78 | 计算模型指标,auc,ks,f1,recall,precision,accuracy,cut_prob 79 | :param y_true:like-array 80 | :param y_prob:like-array 81 | :return:norm dict 82 | """ 83 | norm = dict() 84 | fpr, tpr, thr = roc_curve(y_true, y_prob) 85 | KS = 0 86 | cut_prob = 0.5 87 | for i in range(len(thr)): 88 | if abs(fpr[i] - tpr[i]) > KS: 89 | KS = abs(fpr[i] - tpr[i]) 90 | cut_prob = thr[i] 91 | norm["AUC"] = auc(fpr, tpr) 92 | norm["KS"] = KS 93 | norm["cut_prob"] = cut_prob 94 | y_pred = np.array([1 if i > cut_prob else 0 for i in y_prob]) 95 | norm["recall"] = recall_score(y_true=y_true,y_pred=y_pred,pos_label=1,average='binary') 96 | norm["precision"] = precision_score(y_true=y_true,y_pred=y_pred,pos_label=1,average='binary') 97 | norm["accuracy"] = accuracy_score(y_true=y_true,y_pred=y_pred) 98 | norm["f1"] = f1_score(y_true=y_true,y_pred=y_pred,pos_label=1,average='binary') 99 | return norm 100 | 101 | def calculate_AIC(X,y_true,y_prob): 102 | """ 103 | 赤池信息准则AIC计算 104 | :param X: like-array 105 | :param y_true:like-array 106 | :param y_prob:like-array 107 | :return: float AIC 108 | """ 109 | aic = 2 * X.shape[1] + X.shape[0] * math.log(pow(y_true - y_prob,2).sum() / X.shape[1]) 110 | return aic 111 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ############################################# 4 | # Author: huangsir 5 | # Mail: hxysir@163.com 6 | # Created Time: 2019-10-22 18:00 7 | ############################################# 8 | 9 | from setuptools import setup,find_packages 10 | 11 | setup( 12 | name = "riskModel", 13 | version = "1.0.6", 14 | author="huangsir", 15 | author_email="hxysir@163.com", 16 | url = "https://github.com/huangxianyang/risk-model", 17 | license = "MIT License", 18 | description = "build credit score model", 19 | long_description = "build rsik score model, including eda, preprocessing, featureengineering, trainmodel, riskstragety eg.", 20 | platforms = "any", 21 | keywords = ["pip", "EDA","Preprocessing", "FeatureEngineering", "Modeling","RiskStragety"], 22 | 23 | packages = find_packages(),# 所有包含__init__.py文件的目录 24 | package_data={'riskModel':['data/*.csv','data/*.txt']}, 25 | # include_package_data = True, 26 | install_requires = ['pandas-profiling>=2.4.0','numpy>=1.18.1', 27 | 'matplotlib>=3.1.3','pandas>=1.0.3','scikit-learn>=0.23.1','imbalanced-learn==0.5.0', 28 | 'statsmodels>=0.11.1','scorecardpy>=0.1.9.2','seaborn>=0.10.1','scipy>=1.4.1','toad>=0.0.60' 29 | ] 30 | ) --------------------------------------------------------------------------------