def import_rules_identity_sim_card_ownerships_i3(ds: DataService): # define Identities(I)' rules of sim_care_ownership master: level 2 rule = create_new_rule(2, 'I', 'I3', 'مالکیت خط تلفن همراه', 2) ds.insert_rule(rule) # define Identities(I)' rules of sim_care_ownership details: level 3 # SimCardOwnership = Yes 20 I0301P20 2% تطابق هویت واقعی کاربر با مشخصات مالک خط تلفن همراه در سامانه شاهکار rule = create_new_rule( 3, 'I3', 'I0301P20', 'تطابق هویت واقعی کاربر با مشخصات مالک خط تلفن همراه در سامانه شاهکار', 2, 20, 1) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # SimCardOwnership = No 00 I0302P0 0% عدم تطابق هویت واقعی کاربر با مشخصات مالک خط تلفن همراه rule = create_new_rule( 3, 'I3', 'I0302P0', 'عدم تطابق هویت واقعی کاربر با مشخصات مالک خط تلفن همراه', 0, 0, 0) ds.insert_rule(rule) rule_codes.append(rule.code) print('Identities(I) sim_card_ownerships_i3 rules are created.') ds.delete_score_reasons( {RULE_MASTER_CODE: I3_RULES_PROFILE_SIM_CARD_OWNERSHIPS}) change_reason = create_new_score_reason( I3_RULES_PROFILE_SIM_CARD_OWNERSHIPS, rule_codes, 'تایید مالکیت خط تلفن همراه', 'عدم تایید مالکیت خط تلفن همراه') ds.insert_score_reason(change_reason) print('Identities(I) sim_card_ownerships_i3 change reasons are created.')
def import_rules_identity_address_verifications_i4(ds: DataService): # define Identities(I)' rules of address_verifications master: level 2 rule = create_new_rule(2, 'I', 'I4', 'احراز اصالت محل سکونت', 2) ds.insert_rule(rule) # define Identities(I)' rules of address_verifications details: level 3 # AddressVerification = Yes 20 I0401P20 2% احراز اصالت نشانی محل سکونت کاربر از طریق وارد کردن رمز پستی rule = create_new_rule( 3, 'I4', 'I0401P20', 'احراز اصالت نشانی محل سکونت کاربر از طریق وارد کردن رمز پستی', 2, 20, 1) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # AddressVerification = No 00 I0402P0 0% عدم احراز اصالت نشانی محل سکونت کاربر rule = create_new_rule( 3, 'I4', 'I0402P0', 'تطابق هویت واقعی کاربر با مشخصات مالک خط تلفن همراه در سامانه شاهکار', 0, 0, 0) ds.insert_rule(rule) rule_codes.append(rule.code) print('Identities(I) address_verifications_i4 rules are created.') ds.delete_score_reasons( {RULE_MASTER_CODE: I4_RULES_PROFILE_ADDRESS_VERIFICATIONS}) change_reason = create_new_score_reason( I4_RULES_PROFILE_ADDRESS_VERIFICATIONS, rule_codes, 'تایید نشانی محل سکونت', 'عدم تایید نشانی محل سکونت') ds.insert_score_reason(change_reason) print('Identities(I) address_verifications_i4 change reasons are created.')
def import_score_gauges(ds: DataService): # ds.db.get_collection('scoreGauges').remove() ds.db.scoreGauges.delete_many({}) sg = ScoreGauge() sg.start = 0 sg.end = 499 sg.title = 'خیلی ضعیف' sg.color = 'fe3030' sg.risk_status = 'بسیار بالا' ds.insert_score_gauge(sg) sg = ScoreGauge() sg.start = 500 sg.end = 589 sg.title = 'ضعیف' sg.color = 'ff6800' sg.risk_status = 'بالا' ds.insert_score_gauge(sg) sg = ScoreGauge() sg.start = 590 sg.end = 669 sg.title = 'متوسط' sg.color = 'ffbb5e' sg.risk_status = 'متوسط' ds.insert_score_gauge(sg) sg = ScoreGauge() sg.start = 670 sg.end = 749 sg.title = 'خوب' sg.color = 'a6d94c' sg.risk_status = 'پایین' ds.insert_score_gauge(sg) sg = ScoreGauge() sg.start = 750 sg.end = 1000 sg.title = 'عالی' sg.color = '00d184' sg.risk_status = 'بسیار پایین' ds.insert_score_gauge(sg)
def import_rule_history_master(ds: DataService): # Delete all histories(H) rules l2_rules: {Rule} = ds.get_rules({PARENT: HISTORIES}) for r in l2_rules: # delete all l3_rules ds.delete_rules({PARENT: r[CODE]}) # delete all l2_rules ds.delete_rules({PARENT: HISTORIES}) # delete the l1_rule ds.delete_rules({CODE: HISTORIES}) print('Histories(H) rules are deleted.') # define Identities(I)' rules master: level 1 rule = create_new_rule(1, None, 'H', 'سوابق تعاملات', 30, 270) ds.insert_rule(rule) print('Histories(H) master rule is created.')
def import_rule_timeliness_master(ds: DataService): # Delete all Timeliness(T) rules l2_rules: {Rule} = ds.get_rules({PARENT: TIMELINESS}) for r in l2_rules: # delete all l3_rules ds.delete_rules({PARENT: r[CODE]}) # delete all l2_rules ds.delete_rules({PARENT: TIMELINESS}) # delete the l1_rule ds.delete_rules({CODE: TIMELINESS}) print('Timeliness(T) rules are deleted.') # define Timeliness(T)' rules master: level 1 # rule.drop_collection() rule = create_new_rule(1, None, 'T', 'انجام به موقع تعهدات', 35, 270) ds.insert_rule(rule) print('Timeliness(T) master rule is created.')
def import_rule_identity_master(ds: DataService): # Delete all identities(I) rules # l2_rules: [Rule] = Rule.objects(Q(parent='I')) l2_rules: {Rule} = ds.get_rules({PARENT: IDENTITIES}) for r in l2_rules: # l3_rules: [Rule] = Rule.objects(Q(parent=r.code)) # l3_rules.delete() ds.delete_rules({PARENT: r[CODE]}) # l2_rules.delete() ds.delete_rules({PARENT: IDENTITIES}) # l1_rule = Rule.objects(Q(code='I')) # l1_rule.delete() ds.delete_rules({CODE: IDENTITIES}) print('Identities(I) rules are deleted.') # define Identities(I)' rules master: level 1 rule = create_new_rule(1, None, 'I', 'اطلاعات هویتی', 10, 100) ds.insert_rule(rule) print('Identities(I) master rule is created.')
def import_rules_identity_has_kycs_i1(ds: DataService): # define Identities(I)' rules of kycs master: level 2 rule = create_new_rule(2, 'I', 'I1', 'احراز هویت', 4) ds.insert_rule(rule) # define Identities(I)' rules of kycs details: level 3 # KYC = Yes 40 I0101P40 %4 احراز هویت نهایی از طریق استعلام ثبت احوال rule = create_new_rule(3, 'I1', 'I0101P40', 'احراز هویت نهایی از طریق استعلام ثبت احوال', 4, 40, 1) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # KYC = No 00 I0102P0 0% عدم احراز هویت rule = create_new_rule(3, 'I1', 'I0102P0', 'عدم احراز هویت', 0, 0, 0) ds.insert_rule(rule) rule_codes.append(rule.code) print('Identities(I) has_kycs_i1 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: I1_RULES_PROFILE_HAS_KYCS}) change_reason = create_new_score_reason( I1_RULES_PROFILE_HAS_KYCS, rule_codes, 'احراز هویت نهایی از طریق استعلام ثبت احوال') ds.insert_score_reason(change_reason) print('Identities(I) has_kycs_i1 change reasons are created.')
def import_rules_history_done_timely_trades_of_last_3_months_h6(ds: DataService): # define History(H)' rules of done_timely_trades_of_last_3_months master: level 2 rule = create_new_rule(2, 'H', 'H6', 'تعداد تعاملات موفق در 3 ماه گذشته', 4.44, 40) ds.insert_rule(rule) # define History(H)' rules of done_timely_trades_of_last_3_months details: level 3 # Last3MSD = 0 00 H0601P0 کاربر در سه ماه گذشته هیچ تعامل موفقی با سایر کاربران نداشته است rule = create_new_rule(3, 'H6', 'H0601P0', 'کاربر در سه ماه گذشته هیچ تعامل موفقی با سایر کاربران نداشته است', 0, 0, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # Last3MSD = 1 10 H0602P10 کاربر در سه ماه گذشته 1 تعامل موفق با سایر کاربران داشته است rule = create_new_rule(3, 'H6', 'H0602P10', 'کاربر در سه ماه گذشته 1 تعامل موفق با سایر کاربران داشته است', 1.11, 10, 1, 1) ds.insert_rule(rule) rule_codes.append(rule.code) # Last3MSD = 2 20 H0603P20 کاربر در سه ماه گذشته ۲ تعامل موفق با سایر کاربران داشته است rule = create_new_rule(3, 'H6', 'H0603P20', 'کاربر در سه ماه گذشته ۲ تعامل موفق با سایر کاربران داشته است', 2.22, 20, 2, 2) ds.insert_rule(rule) rule_codes.append(rule.code) # Last3MSD = 3 30 H0604P30 کاربر در سه ماه گذشته 3 تعامل موفق با سایر کاربران داشته است rule = create_new_rule(3, 'H6', 'H0601P0', 'کاربر در سه ماه گذشته 3 تعامل موفق با سایر کاربران داشته است', 3.33, 30, 3, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # Last3MSD ≥ 4 40 H0605P40 کاربر در سه ماه گذشته بیش از 3 تعامل موفق با سایر کاربران داشته است rule = create_new_rule(3, 'H6', 'H0605P40', 'کاربر در سه ماه گذشته بیش از 3 تعامل موفق با سایر کاربران داشته است', 4.44, 40, 4, 999) ds.insert_rule(rule) print('Histories(H) done_timely_trades_of_last_3_months_h6 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: H6_RULES_DONE_TIMELY_TRADES_OF_LAST_3_MONTHS}) change_reason = create_new_score_reason(H6_RULES_DONE_TIMELY_TRADES_OF_LAST_3_MONTHS, rule_codes, 'افزایش معاملات موفق در سه ماه گذشته', 'کاهش معاملات موفق در سه ماه گذشته') ds.insert_score_reason(change_reason) print('Histories(H) done_timely_trades_of_last_3_months_h6 change reasons are created.')
def import_rules_history_loans_total_count_h11(ds: DataService): # define History(H)' rules of undone_undue_trades_counts master: level 2 rule = create_new_rule(2, 'H', 'H11', 'تعداد کل تسهیلات بانکی در جریان', 2.22, 20) ds.insert_rule(rule) # define History(H)' rules of undone_undue_trades_counts details: level 3 # Loans = 0 00 H1101P0 کاربر هیچگونه تسهیلات در جریان ندارد rule = create_new_rule(3, 'H11', 'H1101P0', 'کاربر هیچگونه تسهیلات در جریان ندارد', 0, 0, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # Loans = 1 20 H1102P20 کاربر ۱ تسهیلات در جریان دارد rule = create_new_rule(3, 'H11', 'H1102P20', 'کاربر ۱ تسهیلات در جریان دارد', 2.22, 20, 1, 1) ds.insert_rule(rule) rule_codes.append(rule.code) ds.delete_score_reasons({RULE_MASTER_CODE: H11_RULES_LOAN_TOTAL_COUNTS}) change_reason = create_new_score_reason(H11_RULES_LOAN_TOTAL_COUNTS, rule_codes, 'افزایش امکان سنجش رفتار اعتباری کاربر از طریق اخذ تسهیلات بانکی', 'کاهش امکان سنجش رفتار اعتباری کاربر به دلیل اتمام تسهیلات بانکی') ds.insert_score_reason(change_reason) print('Histories(H) loans_total_count_h11 part-1 change reasons are created.') # Loans = 2 10 H1103P10 کاربر ۲ تسهیلات در جریان دارد rule = create_new_rule(3, 'H11', 'H1103P10', 'کاربر ۲ تسهیلات در جریان دارد', 1.11, 10, 2, 2) ds.insert_rule(rule) rule_codes.append(rule.code) # Loans = 3 01 H1104P1 کاربر ۳ تسهیلات در جریان دارد rule = create_new_rule(3, 'H11', 'H1104P1', 'کاربر ۳ تسهیلات در جریان دارد', 0.11, 1, 3, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # Loans = 4 -20 H1105N20 کاربر ۴ تسهیلات در جریان دارد rule = create_new_rule(3, 'H11', 'H1105N20', 'کاربر ۴ تسهیلات در جریان دارد', 2.22, -20, 4, 4) ds.insert_rule(rule) rule_codes.append(rule.code) # Loans = 5 -30 H1106N30 کاربر ۵ تسهیلات در جریان دارد rule = create_new_rule(3, 'H11', 'H1106N30', 'کاربر ۵ تسهیلات در جریان دارد', 3.33, -30, 5, 5) ds.insert_rule(rule) rule_codes.append(rule.code) # Loans >= 6 -50 H1107N50 کاربر بیش از ۵ تسهیلات در جریان دارد rule = create_new_rule(3, 'H11', 'H1107N50', 'کاربر بیش از ۵ تسهیلات در جریان دارد', 5.56, -50, 6, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Histories(H) loans_total_count_h11 rules are created.') change_reason = create_new_score_reason(H11_RULES_LOAN_TOTAL_COUNTS, rule_codes, 'کاهش تعداد تسهیلات بانکی در جریان', 'افزایش تعداد تسهیلات بانکی در جریان') ds.insert_score_reason(change_reason) print('Histories(H) loans_total_count_h11 part-2 change reasons are created.')
def import_rules_history_membership_days_counts_h5(ds: DataService): # define History(H)' rules of membership_days master: level 2 rule = create_new_rule(2, 'H', 'H5', 'مدت زمان عضویت فعال', 6.67, 60) ds.insert_rule(rule) # define History(H)' rules of membership_days details: level 3 # Just Registered MembershipDaysWithAtleast1SD == 0 00 H0501P0 عضو جدید rule = create_new_rule(3, 'H5', 'H0501P0', 'عضو جدید', 0, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # 1 <= MembershipDaysWithAtleast1SD ≤ 90 10 H0502P10 عضویت بین 1 تا 90 روز rule = create_new_rule(3, 'H5', 'H0502P10', ' عضویت بین 1 تا 90 روز', 1.11, 10, 1, 90) ds.insert_rule(rule) rule_codes.append(rule.code) # 91 <= MembershipDaysWithAtleast3SD ≤ 180 20 H0503P20 عضویت بین 91 تا 180 روز rule = create_new_rule(3, 'H5', 'H0503P20', 'عضویت بین 91 تا 180 روز', 2.22, 20, 91, 180) ds.insert_rule(rule) rule_codes.append(rule.code) # 181 <= MembershipDaysWithAtleast5SD ≤ 365 30 H0504P30 عضویت بین 181 تا 365 روز rule = create_new_rule(3, 'H5', 'H0504P30', ' عضویت بین 181 تا 365 روز', 3.33, 30, 181, 365) ds.insert_rule(rule) rule_codes.append(rule.code) # 366 <= MembershipDaysWithAtleast10SD ≤ 720 40 H0505P40 عضویت بین 366 تا 720 روز rule = create_new_rule(3, 'H5', 'H0505P40', ' عضویت بین 366 تا 720 روز', 4.44, 40, 366, 720) ds.insert_rule(rule) rule_codes.append(rule.code) # 721 <= MembershipDaysWithAtleast15SD ≤ 1080 50 H0506P50 عضویت بین 721 تا 1080 روز rule = create_new_rule(3, 'H5', 'H0506P50', ' عضویت بین 721 تا 1080 روز', 5.50, 50, 721, 1080) ds.insert_rule(rule) rule_codes.append(rule.code) # MembershipDaysWithAtleast20SD >= 1081 60 H0507P60 عضویت بیش از 1081 روز rule = create_new_rule(3, 'H5', 'H0507P60', ' عضویت بیش از 1081 روز', 6.67, 60, 1081, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Histories(H) membership_days_counts_h5 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: H5_RULES_PROFILE_MEMBERSHIP_DAYS_COUNTS}) change_reason = create_new_score_reason(H5_RULES_PROFILE_MEMBERSHIP_DAYS_COUNTS, rule_codes, 'افزایش مدت عضویت فعال') ds.insert_score_reason(change_reason) print('Histories(H) membership_days_counts_h5 change reasons are created.')
def import_rules_history_undone_undue_trades_counts_h10(ds: DataService): # define History(H)' rules of undone_undue_trades_counts master: level 2 rule = create_new_rule(2, 'H', 'H10', 'تعداد تعاملات جاری سررسید نشده', 1.11, 10) ds.insert_rule(rule) # define History(H)' rules of undone_undue_trades_counts details: level 3 # NumNotDueDeal = 0 00 H1001P0 کاربر تعامل سررسید نشده ندارد rule = create_new_rule(3, 'H10', 'H1001P0', 'کاربر تعامل سررسید نشده ندارد', 0, 0, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # NumNotDueDeal = 1 02 H1002P2 کاربر 1 تعامل سررسید نشده دارد rule = create_new_rule(3, 'H10', 'H1002P2', 'کاربر 1 تعامل سررسید نشده دارد', 0.22, 2, 1, 1) ds.insert_rule(rule) rule_codes.append(rule.code) # NumNotDueDeal = 2 05 H1003P5 کاربر 2 تعامل سررسید نشده دارد rule = create_new_rule(3, 'H10', 'H1003P5', 'کاربر 2 تعامل سررسید نشده دارد', 0.56, 5, 2, 2) ds.insert_rule(rule) rule_codes.append(rule.code) # NumNotDueDeal = 3 7 H1004P7 کاربر 3 تعامل سررسید نشده دارد rule = create_new_rule(3, 'H10', 'H1004P7', 'کاربر 3 تعامل سررسید نشده دارد', 0.78, 7, 3, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # NumNotDueDeal = 4 10 H1005P10 کاربر 4 تعامل سررسید نشده دارد rule = create_new_rule(3, 'H10', 'H1005P10', 'کاربر 4 تعامل سررسید نشده دارد', 1.11, 10, 4, 4) ds.insert_rule(rule) rule_codes.append(rule.code) ds.delete_score_reasons({RULE_MASTER_CODE: H10_RULES_UNDONE_UNDUE_TRADES_COUNTS}) change_reason = create_new_score_reason(H10_RULES_UNDONE_UNDUE_TRADES_COUNTS, rule_codes, 'افزایش امکان سنجش رفتار اعتباری کاربر از طریق افزایش معاملات جاری', 'کاهش امکان سنجش رفتار اعتباری کاربر به دلیل کاهش معاملات جاری') ds.insert_score_reason(change_reason) print('Histories(H) undone_undue_trades_counts_h10 part1 change reasons are created.') # NumNotDueDeal = 5 03 H1006P3 کاربر 5 تعامل سررسید نشده دارد rule = create_new_rule(3, 'H10', 'H1006P3', 'کاربر 5 تعامل سررسید نشده دارد', 0.33, 3, 5, 5) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # NumNotDueDeal = 6 -1 H1007N1 کاربر 6 تعامل سررسید نشده دارد rule = create_new_rule(3, 'H10', 'H1007N1', 'کاربر 6 تعامل سررسید نشده دارد', 0.11, -1, 6, 6) ds.insert_rule(rule) rule_codes.append(rule.code) # 7 <= NumNotDueDeal ≤ 10 -10 H1008N10 کاربر بین 7 تا 10 تعامل سررسید نشده دارد rule = create_new_rule(3, 'H10', 'H1008N10', 'کاربر بین 7 تا 10 تعامل سررسید نشده دارد', 1.11, -10, 7, 10) ds.insert_rule(rule) rule_codes.append(rule.code) # 11 <= NumNotDueDeal ≤ 20 -20 H1009N20 کاربر بین 11 تا 20 تعامل سررسید نشده دارد rule = create_new_rule(3, 'H10', 'H1009N20', 'کاربر بین 11 تا 20 تعامل سررسید نشده دارد', 2.22, -20, 11, 20) ds.insert_rule(rule) rule_codes.append(rule.code) # 21 <= NumNotDueDeal ≤ 30 -30 H1010N30 کاربر بین 21 تا 30 تعامل سررسید نشده دارد rule = create_new_rule(3, 'H10', 'H1010N30', 'کاربر بین 21 تا 30 تعامل سررسید نشده دارد', 3.33, -30, 21, 30) ds.insert_rule(rule) rule_codes.append(rule.code) # NotDueDeal >= 31 -50 H1011N50 کاربر بیش از 30 تعامل سررسید نشده دارد rule = create_new_rule(3, 'H10', 'H1011N50', 'کاربر بیش از 30 تعامل سررسید نشده دارد', 5.56, -50, 31, 999) ds.insert_rule(rule) rule_codes.append(rule.code) print('Histories(H) undone_undue_trades_counts_h10 rules are created.') change_reason = create_new_score_reason(H10_RULES_UNDONE_UNDUE_TRADES_COUNTS, rule_codes, 'کاهش تعداد معاملات جاری', 'افزایش بیش از حد تعداد معاملات جاری') ds.insert_score_reason(change_reason) print('Histories(H) undone_undue_trades_counts_h10 part2 change reasons are created.')
def import_rules_timeliness_unfixed_returned_cheques_count_of_more_12_months_t31(ds: DataService): # define Timeliness(T)' rules of done_arrear_trades_of_last_3_months master: level 2 rule = create_new_rule(2, 'T', 'T31', 'تعداد چکهای برگشتی رفع سو اثر نشده در بیش از ۱۲ ماه گذشته', 2.59, 20) ds.insert_rule(rule) # define Timeliness(T)' rules of done_arrear_trades_of_last_3_months details: level 3 # DishonouredChequesA12M = 0 20 T3101P20 کاربر چک برگشتی ندارد rule = create_new_rule(3, 'T31', 'T3101P20', 'کاربر چک برگشتی ندارد', 2.59, 20, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # DishonouredChequesA12M = 1 -40 T3102N40 کاربر ۱ چک برگشتی دارد rule = create_new_rule(3, 'T31', 'T3102N40', 'کاربر ۱ چک برگشتی دارد', 5.19, -40, 1, 1) ds.insert_rule(rule) rule_codes.append(rule.code) # DishonouredChequesA12M = 2 -50 T3103N50 کاربر ۲ چک برگشتی دارد rule = create_new_rule(3, 'T31', 'T3103N50', 'کاربر ۲ چک برگشتی دارد', 6.48, -50, 2, 2) ds.insert_rule(rule) rule_codes.append(rule.code) # DishonouredChequesA12M = 3 -60 T3104N60 کاربر ۳ چک برگشتی دارد rule = create_new_rule(3, 'T31', 'T3104N60', 'کاربر ۳ چک برگشتی دارد', 7.78, -60, 3, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # DishonouredChequesA12M >= 4 -70 T3105N70 کاربر بیش از ۳ چک برگشتی دارد rule = create_new_rule(3, 'T31', 'T3105N70', 'کاربر بیش از ۳ چک برگشتی دارد', 9.07, -70, 4, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Timeliness(T) unfixed_returned_cheques_count_of_more_12_months_t31 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: T31_RULES_CHEQUE_UNFIXED_RETURNED_COUNT_OF_MORE_12_MONTHS}) change_reason = create_new_score_reason(T31_RULES_CHEQUE_UNFIXED_RETURNED_COUNT_OF_MORE_12_MONTHS, rule_codes, 'کاهش تعداد چکهای برگشتی رفع سو اثر نشده در بیش از یک سال گذشته', 'افزایش تعداد چکهای برگشتی رفع سو اثر نشده در بیش از یک سال گذشته') ds.insert_score_reason(change_reason) print('Timeliness(T) unfixed_returned_cheques_count_of_more_12_months_t31 change reasons are created.')
def import_rules_timeliness_suspicious_loans_total_count_t35(ds: DataService): # define Timeliness(T)' rules of done_arrear_trades_of_last_3_months master: level 2 rule = create_new_rule(2, 'T', 'T35', 'تعداد تسهیلات مشکوک الوصول در جریان', 3.89, 30) ds.insert_rule(rule) # define Timeliness(T)' rules of done_arrear_trades_of_last_3_months details: level 3 # DoubfulCollectionLoans = 0 30 T3501P30 کاربر تسهیلات مشکوک الوصول ندارد rule = create_new_rule(3, 'T35', 'T3501P30', 'کاربر تسهیلات مشکوک الوصول ندارد', 3.89, 30, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # DoubfulCollectionLoans = 1 -20 T3502N20 کاربر 1 تسهیلات مشکوک الوصول دارد rule = create_new_rule(3, 'T35', 'T3502N20', 'کاربر 1 تسهیلات مشکوک الوصول دارد', 2.59, -20, 1, 1) ds.insert_rule(rule) rule_codes.append(rule.code) # DoubfulCollectionLoans = 2 -30 T3503N30 کاربر ۲ تسهیلات مشکوک الوصول دارد rule = create_new_rule(3, 'T35', 'T3503N30', 'کاربر ۲ تسهیلات مشکوک الوصول دارد', 3.89, -30, 2, 2) ds.insert_rule(rule) rule_codes.append(rule.code) # DoubfulCollectionLoans = 3 -40 T3504N40 کاربر ۳ تسهیلات مشکوک الوصول دارد rule = create_new_rule(3, 'T35', 'T3504N40', 'کاربر ۳ تسهیلات مشکوک الوصول دارد', 5.19, -40, 3, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # DoubfulCollectionLoans >= 4 -50 T3505N50 کاربر بیش از ۳ تسهیلات مشکوک الوصول دارد rule = create_new_rule(3, 'T35', 'T3505N50', 'کاربر بیش از ۳ تسهیلات مشکوک الوصول دارد', 6.48, -50, 4, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Timeliness(T) suspicious_loans_total_count_t35 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: T35_RULES_LOAN_SUSPICIOUS_TOTAL_COUNTS}) change_reason = create_new_score_reason(T35_RULES_LOAN_SUSPICIOUS_TOTAL_COUNTS, rule_codes, 'کاهش تعداد تسهیلات مشکوک الوصول در جریان', 'افزایش تعداد تسهیلات مشکوک الوصول در جریان') ds.insert_score_reason(change_reason) print('Timeliness(T) suspicious_loans_total_count_t35 change reasons are created.')
rule_codes.append(rule.code) # Loans = 5 -30 H1106N30 کاربر ۵ تسهیلات در جریان دارد rule = create_new_rule(3, 'H11', 'H1106N30', 'کاربر ۵ تسهیلات در جریان دارد', 3.33, -30, 5, 5) ds.insert_rule(rule) rule_codes.append(rule.code) # Loans >= 6 -50 H1107N50 کاربر بیش از ۵ تسهیلات در جریان دارد rule = create_new_rule(3, 'H11', 'H1107N50', 'کاربر بیش از ۵ تسهیلات در جریان دارد', 5.56, -50, 6, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Histories(H) loans_total_count_h11 rules are created.') change_reason = create_new_score_reason(H11_RULES_LOAN_TOTAL_COUNTS, rule_codes, 'کاهش تعداد تسهیلات بانکی در جریان', 'افزایش تعداد تسهیلات بانکی در جریان') ds.insert_score_reason(change_reason) print('Histories(H) loans_total_count_h11 part-2 change reasons are created.') def import_rules_histories(ds: DataService): import_rule_history_master(ds) import_rules_history_membership_days_counts_h5(ds) import_rules_history_done_timely_trades_of_last_3_months_h6(ds) import_rules_history_done_timely_trades_between_last_3_to_12_months_h7(ds) import_rules_history_recommended_to_others_counts_h8(ds) import_rules_history_star_counts_avgs_h9(ds) import_rules_history_undone_undue_trades_counts_h10(ds) import_rules_history_loans_total_count_h11(ds) if __name__ == '__main__': import_rules_histories(DataService(get_db()))
def import_rules_timeliness_past_due_loans_total_count_t33(ds: DataService): # define Timeliness(T)' rules of done_arrear_trades_of_last_3_months master: level 2 rule = create_new_rule(2, 'T', 'T33', 'تعداد تسهیلات سررسید گذشته در جریان', 1.30, 10) ds.insert_rule(rule) # define Timeliness(T)' rules of done_arrear_trades_of_last_3_months details: level 3 # PastDueLoans = 0 10 T3301P10 کاربر تسهیلات سررسید گذشته ندارد rule = create_new_rule(3, 'T33', 'T3301P10', 'کاربر تسهیلات سررسید گذشته ندارد', 1.30, 10, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # PastDueLoans = 1 00 T3302P0 کاربر 1 تسهیلات سررسید گذشته دارد rule = create_new_rule(3, 'T33', 'T3302P0', 'کاربر 1 تسهیلات سررسید گذشته دارد', 0, 0, 1, 1) ds.insert_rule(rule) rule_codes.append(rule.code) # PastDueLoans = 2 -10 T3303N10 کاربر ۲ تسهیلات سررسید گذشته دارد rule = create_new_rule(3, 'T33', 'T3303N10', 'کاربر ۲ تسهیلات سررسید گذشته دارد', 1.30, -10, 2, 2) ds.insert_rule(rule) rule_codes.append(rule.code) # PastDueLoans = 3 -20 T3304N20 کاربر ۳ تسهیلات سررسید گذشته دارد rule = create_new_rule(3, 'T33', 'T3304N20', 'کاربر ۳ تسهیلات سررسید گذشته دارد', 2.59, -20, 3, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # PastDueLoans >= 4 -30 T3305N30 کاربر بیش از ۳ تسهیلات سررسید گذشته دارد rule = create_new_rule(3, 'T33', 'T3305N30', 'کاربر بیش از ۳ تسهیلات سررسید گذشته دارد', 3.89, -30, 4, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Timeliness(T) past_due_loans_total_count_t33 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: T33_RULES_LOAN_PAST_DUE_TOTAL_COUNTS}) change_reason = create_new_score_reason(T33_RULES_LOAN_PAST_DUE_TOTAL_COUNTS, rule_codes, 'کاهش تعداد تسهیلات سررسید گذشته در جریان', 'افزایش تعداد تسهیلات سررسید گذشته در جریان') ds.insert_score_reason(change_reason) print('Timeliness(T) past_due_loans_total_count_t33 change reasons are created.')
sg.risk_status = 'بالا' ds.insert_score_gauge(sg) sg = ScoreGauge() sg.start = 590 sg.end = 669 sg.title = 'متوسط' sg.color = 'ffbb5e' sg.risk_status = 'متوسط' ds.insert_score_gauge(sg) sg = ScoreGauge() sg.start = 670 sg.end = 749 sg.title = 'خوب' sg.color = 'a6d94c' sg.risk_status = 'پایین' ds.insert_score_gauge(sg) sg = ScoreGauge() sg.start = 750 sg.end = 1000 sg.title = 'عالی' sg.color = '00d184' sg.risk_status = 'بسیار پایین' ds.insert_score_gauge(sg) if __name__ == '__main__': import_score_gauges(DataService(get_db()))
def calculate_score(scenarios_dicts: [], user_id: int): ds = DataService() rds = RedisCaching(ds) cs = ScoreCalculationService(rds, ds) for scn_dict in scenarios_dicts: # Profile Score Calculation .................................................. recent_p = ds.get_user_profile(user_id) revised_p = create_revised_profile(user_id=user_id, recent_p=recent_p) if is_not_none(scn_dict['KYC']): revised_p.has_kyc = scn_dict['KYC'] if is_not_none(scn_dict['Military']): revised_p.military_service_status = ProfileMilitaryServiceStatusEnum.__getitem__( scn_dict['Military']) if is_not_none(scn_dict['SimCard']): revised_p.sim_card_ownership = scn_dict['SimCard'] if is_not_none(scn_dict['Address']): revised_p.address_verification = scn_dict['Address'] if is_not_none(scn_dict['Membership']): revised_p.membership_date = date.today() - timedelta( days=int(scn_dict['Membership'])) if is_not_none(scn_dict['Recommendation']): revised_p.recommended_to_others_count = scn_dict['Recommendation'] if is_not_none(scn_dict['WeightedAveStars']): revised_p.star_count_average = scn_dict['WeightedAveStars'] cs.calculate_user_profile_score(recent_p=recent_p, revised_p=revised_p) # DoneTrade Score Calculation .................................................. dt = DoneTrade(user_id=user_id) if is_not_none(scn_dict['Last3MSD']): dt.timely_trades_count_of_last_3_months = scn_dict['Last3MSD'] if is_not_none(scn_dict['Last1YSD']): dt.timely_trades_count_between_last_3_to_12_months = scn_dict[ 'Last1YSD'] if is_not_none(scn_dict['B30DayDelayLast3M']): dt.past_due_trades_count_of_last_3_months = scn_dict[ 'B30DayDelayLast3M'] if is_not_none(scn_dict['B30DayDelayLast3-12M']): dt.past_due_trades_count_between_last_3_to_12_months = scn_dict[ 'B30DayDelayLast3-12M'] if is_not_none(scn_dict['A30DayDelayLast3M']): dt.arrear_trades_count_of_last_3_months = scn_dict[ 'A30DayDelayLast3M'] if is_not_none(scn_dict['A30DayDelay3-12M']): dt.arrear_trades_count_between_last_3_to_12_months = scn_dict[ 'A30DayDelay3-12M'] if is_not_none(scn_dict['AverageDelayRatio']): dt.total_delay_days = scn_dict['AverageDelayRatio'] if is_not_none(scn_dict['SDealAmountRatio']): # todo: 100000000 is fix Denominator that is all_other_users_done_trades_amount, it should be change later dt.trades_total_balance = round( float(scn_dict['SDealAmountRatio']) * ALL_USERS_AVERAGE_DEAL_AMOUNT) recent_dt = ds.get_user_done_trade(user_id) cs.calculate_user_done_trades_score(revised_p=revised_p, recent_dt=recent_dt, revised_dt=dt) ds.insert_or_update_done_trade(dt, update_flag=recent_dt.user_id is not None) # UndoneTrade Score Calculation .................................................. udt = UndoneTrade(user_id=user_id) if is_not_none(scn_dict['NumNotDueDeal']): udt.undue_trades_count = scn_dict['NumNotDueDeal'] if is_not_none(scn_dict['UnfinishedB30DayDelay']): udt.past_due_trades_count = scn_dict['UnfinishedB30DayDelay'] if is_not_none(scn_dict['UnfinishedA30DayDelay']): udt.arrear_trades_count = scn_dict['UnfinishedA30DayDelay'] dt.trades_total_balance = get_zero_if_none(dt.trades_total_balance) if is_not_none(scn_dict['NotDueDealAmountRatio']): udt.undue_trades_total_balance_of_last_year = round( float(scn_dict['NotDueDealAmountRatio']) * dt.trades_total_balance) if is_not_none(scn_dict['UnfinishedB30Din1YRatio']): udt.past_due_trades_total_balance_of_last_year = round( float(scn_dict['UnfinishedB30Din1YRatio']) * dt.trades_total_balance) if is_not_none(scn_dict['UnfinishedA30Din1YRatio']): udt.arrear_trades_total_balance_of_last_year = round( float(scn_dict['UnfinishedA30Din1YRatio']) * dt.trades_total_balance) recent_udt = ds.get_user_undone_trade(user_id) cs.calculate_user_undone_trades_score(revised_p=revised_p, recent_udt=recent_udt, revised_udt=udt, dt=dt) ds.insert_or_update_undone_trade(udt, update_flag=recent_udt.user_id is not None) # Loan Score Calculation .................................................. ln = Loan(user_id=user_id) if is_not_none(scn_dict['Loans']): ln.loans_total_count = scn_dict['Loans'] ln.loans_total_balance = ALL_USERS_AVERAGE_PRINCIPAL_INTEREST_AMOUNT if is_not_none(scn_dict['PastDueLoans']): ln.past_due_loans_total_count = int(scn_dict['PastDueLoans']) if is_not_none(scn_dict['DelayedLoans']): ln.arrear_loans_total_count = int(scn_dict['DelayedLoans']) if is_not_none(scn_dict['DoubfulCollectionLoans']): ln.suspicious_loans_total_count = int( scn_dict['DoubfulCollectionLoans']) if is_not_none(scn_dict['MonthlyInstallments']): ln.monthly_installments_total_balance = float( scn_dict['MonthlyInstallments']) if is_not_none(scn_dict['CurrentLoanAmountRatio']): ln.overdue_loans_total_balance = round( float(scn_dict['CurrentLoanAmountRatio']) * ln.loans_total_balance) if is_not_none(scn_dict['PastDueLoanAmountRatio']): ln.past_due_loans_total_balance = round( float(scn_dict['PastDueLoanAmountRatio']) * ln.loans_total_balance) if is_not_none(scn_dict['DelayedLoanAmountRatio']): ln.arrear_loans_total_balance = round( float(scn_dict['DelayedLoanAmountRatio']) * ln.loans_total_balance) if is_not_none(scn_dict['DoubtfulCollectionAmountRatio']): ln.suspicious_loans_total_balance = round( float(scn_dict['DoubtfulCollectionAmountRatio']) * ln.loans_total_balance) recent_ln = ds.get_user_loan(user_id) loan_score = cs.calculate_user_loans_score(revised_p=revised_p, recent_ln=recent_ln, revised_ln=ln) ds.insert_or_update_loan(ln, update_flag=recent_ln.user_id is not None) # Cheque Score Calculation .................................................. ch = Cheque(user_id=user_id) if is_not_none(scn_dict['DishonouredChequesL3M']): ch.unfixed_returned_cheques_count_of_last_3_months = scn_dict[ 'DishonouredChequesL3M'] if is_not_none(scn_dict['DishonouredChequesL3-12M']): ch.unfixed_returned_cheques_count_between_last_3_to_12_months = scn_dict[ 'DishonouredChequesL3-12M'] if is_not_none(scn_dict['DishonouredChequesA12M']): ch.unfixed_returned_cheques_count_of_more_12_months = scn_dict[ 'DishonouredChequesA12M'] if is_not_none(scn_dict['AllDishonouredCheques']): ch.unfixed_returned_cheques_count_of_last_5_years = scn_dict[ 'AllDishonouredCheques'] if is_not_none(scn_dict['DCAmountRatio']): ch.unfixed_returned_cheques_total_balance = round( float(scn_dict['DCAmountRatio']) * ALL_USERS_AVERAGE_UNFIXED_RETURNED_CHEQUES_AMOUNT) recent_ch = ds.get_user_cheque(user_id) cheque_score = cs.calculate_user_cheques_score(revised_p=revised_p, recent_ch=recent_ch, revised_ch=ch) ds.insert_or_update_cheque(ch, update_flag=recent_ch.user_id is not None) ds.insert_or_update_profile(revised_p, update_flag=recent_p.user_id is not None)
self.rds_rules_undone_trades_service.cache_rules() return self.rds_rules_undone_trades_service def get_redis_caching_rules_loans_service(self, reset_cache=False): if self.rds_rules_loans_service is None: self.rds_rules_loans_service = RedisCachingRulesLoans( self.rds, self.ds) if reset_cache: self.rds_rules_loans_service.cache_rules() return self.rds_rules_loans_service def get_redis_caching_rules_cheques_service(self, reset_cache=False): if self.rds_rules_cheques_service is None: self.rds_rules_cheques_service = RedisCachingRulesCheques( self.rds, self.ds) if reset_cache: self.rds_rules_cheques_service.cache_rules() return self.rds_rules_cheques_service def cache_rules(self): RedisCachingRulesMasters(self.rds, self.ds).cache_rules() RedisCachingRulesProfiles(self.rds, self.ds).cache_rules() RedisCachingRulesDoneTrades(self.rds, self.ds).cache_rules() RedisCachingRulesUndoneTrades(self.rds, self.ds).cache_rules() RedisCachingRulesLoans(self.rds, self.ds).cache_rules() RedisCachingRulesCheques(self.rds, self.ds).cache_rules() if __name__ == '__main__': RedisCaching(DataService()).cache_rules()
def import_rules_timeliness_done_past_due_trades_between_last_3_to_12_months_t23(ds: DataService): # define Timeliness(T)' rules of done_past_due_trades_between_last_3_to_12_months master: level 2 rule = create_new_rule(2, 'T', 'T23', 'تعداد تعاملات سررسید گذشته (کمتر از 30 روز تاخیر) خاتمه یافته در ۳ تا ۱۲ ماه گذشته', 2.59, 20) ds.insert_rule(rule) # define Timeliness(T)' rules of done_past_due_trades_between_last_3_to_12_months details: level 3 # B30DayDelayLast3-12M = 0 20 T2301P20 کاربر در یکسال گذشته هیچ تعامل سررسید گذشتهای نداشته است rule = create_new_rule(3, 'T23', 'T2301P20', 'کاربر در یکسال گذشته هیچ تعامل سررسید گذشتهای نداشته است', 2.59, 20, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # B30DayDelayLast3-12M = 1 15 T2302P15 کاربر در یکسال گذشته 1 تعامل سررسید گذشته داشته است rule = create_new_rule(3, 'T23', 'T2302P15', 'کاربر در یکسال گذشته 1 تعامل سررسید گذشته داشته است', 1.94, 15, 1, 1) ds.insert_rule(rule) rule_codes.append(rule.code) # 2 <= B30DayDelayLast3-12M ≤ 3 05 T2303P5 کاربر در یکسال گذشته بین 2 تا 3 تعامل سررسید گذشته داشته است rule = create_new_rule(3, 'T23', 'T2303P5', 'کاربر در یکسال گذشته بین 2 تا 3 تعامل سررسید گذشته داشته است', 0.65, 5, 2, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # 4 <= B30DayDelayLast3-12M ≤ 6 -10 T2304N10 کاربر در یکسال گذشته بین 4 تا 6 تعامل سررسید گذشته داشته است rule = create_new_rule(3, 'T23', 'T2304N10', 'کاربر در یکسال گذشته بین 4 تا 6 تعامل سررسید گذشته داشته است', 1.30, -10, 4, 6) ds.insert_rule(rule) rule_codes.append(rule.code) # 7 <= B30DayDelayLast3-12M ≤ 10 -15 T2305N15 کاربر در یکسال گذشته بین 7 تا 10 تعامل سررسید گذشته داشته است rule = create_new_rule(3, 'T23', 'T2305N15', 'کاربر در یکسال گذشته بین 7 تا 10 تعامل سررسید گذشته داشته است', 1.94, -15, 7, 10) ds.insert_rule(rule) rule_codes.append(rule.code) # B30DayDelayLast3-12M >= 11 -20 T2306N20 کاربر در یکسال گذشته بیش از 10 تعامل سررسید گذشته داشته است rule = create_new_rule(3, 'T23', 'T2306N20', 'کاربر در یکسال گذشته بیش از 10 تعامل سررسید گذشته داشته است', 2.59, -20, 11, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Timeliness(T) done_past_due_trades_between_last_3_to_12_months_t23 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: T23_RULES_DONE_PAST_DUE_TRADES_BETWEEN_LAST_3_TO_12_MONTHS}) change_reason = create_new_score_reason(T23_RULES_DONE_PAST_DUE_TRADES_BETWEEN_LAST_3_TO_12_MONTHS, rule_codes, 'کاهش تعداد معاملات سررسید گذشته خاتمه یافته در یک سال گذشته', 'افزایش تعداد معاملات سررسید گذشته خاتمه یافته در یک سال گذشته') ds.insert_score_reason(change_reason) print('Timeliness(T) done_past_due_trades_between_last_3_to_12_months_t23 change reasons are created.')
ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # AddressVerification = No 00 I0402P0 0% عدم احراز اصالت نشانی محل سکونت کاربر rule = create_new_rule( 3, 'I4', 'I0402P0', 'تطابق هویت واقعی کاربر با مشخصات مالک خط تلفن همراه در سامانه شاهکار', 0, 0, 0) ds.insert_rule(rule) rule_codes.append(rule.code) print('Identities(I) address_verifications_i4 rules are created.') ds.delete_score_reasons( {RULE_MASTER_CODE: I4_RULES_PROFILE_ADDRESS_VERIFICATIONS}) change_reason = create_new_score_reason( I4_RULES_PROFILE_ADDRESS_VERIFICATIONS, rule_codes, 'تایید نشانی محل سکونت', 'عدم تایید نشانی محل سکونت') ds.insert_score_reason(change_reason) print('Identities(I) address_verifications_i4 change reasons are created.') def import_rules_identities(ds: DataService): import_rule_identity_master(ds) import_rules_identity_has_kycs_i1(ds) import_rules_identity_military_service_status_i2(ds) import_rules_identity_sim_card_ownerships_i3(ds) import_rules_identity_address_verifications_i4(ds) if __name__ == '__main__': import_rules_identities(DataService(get_db()))
def import_rules_timeliness_unfixed_returned_cheques_count_of_last_5_years_t32(ds: DataService): # define Timeliness(T)' rules of done_arrear_trades_of_last_3_months master: level 2 rule = create_new_rule(2, 'T', 'T32', 'تعداد کل چکهای برگشتی رفع سو اثر شده در 5 سال گذشته', 2.59, 20) ds.insert_rule(rule) # define Timeliness(T)' rules of done_arrear_trades_of_last_3_months details: level 3 # AllDishonouredCheques = 0 20 T3201P20 کاربر چک برگشتی ندارد rule = create_new_rule(3, 'T32', 'T3201P20', 'کاربر چک برگشتی ندارد', 2.59, 20, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # 1 ≤ AllDishonouredCheques ≤ 3 00 T3202P0 کاربر بین 1 تا 3 چک برگشتی دارد rule = create_new_rule(3, 'T32', 'T3202P0', 'کاربر بین 1 تا 3 چک برگشتی دارد', 0, 0, 1, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # 4 <= AllDishonouredCheques ≤ 6 -10 T3203N10 کاربر بین 4 تا 6 چک برگشتی دارد rule = create_new_rule(3, 'T32', 'T3203N10', 'کاربر بین 4 تا 6 چک برگشتی دارد', 1.30, -10, 4, 6) ds.insert_rule(rule) rule_codes.append(rule.code) # 7 <= AllDishonouredCheques ≤ 10 -20 T3204N20 کاربر کاربر بین 7 تا 10 چک برگشتی دارد rule = create_new_rule(3, 'T32', 'T3204N20', 'کاربر کاربر بین 7 تا 10 چک برگشتی دارد', 2.59, -20, 7, 10) ds.insert_rule(rule) rule_codes.append(rule.code) # DishonouredCheques >= 11 -30 T3205N30 کاربر بیش از 10 چک برگشتی دارد rule = create_new_rule(3, 'T32', 'T3205N30', 'کاربر بیش از 10 چک برگشتی دارد', 3.89, -30, 11, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Timeliness(T) unfixed_returned_cheques_count_of_last_5_years_t32 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: T32_RULES_CHEQUE_UNFIXED_RETURNED_COUNT_OF_LAST_5_YEARS}) change_reason = create_new_score_reason(T32_RULES_CHEQUE_UNFIXED_RETURNED_COUNT_OF_LAST_5_YEARS, rule_codes, 'کاهش تعداد چکهای برگشتی رفع سو اثر شده در پنج سال گذشته', 'افزایش تعداد چکهای برگشتی رفع سو اثر شده در پنج سال گذشته') ds.insert_score_reason(change_reason) print('Timeliness(T) unfixed_returned_cheques_count_of_last_5_years_t32 change reasons are created.')
from app.core.data.import_history_rules_data import import_rules_histories from app.core.data.import_identity_rules_data import import_rules_identities from app.core.data.import_score_gauges_data import import_score_gauges from app.core.data.import_timeliness_rules_data import import_rules_timeliness from app.core.data.import_volume_rules_data import import_rules_volumes from app.core.database import get_db from app.core.services.data_service import DataService def import_rules(ds: DataService): import_score_gauges(ds) import_rules_identities(ds) import_rules_histories(ds) import_rules_volumes(ds) import_rules_timeliness(ds) if __name__ == '__main__': import_rules(DataService(get_db()))
from app.core.models.dtos.cheque_status_dto import ChequesStatusDTO from app.core.models.dtos.loan_status_dto import LoansStatusDTO from app.core.models.dtos.score_boundaries_dto import ScoreBoundariesDTO from app.core.models.dtos.score_change_dto import ScoreChangeDTO from app.core.models.dtos.score_details_dto import ScoreDetailsDTO from app.core.models.dtos.score_distribution_dto import ScoreDistributionDTO from app.core.models.dtos.score_status_dto import ScoreStatusDTO from app.core.models.dtos.score_time_series_dto import ScoreTimeSeriesDTO from app.core.models.dtos.user_score_dto import UserScoreDTO from app.core.models.dtos.vosouq_status_dto import VosouqStatusDTO from app.core.models.score_gauges import ScoreGauge from app.core.services.data_service import DataService from app.core.settings import redis_reset router = APIRouter() ds = DataService() if bool(redis_reset): RedisCaching(ds).cache_rules() # @router.get("/score-gauges", response_model=List[ScoreGauge]) @router.get("/score-gauges", response_model=List[ScoreGauge], responses={200: {"model": ScoreGauge}}) async def get_score_gauges(): return ds.get_score_gauges() @router.get("/score-boundaries", response_model=ScoreBoundariesDTO) async def get_score_boundaries(): return ds.get_score_boundaries()
def import_rules_timeliness_arrear_loans_total_count_t34(ds: DataService): # define Timeliness(T)' rules of done_arrear_trades_of_last_3_months master: level 2 rule = create_new_rule(2, 'T', 'T34', 'تعداد تسهیلات معوق در جریان', 2.59, 20) ds.insert_rule(rule) # define Timeliness(T)' rules of done_arrear_trades_of_last_3_months details: level 3 # DelayedLoans = 0 20 T3401P20 کاربر تسهیلات معوق ندارد rule = create_new_rule(3, 'T34', 'T3401P20', 'کاربر تسهیلات معوق ندارد', 2.59, 20, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # DelayedLoans = 1 -10 T3402N10 کاربر 1 تسهیلات معوق دارد rule = create_new_rule(3, 'T34', 'T3402N10', 'کاربر 1 تسهیلات معوق دارد', 1.30, -10, 1, 1) ds.insert_rule(rule) rule_codes.append(rule.code) # DelayedLoans = 2 -20 T3403N20 کاربر ۲ تسهیلات معوق دارد rule = create_new_rule(3, 'T34', 'T3403N20', 'کاربر ۲ تسهیلات معوق دارد', 2.59, -20, 2, 2) ds.insert_rule(rule) rule_codes.append(rule.code) # DelayedLoans = 3 -30 T3404N30 کاربر ۳ تسهیلات معوق دارد rule = create_new_rule(3, 'T34', 'T3404N30', 'کاربر ۳ تسهیلات معوق دارد', 3.89, -30, 3, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # DelayedLoans >= 4 -40 T3405N40 کاربر بیش از ۳ تسهیلات معوق دارد rule = create_new_rule(3, 'T34', 'T3405N40', 'کاربر بیش از ۳ تسهیلات معوق دارد', 5.19, -40, 4, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Timeliness(T) arrear_loans_total_count_t34 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: T34_RULES_LOAN_ARREAR_TOTAL_COUNTS}) change_reason = create_new_score_reason(T34_RULES_LOAN_ARREAR_TOTAL_COUNTS, rule_codes, 'کاهش تعداد تسهیلات معوق در جریان', 'افزایش تعداد تسهیلات معوق در جریان') ds.insert_score_reason(change_reason) print('Timeliness(T) arrear_loans_total_count_t34 change reasons are created.')
def import_rules_identity_military_service_status_i2(ds: DataService): # define Identities(I)' rules of military_service master: level 2 rule = create_new_rule(2, 'I', 'I2', 'خدمت وظیفه عمومی', 2) ds.insert_rule(rule) # define Identities(I)' rules of military_service details: level 3 # MilServiceFinished/Exempted/Ongoing 20 2% I0201P20 پایان خدمت rule = create_new_rule(3, 'I2', 'I0201P20', 'پایان خدمت', 2, 20, ProfileMilitaryServiceStatusEnum.FINISHED.value) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # MilServiceFinished/Exempted/Ongoing 20 2% I0202P20 معافیت rule = create_new_rule(3, 'I2', 'I0202P20', 'معافیت', 2, 20, ProfileMilitaryServiceStatusEnum.EXEMPTED.value) ds.insert_rule(rule) rule_codes.append(rule.code) # MilServiceFinished/Exempted/Ongoing 20 2% I0203P20 در حال خدمت rule = create_new_rule(3, 'I2', 'I0203P20', 'در حال خدمت', 2, 20, ProfileMilitaryServiceStatusEnum.ONGOING.value) ds.insert_rule(rule) rule_codes.append(rule.code) # MilServiceSubjected 00 I0204P0 0% مشمول غیر غایب rule = create_new_rule(3, 'I2', 'I0204P0', 'مشمول غیر غایب', 2, 20, ProfileMilitaryServiceStatusEnum.SUBJECTED.value) ds.insert_rule(rule) rule_codes.append(rule.code) # MilServiceAbsent -50 I0205N50 -5% غایب rule = create_new_rule(3, 'I2', 'I0205N50', 'غایب', 5, -50, ProfileMilitaryServiceStatusEnum.ABSENT.value) ds.insert_rule(rule) rule_codes.append(rule.code) print('Identities(I) military_service_status_i2 rules are created.') ds.delete_score_reasons( {RULE_MASTER_CODE: I2_RULES_PROFILE_MILITARY_SERVICE_STATUS}) change_reason = create_new_score_reason( I2_RULES_PROFILE_MILITARY_SERVICE_STATUS, rule_codes, 'بهبود وضعیت خدمت وظیفه عمومی', 'تنزل وضعیت خدمت وظیفه عمومی') ds.insert_score_reason(change_reason) print( 'Identities(I) military_service_status_i2 change reasons are created.')
def import_rules_history_done_timely_trades_between_last_3_to_12_months_h7(ds: DataService): # define History(H)' rules of done_timely_trades_between_last_3_to_12_months master: level 2 rule = create_new_rule(2, 'H', 'H7', 'تعداد تعاملات موفق در ۳ تا ۱۲ ماه گذشته', 4.44, 40) ds.insert_rule(rule) # define History(H)' rules of done_timely_trades_of_last_3_months details: level 3 # Last1YSD = 0 00 H0701P0 کاربر در یکسال گذشته هیچ تعامل موفقی با سایر کاربران نداشته است rule = create_new_rule(3, 'H7', 'H0701P0', 'کاربر در یکسال گذشته هیچ تعامل موفقی با سایر کاربران نداشته است', 0, 0, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # Last1YSD = 1 05 H0702P05 کاربر در یکسال گذشته 1 تعامل موفق با سایر کاربران داشته است rule = create_new_rule(3, 'H7', 'H0702P05', 'کاربر در یکسال گذشته 1 تعامل موفق با سایر کاربران داشته است', 0.56, 5, 1, 1) ds.insert_rule(rule) rule_codes.append(rule.code) # 2 <= Last1YSD ≤ 3 10 H0703P10 کاربر در یکسال گذشته بین 2 تا 3 تعامل موفق با سایر کاربران داشته است rule = create_new_rule(3, 'H7', 'H0703P10', 'کاربر در یکسال گذشته بین 2 تا 3 تعامل موفق با سایر کاربران داشته است', 1.11, 10, 2, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # 4 <= Last1YSD ≤ 6 20 H0704P20 کاربر در یکسال گذشته بین 4 تا 6 تعامل موفق با سایر کاربران داشته است rule = create_new_rule(3, 'H7', 'H0704P20', 'کاربر در یکسال گذشته بین 4 تا 6 تعامل موفق با سایر کاربران داشته است', 2.22, 20, 4, 6) ds.insert_rule(rule) rule_codes.append(rule.code) # 7 <= Last1YSD ≤ 10 30 H0705P30 کاربر در یکسال گذشته بین 7 تا 10 تعامل موفق با سایر کاربران داشته است rule = create_new_rule(3, 'H7', 'H0705P30', 'کاربر در یکسال گذشته بین 7 تا 10 تعامل موفق با سایر کاربران داشته است', 3.33, 30, 7, 10) ds.insert_rule(rule) rule_codes.append(rule.code) # Last1YSD >= 11 40 H0706P40 کاربر در یکسال گذشته بیش از 10 تعامل موفق با سایر کاربران داشته است rule = create_new_rule(3, 'H7', 'H0706P40', 'کاربر در یکسال گذشته بیش از 10 تعامل موفق با سایر کاربران داشته است', 4.44, 40, 11, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Histories(H) done_timely_trades_between_last_3_to_12_months_h7 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: H7_RULES_DONE_TIMELY_TRADES_BETWEEN_LAST_3_TO_12_MONTHS}) change_reason = create_new_score_reason(H7_RULES_DONE_TIMELY_TRADES_BETWEEN_LAST_3_TO_12_MONTHS, rule_codes, 'افزایش معاملات موفق در یک سال گذشته', 'کاهش معاملات موفق در یک سال گذشته') ds.insert_score_reason(change_reason) print('Histories(H) done_timely_trades_between_last_3_to_12_months_h7 change reasons are created.')
def calculate_score(scenarios_dicts: [], user_id: int = None): # mongoengine_api.launch_app() ds = DataService() rds = RedisCaching(ds) cs = ScoreCalculationService_2(rds, ds) # crm = RedisCachingRulesMasters(rds.rds) for scn_dict in scenarios_dicts: expected_score = scn_dict['Vscore'] # DoneTrade Score Calculation .................................................. dt = DoneTrade(user_id=user_id) dt.timely_trades_count_of_last_3_months = scn_dict['Last3MSD'] dt.timely_trades_count_between_last_3_to_12_months = scn_dict[ 'Last1YSD'] dt.past_due_trades_count_of_last_3_months = scn_dict[ 'B30DayDelayLast3M'] dt.past_due_trades_count_between_last_3_to_12_months = scn_dict[ 'B30DayDelayLast3-12M'] dt.arrear_trades_count_of_last_3_months = scn_dict['A30DayDelayLast3M'] dt.arrear_trades_count_between_last_3_to_12_months = scn_dict[ 'A30DayDelay3-12M'] dt.total_delay_days = scn_dict['AverageDelayRatio'] # todo: 100000000 is fix Denominator that is all_other_users_done_trades_amount, it should be change later dt.trades_total_balance = round( float(scn_dict['SDealAmountRatio']) * ALL_USERS_AVERAGE_DEAL_AMOUNT) done_trades_score = cs.calculate_user_done_trades_score_2( user_id=0, modified_done_trade=dt) ds.delete_done_trades({USER_ID: user_id}) ds.insert_done_trade(dt) # UndoneTrade Score Calculation .................................................. udt = UndoneTrade(user_id=user_id) udt.undue_trades_count = scn_dict['NumNotDueDeal'] udt.past_due_trades_count = scn_dict['UnfinishedB30DayDelay'] udt.arrear_trades_count = scn_dict['UnfinishedA30DayDelay'] udt.undue_trades_total_balance_of_last_year = round( float(scn_dict['NotDueDealAmountRatio']) * dt.trades_total_balance) udt.past_due_trades_total_balance_of_last_year = round( float(scn_dict['UnfinishedB30Din1YRatio']) * dt.trades_total_balance) udt.arrear_trades_total_balance_of_last_year = round( float(scn_dict['UnfinishedA30Din1YRatio']) * dt.trades_total_balance) undone_trades_score = cs.calculate_user_undone_trades_score_2( user_id=0, undone_trade_object=udt, done_trade_object=dt) ds.delete_undone_trades({USER_ID: user_id}) ds.insert_undone_trade(udt) # Loan Score Calculation .................................................. ln = Loan(user_id=user_id) ln.loans_total_count = scn_dict['Loans'] ln.loans_total_balance = ALL_USERS_AVERAGE_PRINCIPAL_INTEREST_AMOUNT ln.past_due_loans_total_count = int(scn_dict['PastDueLoans']) ln.arrear_loans_total_count = int(scn_dict['DelayedLoans']) ln.suspicious_loans_total_count = int( scn_dict['DoubfulCollectionLoans']) ln.monthly_installments_total_balance = float( scn_dict['MonthlyInstallments']) ln.overdue_loans_total_balance = round( float(scn_dict['CurrentLoanAmountRatio']) * ln.loans_total_balance) ln.past_due_loans_total_balance = round( float(scn_dict['PastDueLoanAmountRatio']) * ln.loans_total_balance) ln.arrear_loans_total_balance = round( float(scn_dict['DelayedLoanAmountRatio']) * ln.loans_total_balance) ln.suspicious_loans_total_balance = round( float(scn_dict['DoubtfulCollectionAmountRatio']) * ln.loans_total_balance) loan_score = cs.calculate_user_loans_score_2(user_id=0, loan_object=ln) ds.delete_loans({USER_ID: user_id}) ds.insert_loan(ln) # Cheque Score Calculation .................................................. ch = Cheque(user_id=user_id) ch.unfixed_returned_cheques_count_of_last_3_months = scn_dict[ 'DishonouredChequesL3M'] ch.unfixed_returned_cheques_count_between_last_3_to_12_months = scn_dict[ 'DishonouredChequesL3-12M'] ch.unfixed_returned_cheques_count_of_more_12_months = scn_dict[ 'DishonouredChequesA12M'] ch.unfixed_returned_cheques_count_of_last_5_years = scn_dict[ 'AllDishonouredCheques'] ch.unfixed_returned_cheques_total_balance = round( float(scn_dict['DCAmountRatio']) * ALL_USERS_AVERAGE_UNFIXED_RETURNED_CHEQUES_AMOUNT) cheque_score: [] = cs.calculate_user_cheques_score_2(user_id=0, cheque_object=ch) ds.delete_cheques({USER_ID: user_id}) ds.insert_cheque(ch) # Profile Score Calculation .................................................. if user_id is not None: ds.delete_profiles({USER_ID: user_id}) p = Profile(user_id=user_id) p.has_kyc = scn_dict['KYC'] p.military_service_status = ProfileMilitaryServiceStatusEnum.__getitem__( scn_dict['Military']) p.sim_card_ownership = scn_dict['SimCard'] p.address_verification = scn_dict['Address'] p.membership_date = date.today() - timedelta( days=int(scn_dict['Membership'])) p.recommended_to_others_count = scn_dict['Recommendation'] p.star_count_average = scn_dict['WeightedAveStars'] profile_score = cs.calculate_user_profile_score_2(user_id=0, profile_object=p) # total_pure_score = int(profile_score) + int(done_trades_score) + int(undone_trades_score) + int(loan_score) + int(cheque_score) identities_pure_score = cs.scores_dict.get(IDENTITIES_SCORE) identities_normalized_score = cs.calculate_identities_normalized_score_2( identities_pure_score) histories_pure_score = cs.scores_dict.get(HISTORIES_SCORE) histories_normalized_score = cs.calculate_histories_normalized_score_2( histories_pure_score) volumes_pure_score = cs.scores_dict.get(VOLUMES_SCORE) volumes_normalized_score = cs.calculate_volumes_normalized_score_2( volumes_pure_score) timeliness_pure_score = cs.scores_dict.get(TIMELINESS_SCORE) timeliness_normalized_score = cs.calculate_timeliness_normalized_score_2( timeliness_pure_score) total_pure_score = identities_pure_score + histories_pure_score + volumes_pure_score + timeliness_pure_score total_normalized_score = identities_normalized_score + histories_normalized_score + volumes_normalized_score + timeliness_normalized_score print( '<><><><><><><> expected-score= {} , total_pure_score = {} and total_normalized_score = {} ' '<><><><><><><>'.format(expected_score, total_pure_score, total_normalized_score)) # Profile Score insertion p.score = total_normalized_score p.identities_score = identities_normalized_score p.histories_score = histories_normalized_score p.volumes_score = volumes_normalized_score p.timeliness_score = timeliness_normalized_score ds.delete_profiles({USER_ID: user_id}) ds.insert_profile(p)
def import_rules_history_recommended_to_others_counts_h8(ds: DataService): # define History(H)' rules of recommended_to_others_counts master: level 2 rule = create_new_rule(2, 'H', 'H8', 'پیشنهاد شدن کاربر به سایرین جهت انجام تعامل پس از انجام موفقیت آمیز تعامل', 4.44, 40) ds.insert_rule(rule) # define History(H)' rules of recommended_to_others_counts details: level 3 # Recommendation = 0 00 H0801P0 کاربر توسط کسی پیشنهاد نشده است rule = create_new_rule(3, 'H8', 'H0801P0', 'کاربر توسط کسی پیشنهاد نشده است', 0, 0, 0, 0) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # Recommendation = 1 10 H0802P10 پیشنهاد شده توسط 1 نفر rule = create_new_rule(3, 'H8', 'H0802P10', 'پیشنهاد شده توسط 1 نفر', 1.11, 10, 1, 1) ds.insert_rule(rule) rule_codes.append(rule.code) # 2 < Recommendation ≤ 3 20 H0803P20 پیشنهاد شده توسط 2 تا 3 نفر rule = create_new_rule(3, 'H8', 'H0803P20', 'پیشنهاد شده توسط 2 تا 3 نفر', 2.22, 20, 2, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # 4 < Recommendation ≤ 10 30 H0804P30 پیشنهاد شده توسط 4 تا 10 نفر rule = create_new_rule(3, 'H8', 'H0804P30', 'پیشنهاد شده توسط 4 تا 10 نفر', 3.33, 30, 4, 10) ds.insert_rule(rule) rule_codes.append(rule.code) # 11 < Recommendation ≤ 30 40 H0805P40 پیشنهاد شده توسط 11 تا 30 نفر rule = create_new_rule(3, 'H8', 'H0805P40', 'پیشنهاد شده توسط 11 تا 30 نفر', 4.44, 40, 11, 30) ds.insert_rule(rule) rule_codes.append(rule.code) # Recommendation > 30 50 H0806P50 پیشنهاد شده توسط بیش از 30 نفر rule = create_new_rule(3, 'H8', 'H0806P50', 'پیشنهاد شده توسط بیش از 30 نفر', 5.56, 50, 30, rules_max_val) ds.insert_rule(rule) rule_codes.append(rule.code) print('Histories(H) recommended_to_others_counts_h8 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: H8_RULES_PROFILE_RECOMMENDED_TO_OTHERS_COUNTS}) change_reason = create_new_score_reason(H8_RULES_PROFILE_RECOMMENDED_TO_OTHERS_COUNTS, rule_codes, 'افزایش پیشنهادات طرفین معاملات به سایرین جهت انجام معامله با شما', 'کاهش پیشنهادات طرفین معاملات به سایرین جهت انجام معامله با شما') ds.insert_score_reason(change_reason) print('Histories(H) recommended_to_others_counts_h8 change reasons are created.')
import random from datetime import date from app.core.database import get_db from app.core.models.profile import Profile from app.core.models.scoring_enums import ProfileMilitaryServiceStatusEnum from app.core.services.data_service import DataService if __name__ == '__main__': ds = DataService(get_db()) ds.delete_profiles({}) for i in range(2): p = Profile(user_id=int(100 + i)) p.has_kyc = 1 p.military_service_status = ProfileMilitaryServiceStatusEnum.FINISHED p.sim_card_ownership = 1 p.address_verification = 1 p.membership_date = date.today() p.recommended_to_others_count = 23 p.star_count_average = 1 p.identities_score = random.randint(0, 100) # 10% p.histories_score = random.randint(0, 300) # 30% p.volumes_score = random.randint(0, 250) # 25% p.timeliness_score = random.randint(0, 350) # 35% p.score = p.identities_score + p.histories_score + p.volumes_score + p.timeliness_score ds.insert_profile(p) # Test aggregation pipeline run performance # pipeline = generate_scores_distributions_pipeline(0, 1000, 20) # ref: CommandCursor = ds.db.profiles.aggregate(pipeline)
def import_rules_history_star_counts_avgs_h9(ds: DataService): # define History(H)' rules of star_counts_avgs master: level 2 rule = create_new_rule(2, 'H', 'H9', ' امتیاز رضایتمندی دریافت شده از طرف مقابل پس از انجام موفقیت آمیز تعامل', 5.56, 50) ds.insert_rule(rule) # define History(H)' rules of star_counts_avgs details: level 3 # WeightedAveStars <= 1 00 H0901P0 کاربر به طور متوسط کمتر مساوی ۱ ستاره کسب کرده است rule = create_new_rule(3, 'H9', 'H0901P0', 'کاربر به طور متوسط کمتر مساوی ۱ ستاره کسب کرده است', 0, 0, 0, 1) ds.insert_rule(rule) rule_codes: List[str] = [rule.code] # 1.001 <= WeightedAveStars ≤ 2 05 H0902P5 کاربر به طور متوسط بیش از ۱ و کمتر مساوی ۲ ستاره کسب کرده است rule = create_new_rule(3, 'H9', 'H0902P5', 'کاربر به طور متوسط بیش از ۱ و کمتر مساوی ۲ ستاره کسب کرده است', 0.56, 5, 1.001, 2) ds.insert_rule(rule) rule_codes.append(rule.code) # 2.001 <= WeightedAveStars ≤ 3 10 H0903P10 کاربر به طور متوسط بیش از ۲ و کمتر مساوی ۳ ستاره کسب کرده است rule = create_new_rule(3, 'H9', 'H0903P10', 'کاربر به طور متوسط بیش از ۲ و کمتر مساوی ۳ ستاره کسب کرده است', 1.11, 10, 2.001, 3) ds.insert_rule(rule) rule_codes.append(rule.code) # 3.001 <= WeightedAveStars ≤ 4 30 H0904P30 کاربر به طور متوسط بیش از ۳ و کمتر مساوی ۴ ستاره کسب کرده است rule = create_new_rule(3, 'H9', 'H0904P30', 'کاربر به طور متوسط بیش از ۳ و کمتر مساوی ۴ ستاره کسب کرده است', 3.33, 30, 3.001, 4) ds.insert_rule(rule) rule_codes.append(rule.code) # 4.001 <= WeightedAveStars ≤ 5 50 H0905P50 کاربر به طور متوسط بیش از ۴ و کمتر مساوی ۵ ستاره کسب کرده است rule = create_new_rule(3, 'H9', 'H0905P50', 'کاربر به طور متوسط بیش از ۴ و کمتر مساوی ۵ ستاره کسب کرده است', 5.56, 50, 4.001, 5) ds.insert_rule(rule) rule_codes.append(rule.code) print('Histories(H) star_counts_avgs_h9 rules are created.') ds.delete_score_reasons({RULE_MASTER_CODE: H9_RULES_PROFILE_STAR_COUNTS_AVGS}) change_reason = create_new_score_reason(H9_RULES_PROFILE_STAR_COUNTS_AVGS, rule_codes, 'افزایش امتیاز رضایتمندی دریافت شده از طرفین معاملات', 'کاهش امتیاز رضایتمندی دریافت شده از طرفین معاملات') ds.insert_score_reason(change_reason) print('Histories(H) star_counts_avgs_h9 change reasons are created.')