xmlSelfParser.py 229 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037
  1. #!/usr/bin/env Python
  2. # coding=utf-8
  3. import json
  4. from xml.dom import minidom
  5. import consts;
  6. import constsBase
  7. import pandas as pd
  8. import numpy as np;
  9. import time
  10. import log
  11. logger = log.logger
  12. import utils
  13. import loanIndexParser as lip;
  14. import payRcdIndexParser as prp;
  15. import creditCardIndexParser as cip
  16. import queryInfoIndexParser as qip
  17. import requests
  18. import dfParser
  19. import sys
  20. import traceback
  21. import timeit
  22. from mailUtil import MailUtil
  23. from dbController import DbController
  24. #身份信息
  25. identityInfoIndex = '身份信息'
  26. identityInfoDf = pd.DataFrame(columns=consts.identityInfoHeader,index=[identityInfoIndex])
  27. #配偶信息
  28. mateInfoIndex = '配偶信息'
  29. mateInfoDf = pd.DataFrame(columns=consts.mateInfoHeader,index=[mateInfoIndex])
  30. #居住信息
  31. liveInfoIndex = '居住信息'
  32. liveInfoDf = pd.DataFrame(columns=consts.liveInfoHeader,index=[liveInfoIndex])
  33. #职业信息
  34. occupationInfoIndex = '职业信息'
  35. occupationInfoDf = pd.DataFrame(columns=consts.occupationInfoHeader,index=[occupationInfoIndex])
  36. #信贷交易信息提示
  37. loanTradeInfoIndex = '信贷交易信息提示'
  38. briefInfoDf_loanTradeInfo = pd.DataFrame(columns=consts.briefInfoHeader_loanTradeInfo,index=[loanTradeInfoIndex])
  39. #被追偿信息汇总及呆账信息汇总
  40. recoveryInfoSumIndex = '信贷交易违约信息概要'
  41. briefInfoDf_recoveryInfoSum = pd.DataFrame(columns=consts.briefInfoHeader_recoveryInfo,index=[recoveryInfoSumIndex])
  42. #呆账信息汇总
  43. badDebtsInfoIndex = '呆账信息汇总'
  44. briefInfoDf_badDebtsInfoSum = pd.DataFrame(columns=consts.briefInfoHeader_badDebtsInfoSum,index=[badDebtsInfoIndex])
  45. #逾期(透支)信息汇总
  46. overdueInfoSumIndex='逾期(透支)信息汇总'
  47. briefInfoDf_overdueInfoSum = pd.DataFrame(columns=consts.briefInfoHeader_overdueInfoSum,index=[overdueInfoSumIndex])
  48. #信贷交易授信及负债信息概要
  49. loanTradeCreditInfoIndex='信贷交易授信及负债信息概要'
  50. briefInfoDf_loanTradeCreditInfo = pd.DataFrame(columns=consts.briefInfoHeader_loanTradeCreditInfo,index=[loanTradeCreditInfoIndex]).fillna(0.0)
  51. #公共信息概要
  52. publicInfoBriefIndex = '公共信息概要'
  53. publicInfoBriefDf = pd.DataFrame(columns=consts.publicInfoBriefHeader,index=[publicInfoBriefIndex])
  54. #查询记录汇总
  55. queryRecordSumIndex = '查询记录汇总'
  56. queryRecordSumDf = pd.DataFrame(columns=consts.queryRecordSumHeader,index=[queryRecordSumIndex])
  57. #信贷交易明细-被追偿信息
  58. recoveryInfoIndex='被追偿信息'
  59. creditTradeDetailDf_recoveryInfo = pd.DataFrame(columns=consts.creditTradeDetailHeader_recoveryInfo,index=[recoveryInfoIndex])
  60. #信贷交易明细-特殊交易
  61. specialTradeIndex='特殊交易'
  62. creditTradeDetailHeader_specialTrade = pd.DataFrame(columns=consts.creditTradeDetailHeader_specialTrade,index=[specialTradeIndex])
  63. #信贷交易明细
  64. #非循环贷账户
  65. loanInfoIndex='非循环贷账户'
  66. creditTradeDetailDf_loanAccountInfo = pd.DataFrame(columns=consts.creditTradeDetailHeader_loanAccountInfo,index=[loanInfoIndex])
  67. #循环额度下分账户
  68. cycleCreditAccountInfoIndex='循环额度下分账户'
  69. creditTradeDetailDf_cycleCreditAccountInfo = pd.DataFrame(columns=consts.creditTradeDetailHeader_cycleCreditAccountInfo,index=[cycleCreditAccountInfoIndex])
  70. #循环贷账户
  71. cycleLoanAccountInfoIndex='循环贷账户'
  72. creditTradeDetailDf_cycleLoanAccountInfo = pd.DataFrame(columns=consts.creditTradeDetailHeader_cycleLoanAccountInfo,index=[cycleLoanAccountInfoIndex])
  73. #贷款信息
  74. loanAccountInfoIndex='贷款信息'
  75. loanAccountInfoDf = pd.DataFrame(columns=consts.loanAccountInfoHeader,index=[loanAccountInfoIndex])
  76. #贷记卡信息
  77. creditCardAccountInfoIndex = '贷记卡账户'
  78. creditCardAccountInfoDf = pd.DataFrame(columns=consts.creditCardAccountInfoHeader,index=[creditCardAccountInfoIndex])
  79. #准贷记卡
  80. creditCardAccountInfoIndexZ = '准贷记卡账户'
  81. creditCardAccountInfoDfZ = pd.DataFrame(columns=consts.creditCardAccountInfoHeaderZ,index=[creditCardAccountInfoIndexZ])
  82. useRateIndex = '使用率'
  83. useRateDf = pd.DataFrame(columns=consts.creditTradeDetailHeader_useRate,index=[useRateIndex])
  84. openAccountIndex = '开户数'
  85. openAccountDf = pd.DataFrame(columns=consts.creditTradeDetailHeader_openAccount,index=[openAccountIndex])
  86. payRcdStatusIndex = '24期还款状态'
  87. payRcdStatusDf = pd.DataFrame(columns=consts.creditTradeDetailHeader_payRcdStatus,index=[payRcdStatusIndex])
  88. #查询记录明细指标
  89. queryRecordDetailIndex = '信贷审批查询记录明细'
  90. queryRecordDetailDf = pd.DataFrame(columns=consts.queryRecordDetailHeader,index=[queryRecordDetailIndex])
  91. #住房公积金
  92. housingFundRcdIndex = '住房公积金参缴记录'
  93. housingFundRcdDf = pd.DataFrame(columns=consts.housingFundRcdHeader,index=[housingFundRcdIndex])
  94. #汇算-其他
  95. otherIndex = '慧算账新增'
  96. otherDf = pd.DataFrame(columns=consts.otherHeader,index=[otherIndex])
  97. sanshouIndex = '恒昌新增'
  98. sanshouDf = pd.DataFrame(columns=consts.sanShouHeader,index=[sanshouIndex])
  99. #0916
  100. juziIndex = '桔子新增'
  101. juziDf = pd.DataFrame(columns=consts.juziHeader,index=[juziIndex])
  102. #基础信息字段补充,从欠税记录到查询记录(已补完),中间略去本人声明和异注声明
  103. #基础身份信息
  104. baseIdentityInfo = "基础身份信息"
  105. baseIdentityInfoDf = pd.DataFrame(columns=constsBase.identityInfo,index=[baseIdentityInfo])
  106. #基础配偶信息
  107. baseMateInfo = "基础配偶信息"
  108. baseMateInfoDf = pd.DataFrame(columns=constsBase.mateInfo,index=[baseMateInfo])
  109. #基础居住信息
  110. baseLiveInfo = "基础居住信息"
  111. baseLiveInfoDf = pd.DataFrame(columns=constsBase.liveInfo,index=[baseLiveInfo])
  112. #基础职业信息
  113. baseOccupationInfo = "基础职业信息"
  114. baseOccupationInfoDf = pd.DataFrame(columns=constsBase.occupationInfo,index=[baseOccupationInfo])
  115. #个人信用报告"数字解读"
  116. personalCreditInfo = "个人信用报告'数字解读'"
  117. personalCreditInfoDf = pd.DataFrame(columns=constsBase.personalCreditInfo,index=[personalCreditInfo])
  118. #信贷交易信息提示
  119. briefInfoHeaderLoanTradeInfo = "信贷交易信息提示"
  120. briefInfoHeaderLoanTradeInfoDf = pd.DataFrame(columns=constsBase.briefInfoHeaderLoanTradeInfo,index=[briefInfoHeaderLoanTradeInfo])
  121. #被追偿信息汇总
  122. recoveryInfoSumIndexY = '信贷交易违约信息概要'
  123. briefInfoDf_recoveryInfoSumY = pd.DataFrame(columns=constsBase.briefInfoHeader_recoveryInfoY,index=[recoveryInfoSumIndexY])
  124. #呆账信息汇总
  125. badDebtsInfoIndexY = '呆账信息汇总'
  126. briefInfoDf_badDebtsInfoSumY = pd.DataFrame(columns=constsBase.briefInfoHeader_badDebtsInfoSumY,index=[badDebtsInfoIndexY])
  127. #逾期(透支)信息汇总
  128. overdueInfoSumIndexY='逾期(透支)信息汇总'
  129. briefInfoDf_overdueInfoSumY = pd.DataFrame(columns=constsBase.briefInfoHeader_overdueInfoSumY,index=[overdueInfoSumIndexY])
  130. #信贷交易授信及负债信息概要
  131. creditTransactionCredit = "信贷交易授信及负债信息概要"
  132. creditTransactionCreditDf = pd.DataFrame(columns=constsBase.creditTransactionCredit,index=[creditTransactionCredit])
  133. #非信贷交易信息概要
  134. nonCreditTransactions = "非信贷交易信息概要"
  135. nonCreditTransactionsDf = pd.DataFrame(columns=constsBase.nonCreditTransactions,index=[nonCreditTransactions])
  136. #公共信息概要
  137. publicInformation = "公共信息概要"
  138. publicInformationDf = pd.DataFrame(columns=constsBase.publicInformation,index=[publicInformation])
  139. #查询记录概要
  140. queryRecord = "查询记录概要"
  141. queryRecordDf = pd.DataFrame(columns=constsBase.queryRecord,index=[queryRecord])
  142. #被追偿信息
  143. recoveryInformation = "被追偿信息"
  144. recoveryInformationDf = pd.DataFrame(columns=constsBase.recoveryInformation,index=[recoveryInformation])
  145. #非循环贷账户
  146. nonRevolvingLoan = "非循环贷账户"
  147. nonRevolvingLoanDf = pd.DataFrame(columns=constsBase.nonRevolvingLoan,index=[nonRevolvingLoan])
  148. #循环额度下分账户
  149. revolvingLoneSubAccount = "循环额度下分账户"
  150. revolvingLoneSubAccountDf = pd.DataFrame(columns=constsBase.revolvingLoneSubAccount,index=[revolvingLoneSubAccount])
  151. #循环贷账户
  152. revolvingLone = "循环贷账户"
  153. revolvingLoneDf = pd.DataFrame(columns=constsBase.revolvingLone,index=[revolvingLone])
  154. #贷记卡账户
  155. creditCard = "贷记卡账户"
  156. creditCardDf = pd.DataFrame(columns=constsBase.creditCard,index=[creditCard])
  157. #准贷记卡账户
  158. quasiCreditCard = "准贷记卡账户"
  159. quasiCreditCardDf = pd.DataFrame(columns=constsBase.quasiCreditCard,index=[quasiCreditCard])
  160. #相关还款责任信息
  161. relevantRepaymentLiability = "相关还款责任信息"
  162. relevantRepaymentLiabilityDf = pd.DataFrame(columns=constsBase.relevantRepaymentLiability,index=[relevantRepaymentLiability])
  163. #授信协议信息
  164. creditAgreement = "授信协议信息"
  165. creditAgreementDf = pd.DataFrame(columns=constsBase.creditAgreement,index=[creditAgreement])
  166. #后付费记录(未开发)
  167. postPaidRecord = "后付费记录"
  168. postPaidRecordDf = pd.DataFrame(columns=constsBase.postPaidRecord,index=[postPaidRecord])
  169. #欠税记录
  170. taxArrearsIndex = '欠税记录'
  171. taxArrearsDf = pd.DataFrame(columns=constsBase.taxArrears,index=[taxArrearsIndex])
  172. #民事判决记录
  173. civilJudgmentIndex = '民事判决记录'
  174. civilJudgmentDf = pd.DataFrame(columns=constsBase.civilJudgment,index=[civilJudgmentIndex])
  175. #强制执行记录
  176. enforceIndex = '强制执行记录'
  177. enforceDf = pd.DataFrame(columns=constsBase.enforce,index=[enforceIndex])
  178. #行政处罚记录
  179. administrativePunishmentIndex = '行政处罚记录'
  180. administrativePunishmentDf = pd.DataFrame(columns=constsBase.administrativePunishment,index=[administrativePunishmentIndex])
  181. #住房公积金参缴记录
  182. housingProvidentFundParticipationIndex = '住房公积金参缴记录'
  183. housingProvidentFundParticipationIndexDf = pd.DataFrame(columns=constsBase.housingProvidentFundParticipation,index=[housingProvidentFundParticipationIndex])
  184. #低保救助记录
  185. subsistenceAllowanceAssistanceIndex = '低保救助记录'
  186. subsistenceAllowanceAssistanceDf = pd.DataFrame(columns=constsBase.subsistenceAllowanceAssistance,index=[subsistenceAllowanceAssistanceIndex])
  187. #执业资格记录
  188. practiceQualificationIndex = '执业资格记录'
  189. practiceQualificationDf = pd.DataFrame(columns=constsBase.practiceQualification,index=[practiceQualificationIndex])
  190. #行政奖励记录
  191. administrativeIncentiveIndex = '行政奖励记录'
  192. administrativeIncentiveDf = pd.DataFrame(columns=constsBase.administrativeIncentive,index=[administrativeIncentiveIndex])
  193. #本人声明
  194. personalDeclaration = "本人声明"
  195. personalDeclarationDf = pd.DataFrame(columns=constsBase.personalDeclaration,index=[personalDeclaration])
  196. #异议标注
  197. objectionMarking = "异议标注"
  198. objectionMarkingDf = pd.DataFrame(columns=constsBase.objectionMarking,index=[objectionMarking])
  199. #查询记录
  200. queryRecordIndex = '查询记录'
  201. queryRecordDf = pd.DataFrame(columns=constsBase.queryRecord,index=[queryRecordIndex])
  202. #待执行的sql语句
  203. sqlMap = []
  204. class XmlSelfParser(object):
  205. def getNodeData(self,node, key):
  206. data = ""
  207. try:
  208. if len(node.getElementsByTagName(key)) > 0:
  209. nodeValue = node.getElementsByTagName(key)[0].childNodes
  210. if len(nodeValue)>0:
  211. data = nodeValue[0].data
  212. except Exception:
  213. logger.error("getNodeData error")
  214. info = sys.exc_info()
  215. logger.error(info[0])
  216. logger.error(info[1])
  217. logger.error(traceback.extract_tb(info[2], 1))
  218. return data;
  219. def parse(self, xmlData):
  220. result = "{"
  221. try:
  222. docXml = minidom.parseString(xmlData)
  223. # print("xmlData" + xmlData)
  224. # print("docXml" +docXml)
  225. queryInfo = self.parseQueryInfo(docXml)
  226. reportTime = queryInfo["reportTime"];
  227. start = timeit.default_timer();
  228. logger.info(queryInfo["queryInfoCardId"] + "基本信息解析开始")
  229. self.parseIdentity(reportTime,docXml)
  230. self.parseLiveInfo(docXml)
  231. self.parseOccupationInfoDf(reportTime,docXml)
  232. self.parseLoanTradeInfo(docXml)
  233. self.parseRecoveryInfoSum(docXml)
  234. self.parseBadDebtsInfoSumDf(docXml)
  235. self.parseOverdueInfoSum(docXml)
  236. self.parseLoanAccountInfoSum(docXml)
  237. self.parseCycleCreditAccountInfoSum(docXml);
  238. self.parseCyleLoanAccountInfoSum(docXml);
  239. self.parseCreditCardInfoSum(docXml)
  240. self.parseCreditCardInfoSumZ(docXml)
  241. self.parseRepaymentSum(docXml)
  242. self.parsePublicInfoBrief(docXml)
  243. self.parseQueryRecordSum(docXml)
  244. self.parseQueryInfoDetail(reportTime,docXml)
  245. self.parseHousingFundRcd(reportTime,docXml)
  246. #新增加
  247. self.parseCivilJudgment(docXml) #yuan
  248. s = timeit.default_timer() - start
  249. logger.info(str(s) + " 秒")
  250. logger.info(queryInfo["queryInfoCardId"] + "基本信息解析完成")
  251. loanAccountDfs = []
  252. start = timeit.default_timer();
  253. logger.info(queryInfo["queryInfoCardId"]+"贷款解析开始")
  254. # 非循环
  255. noloopcreditaccountbols = self.mergeLoanDf(reportTime, docXml, "NOLOOPCREDITACCOUNTBOLS")
  256. # 循环额度
  257. loopquotaaccountbols = self.mergeLoanDf(reportTime, docXml, "LOOPQUOTAACCOUNTBOLS")
  258. # 循环贷账户
  259. loopcreditaccountbols = self.mergeLoanDf(reportTime, docXml, "LOOPCREDITACCOUNTBOLS")
  260. loanAccountDfs = noloopcreditaccountbols + loopquotaaccountbols + loopcreditaccountbols
  261. # print(len(loanAccountDfs))
  262. s = timeit.default_timer() - start
  263. logger.info(str(s) + " 秒")
  264. logger.info(queryInfo["queryInfoCardId"] + "贷款解析完成")
  265. start = timeit.default_timer();
  266. logger.info(queryInfo["queryInfoCardId"] + "信用卡解析开始")
  267. creditCardAccountDfs = self.mergeCreditCardDf(reportTime, docXml)
  268. # print(len(creditCardAccountDfs))
  269. creditCardAccountDfsZ = self.mergeCreditCardDfZ(reportTime, docXml)
  270. # print(len(creditCardAccountDfsZ))
  271. # 合并贷款
  272. loanMergeDf = pd.DataFrame(columns=dfParser.dfHeaderLoan)
  273. loanPayRecordMergeDf = pd.DataFrame(columns=dfParser.dfHeaderLoanPayRecord)
  274. loanSpecialTradeMergeDf = pd.DataFrame(columns=dfParser.dfHeaderLoanSpecialTrade) # 特殊交易
  275. loanMergeDfDs = []
  276. loanPayRecordMergeDfDs = []
  277. # for loanDfObj in loanAccountDfs:
  278. # loanMergeDf = pd.concat([loanMergeDf, loanDfObj["loanDf"]], axis=0, ignore_index=True);
  279. # loanPayRecordMergeDf = pd.concat([loanPayRecordMergeDf, loanDfObj["loanPayRecordDf"]], axis=0,ignore_index=True);
  280. # loanSpecialTradeMergeDf = pd.concat([loanSpecialTradeMergeDf, loanDfObj["specialTradeDf"]], axis=0,ignore_index=True);
  281. for loanDfObj in loanAccountDfs:
  282. loanMergeDfDs.append(loanDfObj["loanDf"])
  283. if loanDfObj["loanPayRecordDf"]!=None:
  284. loanPayRecordMergeDfDs.extend(loanDfObj["loanPayRecordDf"])
  285. loanSpecialTradeMergeDf = pd.concat([loanSpecialTradeMergeDf, loanDfObj["specialTradeDf"]], axis=0,ignore_index=True);
  286. if len(loanMergeDfDs)>0:
  287. loanMergeDf = pd.DataFrame(loanMergeDfDs)
  288. if len(loanPayRecordMergeDfDs)>0:
  289. loanPayRecordMergeDf = pd.DataFrame(loanPayRecordMergeDfDs)
  290. # 合并贷记卡
  291. creditCardMergeDf = pd.DataFrame(columns=dfParser.dfHeaderCreditCard)
  292. creditCardPayRecordMergeDf = pd.DataFrame(columns=dfParser.dfHeaderCreditCardPayRecord)
  293. for creditCardDfObj in creditCardAccountDfs:
  294. creditCardMergeDf = pd.concat([creditCardMergeDf, creditCardDfObj["creditCardDf"]], axis=0,ignore_index=True);
  295. creditCardPayRecordMergeDf = pd.concat([creditCardPayRecordMergeDf, creditCardDfObj["creditCardPayRecordDf"]], axis=0, ignore_index=True);
  296. # 准贷记卡合并df
  297. creditCardMergeDfZ = pd.DataFrame(columns=dfParser.dfHeaderCreditCardZ)
  298. creditCardPayRecordMergeDfZ = pd.DataFrame(columns=dfParser.dfHeaderCreditCardPayRecordZ)
  299. for creditCardDfObj in creditCardAccountDfsZ:
  300. creditCardMergeDfZ = pd.concat([creditCardMergeDfZ, creditCardDfObj["creditCardDfZ"]], axis=0,ignore_index=True);
  301. creditCardPayRecordMergeDfZ = pd.concat([creditCardPayRecordMergeDfZ, creditCardDfObj["creditCardPayRecordDfZ"]], axis=0,ignore_index=True);
  302. s = timeit.default_timer() - start
  303. logger.info(str(s) + " 秒")
  304. logger.info(queryInfo["queryInfoCardId"] + "信用卡解析完成")
  305. result += utils.toJson(identityInfoDf) + ","
  306. result += utils.toJson(mateInfoDf) + ","
  307. result += utils.toJson(liveInfoDf) + ","
  308. result += utils.toJson(occupationInfoDf) + ","
  309. result += "briefInfoDf_loanTradeInfo" + "," # 占位符
  310. result += "briefInfoDf_recoveryInfoSum" + "," # 占位符
  311. result += "briefInfoDf_overdueInfoSum" + ","
  312. result += utils.toJson(briefInfoDf_badDebtsInfoSum) + ","
  313. result += utils.toJson(briefInfoDf_loanTradeCreditInfo) + ","
  314. result += utils.toJson(publicInfoBriefDf) + ","
  315. result += utils.toJson(civilJudgmentDf) + "," #yuan
  316. result += utils.toJson(queryRecordSumDf) + ","
  317. # 合并被追偿信息DF
  318. recoveryInfoMergeDf = self.mergeRecoveryInfoDf(reportTime, docXml)
  319. self.parseRecoveryInfoMergeDf(recoveryInfoMergeDf)
  320. result = result.replace("briefInfoDf_recoveryInfoSum", utils.toJson(briefInfoDf_recoveryInfoSum)) # 替换汇总中的指标
  321. result += utils.toJson(creditTradeDetailDf_recoveryInfo) + "," # 设置占位符,由于存在概要的指标在明细中计算
  322. # 特殊交易
  323. self.parseSpecialTrade(loanSpecialTradeMergeDf)
  324. result += utils.toJson(creditTradeDetailHeader_specialTrade) + ","
  325. # 信贷交易明细-解析非循环贷账户
  326. self.parseLoanAccountInfo(loanMergeDf);
  327. result += utils.toJson(creditTradeDetailDf_loanAccountInfo) + ","
  328. # 循环额度分账户
  329. self.parseCycleCreditAccountInfo(loanMergeDf);
  330. result += utils.toJson(creditTradeDetailDf_cycleCreditAccountInfo) + ","
  331. # 循环贷
  332. self.parseCycleLoanAccountInfo(loanMergeDf);
  333. result += utils.toJson(creditTradeDetailDf_cycleLoanAccountInfo) + ","
  334. # 解析贷款账户指标
  335. start = timeit.default_timer();
  336. self.parseLoanMergeDf(loanMergeDf,reportTime);
  337. s = timeit.default_timer() - start
  338. logger.info("解析贷款账户指标 " + str(s) + " 秒")
  339. # 解析还款记录相关指标
  340. start = timeit.default_timer();
  341. self.parseLoanMergeAndPayRecordDf(loanMergeDf, loanPayRecordMergeDf,reportTime);
  342. s = timeit.default_timer() - start
  343. logger.info("解析还款记录相关指标 " + str(s) + " 秒")
  344. result += utils.toJson(loanAccountInfoDf) + ","
  345. # 解析贷记卡账户指标
  346. self.parseCreditCardMergeDf(creditCardMergeDf,reportTime);
  347. self.parseCreditCardMergeAndPayRecordDf(creditCardMergeDf, creditCardPayRecordMergeDf,reportTime)
  348. # 解析准贷记卡相关指标
  349. self.parseCreditCardMergeDfZ(creditCardMergeDfZ, creditCardPayRecordMergeDfZ);
  350. result += utils.toJson(creditCardAccountInfoDf) + ","
  351. result += utils.toJson(creditCardAccountInfoDfZ) + ","
  352. # 使用率
  353. self.parseUseRate()
  354. result += utils.toJson(useRateDf) + ","
  355. # 开户数
  356. self.parseOpenAccount(loanMergeDf, creditCardMergeDf, creditCardMergeDfZ, recoveryInfoMergeDf, loanPayRecordMergeDf,creditCardPayRecordMergeDf, creditCardPayRecordMergeDfZ,reportTime)
  357. result += utils.toJson(openAccountDf) + ","
  358. # 24期还款状态
  359. start = timeit.default_timer();
  360. self.parsePayRcdStatus(loanMergeDf, creditCardMergeDf, creditCardMergeDfZ, loanPayRecordMergeDf,creditCardPayRecordMergeDf, creditCardPayRecordMergeDfZ,reportTime)
  361. s = timeit.default_timer() - start
  362. logger.info("24期还款状态 " + str(s) + " 秒")
  363. result += utils.toJson(payRcdStatusDf) + ","
  364. # 由于逾期汇总的指标再还款状态之后需要替换占位 TODO
  365. result = result.replace("briefInfoDf_overdueInfoSum", utils.toJson(briefInfoDf_overdueInfoSum))
  366. # 0525 由于在开户数后,统计信贷信息概要的指标,替换占位符
  367. result = result.replace("briefInfoDf_loanTradeInfo", utils.toJson(briefInfoDf_loanTradeInfo))
  368. # 公积金
  369. result += utils.toJson(housingFundRcdDf) + ","
  370. result += utils.toJson(queryRecordDetailDf) + ","
  371. #取消汇算帐
  372. result += utils.toJson(otherDf) + ","
  373. #三寿新增
  374. result += utils.toJson(sanshouDf) + ","
  375. self.calcFirstBusMonth(reportTime)
  376. self.getLastOverdueMonthJz(loanMergeDf,creditCardMergeDf,loanPayRecordMergeDf,creditCardPayRecordMergeDf,reportTime)
  377. result += utils.toJson(juziDf)
  378. result += "}"
  379. except Exception:
  380. info = sys.exc_info()
  381. # logger.error(str(Exception))
  382. logger.error(queryInfo["queryInfoCardId"]+" error")
  383. logger.error(info[0])
  384. logger.error(info[1])
  385. logger.error(traceback.extract_tb(info[2], 1))
  386. # logger.error( 'str(Exception):\t', str(Exception))
  387. # logger.error('str(e):\t\t', str(e))
  388. # logger.error('repr(e):\t', repr(e))
  389. # logger.error('e.message:\t', e.message)
  390. logger.error(traceback.print_exc())
  391. logger.error(traceback.format_exc())
  392. mailUtil = MailUtil();
  393. webhook = 'https://oapi.dingtalk.com/robot/send?access_token=64d8b2c7fed4949e9433b807c7c5559939f1517af8f77c1dacb4de19c6910b56'
  394. mailUtil.dingtalk("号码:"+queryInfo["queryInfoCardId"]+" 解析错误 "+traceback.format_exc(),webhook)
  395. return result,sqlMap;
  396. # 解析被查询信息指标
  397. def parseQueryInfo(self,docXml):
  398. headbo = docXml.documentElement.getElementsByTagName("HEADBO")[0]
  399. reportTime= self.getNodeData(headbo,"RPTTIME")
  400. queryInfo = {};
  401. queryInfoCardId = self.getNodeData(headbo,"CRENUMBER")
  402. queryInfo["reportTime"] = reportTime.replace("T"," ")
  403. queryInfo["queryInfoCardId"] = queryInfoCardId; # 被查询者证件号码
  404. otherDf.loc[otherIndex, '报告查询日期'] = queryInfo["reportTime"];
  405. sanshouDf.loc[sanshouIndex,"身份证号前两位"]=queryInfoCardId[0:2]
  406. # print(queryInfo)
  407. RPTNO = self.getNodeData(headbo, "RPTNO")
  408. self.RPTNO = RPTNO
  409. self.saveNode(headbo)
  410. return queryInfo;
  411. #xml节点入库
  412. def saveNode(self,node):
  413. try:
  414. RPTNO = self.RPTNO
  415. if node.nodeName == "HEADBO":
  416. sql = "insert into "+node.nodeName+"("
  417. # 保存根节点
  418. childNodes = node.childNodes;
  419. for child in childNodes:
  420. sql += child.nodeName+","
  421. sql=sql[:-1]
  422. sql += ")"
  423. sql+="values("
  424. for child in childNodes:
  425. if len(child.childNodes) == 1:
  426. sql +="'"+ child.childNodes[0].data + "',"
  427. else:
  428. sql += "'" + "" + "',"
  429. if sql.endswith(","):
  430. sql = sql[:-1]
  431. sql += ")"
  432. else:#保存其它节点
  433. sql = "insert into " + node.nodeName + "(RPTNO,"
  434. # 保存根节点
  435. childNodes = node.childNodes;
  436. for child in childNodes:
  437. if child.nodeName=='RINFOLS':
  438. continue
  439. sql += child.nodeName + ","
  440. sql = sql[:-1]
  441. sql += ")"
  442. sql += "values("+"'"+RPTNO+"',"
  443. for child in childNodes:
  444. if child.nodeName=='RINFOLS':
  445. continue
  446. if len(child.childNodes) == 1:
  447. sql += "'" + child.childNodes[0].data + "',"
  448. else:
  449. sql += "'" + "" + "',"
  450. if sql.endswith(","):
  451. sql = sql[:-1]
  452. sql += ")"
  453. sqlMap.append(sql)
  454. except:
  455. logger.error(traceback.print_exc())
  456. logger.error(traceback.format_exc())
  457. def saveNodeWithType(self,node,TYPE):
  458. try:
  459. RPTNO = self.RPTNO
  460. sql = "insert into " + node.nodeName + "(TYPE,RPTNO,"
  461. # 保存根节点
  462. childNodes = node.childNodes;
  463. for child in childNodes:
  464. if child.nodeName=='RINFOLS':
  465. continue
  466. sql += child.nodeName + ","
  467. sql = sql[:-1]
  468. sql += ")"
  469. sql += "values("+"'"+TYPE+"','"+RPTNO+"',"
  470. for child in childNodes:
  471. if child.nodeName=='RINFOLS':
  472. continue
  473. if len(child.childNodes) == 1:
  474. sql += "'" + child.childNodes[0].data + "',"
  475. else:
  476. sql += "'" + "" + "',"
  477. if sql.endswith(","):
  478. sql = sql[:-1]
  479. sql += ")"
  480. sqlMap.append(sql)
  481. except:
  482. logger.error(traceback.print_exc())
  483. logger.error(traceback.format_exc())
  484. def parseIdentity(self,reportTime,docXml):
  485. tmpNode =docXml.documentElement.getElementsByTagName("BASEINFO")
  486. if len(tmpNode)>0:
  487. baseInfo = docXml.documentElement.getElementsByTagName("BASEINFO")[0]
  488. print(str(baseInfo))
  489. self.saveNode(baseInfo)
  490. tmpNode = docXml.documentElement.getElementsByTagName("MARRIAGEINFOSG")
  491. identityInfoDf.loc[identityInfoIndex, '性别'] = self.getNodeData(baseInfo,"SEXDESC")
  492. identityInfoDf.loc[identityInfoIndex, '出生日期'] = self.getNodeData(baseInfo,"BIRTHDAY")
  493. identityInfoDf.loc[identityInfoIndex, '国籍'] = self.getNodeData(baseInfo,"NATIONDESC")
  494. identityInfoDf.loc[identityInfoIndex, '户籍地址'] = self.getNodeData(baseInfo,"ADDRESS")
  495. if len(tmpNode)>0:
  496. marriageinfosg = docXml.documentElement.getElementsByTagName("MARRIAGEINFOSG")[0]
  497. self.parseMate(marriageinfosg)
  498. identityInfoDf.loc[identityInfoIndex, '婚姻状况'] = self.getNodeData(marriageinfosg,"MARSTATUDESC")
  499. identityInfoDf.loc[identityInfoIndex, '学历'] = self.getNodeData(baseInfo,"DEGREEDESC")
  500. identityInfoDf.loc[identityInfoIndex, '学位'] = self.getNodeData(baseInfo,"DEGREEDESC")
  501. identityInfoDf.loc[identityInfoIndex, '通讯地址'] = self.getNodeData(baseInfo,"COMMUADDRESS")
  502. identityInfoDf.loc[identityInfoIndex, '就业状况'] = self.getNodeData(baseInfo,"WORKSTATUSDESC")
  503. mobiles = docXml.documentElement.getElementsByTagName("TELEPHONEINFOSGLS")
  504. if len(mobiles)>0:
  505. telephoneinfosgls = docXml.documentElement.getElementsByTagName("TELEPHONEINFOSGLS")[0]
  506. telephoneinfosg = telephoneinfosgls.getElementsByTagName("TELEPHONEINFOSG");
  507. identityInfoDf.loc[identityInfoIndex, '历史手机号码数'] = len(telephoneinfosg)
  508. identityInfoDf.loc[identityInfoIndex, '近3个月手机号码数'] = self.getLastMonthMobileCount(telephoneinfosg, 3, reportTime)
  509. identityInfoDf.loc[identityInfoIndex, '近6个月手机号码数'] = self.getLastMonthMobileCount(telephoneinfosg, 6, reportTime)
  510. identityInfoDf.loc[identityInfoIndex, '近12个月手机号码数'] = self.getLastMonthMobileCount(telephoneinfosg, 12, reportTime)
  511. identityInfoDf.loc[identityInfoIndex, '近24个月手机号码数'] = self.getLastMonthMobileCount(telephoneinfosg, 24, reportTime)
  512. # print(identityInfoDf.to_json(orient="index",force_ascii=False))
  513. def getLastMonthMobileCount(self,telephoneinfosg, month, reportTime):
  514. df = pd.DataFrame()
  515. for i in range(0,len(telephoneinfosg)):
  516. self.saveNode(telephoneinfosg[i])
  517. telephone = self.getNodeData(telephoneinfosg[i],"TELEPHONE")
  518. updatedateinfo= self.getNodeData(telephoneinfosg[i],"UPDATEDATEINFO")
  519. df.loc[i,0] = telephone
  520. df.loc[i,1] = updatedateinfo
  521. # 当前日期
  522. last1MonthDateStr = reportTime
  523. # 最近一个月
  524. lastMonthDate = np.datetime64(last1MonthDateStr, "D") - np.timedelta64(30 * month, 'D')
  525. lastMonthMobileDf = df[df[1] >= str(lastMonthDate)]
  526. return lastMonthMobileDf.shape[0];
  527. #解析配偶信息
  528. def parseMate(self,marriageinfosg):
  529. self.saveNode(marriageinfosg)
  530. mateInfoDf.loc[mateInfoIndex, '姓名'] = self.getNodeData(marriageinfosg,"SPUOSENAME")
  531. mateInfoDf.loc[mateInfoIndex, '证件号码'] = self.getNodeData(marriageinfosg,"CERTNUM")
  532. mateInfoDf.loc[mateInfoIndex, '工作单位'] = self.getNodeData(marriageinfosg,"COMPANY")
  533. mateInfoDf.loc[mateInfoIndex, '联系电话'] = self.getNodeData(marriageinfosg,"TELNUM")
  534. # print(mateInfoDf.to_json(orient="index", force_ascii=False))
  535. # 解析居住信息
  536. def parseLiveInfo(self,docXml):
  537. # residenceinfosgls = docXml.documentElement.getElementsByTagName("RESIDENCEINFOSGLS")
  538. residenceinfosg = docXml.documentElement.getElementsByTagName("RESIDENCEINFOSG");
  539. df = pd.DataFrame()
  540. for i in range(0, len(residenceinfosg)):
  541. self.saveNode(residenceinfosg[i])
  542. resistatusdesc = self.getNodeData(residenceinfosg[i], "RESISTATUSDESC")
  543. address = self.getNodeData(residenceinfosg[i], "ADDRESS")
  544. telnum = self.getNodeData(residenceinfosg[i], "TELNUM")
  545. updatedateinfo = self.getNodeData(residenceinfosg[i], "UPDATEDATEINFO")
  546. df.loc[i, 0] = resistatusdesc
  547. df.loc[i, 1] = address
  548. df.loc[i, 2] = telnum
  549. df.loc[i, 3] = updatedateinfo
  550. if len(residenceinfosg)>0:
  551. liveInfoDf.loc[liveInfoIndex, '居住地址'] = self.getNodeData(residenceinfosg[0],"ADDRESS")
  552. liveInfoDf.loc[liveInfoIndex, '住宅电话'] = self.getNodeData(residenceinfosg[0],"TELNUM")
  553. liveInfoDf.loc[liveInfoIndex, '历史居住地址个数'] = len(residenceinfosg);
  554. curDate = np.datetime64(time.strftime("%Y-%m-%d"));
  555. last3year = str(curDate)[0:4]
  556. last3yearDate = str(int(last3year) - 3) + str(curDate)[4:10]
  557. lastLiveDf = df[df[3] >= last3yearDate];
  558. liveInfoDf.loc[liveInfoIndex, '最近3年内居住地址个数'] = lastLiveDf.index.size ;
  559. houseIndex = df[df[0] == '自置'].index.size > 0
  560. if (houseIndex):
  561. houseStr = '是'
  562. else:
  563. houseStr = '否'
  564. liveInfoDf.loc[liveInfoIndex, '当前居住状况-是否具有自有住房'] = houseStr;
  565. liveInfoDf.loc[liveInfoIndex, '居住状况'] = self.getNodeData(residenceinfosg[0],"RESISTATUSDESC")
  566. liveInfoDf.loc[liveInfoIndex, '信息更新日期'] = self.getNodeData(residenceinfosg[0],"UPDATEDATEINFO")
  567. # print(liveInfoDf.to_json(orient="index", force_ascii=False))
  568. # 解析职业信息
  569. def parseOccupationInfoDf(self,reportTime,docXml):
  570. vocationinfosg = docXml.documentElement.getElementsByTagName("VOCATIONINFOSG");
  571. df = pd.DataFrame()
  572. if len(vocationinfosg)>0:
  573. for i in range(0, len(vocationinfosg)):
  574. # df.loc[i, 0] = self.getNodeData(vocationinfosg[i], "WORDSTATUSDESC")
  575. self.saveNode(vocationinfosg[i])
  576. df.loc[i, 0] = self.getNodeData(vocationinfosg[i], "CPNTYPEDESC")
  577. df.loc[i, 1] = self.getNodeData(vocationinfosg[i], "TRADEDESC")
  578. df.loc[i, 2] = self.getNodeData(vocationinfosg[i], "VOCATIONDESC")
  579. df.loc[i, 3] = self.getNodeData(vocationinfosg[i], "VOCATIONTITLEDESC")
  580. df.loc[i, 4] = self.getNodeData(vocationinfosg[i], "COMPANY")
  581. df.loc[i, 5] = self.getNodeData(vocationinfosg[i], "CPNADDRESS")
  582. df.loc[i, 6] = self.getNodeData(vocationinfosg[i], "CPNTELNUM")
  583. df.loc[i, 7] = self.getNodeData(vocationinfosg[i], "BEGINYEAR")
  584. df.loc[i, 8] = self.getNodeData(vocationinfosg[i], "INFOUPDATEDATE")
  585. occupationInfoDf.loc[occupationInfoIndex, '工作单位'] = self.getNodeData(vocationinfosg[0], "COMPANY")
  586. last3yearDate = utils.getLastMonthDate(reportTime, 12 * 3)
  587. last3yearOccDf = df[df[8] >= last3yearDate]
  588. occupationInfoDf.loc[occupationInfoIndex, '最近3年内工作单位数'] = last3yearOccDf.index.size;
  589. occupationInfoDf.loc[occupationInfoIndex, '单位电话'] = self.getNodeData(vocationinfosg[0], "CPNTELNUM")
  590. try:
  591. minDateIndex = np.argmin(df[7]);
  592. maxDateIndex = np.argmax(df[7]);
  593. rowYearMin = df.loc[minDateIndex, :].dropna()
  594. rowYearMax = df.loc[maxDateIndex, :].dropna()
  595. if rowYearMin[7] != "":
  596. occupationInfoDf.loc[occupationInfoIndex, '最早进入本单位年份距报告日期时长'] = int(
  597. str(np.datetime64(reportTime, "Y"))) - int(rowYearMin[7])
  598. if rowYearMax[7] != "":
  599. occupationInfoDf.loc[occupationInfoIndex, '最新进入本单位年份距报告日期时长'] = int(
  600. str(np.datetime64(reportTime, "Y"))) - int(rowYearMax[7])
  601. except:
  602. logger.error("最早进入本单位年份距报告日期时长解析异常")
  603. occupationInfoDf.loc[occupationInfoIndex, '单位性质'] = self.getNodeData(vocationinfosg[0], "CPNTYPEDESC")
  604. occupationInfoDf.loc[occupationInfoIndex, '单位地址'] = self.getNodeData(vocationinfosg[0], "CPNADDRESS")
  605. occupationInfoDf.loc[occupationInfoIndex, '职业'] = self.getNodeData(vocationinfosg[0], "VOCATIONDESC")
  606. occupationInfoDf.loc[occupationInfoIndex, '行业'] = self.getNodeData(vocationinfosg[0], "TRADEDESC")
  607. occupationInfoDf.loc[occupationInfoIndex, '职务'] = self.getNodeData(vocationinfosg[0], "TITLEDESC")
  608. occupationInfoDf.loc[occupationInfoIndex, '职称'] = self.getNodeData(vocationinfosg[0], "VOCATIONTITLEDESC")
  609. occupationInfoDf.loc[occupationInfoIndex, '进入本单位年份'] =self.getNodeData(vocationinfosg[0], "BEGINYEAR")
  610. occupationInfoDf.loc[occupationInfoIndex, '信息更新日期'] = self.getNodeData(vocationinfosg[0], "INFOUPDATEDATE")
  611. occupationInfoDf.loc[occupationInfoIndex, '历史工作单位数'] = len(vocationinfosg)
  612. # print(occupationInfoDf.to_json(orient="index", force_ascii=False))
  613. # 信贷交易明细汇总
  614. def parseLoanTradeInfo(self,docXml):
  615. credittipsinfo = docXml.documentElement.getElementsByTagName("CREDITTIPSINFO");
  616. if len(credittipsinfo)>0:
  617. briefInfoDf_loanTradeInfo.loc[loanTradeInfoIndex, '个人住房贷款账户数'] = utils.toInt(self.getNodeData(credittipsinfo[0],"ACCOUNTNUM"))
  618. self.saveNode(credittipsinfo[0])
  619. briefInfoDf_loanTradeInfo.loc[loanTradeInfoIndex, '个人商用房贷款(包括商住两用)账户数'] = utils.toInt(self.getNodeData(credittipsinfo[1],"ACCOUNTNUM"))
  620. self.saveNode(credittipsinfo[1])
  621. briefInfoDf_loanTradeInfo.loc[loanTradeInfoIndex, '其他类贷款账户数'] = utils.toInt(self.getNodeData(credittipsinfo[2],"ACCOUNTNUM"))
  622. self.saveNode(credittipsinfo[2])
  623. briefInfoDf_loanTradeInfo.loc[loanTradeInfoIndex, '贷记卡账户数'] = utils.toInt(self.getNodeData(credittipsinfo[3],"ACCOUNTNUM"))
  624. self.saveNode(credittipsinfo[3])
  625. briefInfoDf_loanTradeInfo.loc[loanTradeInfoIndex, '准贷记卡账户数'] = utils.toInt(self.getNodeData(credittipsinfo[4],"ACCOUNTNUM"))
  626. self.saveNode(credittipsinfo[4])
  627. #汇算
  628. moths = [self.getNodeData(credittipsinfo[0], "FIRSTBUSMONTH"),
  629. self.getNodeData(credittipsinfo[1], "FIRSTBUSMONTH"),self.getNodeData(credittipsinfo[2], "FIRSTBUSMONTH")]
  630. moths=utils.get_real_arr(moths)
  631. if len(moths)>0:
  632. otherDf.loc[otherIndex, '首笔贷款发放月份'] = min(moths)
  633. otherDf.loc[otherIndex, '首张贷记卡发卡月份'] = self.getNodeData(credittipsinfo[3], "FIRSTBUSMONTH")
  634. # print(briefInfoDf_loanTradeInfo.to_json(orient="index", force_ascii=False))
  635. #贷款首次交易或者第一张贷记卡开卡日期距今月份数
  636. #juzi
  637. def calcFirstBusMonth(self,reportTime):
  638. try:
  639. firstLoanMonth = str(otherDf.loc[otherIndex, '首笔贷款发放月份'])
  640. firstCreditMonth = str(otherDf.loc[otherIndex, '首张贷记卡发卡月份'])
  641. dateStr = ""
  642. if str(firstLoanMonth) == "nan":
  643. firstLoanMonth = ""
  644. if firstCreditMonth == "nan":
  645. firstCreditMonth = ""
  646. if firstLoanMonth == "" and firstCreditMonth !="":
  647. dateStr = firstCreditMonth
  648. elif firstCreditMonth == "" and firstLoanMonth !="":
  649. dateStr = firstLoanMonth
  650. elif firstCreditMonth == "" and firstLoanMonth =="":
  651. dateStr = ""
  652. else:
  653. dateStr = min(firstCreditMonth,firstLoanMonth)
  654. if dateStr !="":
  655. juziDf.loc[juziIndex, '贷款首次交易或者第一张贷记卡开卡日期距今月份数'] = utils.difMonthReportTime(dateStr,reportTime)
  656. except:
  657. logger.error(traceback.print_exc())
  658. logger.error(traceback.format_exc())
  659. mailUtil = MailUtil();
  660. webhook = 'https://oapi.dingtalk.com/robot/send?access_token=64d8b2c7fed4949e9433b807c7c5559939f1517af8f77c1dacb4de19c6910b56'
  661. mailUtil.dingtalk("号码:" + " 解析错误 " + traceback.format_exc(), webhook)
  662. # 最近一次逾期距今月份数 juzi
  663. def getLastOverdueMonthJz(self, loanMergeDf, creditCardMergeDf, loanPayRecordMergeDf, creditCardPayRecordMergeDf,
  664. reportTime):
  665. try:
  666. result = None;
  667. if np.sum(loanMergeDf['当前逾期期数']) > 0 or np.sum(creditCardMergeDf['当前逾期期数']) > 0:
  668. result = 0
  669. else:
  670. payRcdDf = loanPayRecordMergeDf.sort_values(by=["账户编号", "还款日期"], ascending=(True, False))
  671. # payRcdDf = payRcdDf.groupby(['账户编号']).head(60)
  672. payRcdDf = utils.replacePayRcdStatusOverdue(payRcdDf) # 替换逾期
  673. payRcdDf = payRcdDf[payRcdDf['还款状态'] > 0]
  674. payRcdDf = utils.replacePayRcdStatusOverdue(payRcdDf) # 替换逾期
  675. loanOverdueDate = np.max(payRcdDf['还款日期'])
  676. payRcdDfCredit = creditCardPayRecordMergeDf.sort_values(by=["账户编号", "还款日期"], ascending=(True, False))
  677. payRcdDfCredit = utils.replacePayRcdStatusOverdue(payRcdDfCredit) # 替换逾期
  678. # payRcdDfCredit = payRcdDfCredit.groupby(['账户编号']).head(60)
  679. payRcdDfCredit = payRcdDfCredit[payRcdDfCredit['还款状态'] > 0]
  680. if not payRcdDf.empty or not payRcdDfCredit.empty:
  681. creditOverdueDate = np.max(payRcdDfCredit['还款日期'])
  682. # reportTime = str(np.datetime64(reportTime, "M")) + "-02"
  683. reportTime = utils.get_last_month_first_day_v2(reportTime)
  684. overdueDate = None
  685. if str(loanOverdueDate) != "nan" and str(creditOverdueDate) != "nan":
  686. overdueDate = max([loanOverdueDate, creditOverdueDate])
  687. elif str(loanOverdueDate) == "nan" and str(creditOverdueDate) != "nan":
  688. overdueDate = creditOverdueDate
  689. elif str(loanOverdueDate) != "nan" and str(creditOverdueDate) == "nan":
  690. overdueDate = loanOverdueDate
  691. if overdueDate != None:
  692. result = utils.difMonthReportTime(overdueDate, reportTime)
  693. juziDf.loc[juziIndex, "用户贷记卡或者贷款最近逾期距今月份数"] = result
  694. except:
  695. logger.error(traceback.print_exc())
  696. logger.error(traceback.format_exc())
  697. mailUtil = MailUtil();
  698. webhook = 'https://oapi.dingtalk.com/robot/send?access_token=64d8b2c7fed4949e9433b807c7c5559939f1517af8f77c1dacb4de19c6910b56'
  699. mailUtil.dingtalk("号码:" + " 解析错误 " + traceback.format_exc(), webhook)
  700. def encodeJuzi(self,value):
  701. result = ""
  702. if value == None:
  703. result = 'A'
  704. elif value >=1 and value <3:
  705. result = 'B'
  706. elif value >=3 and value <5:
  707. result = 'C'
  708. elif value >= 3 and value < 5:
  709. result = 'C'
  710. elif value >= 5 and value < 7:
  711. result = 'D'
  712. elif value >= 7 and value < 10:
  713. result = 'E'
  714. elif value >= 10 and value < 12:
  715. result = 'F'
  716. elif value >= 12 and value < 15:
  717. result = 'G'
  718. elif value >= 15 and value < 17:
  719. result = 'H'
  720. elif value >= 17 and value < 20:
  721. result = 'I'
  722. elif value >= 20 and value < 24:
  723. result = 'J'
  724. elif value >= 24 and value < 30:
  725. result = 'K'
  726. elif value >= 30 and value < 36:
  727. result = 'L'
  728. elif value >= 36 and value < 48:
  729. result = 'M'
  730. elif value >= 48:
  731. result = 'N'
  732. return result
  733. # 解析被追偿信息汇总
  734. def parseRecoveryInfoSum(self,docXml):
  735. recoveredinfosumsmry = docXml.documentElement.getElementsByTagName("RECOVEREDINFOSUMSMRY");
  736. recorinfosumsg = docXml.documentElement.getElementsByTagName("RECORINFOSUMSG")
  737. if len(recoveredinfosumsmry)>0:
  738. if len(recorinfosumsg)>0:
  739. self.saveNode(recorinfosumsg[0])
  740. briefInfoDf_recoveryInfoSum.loc[recoveryInfoSumIndex, '资产处置业务账户数'] = utils.toInt(self.getNodeData(recorinfosumsg[0],"ACCOUNTNUM"))
  741. briefInfoDf_recoveryInfoSum.loc[recoveryInfoSumIndex, '资产处置业务余额'] = utils.replaceAmt(self.getNodeData(recorinfosumsg[0],"BALANCE"))
  742. briefInfoDf_recoveryInfoSum.loc[recoveryInfoSumIndex, '垫款业务账户数'] = utils.toInt(self.getNodeData(recorinfosumsg[1],"ACCOUNTNUM"))
  743. briefInfoDf_recoveryInfoSum.loc[recoveryInfoSumIndex, '垫款业务余额'] = utils.replaceAmt(self.getNodeData(recorinfosumsg[1],"BALANCE"))
  744. self.saveNode(recorinfosumsg[1])
  745. briefInfoDf_recoveryInfoSum.loc[recoveryInfoSumIndex, '合计总账户数'] = utils.toInt(self.getNodeData(recoveredinfosumsmry[0],"ACCOUNTNUMSUM"))
  746. briefInfoDf_recoveryInfoSum.loc[recoveryInfoSumIndex, '合计总余额'] = utils.replaceAmt(self.getNodeData(recoveredinfosumsmry[0],"BALANCESUM"))
  747. self.saveNode(recoveredinfosumsmry[0])
  748. # print(briefInfoDf_recoveryInfoSum.to_json(orient="index", force_ascii=False))
  749. # 解析呆账信息汇总
  750. def parseBadDebtsInfoSumDf(self,docXml):
  751. baddebtssmry = docXml.documentElement.getElementsByTagName("BADDEBTSSMRY");
  752. if len(baddebtssmry)>0:
  753. briefInfoDf_badDebtsInfoSum.loc[badDebtsInfoIndex, '账户数'] = utils.toInt(self.getNodeData(baddebtssmry[0],"ACCOUNTNUM"))
  754. briefInfoDf_badDebtsInfoSum.loc[badDebtsInfoIndex, '余额'] = utils.replaceAmt(self.getNodeData(baddebtssmry[0],"BALANCE"));
  755. self.saveNode(baddebtssmry[0])
  756. # print(briefInfoDf_badDebtsInfoSum.to_json(orient="index", force_ascii=False))
  757. #透支及逾期信息汇总
  758. def parseOverdueInfoSum(self,docXml):
  759. overdraftsumsg = docXml.documentElement.getElementsByTagName("OVERDRAFTSUMSG");
  760. df = pd.DataFrame()
  761. if len(overdraftsumsg)>0:
  762. for i in range(0, len(overdraftsumsg)):
  763. df.loc[i, 0] = self.getNodeData(overdraftsumsg[i], "ACCTYPEDESC")
  764. df.loc[i, 1] = self.getNodeData(overdraftsumsg[i], "ACCSUM")
  765. df.loc[i, 2] = self.getNodeData(overdraftsumsg[i], "MONTHSUM")
  766. df.loc[i, 3] = self.getNodeData(overdraftsumsg[i], "OVERDRAFTMAX")
  767. df.loc[i, 4] = self.getNodeData(overdraftsumsg[i], "OVERMONTH")
  768. self.saveNode(overdraftsumsg[i])
  769. if len(overdraftsumsg)>0:
  770. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '非循环贷帐户账户数'] = utils.toInt(self.getNodeData(overdraftsumsg[0],"ACCSUM"));
  771. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '非循环贷帐户月份数'] = utils.toInt(self.getNodeData(overdraftsumsg[0],"MONTHSUM"));
  772. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '非循环贷帐户单月最高逾期总额'] = utils.replaceAmt(self.getNodeData(overdraftsumsg[0],"OVERDRAFTMAX"));
  773. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '非循环贷帐户最长逾期月数'] = utils.toInt(self.getNodeData(overdraftsumsg[0],"OVERMONTH"));
  774. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '循环额度下分账户账户数'] = utils.toInt(self.getNodeData(overdraftsumsg[1],"ACCSUM"));
  775. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '循环额度下分账户月份数'] = utils.toInt(self.getNodeData(overdraftsumsg[1],"MONTHSUM"));
  776. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '循环额度下分账户单月最高逾期总额'] = utils.replaceAmt(self.getNodeData(overdraftsumsg[1],"OVERDRAFTMAX"));
  777. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '循环额度下分账户最长逾期月数'] = utils.toInt(self.getNodeData(overdraftsumsg[1],"OVERMONTH"));
  778. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '循环贷账户账户数'] = utils.toInt(self.getNodeData(overdraftsumsg[2],"ACCSUM"));
  779. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '循环贷账户月份数'] = utils.toInt(self.getNodeData(overdraftsumsg[2],"MONTHSUM"));
  780. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '循环贷账户单月最高逾期总额'] = utils.replaceAmt(self.getNodeData(overdraftsumsg[2],"OVERDRAFTMAX"));
  781. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '循环贷账户最长逾期月数'] = utils.toInt(self.getNodeData(overdraftsumsg[2],"OVERMONTH"));
  782. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '贷记卡账户账户数'] = utils.toInt(self.getNodeData(overdraftsumsg[3],"ACCSUM"));
  783. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '贷记卡账户月份数'] = utils.toInt(self.getNodeData(overdraftsumsg[3],"MONTHSUM"));
  784. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '贷记卡账户单月逾期总额'] = utils.replaceAmt(self.getNodeData(overdraftsumsg[3],"OVERDRAFTMAX"));
  785. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '贷记卡账户最长逾期月数'] = utils.toInt(self.getNodeData(overdraftsumsg[3],"OVERMONTH"));
  786. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '准贷记卡账户账户数'] = utils.toInt(self.getNodeData(overdraftsumsg[4],"ACCSUM"));
  787. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '准贷记卡账户月份数'] = utils.toInt(self.getNodeData(overdraftsumsg[4],"MONTHSUM"));
  788. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '准贷记卡账户单月透支总额'] = utils.replaceAmt(self.getNodeData(overdraftsumsg[4],"OVERDRAFTMAX"));
  789. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '准贷记卡账户最长透支月数'] = utils.toInt(self.getNodeData(overdraftsumsg[4],"OVERMONTH"));
  790. overdueInfoAccountDf = df[df[1] != ''];
  791. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '该用户所有逾期账户最长逾期/透支月数最大值'] = np.max(overdueInfoAccountDf[4].astype('int'))
  792. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '该用户所有逾期账户数加总'] = np.sum(overdueInfoAccountDf[1].astype('int')) # TODO
  793. # briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '该用户过去5年出现逾期的所有账户数目']=None# TODO
  794. # print(briefInfoDf_overdueInfoSum.to_json(orient="index", force_ascii=False))
  795. # 非循环贷账户信息汇总
  796. def parseLoanAccountInfoSum(self,docXml):
  797. noncyclicalsmry = docXml.documentElement.getElementsByTagName("NONCYCLICALSMRY");
  798. if len(noncyclicalsmry)>0:
  799. # loanAccountInfoSumDf = doFilterCalc(loanAccountInfoSumDf); # 替换为0
  800. #TODO 需要检查是否都有值
  801. # loanAccountInfoSumDf = loanAccountInfoSumDf.reset_index(drop=True)
  802. # row0 = loanAccountInfoSumDf.loc[0, :]
  803. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '非循环贷账户管理机构数'] = int(self.getNodeData(noncyclicalsmry[0],"MANAGEORGNUM"))
  804. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '非循环贷账户账户数'] = int(self.getNodeData(noncyclicalsmry[0],"ACCSUM"))
  805. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '非循环贷账户授信总额'] = utils.replaceAmt(self.getNodeData(noncyclicalsmry[0],"CREDITSUM"))
  806. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '非循环贷账户余额'] = utils.replaceAmt(self.getNodeData(noncyclicalsmry[0],"BALANCE"))
  807. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '非循环贷账户6月平均应还款'] = utils.replaceAmt(self.getNodeData(noncyclicalsmry[0],"LATELY6MON"))
  808. self.saveNode(noncyclicalsmry[0])
  809. # print(briefInfoDf_loanTradeCreditInfo.to_json(orient="index", force_ascii=False))
  810. # 循环额度下分账户
  811. def parseCycleCreditAccountInfoSum(self,docXml):
  812. cybranchaccsmry = docXml.documentElement.getElementsByTagName("CYBRANCHACCSMRY");
  813. if len(cybranchaccsmry) > 0:
  814. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环额度下分账户管理机构数'] = int(self.getNodeData(cybranchaccsmry[0],"MANAGEORGNUM"))
  815. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环额度下分账户账户数'] = int(self.getNodeData(cybranchaccsmry[0],"ACCSUM"))
  816. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环额度下分账户授信总额'] = utils.replaceAmt(self.getNodeData(cybranchaccsmry[0],"CREDITSUM"))
  817. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环额度下分账户余额'] = utils.replaceAmt(self.getNodeData(cybranchaccsmry[0],"BALANCE"))
  818. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环额度下分账户6月平均应还款'] = utils.replaceAmt(self.getNodeData(cybranchaccsmry[0],"LATELY6MON"))
  819. self.saveNode(cybranchaccsmry[0])
  820. # print(briefInfoDf_loanTradeCreditInfo.to_json(orient="index", force_ascii=False))
  821. # 循环贷账户信息
  822. def parseCyleLoanAccountInfoSum(self,docXml):
  823. cyclicalloansmry = docXml.documentElement.getElementsByTagName("CYCLICALLOANSMRY");
  824. if len(cyclicalloansmry) > 0:
  825. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环贷账户管理机构数'] = int(self.getNodeData(cyclicalloansmry[0],"MANAGEORGNUM"))
  826. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环贷账户账户数'] = int(self.getNodeData(cyclicalloansmry[0],"ACCSUM"))
  827. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环贷账户授信总额'] = utils.replaceAmt(self.getNodeData(cyclicalloansmry[0],"CREDITSUM"))
  828. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环贷账户余额'] = utils.replaceAmt(self.getNodeData(cyclicalloansmry[0],"BALANCE"))
  829. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环贷账户6月平均应还款'] = utils.replaceAmt(self.getNodeData(cyclicalloansmry[0],"LATELY6MON"))
  830. self.saveNode(cyclicalloansmry[0])
  831. # 解析贷记卡信息汇总,包含准贷记卡
  832. def parseCreditCardInfoSum(self,docXml):
  833. debitcardaccsmry = docXml.documentElement.getElementsByTagName("DEBITCARDACCSMRY");
  834. if len(debitcardaccsmry) > 0:
  835. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '贷记卡发卡机构数'] = int(self.getNodeData(debitcardaccsmry[0],"CARDISSUERNUM"))
  836. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '贷记卡账户数'] =int(self.getNodeData(debitcardaccsmry[0],"ACCSUM"))
  837. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '贷记卡授信总额'] = utils.replaceAmt(self.getNodeData(debitcardaccsmry[0],"CREDITSUM"))
  838. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '贷记卡单家机构最高授信额'] = utils.replaceAmt(self.getNodeData(debitcardaccsmry[0],"CRAMOUNTMAX"))
  839. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '贷记卡单家机构最低授信额'] =utils.replaceAmt(self.getNodeData(debitcardaccsmry[0],"CRAMOUNTMIN"))
  840. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '贷记卡已用额度'] = utils.replaceAmt(self.getNodeData(debitcardaccsmry[0],"ALREADYUSED"))
  841. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '贷记卡最近6个月平均使用额度'] = utils.replaceAmt(self.getNodeData(debitcardaccsmry[0],"LATELY6MONUSE"))
  842. self.saveNode(debitcardaccsmry[0])
  843. # 解析贷记卡信息汇总,包含准贷记卡
  844. def parseCreditCardInfoSumZ(self,docXml):
  845. zdebitcardaccsmry = docXml.documentElement.getElementsByTagName("ZDEBITCARDACCSMRY");
  846. if len(zdebitcardaccsmry) > 0:
  847. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '准贷记卡发卡机构数'] = int(self.getNodeData(zdebitcardaccsmry[0],"CARDISSUERNUM"))
  848. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '准贷记卡账户数'] =int(self.getNodeData(zdebitcardaccsmry[0],"ACCSUM"))
  849. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '准贷记卡授信总额'] = utils.replaceAmt(self.getNodeData(zdebitcardaccsmry[0],"CREDITSUM"))
  850. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '准贷记卡单家机构最高授信额'] = utils.replaceAmt(self.getNodeData(zdebitcardaccsmry[0],"CRAMOUNTMAX"))
  851. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '准贷记卡单家机构最低授信额'] = utils.replaceAmt(self.getNodeData(zdebitcardaccsmry[0],"CRAMOUNTMIN"))
  852. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '准贷记卡已用额度'] = utils.replaceAmt(self.getNodeData(zdebitcardaccsmry[0],"OVERDRAFT"))
  853. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '准贷记卡最近6个月平均使用额度'] = utils.replaceAmt(self.getNodeData(zdebitcardaccsmry[0],"LATELY6MONDRAFT"))
  854. self.saveNode(zdebitcardaccsmry[0])
  855. # 相关还款责任
  856. def parseRepaymentSum(self,docXml):
  857. repaymentinfosmry = docXml.documentElement.getElementsByTagName("REPAYMENTINFOSMRY");
  858. for item in repaymentinfosmry:
  859. self.saveNode(item)
  860. if len(repaymentinfosmry)>0:
  861. perAccountNum = 0; # 个人账户数
  862. orgAccountNum = 0; # 企业账户数
  863. totalAccountNum = 0; # 总账户数
  864. guaranteeAccountNum = 0; # 相关还款责任总账户数-担保责任
  865. otherAccountNum = 0; # 相关还款责任总账户数-其他
  866. perGuaranteeAmt = 0 # 个人担保金额及其他
  867. orgGuaranteeAmt = 0 # 企业担保金额及其他
  868. totalGuaranteeAmt = 0; # 总担保金额
  869. guaranteeAmt = 0; # 相关还款责任总担保金额
  870. otherPaymentAmt = 0; # 其他还款责任金额
  871. perGuaranteeBalance = 0 # 个人担保余额及其他
  872. orgGuaranteeBalance = 0 # 企业担保余额及其他
  873. totalGuaranteeBalance = 0; # 总担保余额
  874. guaranteeBalance = 0; # 相关还款责任总担保余额
  875. otherPaymentBalance = 0; # 其他还款责任余额
  876. perGuaranteeNum = self.getNodeData(repaymentinfosmry[0],"ACCSUM")
  877. perGuaranteeAmtStr = self.getNodeData(repaymentinfosmry[0], "RELPAYRESPSUM")
  878. perGuaranteeBalanceStr = self.getNodeData(repaymentinfosmry[0], "BALANCE")
  879. perOtherNum = self.getNodeData(repaymentinfosmry[1], "ACCSUM")
  880. perOtherAmt = self.getNodeData(repaymentinfosmry[1], "RELPAYRESPSUM")
  881. perOtherBalance = self.getNodeData(repaymentinfosmry[1], "BALANCE")
  882. enGuaranteeNum = ""
  883. enGuaranteeAmt = ""
  884. enGuaranBalance = ""
  885. enOtherNum = ""
  886. enOtherAmt = ""
  887. enOtherBalance= ""
  888. if len(repaymentinfosmry)>=3:
  889. enGuaranteeNum = self.getNodeData(repaymentinfosmry[2], "ACCSUM")
  890. enGuaranteeAmt = self.getNodeData(repaymentinfosmry[2], "RELPAYRESPSUM")
  891. enGuaranBalance = self.getNodeData(repaymentinfosmry[2], "BALANCE")
  892. if len(repaymentinfosmry) >= 4:
  893. enOtherNum = self.getNodeData(repaymentinfosmry[3], "ACCSUM")
  894. enOtherAmt = self.getNodeData(repaymentinfosmry[3], "RELPAYRESPSUM")
  895. enOtherBalance = self.getNodeData(repaymentinfosmry[3], "BALANCE")
  896. # 计算总账户数
  897. if perGuaranteeNum != "":
  898. perAccountNum = perAccountNum + utils.toInt(perGuaranteeNum)
  899. guaranteeAccountNum = guaranteeAccountNum + utils.toInt(perGuaranteeNum) # 个人担保责任账户数
  900. if perOtherNum != "":
  901. perAccountNum = perAccountNum + utils.toInt(perOtherNum) # 其他
  902. otherAccountNum = otherAccountNum + utils.toInt(perOtherNum) # 其他
  903. if enGuaranteeNum != None:
  904. if enGuaranteeNum != "":
  905. orgAccountNum = orgAccountNum + utils.toInt(enGuaranteeNum)
  906. guaranteeAccountNum = guaranteeAccountNum + utils.toInt(enGuaranteeNum) # 企业担保责任账户数
  907. if enOtherNum != "":
  908. orgAccountNum = orgAccountNum + utils.toInt(enOtherNum) # 其他
  909. otherAccountNum = otherAccountNum + utils.toInt(enOtherNum) # 其他
  910. totalAccountNum = perAccountNum + orgAccountNum
  911. # 计算担保金额
  912. if perGuaranteeAmtStr != "":
  913. perGuaranteeAmt = perGuaranteeAmt + utils.replaceAmt(perGuaranteeAmtStr) # 担保
  914. guaranteeAmt = guaranteeAmt + utils.replaceAmt(perGuaranteeAmtStr) # 担保
  915. if perOtherAmt != "":
  916. perGuaranteeAmt = perGuaranteeAmt + utils.replaceAmt(perOtherAmt) # 其他
  917. otherPaymentAmt = otherPaymentAmt + utils.replaceAmt(perOtherAmt) # 其他
  918. if enGuaranteeAmt != None:
  919. if enGuaranteeAmt != "":
  920. orgGuaranteeAmt = orgGuaranteeAmt + utils.replaceAmt(enGuaranteeAmt) # 担保
  921. guaranteeAmt = guaranteeAmt + utils.replaceAmt(enGuaranteeAmt) # 担保
  922. if enOtherAmt != "":
  923. orgGuaranteeAmt = orgGuaranteeAmt + utils.replaceAmt(enOtherAmt) # 其他
  924. otherPaymentAmt = otherPaymentAmt + utils.replaceAmt(enOtherAmt) # 其他
  925. totalGuaranteeAmt = perGuaranteeAmt + orgGuaranteeAmt
  926. # 计算余额
  927. if perGuaranteeBalanceStr != "":
  928. perGuaranteeBalance = perGuaranteeBalance + utils.replaceAmt(perGuaranteeBalanceStr)
  929. guaranteeBalance = guaranteeBalance + utils.replaceAmt(perGuaranteeBalanceStr) # 个人担保余额
  930. if perOtherBalance != "":
  931. perGuaranteeBalance = perGuaranteeBalance + utils.replaceAmt(perOtherBalance) # 其他
  932. otherPaymentBalance = otherPaymentBalance + utils.replaceAmt(perOtherBalance) # 其他
  933. if enGuaranBalance != None:
  934. if enGuaranBalance != "":
  935. orgGuaranteeBalance = orgGuaranteeBalance + utils.replaceAmt(enGuaranBalance)
  936. guaranteeBalance = guaranteeBalance + utils.replaceAmt(enGuaranBalance) # 企业担保余额
  937. if enOtherBalance != "":
  938. orgGuaranteeBalance = orgGuaranteeBalance + utils.replaceAmt(enOtherBalance)
  939. otherPaymentBalance = otherPaymentBalance + utils.replaceAmt(enOtherBalance) # 其他
  940. totalGuaranteeBalance = perGuaranteeBalance + orgGuaranteeBalance
  941. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总账户数(担保+其他+个人+企业)'] = totalAccountNum
  942. briefInfoDf_loanTradeCreditInfo.loc[
  943. loanTradeCreditInfoIndex, '相关还款责任总担保金额+总还款责任金额(个人+企业)'] = totalGuaranteeAmt
  944. briefInfoDf_loanTradeCreditInfo.loc[
  945. loanTradeCreditInfoIndex, '相关还款责任账户总担保余额+总其他余额(个人+企业)'] = totalGuaranteeBalance
  946. if totalGuaranteeAmt != 0:
  947. briefInfoDf_loanTradeCreditInfo.loc[
  948. loanTradeCreditInfoIndex, '相关还款责任账户总担保余额+总其他余额(个人+企业)/相关还款责任账户总担保金额+总其他金额(个人+企业)'] = \
  949. round(totalGuaranteeBalance / totalGuaranteeAmt, 2)
  950. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任担保总账户数-个人'] = perAccountNum
  951. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总担保金额-个人'] = perGuaranteeAmt
  952. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总担保余额-个人'] = perGuaranteeBalance
  953. if perGuaranteeBalance != 0:
  954. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总担保余额-个人/相关还款责任总担保金额-个人'] = round(
  955. perGuaranteeBalance / perGuaranteeBalance, 2)
  956. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总账户数-企业'] = orgAccountNum
  957. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总担保金额-企业'] = orgGuaranteeAmt
  958. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总担保余额-企业'] = orgGuaranteeBalance
  959. if orgGuaranteeAmt != 0:
  960. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总担保余额-企业/相关还款责任总担保金额-企业'] = round(
  961. orgGuaranteeBalance / orgGuaranteeAmt, 2)
  962. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总账户数-担保责任'] = guaranteeAccountNum
  963. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总担保金额-担保责任'] = guaranteeAmt
  964. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任账户总担保余额-担保责任'] = guaranteeBalance
  965. if guaranteeAmt != 0:
  966. briefInfoDf_loanTradeCreditInfo.loc[
  967. loanTradeCreditInfoIndex, '相关还款责任总担保余额-担保责任/相关还款责任总担保金额-担保责任'] = round(
  968. guaranteeBalance / guaranteeAmt, 2)
  969. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总账户数-其他'] = otherAccountNum
  970. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总担保金额-其他'] = otherPaymentAmt
  971. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任总担保余额-其他'] = otherPaymentBalance
  972. if otherPaymentAmt != 0:
  973. briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '相关还款责任账户总担保余额-其他/相关还款责任账户总担保金额-其他'] = round(otherPaymentBalance / otherPaymentAmt, 2)
  974. # print(briefInfoDf_loanTradeCreditInfo.to_json(orient="index", force_ascii=False))
  975. #解析公共信息汇总
  976. def parsePublicInfoBrief(self,docXml):
  977. comminfosmry = docXml.documentElement.getElementsByTagName("COMMINFOSMRY")
  978. for item in comminfosmry:
  979. self.saveNode(item)
  980. if len(comminfosmry)>0:
  981. publicInfoBriefDf.loc[publicInfoBriefIndex, '欠税信息-记录数'] = utils.toInt(self.getNodeData(comminfosmry[0],"RECORDNUM"))
  982. publicInfoBriefDf.loc[publicInfoBriefIndex, '欠税信息-涉及金额'] = utils.replaceAmt(self.getNodeData(comminfosmry[0],"INVOLVEMONEY"))
  983. publicInfoBriefDf.loc[publicInfoBriefIndex, '民事判决信息-记录数'] = utils.toInt(self.getNodeData(comminfosmry[1],"RECORDNUM"))
  984. publicInfoBriefDf.loc[publicInfoBriefIndex, '民事判决信息-涉及金额'] = utils.replaceAmt(self.getNodeData(comminfosmry[1],"INVOLVEMONEY"))
  985. publicInfoBriefDf.loc[publicInfoBriefIndex, '强制执行信息-记录数'] = utils.toInt(self.getNodeData(comminfosmry[2],"RECORDNUM"))
  986. publicInfoBriefDf.loc[publicInfoBriefIndex, '强制执行信息-涉及金额'] = utils.replaceAmt(self.getNodeData(comminfosmry[2],"INVOLVEMONEY"))
  987. publicInfoBriefDf.loc[publicInfoBriefIndex, '行政处罚信息-记录数'] = utils.toInt(self.getNodeData(comminfosmry[3],"RECORDNUM"))
  988. publicInfoBriefDf.loc[publicInfoBriefIndex, '行政处罚信息-涉及金额'] = utils.replaceAmt(self.getNodeData(comminfosmry[3],"INVOLVEMONEY"))
  989. # 解析查询信息汇总
  990. def parseQueryRecordSum(self,docXml):
  991. queryrecordsumsg = docXml.documentElement.getElementsByTagName("QUERYRECORDSUMSG")
  992. if len(queryrecordsumsg) > 0:
  993. self.saveNode(queryrecordsumsg[0])
  994. queryRecordSumDf.loc[queryRecordSumIndex, '近1月内的查询机构数-贷款审批'] = int(self.getNodeData(queryrecordsumsg[0],"LAST1ORGSP"))
  995. queryRecordSumDf.loc[queryRecordSumIndex, '近1月内的查询机构数-信用卡审批'] = int(self.getNodeData(queryrecordsumsg[0],"LAST1CREDITSP"))
  996. queryRecordSumDf.loc[queryRecordSumIndex, '近1月内的查询次数-贷款审批'] = int(self.getNodeData(queryrecordsumsg[0],"NUMSP"))
  997. queryRecordSumDf.loc[queryRecordSumIndex, '近1月内的查询次数-信用卡审批'] = int(self.getNodeData(queryrecordsumsg[0],"NUMCREDITSP"))
  998. queryRecordSumDf.loc[queryRecordSumIndex, '近1月内的查询次数-本人查询'] = int(self.getNodeData(queryrecordsumsg[0],"LAST1NUMSELF"))
  999. queryRecordSumDf.loc[queryRecordSumIndex, '近2年内的查询次数-贷后管理'] = int(self.getNodeData(queryrecordsumsg[0],"L2YNUMDH"))
  1000. queryRecordSumDf.loc[queryRecordSumIndex, '近2年内的查询次数-担保资格审查'] = int(self.getNodeData(queryrecordsumsg[0],"L2YNUMDBZG"))
  1001. # print(queryRecordSumDf.to_json(orient="index", force_ascii=False))
  1002. # 解析查询记录明细
  1003. def parseQueryInfoDetail(self,reportTime,docXml):
  1004. queryRecordsg = docXml.documentElement.getElementsByTagName("QUERYRECORDSG");
  1005. if len(queryRecordsg)>0:
  1006. df = pd.DataFrame()
  1007. for i in range(0, len(queryRecordsg)):
  1008. self.saveNode(queryRecordsg[i])
  1009. df.loc[i, 1] = self.getNodeData(queryRecordsg[i], "QUERYDATE")
  1010. df.loc[i, 2] = self.getNodeData(queryRecordsg[i], "QUERYORG")
  1011. queryReson = self.getNodeData(queryRecordsg[i], "QUERYREASONDESC")
  1012. df.loc[i, 3] = queryReson
  1013. queryRecordDetailDf.loc[queryRecordDetailIndex, '近1月查询次数'] =qip.getLastMonthQueryTimes(df, 1, "",reportTime)
  1014. queryRecordDetailDf.loc[queryRecordDetailIndex, '近3月查询次数'] =qip.getLastMonthQueryTimes(df, 3, "",reportTime)
  1015. queryRecordDetailDf.loc[queryRecordDetailIndex, '近6月查询次数'] =qip.getLastMonthQueryTimes(df, 6, "",reportTime)
  1016. queryRecordDetailDf.loc[queryRecordDetailIndex, '近12月查询次数'] =qip.getLastMonthQueryTimes(df, 12, "",reportTime)
  1017. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近1个月查询机构数'] =qip.getLastMonthQueryOrgTimes(df, 1, "", reportTime)
  1018. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近3个月查询机构数'] =qip.getLastMonthQueryOrgTimes(df, 3, "", reportTime)
  1019. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近6个月查询机构数'] =qip.getLastMonthQueryOrgTimes(df, 6, "", reportTime)
  1020. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近12个月查询机构数'] =qip.getLastMonthQueryOrgTimes(df, 12, "", reportTime)
  1021. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近24个月查询机构数'] =qip.getLastMonthQueryOrgTimes(df, 24, "", reportTime)
  1022. queryRecordDetailDf.loc[queryRecordDetailIndex, '近3月查询次数贷款审批'] =qip.getLastMonthQueryTimes(df, 3, consts.loanApprove, reportTime)
  1023. queryRecordDetailDf.loc[queryRecordDetailIndex, '近3月查询次数信用卡审批'] =qip.getLastMonthQueryTimes(df, 3, consts.creditCard, reportTime)
  1024. queryRecordDetailDf.loc[queryRecordDetailIndex, '近6月查询次数贷款审批'] =qip.getLastMonthQueryTimes(df, 6, consts.loanApprove, reportTime)
  1025. queryRecordDetailDf.loc[queryRecordDetailIndex, '近6月查询次数信用卡审批'] = qip.getLastMonthQueryTimes(df, 6, consts.creditCard, reportTime)
  1026. queryRecordDetailDf.loc[queryRecordDetailIndex, '近12月查询次数贷款审批'] = qip.getLastMonthQueryTimes(df, 12, consts.loanApprove, reportTime)
  1027. queryRecordDetailDf.loc[queryRecordDetailIndex, '近12月查询次数信用卡审批'] =qip.getLastMonthQueryTimes(df, 12, consts.creditCard, reportTime)
  1028. queryRecordDetailDf.loc[queryRecordDetailIndex, '近3月查询机构数贷款审批'] =qip.getLastMonthQueryOrgTimes(df, 3, consts.loanApprove, reportTime)
  1029. queryRecordDetailDf.loc[queryRecordDetailIndex, '近3月查询机构数信用卡审批'] =qip.getLastMonthQueryOrgTimes(df, 3, consts.creditCard, reportTime)
  1030. queryRecordDetailDf.loc[queryRecordDetailIndex, '近6月查询机构数贷款审批'] =qip.getLastMonthQueryOrgTimes(df, 6, consts.loanApprove, reportTime)
  1031. queryRecordDetailDf.loc[queryRecordDetailIndex, '近6月查询机构数信用卡审批'] = qip.getLastMonthQueryOrgTimes(df, 6, consts.creditCard,reportTime)
  1032. queryRecordDetailDf.loc[queryRecordDetailIndex, '近12月查询机构数贷款审批'] = qip.getLastMonthQueryOrgTimes(df, 12, consts.loanApprove, reportTime)
  1033. queryRecordDetailDf.loc[queryRecordDetailIndex, '近12月查询机构数信用卡审批'] = qip.getLastMonthQueryOrgTimes(df, 12, consts.creditCard,reportTime)
  1034. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近3个月担保资格审查查询次数'] = qip.getLastMonthQueryTimes(df, 3, consts.insuranceAprove,reportTime)
  1035. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近6个月担保资格审查查询次数'] = qip.getLastMonthQueryTimes(df, 6, consts.insuranceAprove,reportTime)
  1036. queryRecordDetailDf.loc[queryRecordDetailIndex, '近12个月担保资格审查查询次数'] = qip.getLastMonthQueryTimes(df, 12, consts.insuranceAprove,reportTime)
  1037. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近6个月贷后管理查询次数'] = qip.getLastMonthQueryTimes(df, 6, consts.loanAfterMgr,reportTime)
  1038. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近12个月贷后管理查询次数'] = qip.getLastMonthQueryTimes(df, 12, consts.loanAfterMgr,reportTime)
  1039. queryRecordDetailDf.loc[queryRecordDetailIndex, '最后一次查询距离现在的月数贷款审批'] = qip.getLastTimeQueryMonth(df, consts.loanApprove,reportTime)
  1040. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近24个月贷后管理查询次数'] = qip.getLastMonthQueryTimes(df, 24, consts.loanAfterMgr, reportTime)
  1041. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近24个月贷款审批审批次数'] = qip.getLastMonthQueryTimes(df, 24, consts.loanApprove, reportTime)
  1042. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近24个月信用卡审批查询次数'] = qip.getLastMonthQueryTimes(df, 24, consts.creditCard,reportTime)
  1043. queryRecordDetailDf.loc[queryRecordDetailIndex, '最近24个月担保资格审查查询次数'] = qip.getLastMonthQueryTimes(df, 24, consts.insuranceAprove,reportTime)
  1044. #三寿 100年所有信用卡审批
  1045. sanshouDf.loc[sanshouIndex, '贷后管理最近3个月内的机构查询次数'] = qip.getLastMonthQueryTimes(df, 3, consts.loanAfterMgr,reportTime)
  1046. sanshouDf.loc[sanshouIndex, '信用卡审批所有机构查询次数'] =qip.getLastMonthQueryTimes(df, 12*100, consts.creditCard, reportTime)
  1047. sanshouDf.loc[sanshouIndex, '所有本人查询次数'] = qip.getSelfLastMonthQueryTimes(df, 12 * 100,reportTime)
  1048. sanshouDf.loc[sanshouIndex, '最近1年内本人查询次数'] = qip.getSelfLastMonthQueryTimes(df, 12, reportTime)
  1049. sanshouDf.loc[sanshouIndex, '最近2年内本人查询次数'] = qip.getSelfLastMonthQueryTimes(df, 24, reportTime)
  1050. # print(queryRecordDetailDf.to_json(orient="index", force_ascii=False))
  1051. def parseHousingFundRcd(self,reportTime,docXml):
  1052. housingfund = docXml.documentElement.getElementsByTagName("HOUSINGFUND");
  1053. if len(housingfund) >0 :
  1054. df = pd.DataFrame()
  1055. for i in range(0, len(housingfund)):
  1056. self.saveNode(housingfund[i])
  1057. df.loc[i, 0] = self.getNodeData(housingfund[i], "ADDRESSDESC")#参缴地
  1058. df.loc[i, 1] = self.getNodeData(housingfund[i], "PAYDATE")#参缴日期
  1059. df.loc[i, 2] = self.getNodeData(housingfund[i], "STATUSDESC")#缴费状态
  1060. df.loc[i, 3] = self.getNodeData(housingfund[i], "BEGINMONTH")#初缴月份
  1061. df.loc[i, 4] = self.getNodeData(housingfund[i], "ENDMONTH")#缴至月份
  1062. df.loc[i, 5] = self.getNodeData(housingfund[i], "COMPROPORTION")#个人存缴比例
  1063. df.loc[i, 6] = self.getNodeData(housingfund[i], "PEPROPORTION")#个人存缴比例
  1064. df.loc[i, 7] = utils.replaceAmt(self.getNodeData(housingfund[i], "MONTHMONEY"))#月缴存额
  1065. df.loc[i, 8] = self.getNodeData(housingfund[i], "COMPANY")#缴费单位
  1066. df.loc[i, 9] = self.getNodeData(housingfund[i], "UPDATEDATE")#信息更新日期
  1067. lastHousingFundRcdDf = df.sort_values(by=9, ascending=(False)).reset_index(drop=True)
  1068. lastHousingFundRcdDf = lastHousingFundRcdDf[0:1] # 最新
  1069. row1 = lastHousingFundRcdDf.loc[0, :].dropna().reset_index(drop=True)
  1070. housingFundRcdDf.loc[housingFundRcdIndex, '参缴地'] = row1[0]
  1071. housingFundRcdDf.loc[housingFundRcdIndex, '参缴日期'] = row1[1]
  1072. housingFundRcdDf.loc[housingFundRcdIndex, '初缴月份'] = row1[3] # 初缴日期
  1073. housingFundRcdDf.loc[housingFundRcdIndex, '缴至月份'] = row1[4]
  1074. housingFundRcdDf.loc[housingFundRcdIndex, '缴费状态'] = row1[2]
  1075. housingFundRcdDf.loc[housingFundRcdIndex, '月缴存额'] = row1[7]
  1076. housingFundRcdDf.loc[housingFundRcdIndex, '个人存缴比例'] = row1[6]
  1077. housingFundRcdDf.loc[housingFundRcdIndex, '单位存缴比例'] = row1[5]
  1078. housingFundRcdDf.loc[housingFundRcdIndex, '缴费单位'] = row1[8] # 扣缴单位
  1079. housingFundRcdDf.loc[housingFundRcdIndex, '信息更新日期'] = row1[9]
  1080. lastDateStr = utils.getLastMonthDate(reportTime, 12)
  1081. avgHousingFundDf = df[df[4] >= lastDateStr]
  1082. housingFundRcdDf.loc[housingFundRcdIndex, '最近1年公积金平均值'] = round(np.mean(avgHousingFundDf[7]), 2)
  1083. lastDateStr = utils.getLastMonthDate(reportTime, 12 * 3)
  1084. avgHousingFundDf = df[df[4] >= lastDateStr]
  1085. housingFundRcdDf.loc[housingFundRcdIndex, '最近3年公积金平均值'] = round(np.mean(avgHousingFundDf[7]), 2)
  1086. # print(housingFundRcdDf.to_json(orient="index", force_ascii=False))
  1087. # 合并被追偿信息
  1088. def mergeRecoveryInfoDf(self, reportTime,docXml):
  1089. tmpNode = docXml.documentElement.getElementsByTagName("FORCEDREPAYINFOBOLS");
  1090. recoveryInfoMergeDf = pd.DataFrame(columns=dfParser.dfHeaderRecoveryInfo)#合并df
  1091. if len(tmpNode)>0:
  1092. forcedrepayinfobols = docXml.documentElement.getElementsByTagName("FORCEDREPAYINFOBOLS")[0]
  1093. creditacctinfobo = forcedrepayinfobols.getElementsByTagName("CREDITACCTINFOBO");
  1094. for i in range(0,len(creditacctinfobo)):
  1095. creditbaseinfobo = creditacctinfobo[i].getElementsByTagName("CREDITBASEINFOBO")[0]
  1096. self.saveNodeWithType(creditbaseinfobo,"FORCEDREPAYINFOBOLS")
  1097. newperformancebo = creditacctinfobo[i].getElementsByTagName("NEWPERFORMANCEBO")[0]
  1098. self.saveNodeWithType(newperformancebo,"FORCEDREPAYINFOBOLS")
  1099. # latemonthlyperformancebo = creditacctinfobo[i].getElementsByTagName("LATEMONTHLYPERFORMANCEBO")
  1100. # latemonthlyperformancebo = latemonthlyperformancebo[0]
  1101. specialtradebaseinfosg = creditacctinfobo[i].getElementsByTagName("SPECIALTRADEBASEINFOSG")
  1102. recoveryInfoDf = pd.DataFrame(columns=dfParser.dfHeaderCreditCard, index=[0])
  1103. recoveryInfoDf.loc[0, '账户编号'] = self.getNodeData(creditbaseinfobo,"ACCTNO")
  1104. recoveryInfoDf.loc[0, '管理机构'] = self.getNodeData(creditbaseinfobo,"BUSIORGCODE")
  1105. recoveryInfoDf.loc[0, '业务种类'] = self.getNodeData(creditbaseinfobo,"LOANTYPEDESC")
  1106. recoveryInfoDf.loc[0, '债权接收日期'] = self.getNodeData(creditbaseinfobo,"OPENDATE")
  1107. recoveryInfoDf.loc[0, '债权金额'] = utils.replaceAmt(self.getNodeData(creditbaseinfobo,"LOANAMT"))
  1108. recoveryInfoDf.loc[0, '债权转移时的还款状态'] = self.getNodeData(creditbaseinfobo,"RPYACCOUNTSTATUSDESC")
  1109. recoveryInfoDf.loc[0, '账户状态'] = self.getNodeData(newperformancebo,"ACCTSTATUSDESC")
  1110. accountStatus = self.getNodeData(newperformancebo,"ACCTSTATUSDESC")# 账户状态
  1111. # if accountStatus == "":
  1112. # accountStatus = self.getNodeData(latemonthlyperformancebo, "ACCTSTATUDESC")
  1113. if len(specialtradebaseinfosg)>0:
  1114. self.saveNodeWithType(specialtradebaseinfosg[0],"FORCEDREPAYINFOBOLS")
  1115. recoveryInfoDf.loc[0, '特殊交易类型'] = self.getNodeData(specialtradebaseinfosg[0],"TRANTYPEDESC")
  1116. recoveryInfoDf.loc[0, '发生日期'] = self.getNodeData(specialtradebaseinfosg[0],"TRANDATE")
  1117. recoveryInfoDf.loc[0, '变更月份'] = utils.toInt(self.getNodeData(specialtradebaseinfosg[0],"TRANMONTH"))
  1118. recoveryInfoDf.loc[0, '发生金额'] = utils.replaceAmt(self.getNodeData(specialtradebaseinfosg[0],"TRANAMT"))
  1119. recoveryInfoDf.loc[0, '明细记录'] = self.getNodeData(specialtradebaseinfosg[0],"DETRECORD")
  1120. if accountStatus == "催收":
  1121. recoveryInfoDf.loc[0, '余额'] = utils.replaceAmt(self.getNodeData(newperformancebo,"BALANCE"))
  1122. recoveryInfoDf.loc[0, '最近一次还款日期'] =self.getNodeData(newperformancebo, "REPAYDATE");
  1123. else:
  1124. recoveryInfoDf.loc[0, '账户关闭日期'] = self.getNodeData(newperformancebo,"SETTLEDATE")
  1125. # recoveryInfoDf.loc[0, '截至日期'] = self.getNodeData(newperformancebo,"DUEDATE")
  1126. recoveryInfoMergeDf = pd.concat([recoveryInfoMergeDf, recoveryInfoDf], axis=0,ignore_index=True);
  1127. return recoveryInfoMergeDf
  1128. # 合并贷款记录dataframe为宽表
  1129. def mergeLoanDf(self, reportTime,docXml,type):
  1130. tmpNode = docXml.documentElement.getElementsByTagName(type)
  1131. loanAccountDfs = []
  1132. if len(tmpNode)>0:
  1133. noloopcreditaccountbols = docXml.documentElement.getElementsByTagName(type)[0]
  1134. creditacctinfobo = noloopcreditaccountbols.getElementsByTagName("CREDITACCTINFOBO");
  1135. loanDf = pd.DataFrame(columns=dfParser.dfHeaderLoan, index=[0])
  1136. for i in range(0, len(creditacctinfobo)):
  1137. dfObj = {}
  1138. loanDfObj = loanDf.to_json(orient="index",force_ascii=False)
  1139. loanDfObj = json.loads(loanDfObj)['0']
  1140. creditbaseinfobo = creditacctinfobo[i].getElementsByTagName("CREDITBASEINFOBO")[0]
  1141. self.saveNodeWithType(creditbaseinfobo,type)
  1142. newperformancebo = creditacctinfobo[i].getElementsByTagName("NEWPERFORMANCEBO")[0]
  1143. self.saveNodeWithType(newperformancebo,type)
  1144. latemonthlyperformancebo = creditacctinfobo[i].getElementsByTagName("LATEMONTHLYPERFORMANCEBO")
  1145. latemonthlyperformancebo = latemonthlyperformancebo[0]
  1146. self.saveNodeWithType(latemonthlyperformancebo,type)
  1147. specialtradebaseinfosg = creditacctinfobo[i].getElementsByTagName("SPECIALTRADEBASEINFOSG")
  1148. fiveyearhisrpyinfols = creditacctinfobo[i].getElementsByTagName("FIVEYEARHISRPYINFOSG")
  1149. loanDfObj['账户编号'] = self.getNodeData(creditbaseinfobo, "ACCTNO")
  1150. loanDfObj['管理机构'] = self.getNodeData(creditbaseinfobo, "BUSIORGCODE")
  1151. loanDfObj['账户标识'] = self.getNodeData(creditbaseinfobo, "ACCTCODE")
  1152. loanDfObj['开立日期'] = self.getNodeData(creditbaseinfobo, "OPENDATE")
  1153. loanDfObj['到期日期'] = self.getNodeData(creditbaseinfobo, "DUEDATE")
  1154. if type=='LOOPCREDITACCOUNTBOLS':#循环贷款账户
  1155. loanDfObj['借款金额(本金)'] = utils.replaceAmt(self.getNodeData(creditbaseinfobo, "ACCTCREDLINE"))
  1156. else:
  1157. loanDfObj['借款金额(本金)'] = utils.replaceAmt(self.getNodeData(creditbaseinfobo, "LOANAMT"))
  1158. loanDfObj['账户币种'] = self.getNodeData(creditbaseinfobo, "MONEYTYPEDESC")
  1159. loanDfObj['业务种类'] = self.getNodeData(creditbaseinfobo, "LOANTYPEDESC")
  1160. loanDfObj['担保方式'] = self.getNodeData(creditbaseinfobo, "GUARMODEDESC")
  1161. loanDfObj['还款期数'] = utils.toInt(self.getNodeData(creditbaseinfobo, "REPAYPRD"))
  1162. loanDfObj['还款频率'] = self.getNodeData(creditbaseinfobo, "REPAYFREQCYDESC")
  1163. loanDfObj['还款方式'] = self.getNodeData(creditbaseinfobo, "REPAYDESC")
  1164. loanDfObj['共同借款标志'] = self.getNodeData(creditbaseinfobo, "COMMBORROWERMAKERDESC")
  1165. # loanDfObj['截至日期'] = formatDateJz(df4[0]);
  1166. accountStatus = self.getNodeData(latemonthlyperformancebo, "ACCTSTATUDESC")
  1167. if accountStatus == "":
  1168. accountStatus = self.getNodeData(newperformancebo,"ACCTSTATUSDESC")
  1169. loanDfObj['账户状态'] = accountStatus;
  1170. if accountStatus != "结清" and accountStatus != "呆账" and accountStatus != "转出":
  1171. loanDfObj['五级分类'] = self.getNodeData(latemonthlyperformancebo, "FIVECATEDESC");
  1172. loanDfObj['余额(本金)'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "BUSIBAL"))
  1173. loanDfObj['剩余还款期数'] = utils.toInt(self.getNodeData(latemonthlyperformancebo, "REMREPPRD"))
  1174. loanDfObj['本月应还款'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "CURRPYAMT"))
  1175. loanDfObj['应还款日'] = self.getNodeData(latemonthlyperformancebo, "SETTDATE");
  1176. loanDfObj['本月实还款'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "ACTRPYAMT"))
  1177. loanDfObj['最近一次还款日期'] = self.getNodeData(latemonthlyperformancebo, "LATRPYDATE");
  1178. loanDfObj['当前逾期期数'] = utils.toInt(self.getNodeData(latemonthlyperformancebo, "OVERDPRD"))
  1179. loanDfObj['当前逾期总额'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "TOTOVERD"))
  1180. loanDfObj['逾期31-60天未还本金'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "OVERD3160PRINC"))
  1181. loanDfObj['逾期61-90天未还本金'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "OVERD6190PRINC"))
  1182. loanDfObj['逾期91-180天未还本金'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "OVERD91180PRINC"))
  1183. loanDfObj['逾期180天以上未还本金'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "OVERDPRINCOVE180"))
  1184. # loanDfObj['截至日期月份'] = utils.difMonthReportTime(formatDateJz(df4[0]), reportTime); # 截止日期离报告时间月份
  1185. elif accountStatus == "结清":
  1186. loanDfObj['账户关闭日期'] = self.getNodeData(newperformancebo,"SETTLEDATE")
  1187. elif accountStatus == "转出":
  1188. loanDfObj['转出月份'] = self.getNodeData(newperformancebo,"ROLLOUTDATE")
  1189. elif accountStatus == "呆账":
  1190. loanDfObj['余额(本金)'] = utils.replaceAmt(self.getNodeData(newperformancebo,"BALANCE"))
  1191. loanDfObj['最近一次还款日期'] = self.getNodeData(newperformancebo, "REPAYDATE")
  1192. loanDfObj['管理机构类型'] = self.getNodeData(creditbaseinfobo, "MANAGEORGTYPEDESC")
  1193. # loanDf = pd.DataFrame(loanDfObj)
  1194. dfObj["loanDf"] = loanDfObj;
  1195. #计算流动负债,汇算才需要计算
  1196. # try:
  1197. # self.getDebt(loanDf,reportTime)
  1198. # except Exception:
  1199. # logger.error(traceback.print_exc())
  1200. # logger.error(traceback.format_exc())
  1201. # 解析还款记录
  1202. loanPayRecord = None
  1203. # 特殊交易
  1204. specialTradeDf = None
  1205. # if(len(fiveyearhisrpyinfols)>0):
  1206. # fiveyearhisrpyinfols = fiveyearhisrpyinfols[0]
  1207. if accountStatus == "正常": # 正常
  1208. recordIndexBegin = 11
  1209. loanPayRecord = self.mergeLoanPayRecordDf(fiveyearhisrpyinfols, loanPayRecord)
  1210. specialTradeDf = self.mergeLoanSpecialTrade(specialtradebaseinfosg, specialTradeDf)
  1211. elif accountStatus == "逾期": # 如果长度小于12后续无需处理
  1212. # 14 11 有提前最新还款记录的为14
  1213. recordIndexBegin = 11
  1214. loanPayRecord = self.mergeLoanPayRecordDf(fiveyearhisrpyinfols, loanPayRecord)
  1215. specialTradeDf = self.mergeLoanSpecialTrade(specialtradebaseinfosg, specialTradeDf)
  1216. elif accountStatus == "结清":
  1217. recordIndexBegin = 9
  1218. loanPayRecord = self.mergeLoanPayRecordDf(fiveyearhisrpyinfols, loanPayRecord)
  1219. specialTradeDf = self.mergeLoanSpecialTrade(specialtradebaseinfosg, specialTradeDf)
  1220. elif accountStatus == "呆账" or accountStatus == "转出":
  1221. recordIndexBegin = 9
  1222. loanPayRecord = self.mergeLoanPayRecordDf(fiveyearhisrpyinfols, loanPayRecord)
  1223. specialTradeDf = self.mergeLoanSpecialTrade(specialtradebaseinfosg, specialTradeDf)
  1224. else:
  1225. loanPayRecord = self.mergeLoanPayRecordDf(fiveyearhisrpyinfols, loanPayRecord)
  1226. specialTradeDf = self.mergeLoanSpecialTrade(specialtradebaseinfosg, specialTradeDf)
  1227. print("===================还款状态不满足条件===================#"+self.getNodeData(creditbaseinfobo, "ACCTNO")+"#"+accountStatus)
  1228. dfObj["loanPayRecordDf"] = loanPayRecord
  1229. dfObj["specialTradeDf"] = specialTradeDf
  1230. loanAccountDfs.append(dfObj)
  1231. return loanAccountDfs
  1232. #计算流动负债
  1233. def getDebt(self, loanDf, reportTime):
  1234. if loanDf.loc[0, '账户状态'] != '结清' and loanDf.loc[0, '业务种类'] != '个人住房商业贷款' \
  1235. and loanDf.loc[0, '业务种类'] != '个人商用房(含商住两用)贷款' and loanDf.loc[0, '业务种类'] != '个人住房公积金贷款' and loanDf.loc[
  1236. 0, '业务种类'] != '个人汽车消费贷款':
  1237. # term1 / term2 / term3
  1238. term1 = None
  1239. term2 = None
  1240. term3 = None
  1241. debt_f12 = 0
  1242. payRate = loanDf.loc[0, '还款频率']
  1243. payDue = loanDf.loc[0, '还款期数']
  1244. payRemainderDue = loanDf.loc[0, '剩余还款期数']
  1245. openDate = loanDf.loc[0, '开立日期']
  1246. expireDate = loanDf.loc[0, '到期日期']
  1247. payoutAmt = loanDf.loc[0, '借款金额(本金)'] # 放款金额
  1248. balance = loanDf.loc[0, '余额(本金)']
  1249. # Step1 - 基础变量计算
  1250. if payRate == '月':
  1251. if str(payDue) != "nan" and payDue > 0:
  1252. term1 = payDue
  1253. else:
  1254. term1 = utils.difMonthReportTimeFloor(openDate, expireDate)
  1255. if str(payRemainderDue) != "nan" and payRemainderDue > 0:
  1256. term2 = payRemainderDue
  1257. else:
  1258. term2 = utils.difMonthReportTimeFloor(reportTime, expireDate)
  1259. term3 = term1 - term2
  1260. else:
  1261. term1 = utils.difMonthReportTimeFloor(openDate, expireDate)
  1262. term2 = utils.difMonthReportTimeFloor(reportTime, expireDate)
  1263. term3 = term1 - term2
  1264. if term1 <= 0 or term2 <= 0 or term1 < term2 or openDate == None or expireDate == None:
  1265. tag0 = 1
  1266. else:
  1267. tag0 = 0
  1268. payloan = utils.null2Zero(payoutAmt) - utils.null2Zero(balance)
  1269. payloan = max(0, payloan)
  1270. termpct_12 = max(0, 1 - 0.25 * int((term2 - 1) / 3))
  1271. if loanDf.loc[0, '担保方式'] == '抵押':
  1272. tag1 = 1
  1273. else:
  1274. tag1 = 0
  1275. curActualPay = loanDf.loc[0, '本月实还款']
  1276. curShouldPay = loanDf.loc[0, '本月应还款']
  1277. if str(curActualPay) != "nan" and str(curShouldPay) != "nan":
  1278. if max(curShouldPay, curActualPay) * term1 >= payoutAmt * 1.5:
  1279. tag2 = 1
  1280. elif max(curShouldPay, curActualPay) * term2 >= balance * 1.5:
  1281. tag2 = 1
  1282. elif term2 > 0 and term3 > 0 and payloan / term3 >= 1.5 * (balance / term2):
  1283. tag2 = 1
  1284. elif term2 > 0 and term3 > 0 and balance / term2 >= 1.5 * (payloan / term3):
  1285. tag2 = 1
  1286. elif payoutAmt < balance:
  1287. tag2 = 1
  1288. else:
  1289. tag2 = 0
  1290. if tag1 == 1:
  1291. pay_rat = 0.0036
  1292. else:
  1293. pay_rat = 0.0083
  1294. if tag1 == 1:
  1295. mthly_intr = 0.07 / 12
  1296. else:
  1297. mthly_intr = 0.18 / 12
  1298. totpayment1 = payoutAmt * mthly_intr * term1 + payoutAmt
  1299. totpayment2 = balance * mthly_intr * term2 + balance
  1300. # Step2-贷款分流负债统计
  1301. if tag0 == 1:
  1302. debt_f12 = balance * (1 + pay_rat * 12)
  1303. elif tag1 == 1:
  1304. debt_f12 = payoutAmt * pay_rat * 12
  1305. elif payRate != '月' or payRate == None:
  1306. monthy_pay_ref1 = totpayment1 / term1;
  1307. monthy_pay_ref2 = totpayment2 / term2;
  1308. monthy_pay_final = max(monthy_pay_ref1, monthy_pay_ref2);
  1309. debt_f12 = min(monthy_pay_final * 12, totpayment1, totpayment2);
  1310. elif tag2 == 1:
  1311. debt_f12 = min(balance * mthly_intr * min(term2, 12) + termpct_12 * balance, totpayment1, totpayment2);
  1312. else:
  1313. monthy_pay_ref1 = ((pay_rat * term1 + 1) * payoutAmt) / term1
  1314. if term2 == 0:
  1315. print(loanDf.loc[0, '账户编号'])
  1316. monthy_pay_ref2 = ((pay_rat * term2 + 1) * balance) / term2
  1317. monthy_pay_final = max(curShouldPay, monthy_pay_ref1, monthy_pay_ref2);
  1318. debt_f12 = min(monthy_pay_final * 12, balance * (1 + pay_rat * 12), balance * (1 + mthly_intr * term2));
  1319. loanDf.loc[0, '贷款负债'] = debt_f12
  1320. def mergeCreditCardDf(self,reportTime,docXml):
  1321. creditCardAccountDfs = []
  1322. tmpNode = docXml.documentElement.getElementsByTagName("CREDITCARDACCOUNTBOLS");
  1323. if len(tmpNode)>0:
  1324. noloopcreditaccountbols = docXml.documentElement.getElementsByTagName("CREDITCARDACCOUNTBOLS")[0]
  1325. creditacctinfobo = noloopcreditaccountbols.getElementsByTagName("CREDITACCTINFOBO");
  1326. for i in range(0, len(creditacctinfobo)):
  1327. dfObj = {}
  1328. creditCardDf = pd.DataFrame(columns=dfParser.dfHeaderCreditCard, index=[0])
  1329. creditbaseinfobo = creditacctinfobo[i].getElementsByTagName("CREDITBASEINFOBO")[0]
  1330. self.saveNodeWithType(creditbaseinfobo,"CREDITCARDACCOUNTBOLS")
  1331. newperformancebo = creditacctinfobo[i].getElementsByTagName("NEWPERFORMANCEBO")[0]
  1332. self.saveNodeWithType(newperformancebo,"CREDITCARDACCOUNTBOLS")
  1333. latemonthlyperformancebo = creditacctinfobo[i].getElementsByTagName("LATEMONTHLYPERFORMANCEBO")
  1334. latemonthlyperformancebo = latemonthlyperformancebo[0]
  1335. self.saveNodeWithType(latemonthlyperformancebo,"CREDITCARDACCOUNTBOLS")
  1336. bigquotabaselnfosg = creditacctinfobo[i].getElementsByTagName("BIGQUOTABASELNFOSG")
  1337. fiveyearhisrpyinfols = creditacctinfobo[i].getElementsByTagName("FIVEYEARHISRPYINFOSG")
  1338. creditCardDf.loc[0, '账户编号'] = self.getNodeData(creditbaseinfobo, "ACCTNO")
  1339. creditCardDf.loc[0, '发卡机构'] = self.getNodeData(creditbaseinfobo, "BUSIORGCODE")
  1340. creditCardDf.loc[0, '账户标识'] = self.getNodeData(creditbaseinfobo, "ACCTCODE")
  1341. creditCardDf.loc[0, '开立日期'] = self.getNodeData(creditbaseinfobo, "OPENDATE")
  1342. creditCardDf.loc[0, '账户授信额度'] = utils.replaceAmt(self.getNodeData(creditbaseinfobo, "ACCTCREDLINE"))
  1343. creditCardDf.loc[0, '共享授信额度'] = utils.replaceAmt(self.getNodeData(creditbaseinfobo, "ORGCREDLINE"))
  1344. # 排除美元027
  1345. MONEYTYPEDESC = self.getNodeData(creditbaseinfobo, "MONEYTYPEDESC")
  1346. if MONEYTYPEDESC.find('人民币')<0:
  1347. continue
  1348. # if MONEYTYPEDESC.find('美元')>= 0:
  1349. # continue
  1350. creditCardDf.loc[0, '币种'] = self.getNodeData(creditbaseinfobo, "MONEYTYPEDESC")
  1351. creditCardDf.loc[0, '业务种类'] = self.getNodeData(creditbaseinfobo, "LOANTYPEDESC")
  1352. creditCardDf.loc[0, '担保方式'] = self.getNodeData(creditbaseinfobo, "GUARMODEDESC")
  1353. accountStatus = self.getNodeData(latemonthlyperformancebo, "ACCTSTATUDESC")
  1354. if accountStatus == "":
  1355. accountStatus = self.getNodeData(newperformancebo,"ACCTSTATUSDESC")
  1356. if accountStatus.find('未激活') < 0: # 非未激活
  1357. if accountStatus == "呆账":
  1358. creditCardDf.loc[0, '账户状态'] = accountStatus
  1359. creditCardDf.loc[0, '余额'] = utils.replaceAmt(self.getNodeData(newperformancebo, "BALANCE"))
  1360. creditCardDf.loc[0, '最近一次还款日期'] = self.getNodeData(newperformancebo, "REPAYDATE")
  1361. elif accountStatus != '销户':
  1362. try:
  1363. creditCardDf.loc[0, '账户状态'] =accountStatus
  1364. creditCardDf.loc[0, '余额'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "BUSIBAL"))
  1365. creditCardDf.loc[0, '已用额度'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "ACCTBAL"))
  1366. dividePeriodBalance = self.getNodeData(latemonthlyperformancebo, "INSTBAL") # 未出单的大额专项分期余额
  1367. creditCardDf.loc[0, '未出单的大额专项分期余额'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "INSTBAL"))
  1368. creditCardDf.loc[0, '剩余分期期数'] = utils.toInt(self.getNodeData(latemonthlyperformancebo, "REMREPPRD"))
  1369. creditCardDf.loc[0, '最近6个月平均使用额度'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "AVGUSEAMOUNT"))
  1370. creditCardDf.loc[0, '最大使用额'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "MAXUSEAMOUNT"))
  1371. creditCardDf.loc[0, '账单日'] = self.getNodeData(latemonthlyperformancebo, "SETTDATE")
  1372. creditCardDf.loc[0, '本月应还款'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "CURRPYAMT"))
  1373. creditCardDf.loc[0, '本月实还款'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "ACTRPYAMT"))
  1374. creditCardDf.loc[0, '最近一次还款日期'] = self.getNodeData(latemonthlyperformancebo, "LATRPYDATE");
  1375. creditCardDf.loc[0, '当前逾期期数'] = utils.toInt(self.getNodeData(latemonthlyperformancebo,"OVERDPRD"))
  1376. creditCardDf.loc[0, '当前逾期总额'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo,"TOTOVERD"))
  1377. except Exception:
  1378. logger.info("解析贷记卡异常-" + i)
  1379. info = sys.exc_info()
  1380. logger.error(info[0])
  1381. logger.error(info[1])
  1382. logger.error(traceback.extract_tb(info[2]))
  1383. if len(bigquotabaselnfosg) >0:
  1384. bigquotabaselnfosg = bigquotabaselnfosg[0]
  1385. self.saveNodeWithType(bigquotabaselnfosg,"CREDITCARDACCOUNTBOLS")
  1386. # '大额专项分期额度','分期额度生效日期','分期额度到期日期','已用分期金额']
  1387. creditCardDf.loc[0, '大额专项分期额度'] = utils.replaceAmt(self.getNodeData(bigquotabaselnfosg, "SPECLINE"))
  1388. creditCardDf.loc[0, '分期额度生效日期'] = self.getNodeData(bigquotabaselnfosg, "SPECLINE")
  1389. creditCardDf.loc[0, '分期额度到期日期'] = self.getNodeData(bigquotabaselnfosg, "SPECENDDATE")
  1390. creditCardDf.loc[0, '已用分期金额'] = utils.replaceAmt(self.getNodeData(bigquotabaselnfosg, "INSTAMT"))
  1391. else:
  1392. accountStatus = '销户'
  1393. creditCardDf.loc[0, '账户状态'] = '销户'
  1394. else: # 未激活
  1395. creditCardDf.loc[0, '账户状态'] = '未激活'
  1396. accountStatus = '未激活'
  1397. dfObj["creditCardDf"] = creditCardDf;
  1398. # 解析还款记录
  1399. creditCardPayRecord = pd.DataFrame()
  1400. if accountStatus == "正常" or accountStatus == "冻结" or accountStatus == "止付" or accountStatus == "银行止付": # 正常
  1401. recordIndexBegin = 9;
  1402. creditCardPayRecord = self.mergeCreditCardPayRecordDf(fiveyearhisrpyinfols,creditCardPayRecord)
  1403. elif accountStatus == "未激活":
  1404. recordIndexBegin = 0;
  1405. elif accountStatus == "销户" or accountStatus == "呆账":
  1406. recordIndexBegin = 7;
  1407. creditCardPayRecord = self.mergeCreditCardPayRecordDf(fiveyearhisrpyinfols,creditCardPayRecord)
  1408. else:
  1409. creditCardPayRecord = self.mergeCreditCardPayRecordDf(fiveyearhisrpyinfols, creditCardPayRecord)
  1410. print(self.getNodeData(creditbaseinfobo, "ACCTNO")+"===================还款状态不满足条件==================="+"#"+accountStatus)
  1411. dfObj["creditCardPayRecordDf"] = creditCardPayRecord;
  1412. creditCardAccountDfs.append(dfObj)
  1413. return creditCardAccountDfs;
  1414. def mergeCreditCardDfZ(self,reportTime,docXml):
  1415. tmpNode = docXml.documentElement.getElementsByTagName("PASSCREDITCARDACCOUNTBOLS");
  1416. creditCardAccountDfsZ = []
  1417. if len(tmpNode)>0:
  1418. noloopcreditaccountbols = docXml.documentElement.getElementsByTagName("PASSCREDITCARDACCOUNTBOLS")[0]
  1419. creditacctinfobo = noloopcreditaccountbols.getElementsByTagName("CREDITACCTINFOBO");
  1420. for i in range(0, len(creditacctinfobo)):
  1421. dfObj = {}
  1422. creditCardDf = pd.DataFrame(columns=dfParser.dfHeaderCreditCardZ, index=[0])
  1423. creditbaseinfobo = creditacctinfobo[i].getElementsByTagName("CREDITBASEINFOBO")[0]
  1424. self.saveNodeWithType(creditbaseinfobo,"PASSCREDITCARDACCOUNTBOLS")
  1425. newperformancebo = creditacctinfobo[i].getElementsByTagName("NEWPERFORMANCEBO")[0]
  1426. self.saveNodeWithType(newperformancebo,"PASSCREDITCARDACCOUNTBOLS")
  1427. latemonthlyperformancebo = creditacctinfobo[i].getElementsByTagName("LATEMONTHLYPERFORMANCEBO")
  1428. latemonthlyperformancebo = latemonthlyperformancebo[0]
  1429. self.saveNodeWithType(latemonthlyperformancebo,"PASSCREDITCARDACCOUNTBOLS")
  1430. fiveyearhisrpyinfols = creditacctinfobo[i].getElementsByTagName("FIVEYEARHISRPYINFOSG")
  1431. creditCardDf.loc[0, '账户编号'] = self.getNodeData(creditbaseinfobo, "ACCTNO")
  1432. creditCardDf.loc[0, '发卡机构'] = self.getNodeData(creditbaseinfobo, "BUSIORGCODE")
  1433. creditCardDf.loc[0, '账户标识'] = self.getNodeData(creditbaseinfobo, "ACCTCODE")
  1434. creditCardDf.loc[0, '开立日期'] = self.getNodeData(creditbaseinfobo, "OPENDATE")
  1435. creditCardDf.loc[0, '账户授信额度'] = utils.replaceAmt(self.getNodeData(creditbaseinfobo, "ACCTCREDLINE"))
  1436. creditCardDf.loc[0, '共享授信额度'] = utils.replaceAmt(self.getNodeData(creditbaseinfobo, "ORGCREDLINE"))
  1437. creditCardDf.loc[0, '币种'] = self.getNodeData(creditbaseinfobo, "MONEYTYPEDESC")
  1438. creditCardDf.loc[0, '担保方式'] = self.getNodeData(creditbaseinfobo, "GUARMODEDESC")
  1439. MONEYTYPEDESC = self.getNodeData(creditbaseinfobo, "MONEYTYPEDESC")
  1440. if MONEYTYPEDESC.find('人民币') < 0:
  1441. continue
  1442. # if self.getNodeData(creditbaseinfobo, "MONEYTYPEDESC").find('美元') >= 0:
  1443. # continue
  1444. accountStatus = self.getNodeData(latemonthlyperformancebo, "ACCTSTATUDESC")
  1445. if accountStatus == "":
  1446. accountStatus =self.getNodeData(newperformancebo,"ACCTSTATUSDESC")
  1447. if accountStatus.find('未激活') < 0: # 非未激活
  1448. if accountStatus == "呆账":
  1449. creditCardDf.loc[0, '账户状态'] = accountStatus
  1450. creditCardDf.loc[0, '余额'] = utils.replaceAmt(self.getNodeData(newperformancebo, "BALANCE"))
  1451. creditCardDf.loc[0, '透支余额'] = utils.replaceAmt(self.getNodeData(newperformancebo, "BALANCE"))
  1452. creditCardDf.loc[0, '最近一次还款日期'] = self.getNodeData(newperformancebo, "REPAYDATE")
  1453. elif accountStatus != '销户':
  1454. try:
  1455. creditCardDf.loc[0, '账户状态'] = accountStatus
  1456. creditCardDf.loc[0, '透支余额'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "BUSIBAL"))
  1457. creditCardDf.loc[0, '最近6个月平均透支余额'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "LATSIXMNAVGOVDFTBAL"))
  1458. creditCardDf.loc[0, '最大透支余额'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "MAXOVERDRAFTBAL"))
  1459. creditCardDf.loc[0, '账单日'] = self.getNodeData(latemonthlyperformancebo, "SETTDATE")
  1460. creditCardDf.loc[0, '本月实还款'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "ACTRPYAMT"))
  1461. creditCardDf.loc[0, '最近一次还款日期'] = self.getNodeData(latemonthlyperformancebo, "LATRPYDATE");
  1462. creditCardDf.loc[0, '透支180天以上未付余额'] = utils.replaceAmt(self.getNodeData(latemonthlyperformancebo, "OVERDRAWBAOVE180"))
  1463. except:
  1464. logger.info("解析准贷记卡异常-" + i);
  1465. else:
  1466. accountStatus = '销户'
  1467. creditCardDf.loc[0, '账户状态'] = '销户'
  1468. creditCardDf.loc[0, '最近一次还款日期'] = ""
  1469. else: # 未激活
  1470. creditCardDf.loc[0, '账户状态'] = '未激活'
  1471. accountStatus = '未激活'
  1472. creditCardDf.loc[0, '最近一次还款日期'] = ""
  1473. dfObj["creditCardDfZ"] = creditCardDf;
  1474. # 解析还款记录
  1475. creditCardPayRecord = pd.DataFrame()
  1476. if accountStatus == "正常" or accountStatus == "冻结" or accountStatus == "止付" or accountStatus == "银行止付": # 正常
  1477. recordIndexBegin = 9;
  1478. creditCardPayRecord = self.mergeCreditCardPayRecordDf(fiveyearhisrpyinfols,creditCardPayRecord)
  1479. elif accountStatus == "未激活":
  1480. recordIndexBegin = 0;
  1481. elif accountStatus == "销户" or accountStatus == "呆账":
  1482. recordIndexBegin = 7;
  1483. creditCardPayRecord = self.mergeCreditCardPayRecordDf(fiveyearhisrpyinfols,creditCardPayRecord)
  1484. else:
  1485. creditCardPayRecord = self.mergeCreditCardPayRecordDf(fiveyearhisrpyinfols, creditCardPayRecord)
  1486. print("账户#" + str(i + 1) + "#" + self.getNodeData(creditbaseinfobo, "ACCTNO")+"===================还款状态不满足条件==================="+"#"+accountStatus)
  1487. dfObj["creditCardPayRecordDfZ"] = creditCardPayRecord;
  1488. creditCardAccountDfsZ.append(dfObj)
  1489. return creditCardAccountDfsZ;
  1490. # 合并贷款还款记录明细
  1491. def mergeLoanPayRecordDf(self,fiveyearhisrpyinfols, loanPayRecord):
  1492. # for i in range(0, len(fiveyearhisrpyinfols)):
  1493. # loanPayRecordTmp = pd.DataFrame(columns=dfParser.dfHeaderLoanPayRecord, index=[0])
  1494. # loanPayRecordTmp.loc[0, '账户编号'] = self.getNodeData(fiveyearhisrpyinfols[i], "ACCTNO");
  1495. # loanPayRecordTmp.loc[0, '还款日期'] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDMON")+"-01";
  1496. # loanPayRecordTmp.loc[0, '还款状态值'] = utils.replaceAmt(self.getNodeData(fiveyearhisrpyinfols[i], "TOTACCTBAL"))
  1497. # loanPayRecordTmp.loc[0, '还款状态'] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDSTATUSCODE");
  1498. # loanPayRecord = pd.concat([loanPayRecord, loanPayRecordTmp], axis=0, ignore_index=True);
  1499. # return loanPayRecord;
  1500. ds = []
  1501. # loanPayRecordTmp = pd.DataFrame(columns=dfParser.dfHeaderLoanPayRecord, index=[0])
  1502. for i in range(0, len(fiveyearhisrpyinfols)):
  1503. dsObj = {}
  1504. # loanPayRecordTmp = pd.DataFrame(columns=dfParser.dfHeaderLoanPayRecord, index=[0])
  1505. # loanPayRecordTmp.loc[0, '账户编号'] = self.getNodeData(fiveyearhisrpyinfols[i], "ACCTNO");
  1506. # loanPayRecordTmp.loc[0, '还款日期'] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDMON") + "-01";
  1507. # loanPayRecordTmp.loc[0, '还款状态值'] = utils.replaceAmt(self.getNodeData(fiveyearhisrpyinfols[i], "TOTACCTBAL"))
  1508. # loanPayRecordTmp.loc[0, '还款状态'] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDSTATUSCODE");
  1509. # loanPayRecord = pd.concat([loanPayRecord, loanPayRecordTmp], axis=0, ignore_index=True);
  1510. dsObj["账户编号"] = self.getNodeData(fiveyearhisrpyinfols[i], "ACCTNO");
  1511. dsObj["还款日期"] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDMON") + "-01";
  1512. dsObj["还款状态值"] = utils.replaceAmt(self.getNodeData(fiveyearhisrpyinfols[i], "TOTACCTBAL"))
  1513. dsObj["还款状态"] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDSTATUSCODE");
  1514. ds.append(dsObj)
  1515. self.saveNodeWithType(fiveyearhisrpyinfols[i],"LOAN")
  1516. # if len(ds)>0:
  1517. # loanPayRecordTmp = pd.DataFrame(ds)
  1518. return ds;
  1519. # 合并贷款还款记录明细
  1520. def mergeCreditCardPayRecordDf(self, fiveyearhisrpyinfols, loanPayRecord):
  1521. # for i in range(0, len(fiveyearhisrpyinfols)):
  1522. # loanPayRecordTmp = pd.DataFrame(columns=dfParser.dfHeaderLoanPayRecord, index=[0])
  1523. # loanPayRecordTmp.loc[0, '账户编号'] = self.getNodeData(fiveyearhisrpyinfols[i], "ACCTNO");
  1524. # loanPayRecordTmp.loc[0, '还款日期'] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDMON") + "-01";
  1525. # loanPayRecordTmp.loc[0, '还款状态值'] = utils.replaceAmt(self.getNodeData(fiveyearhisrpyinfols[i], "TOTACCTBAL"))
  1526. # loanPayRecordTmp.loc[0, '还款状态'] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDSTATUSCODE");
  1527. # loanPayRecord = pd.concat([loanPayRecord, loanPayRecordTmp], axis=0, ignore_index=True);
  1528. # return loanPayRecord;
  1529. ds = []
  1530. # loanPayRecordTmp = pd.DataFrame(columns=dfParser.dfHeaderLoanPayRecord, index=[0])
  1531. loanPayRecordTmp = None
  1532. for i in range(0, len(fiveyearhisrpyinfols)):
  1533. dsObj = {}
  1534. # loanPayRecordTmp = pd.DataFrame(columns=dfParser.dfHeaderLoanPayRecord, index=[0])
  1535. # loanPayRecordTmp.loc[0, '账户编号'] = self.getNodeData(fiveyearhisrpyinfols[i], "ACCTNO");
  1536. # loanPayRecordTmp.loc[0, '还款日期'] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDMON") + "-01";
  1537. # loanPayRecordTmp.loc[0, '还款状态值'] = utils.replaceAmt(self.getNodeData(fiveyearhisrpyinfols[i], "TOTACCTBAL"))
  1538. # loanPayRecordTmp.loc[0, '还款状态'] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDSTATUSCODE");
  1539. # loanPayRecord = pd.concat([loanPayRecord, loanPayRecordTmp], axis=0, ignore_index=True);
  1540. dsObj["账户编号"] = self.getNodeData(fiveyearhisrpyinfols[i], "ACCTNO");
  1541. dsObj["还款日期"] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDMON") + "-01";
  1542. dsObj["还款状态值"] = utils.replaceAmt(self.getNodeData(fiveyearhisrpyinfols[i], "TOTACCTBAL"))
  1543. dsObj["还款状态"] = self.getNodeData(fiveyearhisrpyinfols[i], "OVERDSTATUSCODE");
  1544. self.saveNodeWithType(fiveyearhisrpyinfols[i],"CREDITCARD")
  1545. ds.append(dsObj)
  1546. if len(ds)>0:
  1547. loanPayRecordTmp = pd.DataFrame(ds)
  1548. return loanPayRecordTmp;
  1549. # 合并贷款还款记录明细
  1550. #合并特殊交易
  1551. def mergeLoanSpecialTrade(self,specialtradebaseinfosg, specialTradeDf):
  1552. for i in range(0,len(specialtradebaseinfosg)):
  1553. self.saveNode(specialtradebaseinfosg[i])
  1554. specialTradeDfTmp = pd.DataFrame(columns = dfParser.dfHeaderLoanSpecialTrade, index=[0])
  1555. specialTradeDfTmp.loc[0, '账户编号'] = self.getNodeData(specialtradebaseinfosg[i], "ACCTNO");
  1556. specialTradeDfTmp.loc[0, '特殊交易类型'] = self.getNodeData(specialtradebaseinfosg[i], "TRANTYPEDESC");
  1557. specialTradeDfTmp.loc[0, '发生日期'] = self.getNodeData(specialtradebaseinfosg[i], "TRANDATE");
  1558. specialTradeDfTmp.loc[0, '变更月数'] = utils.toInt(self.getNodeData(specialtradebaseinfosg[i], "TRANMONTH"))
  1559. specialTradeDfTmp.loc[0, '发生金额'] = utils.replaceAmt(self.getNodeData(specialtradebaseinfosg[i], "TRANAMT"))
  1560. specialTradeDfTmp.loc[0, '明细记录'] = self.getNodeData(specialtradebaseinfosg[i], "DETRECORD");
  1561. tradeType = self.getNodeData(specialtradebaseinfosg[i], "TRANTYPEDESC");
  1562. content = self.getNodeData(specialtradebaseinfosg[i], "DETRECORD");
  1563. # TODO 加工严重程度 逻辑待确认
  1564. severity = None
  1565. if tradeType == '提前还款' or tradeType == '提前结清':
  1566. severity = 0
  1567. elif tradeType == '其他' and content.find("提前") >= 0:
  1568. severity = 0
  1569. elif tradeType == '担保人(第三方)代偿':
  1570. severity = 1
  1571. # elif tradeType == "其他" and content.find("担保人代还取消")<0 and content.find("合同展期")<0:
  1572. # severity = 2
  1573. # 同时出现代还和取消
  1574. elif tradeType == "其他" and (content.find("代还") < 0 or content.find("代偿") < 0) and content.find(
  1575. "取消") < 0 and content.find("合同展期") < 0:
  1576. severity = 2
  1577. elif (tradeType == "展期" or tradeType.find('延期') >= 0) and content.find("专升本或研究生入学展期") >= 0:
  1578. severity = 2
  1579. # elif tradeType == "其他" and (content.find("担保人代还取消")>=0 or content.find("合同展期")>=0):
  1580. # severity = 3
  1581. elif tradeType == "其他" and (
  1582. ((content.find("代还") < 0 or content.find("代偿") < 0) and content.find("取消") >= 0) or (
  1583. content.find("合同展期") >= 0)):
  1584. severity = 3
  1585. elif (tradeType == "展期" or tradeType.find('延期') >= 0) and content.find("专升本或研究生入学展期") < 0:
  1586. severity = 3
  1587. elif tradeType == "以资抵债":
  1588. severity = 4
  1589. specialTradeDfTmp.loc[0, '严重程度'] = severity
  1590. specialTradeDf = pd.concat([specialTradeDf, specialTradeDfTmp], axis=0, ignore_index=True);
  1591. return specialTradeDf;
  1592. # 解析被追偿信息汇总
  1593. def parseRecoveryInfoMergeDf(self,df):
  1594. if not df.empty:
  1595. recoveryMaxPayDf = df[df['债权转移时的还款状态'] != '']
  1596. recoveryStatusCs = df[df['账户状态'] == '催收']
  1597. if not recoveryMaxPayDf.empty:
  1598. briefInfoDf_recoveryInfoSum.loc[recoveryInfoSumIndex, '债权转移时的最大还款状态'] = np.max(
  1599. recoveryMaxPayDf['债权转移时的还款状态']);
  1600. briefInfoDf_recoveryInfoSum.loc[recoveryInfoSumIndex, '债权转移时属于催收状态的账户数'] = recoveryStatusCs.index.size;
  1601. briefInfoDf_recoveryInfoSum.loc[recoveryInfoSumIndex, '债权转移时属于催收状态的账户数/被追偿信息总数'] = round(
  1602. recoveryStatusCs.index.size / df.index.size, 2);
  1603. # creditTradeDetailDf_recoveryInfo
  1604. # 被追偿账户总数
  1605. creditTradeDetailDf_recoveryInfo.loc[recoveryInfoIndex, '被追偿账户总数'] = df.index.size;
  1606. creditTradeDetailDf_recoveryInfo.loc[recoveryInfoIndex, '被追偿业务种类'] = df['业务种类'].unique().size;
  1607. creditTradeDetailDf_recoveryInfo.loc[recoveryInfoIndex, '最新一笔被追偿债券接收时间'] = np.max(df['债权接收日期']);
  1608. creditTradeDetailDf_recoveryInfo.loc[recoveryInfoIndex, '总债权金额'] = np.max(df['债权金额']);
  1609. creditTradeDetailDf_recoveryInfo.loc[recoveryInfoIndex, '债权转移时的最大还款状态'] = np.max(
  1610. recoveryMaxPayDf['债权转移时的还款状态']);
  1611. # 解析信贷交易明细-特殊交易
  1612. def parseSpecialTrade(self,df):
  1613. if not df.empty:
  1614. creditTradeDetailHeader_specialTrade.loc[specialTradeIndex, '当前用户发生特殊交易的严重程度'] = np.max(df['严重程度']) # 加工的指标
  1615. maxChangeMonthIndex = np.argmax(np.abs(df['变更月数']))
  1616. meanMonthValue = np.mean(np.abs(df['变更月数']))
  1617. row0 = df.loc[maxChangeMonthIndex, :]
  1618. settleDf = df[(df['特殊交易类型'] == '提前结清') | (df['特殊交易类型'] == '提前还款')]
  1619. debtDf = df[(df['特殊交易类型'] == '以资抵债')]
  1620. creditTradeDetailHeader_specialTrade.loc[specialTradeIndex, '用户发生特殊交易变更月数的最大差值'] = row0[3]
  1621. creditTradeDetailHeader_specialTrade.loc[specialTradeIndex, '用户发生特殊交易变更月数的平均差值'] = round(meanMonthValue, 2)
  1622. creditTradeDetailHeader_specialTrade.loc[specialTradeIndex, '用户特殊交易涉及的发生金额的最大值'] = np.max(df['发生金额'])
  1623. creditTradeDetailHeader_specialTrade.loc[specialTradeIndex, '用户特殊交易涉及的发生金额的平均值'] = round(np.mean(df['发生金额']), 2)
  1624. creditTradeDetailHeader_specialTrade.loc[specialTradeIndex, '用户所有帐户发生提前还款交易的次数统计'] = settleDf.index.size
  1625. creditTradeDetailHeader_specialTrade.loc[specialTradeIndex, '用户所有帐户发生不良特殊交易的次数统计'] = debtDf.index.size;
  1626. # 信贷交易明细-非循环贷账户
  1627. def parseLoanAccountInfo(self,df):
  1628. if not df.empty:
  1629. loanAccountNum = int(briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '非循环贷账户账户数'])
  1630. normalDf = df[(df['账户状态'] != '结清') & (df['账户状态'] != '转出') & (df['账户状态'] != '呆账')].reset_index(drop=True)
  1631. normalDf = normalDf[0:loanAccountNum] # 根据非循环贷账户数进行计算进行截取
  1632. creditTradeDetailDf_loanAccountInfo.loc[loanInfoIndex, '本月应还款(合计)'] = np.sum(normalDf['本月应还款'])
  1633. creditTradeDetailDf_loanAccountInfo.loc[loanInfoIndex, '本月实还款(合计)'] = np.sum(normalDf['本月实还款'])
  1634. creditTradeDetailDf_loanAccountInfo.loc[loanInfoIndex, '最近一次还款日期'] = np.max(normalDf['最近一次还款日期'])
  1635. creditTradeDetailDf_loanAccountInfo.loc[loanInfoIndex, '当前一共逾期期数'] = np.sum(normalDf['当前逾期期数'])
  1636. creditTradeDetailDf_loanAccountInfo.loc[loanInfoIndex, '当前一共逾期总额'] = np.sum(normalDf['当前逾期总额'])
  1637. creditTradeDetailDf_loanAccountInfo.loc[loanInfoIndex, '逾期31-60天未还本金(合计)'] = np.sum(
  1638. normalDf['逾期31-60天未还本金'])
  1639. creditTradeDetailDf_loanAccountInfo.loc[loanInfoIndex, '逾期61-90天未还本金(合计)'] = np.sum(
  1640. normalDf['逾期61-90天未还本金'])
  1641. creditTradeDetailDf_loanAccountInfo.loc[loanInfoIndex, '逾期91-180天未还本金(合计)'] = np.sum(
  1642. normalDf['逾期91-180天未还本金'])
  1643. creditTradeDetailDf_loanAccountInfo.loc[loanInfoIndex, '逾期180天以上未还本金(合计)'] = np.sum(
  1644. normalDf['逾期180天以上未还本金'])
  1645. # 信贷交易明细-循环额度分账户
  1646. def parseCycleCreditAccountInfo(self,df):
  1647. if not df.empty:
  1648. normalDf = df[(df['账户状态'] != '结清') & (df['账户状态'] != '转出') & (df['账户状态'] != '呆账')].reset_index(drop=True)
  1649. loanAccountNum = int(briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '非循环贷账户账户数'])
  1650. cycleCreditAccountNum = int(briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环额度下分账户账户数'])
  1651. normalDf = normalDf[loanAccountNum:(loanAccountNum + cycleCreditAccountNum)]
  1652. if not normalDf.empty:
  1653. creditTradeDetailDf_cycleCreditAccountInfo.loc[cycleCreditAccountInfoIndex, '本月应还款(合计)'] = np.sum(
  1654. normalDf['本月应还款'])
  1655. creditTradeDetailDf_cycleCreditAccountInfo.loc[cycleCreditAccountInfoIndex, '本月实还款(合计)'] = np.sum(
  1656. normalDf['本月实还款'])
  1657. creditTradeDetailDf_cycleCreditAccountInfo.loc[cycleCreditAccountInfoIndex, '最近一次还款日期'] = np.max(
  1658. normalDf['最近一次还款日期'])
  1659. creditTradeDetailDf_cycleCreditAccountInfo.loc[cycleCreditAccountInfoIndex, '当前一共逾期期数'] = np.sum(
  1660. normalDf['当前逾期期数'])
  1661. creditTradeDetailDf_cycleCreditAccountInfo.loc[cycleCreditAccountInfoIndex, '当前一共逾期总额'] = np.sum(
  1662. normalDf['当前逾期总额'])
  1663. creditTradeDetailDf_cycleCreditAccountInfo.loc[
  1664. cycleCreditAccountInfoIndex, '逾期31-60天未还本金(合计)'] = np.sum(normalDf['逾期31-60天未还本金'])
  1665. creditTradeDetailDf_cycleCreditAccountInfo.loc[
  1666. cycleCreditAccountInfoIndex, '逾期61-90天未还本金(合计)'] = np.sum(normalDf['逾期61-90天未还本金'])
  1667. creditTradeDetailDf_cycleCreditAccountInfo.loc[
  1668. cycleCreditAccountInfoIndex, '逾期91-180天未还本金(合计)'] = np.sum(normalDf['逾期91-180天未还本金'])
  1669. creditTradeDetailDf_cycleCreditAccountInfo.loc[
  1670. cycleCreditAccountInfoIndex, '逾期180天以上未还本金(合计)'] = np.sum(normalDf['逾期180天以上未还本金'])
  1671. # 信贷交易明细-循环贷账户
  1672. def parseCycleLoanAccountInfo(self,df):
  1673. if not df.empty:
  1674. normalDf = df[(df['账户状态'] != '结清') & (df['账户状态'] != '转出') & (df['账户状态'] != '呆账')]
  1675. loanAccountNum = int(briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '非循环贷账户账户数'])
  1676. cycleCreditAccountNum = int(briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环额度下分账户账户数'])
  1677. cycleAccountNum = int(briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环贷账户账户数'])
  1678. normalDf = normalDf[(loanAccountNum + cycleCreditAccountNum):normalDf.index.size]
  1679. if not normalDf.empty:
  1680. creditTradeDetailDf_cycleLoanAccountInfo.loc[cycleLoanAccountInfoIndex, '本月应还款(合计)'] = np.sum(
  1681. normalDf['本月应还款'])
  1682. creditTradeDetailDf_cycleLoanAccountInfo.loc[cycleLoanAccountInfoIndex, '本月实还款(合计)'] = np.sum(
  1683. normalDf['本月实还款'])
  1684. creditTradeDetailDf_cycleLoanAccountInfo.loc[cycleLoanAccountInfoIndex, '最近一次还款日期'] = np.max(
  1685. normalDf['最近一次还款日期'])
  1686. creditTradeDetailDf_cycleLoanAccountInfo.loc[cycleLoanAccountInfoIndex, '当前一共逾期期数'] = np.sum(
  1687. normalDf['当前逾期期数'])
  1688. creditTradeDetailDf_cycleLoanAccountInfo.loc[cycleLoanAccountInfoIndex, '当前一共逾期总额'] = np.sum(
  1689. normalDf['当前逾期总额'])
  1690. creditTradeDetailDf_cycleLoanAccountInfo.loc[cycleLoanAccountInfoIndex, '逾期31-60天未还本金(合计)'] = np.sum(
  1691. normalDf['逾期31-60天未还本金'])
  1692. creditTradeDetailDf_cycleLoanAccountInfo.loc[cycleLoanAccountInfoIndex, '逾期61-90天未还本金(合计)'] = np.sum(
  1693. normalDf['逾期61-90天未还本金'])
  1694. creditTradeDetailDf_cycleLoanAccountInfo.loc[cycleLoanAccountInfoIndex, '逾期91-180天未还本金(合计)'] = np.sum(
  1695. normalDf['逾期91-180天未还本金'])
  1696. creditTradeDetailDf_cycleLoanAccountInfo.loc[cycleLoanAccountInfoIndex, '逾期180天以上未还本金(合计)'] = np.sum(
  1697. normalDf['逾期180天以上未还本金'])
  1698. # 解析贷款账户信息指标
  1699. def parseLoanMergeDf(self,df,reportTime):
  1700. if not df.empty:
  1701. sortDf = df.sort_values(by=["账户关闭日期", "借款金额(本金)"], ascending=(False, False))
  1702. sortDf = sortDf[sortDf['账户状态'] == '结清'];
  1703. sortDf = sortDf.reset_index(drop=True)
  1704. if not sortDf.empty:
  1705. row0 = sortDf.loc[0, :]
  1706. loanAccountInfoDf.loc[loanAccountInfoIndex, '最近一笔结清贷款的贷款金额'] = row0['借款金额(本金)']
  1707. openDate = dfParser.formatDate(row0['开立日期'])
  1708. loanAccountInfoDf.loc[loanAccountInfoIndex, '最近一笔结清贷款的发放距今月数'] = utils.difMonthReportTime(openDate,
  1709. reportTime)
  1710. settleDate = dfParser.formatDate(row0['账户关闭日期'])
  1711. loanAccountInfoDf.loc[loanAccountInfoIndex, '最近一笔结清贷款的结清距今月数'] = utils.difMonthReportTime(settleDate,
  1712. reportTime)
  1713. loanAccountInfoDf.loc[loanAccountInfoIndex, '历史贷款总法人机构数'] = df['管理机构'].unique().size
  1714. #1112 汇算
  1715. notSettleDf = df[df['账户状态'] != '结清'];
  1716. otherDf.loc[otherIndex, '未结清贷款机构数'] = notSettleDf['管理机构'].unique().size
  1717. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前同时在用的贷款机构数'] = df[df['余额(本金)'] > 0]['管理机构'].unique().size
  1718. statusDf = df[(df['账户状态'] != '结清') & (df['账户状态'] != '转出')]
  1719. bankDf = statusDf[statusDf['管理机构'].str.contains('银行')]
  1720. # 没有记录
  1721. if statusDf.index.size == 0:
  1722. isNotBankCust = -1
  1723. else:
  1724. if bankDf.index.size > 0: # 有一条以上不为结清,请包含银行
  1725. isNotBankCust = 1;
  1726. else:
  1727. isNotBankCust = 0;
  1728. loanAccountInfoDf.loc[loanAccountInfoIndex, '是否有非银行贷款客户'] = isNotBankCust
  1729. # 最严重的五级分类
  1730. # fiveType = ""
  1731. # for fiveTypeTmp in consts.fiveType:
  1732. # fiveTypeDf = statusDf[statusDf['五级分类']==fiveTypeTmp];
  1733. # if not fiveTypeDf.empty:
  1734. # fiveType = fiveTypeTmp;
  1735. # break;
  1736. # loanAccountInfoDf.loc[loanAccountInfoIndex, '贷款五级分类'] = fiveType
  1737. # 当前贷款LTV
  1738. # 从“贷款信息”中提取,剔除“账户状态”为结清及转出,并剔除“账户状态”为呆账且本金余额 = 0
  1739. # 的记录后,SUM(本金余额) / SUM(贷款本金)
  1740. # 如本金余额为空和贷款本金为0或为空,则当条记录不计算
  1741. loanLtvDf = df[(df['账户状态'] != '结清') & (df['账户状态'] != '转出') & (df['借款金额(本金)'] > 0) & (df['余额(本金)'] != '')]
  1742. badSetDf = loanLtvDf[~((loanLtvDf['账户状态'] == '呆账') & (loanLtvDf['余额(本金)'] == 0))]
  1743. balanceSum = np.sum(badSetDf['余额(本金)'].astype('int'))
  1744. loanAmtSum = np.sum(badSetDf['借款金额(本金)'].astype('int'))
  1745. if (loanAmtSum != 0):
  1746. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款LTV'] = round(np.divide(balanceSum, loanAmtSum), 2)
  1747. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款最高LTV'] = round(
  1748. np.max(np.divide(badSetDf['余额(本金)'].astype('int'), badSetDf['借款金额(本金)'].astype('int'))), 2)
  1749. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款最低LTV'] = round(
  1750. np.min(np.divide(badSetDf['余额(本金)'].astype('int'), badSetDf['借款金额(本金)'].astype('int'))), 2)
  1751. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款平均LTV'] = round(np.mean(np.divide(badSetDf['余额(本金)'].astype('int'), badSetDf['借款金额(本金)'].astype('int'))), 2)
  1752. # ['个人住房商业贷款','个人商用房(含商住两用)贷款','个人住房公积金贷款','房'],
  1753. houseLtvList = consts.houseLtvList;# ['个人住房商业贷款','个人商用房(含商住两用)贷款','个人住房公积金贷款','房'],
  1754. # houseLtvDf = badSetDf[badSetDf['业务种类'].isin(houseLtvList)]
  1755. # if not houseLtvDf.empty:
  1756. # loanAccountInfoDf.loc[loanAccountInfoIndex, '当前房贷LTV'] = round(np.divide(np.sum(houseLtvDf['余额(本金)'].astype('int')),np.sum(houseLtvDf['借款金额(本金)'].astype('int'))), 2)
  1757. # ['个人住房贷款','个人商用房(包括商住两用)贷款']
  1758. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前房贷LTV'] = lip.getCurLtv(badSetDf, houseLtvList)
  1759. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款机构数量'] = loanLtvDf['管理机构'].unique().size
  1760. cardLtvList = ['个人汽车消费贷款']#, '车'
  1761. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前车贷LTV'] = lip.getCurLtv(badSetDf, cardLtvList)
  1762. operateLtvList = ['个人经营性贷款']
  1763. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前经营贷LTV'] = lip.getCurLtv(badSetDf, operateLtvList)
  1764. consumeLtvList = ['其他个人消费贷款']
  1765. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前消费贷LTV'] = lip.getCurLtv(badSetDf, consumeLtvList)
  1766. bankLtvList = ['商业银行', '外资银行', '村镇银行', '住房储蓄银行', '财务公司']
  1767. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前银行贷LTV'] = lip.getCurBankLtv(badSetDf, bankLtvList)
  1768. bankLtvList = ['消费金融公司', '汽车金融公司', '信托公司'] # TODO
  1769. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前消金贷LTV'] = lip.getCurBankLtv(badSetDf, bankLtvList)
  1770. smallLoanLtvList = ['小额信贷公司']
  1771. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前小贷LTV'] = lip.getCurBankLtv(badSetDf, smallLoanLtvList)
  1772. # 当前贷款最大逾期期数
  1773. # 从“贷款信息”中提取,剔除“账户状态”为结清、转出、呆账、呆帐后,MAX(每笔贷款的当前逾期期数)
  1774. loanOverdueLtvDf = df[(df['账户状态'] != '结清') & (df['账户状态'] != '转出') & (df['账户状态'] != '呆账')]
  1775. if not loanOverdueLtvDf.empty:
  1776. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款最大逾期期数'] = np.max(loanOverdueLtvDf['当前逾期期数'])
  1777. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款最大逾期金额'] = np.max(loanOverdueLtvDf['当前逾期总额'])
  1778. loanOverdueLtvDf = loanOverdueLtvDf.reset_index(drop=True)
  1779. maxOverdueIndex = np.argmax(loanOverdueLtvDf['当前逾期期数'])
  1780. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款最大逾期期数对应的最大逾期金额'] = \
  1781. loanOverdueLtvDf.loc[maxOverdueIndex, :]['当前逾期总额']
  1782. loanAccountInfoDf.loc[loanAccountInfoIndex, '近3月开户最高贷款本金'] = lip.getLastLoanAmtMax(df,
  1783. reportTime,
  1784. 3) # 贷款指标加工单独放到一个文件里
  1785. loanAccountInfoDf.loc[loanAccountInfoIndex, '近3月开户最低贷款本金'] = lip.getLastLoanAmtMin(df,
  1786. reportTime,
  1787. 3)
  1788. loanAccountInfoDf.loc[loanAccountInfoIndex, '近3月开户平均贷款本金'] = lip.getLastLoanAmtAvg(df,
  1789. reportTime,
  1790. 3)
  1791. loanAccountInfoDf.loc[loanAccountInfoIndex, '近6月开户最高贷款本金'] = lip.getLastLoanAmtMax(df,
  1792. reportTime,
  1793. 6)
  1794. loanAccountInfoDf.loc[loanAccountInfoIndex, '近6月开户最低贷款本金'] = lip.getLastLoanAmtMin(df,
  1795. reportTime,
  1796. 6)
  1797. loanAccountInfoDf.loc[loanAccountInfoIndex, '近6月开户平均贷款本金'] = lip.getLastLoanAmtAvg(df,
  1798. reportTime,
  1799. 6)
  1800. loanAccountInfoDf.loc[loanAccountInfoIndex, '近12月开户最高贷款本金'] = lip.getLastLoanAmtMax(df,
  1801. reportTime,
  1802. 12)
  1803. loanAccountInfoDf.loc[loanAccountInfoIndex, '近12月开户最低贷款本金'] = lip.getLastLoanAmtMin(df,
  1804. reportTime,
  1805. 12)
  1806. loanAccountInfoDf.loc[loanAccountInfoIndex, '近12月开户平均贷款本金'] = lip.getLastLoanAmtAvg(df,
  1807. reportTime,
  1808. 12)
  1809. lastLoanDf = loanOverdueLtvDf;
  1810. if not lastLoanDf.empty:
  1811. loanAccountInfoDf.loc[loanAccountInfoIndex, '贷款最近一次还款日期距今时长'] = lip.getLastPayDateMinDays(lastLoanDf,reportTime)
  1812. normalDf = df[(df['账户状态'] == '正常') & (df['当前逾期期数'] == 0)]
  1813. # 未结清贷款总账户数:账户状态不等于结清和转出的记录数
  1814. notSettleDf = df[(df['账户状态'] != '结清') & (df['账户状态'] != '转出')]
  1815. #1113 汇算
  1816. cardLoanCountDf = df[df['业务种类'].isin(cardLtvList)]
  1817. otherDf.loc[otherIndex, '车贷发放笔数'] = cardLoanCountDf.index.size
  1818. #count(贷款账户) where 五级分类 in ('关注','次级','可疑','损失')
  1819. fiveDf = df[df['五级分类'].isin(['关注','次级','可疑','损失'])]
  1820. juziDf.loc[juziIndex, "贷款五级分类命中('关注','次级','可疑','损失')的账户数"] = fiveDf.index.size
  1821. loanStatusDf = df[df['账户状态'].isin(['逾期','呆账','转出','担保物不足','强制平仓','司法追偿'])]
  1822. juziDf.loc[juziIndex, "贷款状态为('逾期','呆账','转出','担保物不足','强制平仓','司法追偿')的账户数"] = loanStatusDf.index.size
  1823. #近12个月信贷最大授信额度
  1824. #max(放款金额) where 担保方式 in ("信用/免担保") and 业务种类 not in ("个人住房商业贷款","个人商用房(含商住两用)贷款","个人住房公积金贷款","个人汽车消费贷款") and (报告日期-开立日期)<=360天
  1825. loanCreditAmtDf = df[df['担保方式'].isin(['信用/免担保'])]
  1826. loanCreditAmtDf = loanCreditAmtDf[(~loanCreditAmtDf['业务种类'].isin(consts.notMortgageList))]
  1827. creditDate = utils.getLastMonthDate(reportTime,12)
  1828. loanCreditAmtDf = loanCreditAmtDf[loanCreditAmtDf["开立日期"]>=creditDate]
  1829. if not loanCreditAmtDf.empty:
  1830. otherDf.loc[otherIndex, "近12个月信贷最大授信额度"] = np.max(loanCreditAmtDf['借款金额(本金)'])
  1831. if not notSettleDf.empty:
  1832. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前正常贷款账户数'] = normalDf.index.size
  1833. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前正常贷款账户数占比'] = round(
  1834. normalDf.index.size / notSettleDf.index.size, 2)
  1835. # 当前未结清贷款余额总和
  1836. # ltvDf = tmpDf[tmpDf['业务种类'].isin(bizTypeList)]
  1837. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前未结清贷款余额总和'] = np.sum(notSettleDf['余额(本金)'])
  1838. # loanAccountInfoDf.loc[loanAccountInfoIndex, '当前未结清贷款余额总和'] = np.sum(notSettleDf['余额(本金)'])
  1839. # 当前未结清住房贷款余额总和
  1840. houseDf = notSettleDf[notSettleDf['业务种类'].isin(houseLtvList)]
  1841. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前未结清住房贷款余额总和'] = np.sum(houseDf['余额(本金)'])
  1842. # 当前未结清汽车贷款余额总和
  1843. cardDf = notSettleDf[notSettleDf['业务种类'].isin(cardLtvList)]
  1844. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前未结清汽车贷款余额总和'] = np.sum(cardDf['余额(本金)'])
  1845. # 当前未结清个人经营性贷款余额总和
  1846. operateLtvDf = notSettleDf[notSettleDf['业务种类'].isin(operateLtvList)]
  1847. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前未结清个人经营性贷款余额总和'] = np.sum(operateLtvDf['余额(本金)'])
  1848. # 当前平均每月贷款余额总和
  1849. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前平均每月贷款余额总和'] = round(np.sum(notSettleDf['余额(本金)']) / 12,
  1850. 2)
  1851. # 当前正常贷款账户余额
  1852. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前正常贷款账户余额'] = np.sum(normalDf['余额(本金)'])
  1853. # "从“贷款信息”中提取,剔除结清、转出,当前正常贷款账户余额/未结清贷款总余额(本金余额加总)
  1854. if np.sum(notSettleDf['余额(本金)']) > 0:
  1855. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前正常贷款账户余额占总余额比'] = round(
  1856. np.sum(normalDf['余额(本金)']) / np.sum(notSettleDf['余额(本金)']), 2)
  1857. #1113 汇算
  1858. #sum(本月应还款) where 业务种类 in ("个人住房商业贷款","个人商用房(含商住两用)贷款","个人住房公积金贷款") and 账户状态 not in("结清","转出","呆账")
  1859. housePayDf = notSettleDf[notSettleDf['业务种类'].isin(consts.houseLtvList)]
  1860. otherDf.loc[otherIndex, '房贷月还总额']=np.sum(housePayDf['本月应还款'])
  1861. cardPayMonthDf = notSettleDf[notSettleDf['业务种类'].isin(cardLtvList)]
  1862. otherDf.loc[otherIndex, '车贷月还总额'] = np.sum(cardPayMonthDf['本月应还款'])
  1863. #小额贷款笔数
  1864. smallLoanDf = notSettleDf[notSettleDf['借款金额(本金)']<=20000]
  1865. otherDf.loc[otherIndex, '小额贷款笔数'] = smallLoanDf.index.size
  1866. settleDf = df[(df['账户状态'] == '结清')]
  1867. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前正常结清贷款账户数'] = settleDf.index.size
  1868. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前正常结清贷款账户数占比'] = round(settleDf.index.size / df.index.size, 2)
  1869. # 贷款24期还款记录次数 TODO
  1870. # 最近3个月个人消费贷款发放额度
  1871. loanAccountInfoDf.loc[loanAccountInfoIndex, '贷款本月实还款金额'] = np.sum(loanOverdueLtvDf['本月应还款'])
  1872. loanAccountInfoDf.loc[loanAccountInfoIndex, '最近3个月个人消费贷款发放额度'] = lip.getLastPerConsumeAmt(df, 3, reportTime)
  1873. loanAccountInfoDf.loc[loanAccountInfoIndex, '最近6个月个人消费贷款发放额度'] = lip.getLastPerConsumeAmt(df, 6, reportTime)
  1874. loanAccountInfoDf.loc[loanAccountInfoIndex, '最近12个月个人消费贷款发放额度'] = lip.getLastPerConsumeAmt(df, 12, reportTime)
  1875. # 未结清贷款平均剩余还款期数
  1876. payPieDf = notSettleDf[notSettleDf['还款期数'] != '']
  1877. if payPieDf.index.size != 0:
  1878. loanAccountInfoDf.loc[loanAccountInfoIndex, '未结清贷款平均剩余还款期数'] = round(
  1879. np.sum(payPieDf['剩余还款期数']) / payPieDf.index.size, 2)
  1880. # 当前贷款本月应还金额总和
  1881. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款本月应还金额总和'] = np.sum(notSettleDf['本月应还款'])
  1882. # 当前贷款本月实还金额总额
  1883. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款本月实还金额总额'] = np.sum(notSettleDf['本月实还款'])
  1884. #1112汇算 非抵押类贷款授信总额
  1885. #sum(放款金额) where 业务种类 not in ("个人住房商业贷款","个人商用房(含商住两用)贷款","个人住房公积金贷款","个人汽车消费贷款")
  1886. # and 担保方式 not in ("抵押") and 账户状态不等于"结清" TODO
  1887. notMortgageList = consts.notMortgageList
  1888. notMortgageSettleDf = df[(df['担保方式'] != '抵押') & (df['账户状态'] != '结清')]
  1889. notMortgageSettleDf = notMortgageSettleDf[(~notMortgageSettleDf['业务种类'].isin(notMortgageList))]
  1890. otherDf.loc[otherIndex,"非抵押类贷款授信总额"]=np.sum(notMortgageSettleDf['借款金额(本金)'])
  1891. otherDf.loc[otherIndex, "未结清非抵押贷款笔数"] = notMortgageSettleDf.index.size
  1892. otherDf.loc[otherIndex, "未结清非抵押类贷款本金余额"] = np.sum(notMortgageSettleDf['余额(本金)'])
  1893. notMortgageDf = df[(df['担保方式'] != '抵押') & (df['账户状态'] != '结清') & (df['账户状态'] != '呆账') & (df['账户状态'] != '转出')]
  1894. notMortgageDf = notMortgageDf[(~notMortgageDf['业务种类'].isin(notMortgageList))]
  1895. otherDf.loc[otherIndex, "未结清非抵押类贷款月还总额"] = np.sum(notMortgageDf['本月应还款'])
  1896. sanshouDf.loc[sanshouIndex,"最大贷款余额"]= np.max(notSettleDf["余额(本金)"])
  1897. sanshouDf.loc[sanshouIndex, "未结清所有贷款合同总额"] = np.sum(notSettleDf["借款金额(本金)"])
  1898. # 解析贷记卡账户信息指标
  1899. def parseCreditCardMergeDf(self,df,reportTime):
  1900. if not df.empty:
  1901. # 历史信用卡总法人机构数
  1902. # creditCardAccountInfoDf.loc[creditCardAccountInfoIndex,'历史信用卡总法人机构数'] = df['发卡机构'].unique().size
  1903. # creditCardUseDf = df[df['已用额度']>0];
  1904. # creditCardAccountInfoDf.loc[creditCardAccountInfoIndex,'当前同时在用的信用卡机构数'] = creditCardUseDf['发卡机构'].unique().size
  1905. fstDate = np.min(df['开立日期']);
  1906. sanshouDf.loc[sanshouIndex, '最早信用卡发卡天数'] = utils.difDateReportTime(reportTime,fstDate)
  1907. # 统一排除
  1908. creditDf = df[(df['币种'] == '人民币元') & (df['账户状态'] != '未激活') & (df['账户状态'] != '销户') & (df['账户状态'] != '呆账')]
  1909. totalAmtDf = df[(df['币种'] == '人民币元') & (df['账户状态'] != '未激活') & (df['账户状态'] != '销户') & (df['账户状态'] != '呆账')]
  1910. # 大额专项分期额度(合计)
  1911. # 已用分期金额(合计)
  1912. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '大额专项分期额度(合计)'] = np.sum(creditDf['大额专项分期额度'])
  1913. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '已用分期金额(合计)'] = np.sum(creditDf['已用分期金额'])
  1914. # creditCardAccountInfoDf.loc[creditCardAccountInfoIndex,'贷记卡账户当前总额度'] = cip.getMaxCreditAmt(creditDf)
  1915. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '最近新发放的3张贷记卡平均额度'] = cip.getAvgCreditAmt(creditDf)
  1916. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡额度使用率超过90%的机构数占比'] = cip.getUseRate(creditDf,
  1917. df, 0.9)
  1918. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡额度使用率超过100%的机构数占比'] = cip.getUseRate(creditDf,
  1919. totalAmtDf,
  1920. 1)
  1921. # 从“贷记卡信息”中提取,计算授信额度时剔除销户,计算已用额度时剔除呆账、呆帐、销户后,SUM(各账户已用额度) / SUM(各账户授信额度)
  1922. useCreditDf = df[(df['币种'] == '人民币元') & (df['账户状态'] != '销户') & (df['账户状态'] != '呆账')]
  1923. totalCreditDf = df[(df['币种'] == '人民币元') & (df['账户状态'] != '销户')]
  1924. totalCreditAmt = np.sum(totalCreditDf['账户授信额度'])
  1925. if totalCreditAmt != 0: # 授信额度不能为0
  1926. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡账户当前总额度使用率'] = round(
  1927. np.sum(useCreditDf['已用额度']) / np.sum(totalCreditDf['账户授信额度']), 2)
  1928. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡账户最高使用额度总的使用率'] = round(
  1929. np.sum(useCreditDf['最大使用额']) / np.sum(totalCreditDf['账户授信额度']), 2)
  1930. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡账户近6月平均额度总的使用率'] = round(
  1931. np.sum(useCreditDf['最近6个月平均使用额度']) / np.sum(totalCreditDf['账户授信额度']), 2)
  1932. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前贷记卡最大逾期期数'] = np.max(creditDf['当前逾期期数']) # 用于计算
  1933. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前贷记卡最大逾期金额'] = np.max(creditDf['当前逾期总额'])
  1934. #1112 修改
  1935. otherDf.loc[otherIndex, '贷记卡当前逾期金额'] = np.sum(creditDf['当前逾期总额'])
  1936. if not creditDf.empty:
  1937. creditDf = creditDf.reset_index(drop=True)
  1938. maxOverdueIndex = np.argmax(creditDf['当前逾期期数'])
  1939. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前贷记卡最大逾期期数对应的最大逾期金额'] = \
  1940. creditDf.loc[maxOverdueIndex, :]['当前逾期总额']
  1941. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近3月开卡最高额度'] = cip.getLastMonthMaxCreditAmt(df,
  1942. reportTime,
  1943. 3)
  1944. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近3月开卡最低额度'] = cip.getLastMonthMinCreditAmt(df,
  1945. reportTime,
  1946. 3)
  1947. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近3月开卡平均额度'] = cip.getLastMonthAvgCreditAmt(df,
  1948. reportTime,
  1949. 3)
  1950. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近6月开卡最高额度'] = cip.getLastMonthMaxCreditAmt(df,
  1951. reportTime,
  1952. 6)
  1953. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近6月开卡最低额度'] = cip.getLastMonthMinCreditAmt(df,
  1954. reportTime,
  1955. 6)
  1956. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近6月开卡平均额度'] = cip.getLastMonthAvgCreditAmt(df,
  1957. reportTime,
  1958. 6)
  1959. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近12月开卡最高额度'] = cip.getLastMonthMaxCreditAmt(df,
  1960. reportTime,
  1961. 12)
  1962. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近12月开卡最低额度'] = cip.getLastMonthMinCreditAmt(df,
  1963. reportTime,
  1964. 12)
  1965. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近12月开卡平均额度'] = cip.getLastMonthAvgCreditAmt(df,
  1966. reportTime,
  1967. 12)
  1968. if not creditDf.empty:
  1969. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡最近一次还款日期距今时长'] = cip.getLastPayDateMinDays(
  1970. creditDf, reportTime)
  1971. paySo = np.sum(creditDf['本月应还款'])
  1972. if (paySo) != 0:
  1973. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡还款比例'] = round(
  1974. np.sum(creditDf['本月实还款']) / np.sum(creditDf['本月应还款']), 2)
  1975. creditDfTmp = creditDf[creditDf['本月应还款'] > 0]
  1976. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡最高还款比例'] = round(
  1977. np.max(np.divide(creditDfTmp['本月实还款'], creditDfTmp['本月应还款'])), 2)
  1978. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡最低还款比例'] = round(
  1979. np.min(np.divide(creditDfTmp['本月实还款'], creditDfTmp['本月应还款'])), 2)
  1980. #贷记卡疑似分期笔数 汇算
  1981. installmentDf = creditDf[(creditDf['本月实还款']>0) & (creditDf['本月应还款']>200) &(creditDf['本月实还款']< creditDf['本月应还款']/9)]
  1982. otherDf.loc[otherIndex, '贷记卡疑似分期笔数'] = installmentDf.index.size
  1983. normalDf = df[(df['币种'] == '人民币元') & (df['账户状态'] == '正常') & (df['当前逾期期数'] == 0)];
  1984. activeDf = df[(df['币种'] == '人民币元') & (df['账户状态'] == '正常')];
  1985. notCloseDf = df[(df['账户状态'] != '销户')]
  1986. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前正常贷记卡账户数'] = normalDf.index.size
  1987. if not notCloseDf.empty and not normalDf.empty:
  1988. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前正常贷记卡账户数占比'] = round(
  1989. normalDf.index.size / notCloseDf.index.size, 2)
  1990. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前正常贷记卡已用额度'] = np.sum(normalDf['已用额度'])
  1991. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前正常且有余额的贷记卡账户数'] = normalDf[
  1992. normalDf['已用额度'] > 0].index.size
  1993. if not creditDf.empty:
  1994. creditUseAmt = np.sum(creditDf['已用额度'])
  1995. if creditUseAmt != 0:
  1996. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前正常贷记卡账户余额占总余额比'] = round(
  1997. np.sum(normalDf['已用额度']) / np.sum(creditDf['已用额度']), 2)
  1998. if notCloseDf.empty:
  1999. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前正常且有余额的贷记卡账户数占比'] = -99
  2000. else:
  2001. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前正常且有余额的贷记卡账户数占比'] = \
  2002. round(creditCardAccountInfoDf.loc[
  2003. creditCardAccountInfoIndex, '当前正常且有余额的贷记卡账户数'] / notCloseDf.index.size, 3)
  2004. # 当前正常贷记卡账户余额占总余额比
  2005. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前贷记卡本月实还金额总和'] = np.sum(creditDf['本月实还款'])
  2006. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前贷记卡本月应还金额总和'] = np.sum(creditDf['本月应还款'])
  2007. maxAmtDf = df[(df['币种'] == '人民币元')]
  2008. if not maxAmtDf.empty:
  2009. maxAmtDf = maxAmtDf.reset_index(drop=True)
  2010. maxAmtIndex = np.argmax(maxAmtDf['账户授信额度'])
  2011. maxOpenDate = maxAmtDf.loc[maxAmtIndex, :]['开立日期'];
  2012. creditCardAccountInfoDf.loc[
  2013. creditCardAccountInfoIndex, '额度最高的人民币贷记卡开卡距今月份数'] = utils.difMonthReportTime(maxOpenDate,reportTime);
  2014. # 名下贷记卡数量-状态正常
  2015. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '名下贷记卡数量-状态正常'] = df[
  2016. (df['账户状态'] != '销户')].index.size
  2017. # 名下贷记卡数量-状态未激活
  2018. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '名下贷记卡数量-状态未激活'] = df[
  2019. (df['账户状态'] == '未激活')].index.size
  2020. # 名下贷记卡数量-状态异常异常包含(2-冻结,3-止付,5-呆帐,10-其他)
  2021. abnormalList = ['冻结', '止付', '呆账', '司法追偿','银行止付']#原来为其他
  2022. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '名下贷记卡数量-状态异常'] = df[(df['账户状态'].isin(abnormalList))].index.size
  2023. # 名下贷记卡比例-状态正常
  2024. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '名下贷记卡比例-状态正常'] = round(
  2025. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '名下贷记卡数量-状态正常'] / df.index.size, 2)
  2026. # 名下贷记卡比例-状态未激活
  2027. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '名下贷记卡比例-状态未激活'] = round(
  2028. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '名下贷记卡数量-状态未激活'] / df.index.size, 2)
  2029. # 名下贷记卡比例-状态异常
  2030. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '名下贷记卡比例-状态异常'] = round(
  2031. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '名下贷记卡数量-状态异常'] / df.index.size, 2)
  2032. #1113汇算
  2033. abnormalList = ['冻结', '止付', '呆账', '司法追偿','银行止付']
  2034. otherDf.loc[otherIndex, "贷记卡状态为('呆账','冻结','止付','司法追偿')的账户数"] = df[(df['账户状态'].isin(abnormalList))].index.size
  2035. availableCreditDf = activeDf[activeDf['最近6个月平均使用额度'] > 500] #正常的信用卡
  2036. otherDf.loc[otherIndex, '有效信用卡张数'] = availableCreditDf.index.size
  2037. #使用中的所有贷记卡中发卡时间距征信查询时间的最大天数 0111三寿
  2038. if not activeDf.empty:
  2039. fstDate = np.min(activeDf['开立日期']);
  2040. sanshouDf.loc[sanshouIndex,"使用中贷记卡最早发卡天数"]=utils.difDateReportTime(reportTime, fstDate)
  2041. # 解析准贷记卡账户信息指标
  2042. def parseCreditCardMergeDfZ(self,df, payRcd):
  2043. if not df.empty:
  2044. overdueCreditCardRcdDf = payRcd[payRcd['账户编号'].isin(df['账户编号'].values)];
  2045. overdueCreditCardRcdDf = utils.replacePayRcdStatusOverdue(overdueCreditCardRcdDf)
  2046. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '本月应还款(合计)'] = np.nansum(df['透支余额'])
  2047. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '本月实还款(合计)'] = np.nansum(df['本月实还款'])
  2048. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '最近一次还款日期'] = np.nanmax(df['最近一次还款日期'])
  2049. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '当前一共透支期数'] = cip.getCurOverdueNum(
  2050. overdueCreditCardRcdDf);
  2051. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '当前一共透支总额'] = np.nansum(df['透支余额'])
  2052. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '透支180天以上未支付余额(合计)'] = np.nansum(
  2053. df['透支180天以上未付余额'])
  2054. # 名下贷记卡数量-状态异常异常包含(2-冻结,3-止付,5-呆帐,10-其他)
  2055. abnormalList = ['冻结', '止付', '呆账', '其他','银行止付']
  2056. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '名下准贷记卡数量-状态异常'] = df[(df['账户状态'].isin(abnormalList))].index.size
  2057. creditDf = df[(df['账户状态'] != '未激活') & (df['账户状态'] != '销户')]
  2058. if not creditDf.empty:
  2059. totalAmt = np.nansum(creditDf['账户授信额度'])
  2060. creditAmt = np.nansum(creditDf['透支余额'])
  2061. if totalAmt != 0:
  2062. # 从“贷记卡信息”中提取,剔除未激活、销户后,所有账户透支金额/所有账户账户授信额度。
  2063. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '全部准贷记卡账户当前总额度使用率'] = round(
  2064. creditAmt / totalAmt, 2)
  2065. # 从“贷记卡信息”中提取,剔除未激活、销户后,MAX(单账户最高透支金额/单账户授信额度)
  2066. creditMaxDf = creditDf[creditDf['账户授信额度'] > 0]
  2067. if not creditMaxDf.empty:
  2068. creditMaxDf = creditMaxDf.fillna(0.0)
  2069. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '准贷记卡账户最高使用额度总的使用率'] = round(
  2070. np.max(np.divide(creditMaxDf['最大透支余额'], creditMaxDf['账户授信额度'])), 2)
  2071. creditMaxDf = creditDf[creditDf['最大透支余额'] > 0]
  2072. if not creditMaxDf.empty:
  2073. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '当前准贷记卡最大透支金额'] = np.max(
  2074. creditMaxDf['最大透支余额'])
  2075. # 从“贷记卡信息”中提取,剔除未激活、销户后,当前透支准贷记卡账户数/总准贷记卡账户数,透支账户判断:透支余额不为0的账户
  2076. creditDfTmp = creditDf[creditDf['透支余额'] > 0]
  2077. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '当前准贷记卡透支账户数占比'] = round(
  2078. creditDfTmp.index.size / creditDf.index.size, 2)
  2079. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '当前准贷记卡本月应还金额总和'] = np.nansum(df['透支余额'])
  2080. creditCardAccountInfoDfZ.loc[creditCardAccountInfoIndexZ, '当前准贷记卡本月实还金额总和'] = np.nansum(df['本月实还款'])
  2081. # 解析使用率 TODO 使用汇总计算还是使用明细计算
  2082. def parseUseRate(self):
  2083. # useRateDf.loc[useRateIndex, '贷记卡账户使用率(已用额度/授信总额)']
  2084. # 从“信贷交易授信及负债信息概要”中“非循环贷账户信息汇总”、“循环额度下分账户信息汇总”、“循环贷账户信息汇总”、“贷记卡账户信息汇总”和“准贷记卡账户信息汇总”里提取,SUM(
  2085. # 所有“余额”、“已用额度”和“透支余额”) / SUM(所有“授信总额”和“授信额度”)
  2086. loanUseAmt = briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '非循环贷账户余额']
  2087. cycleCreditUseAmt = briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环额度下分账户余额']
  2088. cycleUseAmt = briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环贷账户余额']
  2089. creditUseAmt = briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '贷记卡已用额度']
  2090. creditAmtUseZ = briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '准贷记卡已用额度']
  2091. loanTotalAmt = briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '非循环贷账户授信总额']
  2092. cycleCreditTotalAmt = briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环额度下分账户授信总额']
  2093. cycleTotalAmt = briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '循环贷账户授信总额']
  2094. creditTotalAmt = briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '贷记卡授信总额']
  2095. creditAmtTotalZ = briefInfoDf_loanTradeCreditInfo.loc[loanTradeCreditInfoIndex, '准贷记卡授信总额']
  2096. # if str(loanUseAmt)=="nan":
  2097. # loanUseAmt = 0;
  2098. # if str(cycleCreditUseAmt) == "nan":
  2099. # loanUseAmt = 0;
  2100. # if str(cycleCreditUseAmt) == "nan":
  2101. # loanUseAmt = 0;
  2102. useAmt = loanUseAmt + cycleCreditUseAmt + cycleUseAmt + creditUseAmt + creditAmtUseZ
  2103. totalAmt = loanTotalAmt + cycleCreditTotalAmt + cycleTotalAmt + creditTotalAmt + creditAmtTotalZ
  2104. if totalAmt != 0:
  2105. useRateDf.loc[useRateIndex, '全账户使用率(已用额度/授信总额)'] = round(useAmt / totalAmt, 2)
  2106. if loanTotalAmt != 0:
  2107. useRateDf.loc[useRateIndex, '非循环贷账户使用率(已用额度/授信总额)'] = round(loanUseAmt / loanTotalAmt, 2)
  2108. if cycleCreditTotalAmt != 0:
  2109. useRateDf.loc[useRateIndex, '循环额度下分账户使用率(已用额度/授信总额)'] = round(cycleCreditTotalAmt / cycleCreditTotalAmt, 2)
  2110. if cycleTotalAmt != 0:
  2111. useRateDf.loc[useRateIndex, '循环贷账户使用率(已用额度/授信总额)'] = round(cycleUseAmt / cycleTotalAmt, 2)
  2112. if creditTotalAmt != 0:
  2113. useRateDf.loc[useRateIndex, '贷记卡账户使用率(已用额度/授信总额)'] = round(creditUseAmt / creditTotalAmt, 2)
  2114. if creditAmtTotalZ != 0:
  2115. useRateDf.loc[useRateIndex, '准贷记卡账户使用率(已用额度/授信总额)'] = round(creditAmtUseZ / creditAmtTotalZ, 2)
  2116. # 解析开户数
  2117. def parseOpenAccount(self,loanDf, creditCardDf, creditCardDfZ, recoveryInfoMergeDf, loanPayRecordMergeDf,
  2118. creditCardPayRecordMergeDf, creditCardPayRecordMergeDfZ,reportTime):
  2119. openAccountDf.loc[openAccountIndex, '近3个月全账户开户数'] = cip.getOpenAccount(loanDf, reportTime,
  2120. 3) + cip.getOpenAccount(creditCardDf,
  2121. reportTime,
  2122. 3) + cip.getOpenAccount(
  2123. creditCardDfZ, reportTime, 3)
  2124. openAccountDf.loc[openAccountIndex, '近6个月全账户开户数'] = cip.getOpenAccount(loanDf, reportTime,
  2125. 6) + cip.getOpenAccount(creditCardDf,
  2126. reportTime,
  2127. 6) + cip.getOpenAccount(
  2128. creditCardDfZ, reportTime, 6)
  2129. openAccountDf.loc[openAccountIndex, '近9个月全账户开户数'] = cip.getOpenAccount(loanDf, reportTime,
  2130. 9) + cip.getOpenAccount(creditCardDf,
  2131. reportTime,
  2132. 9) + cip.getOpenAccount(
  2133. creditCardDfZ, reportTime, 9)
  2134. openAccountDf.loc[openAccountIndex, '近12个月全账户开户数'] = cip.getOpenAccount(loanDf, reportTime,
  2135. 12) + cip.getOpenAccount(creditCardDf,
  2136. reportTime,
  2137. 12) + cip.getOpenAccount(
  2138. creditCardDfZ, reportTime, 12)
  2139. openAccountDf.loc[openAccountIndex, '近24个月全账户开户数'] = cip.getOpenAccount(loanDf, reportTime,
  2140. 24) + cip.getOpenAccount(creditCardDf,
  2141. reportTime,
  2142. 24) + cip.getOpenAccount(
  2143. creditCardDfZ, reportTime, 24)
  2144. openAccountDf.loc[openAccountIndex, '近3个月消费金融类账户开户数'] = lip.getOpenAccount(loanDf, reportTime, 3,
  2145. consts.bankList)
  2146. openAccountDf.loc[openAccountIndex, '近6个月消费金融类账户开户数'] = lip.getOpenAccount(loanDf, reportTime, 6,
  2147. consts.bankList)
  2148. openAccountDf.loc[openAccountIndex, '近9个月消费金融类账户开户数'] = lip.getOpenAccount(loanDf, reportTime, 9,
  2149. consts.bankList)
  2150. openAccountDf.loc[openAccountIndex, '近12个月消费金融类账户开户数'] = lip.getOpenAccount(loanDf, reportTime, 12,
  2151. consts.bankList)
  2152. openAccountDf.loc[openAccountIndex, '近24个月消费金融类账户开户数'] = lip.getOpenAccount(loanDf, reportTime, 24,
  2153. consts.bankList)
  2154. openAccountDf.loc[openAccountIndex, '近3个月贷款账户开户数'] = lip.getOpenAccount(loanDf, reportTime, 3, "")
  2155. openAccountDf.loc[openAccountIndex, '近6个月贷款账户开户数'] = lip.getOpenAccount(loanDf, reportTime, 6, "")
  2156. openAccountDf.loc[openAccountIndex, '近9个月贷款账户开户数'] = lip.getOpenAccount(loanDf, reportTime, 9, "")
  2157. openAccountDf.loc[openAccountIndex, '近12个月贷款账户开户数'] = lip.getOpenAccount(loanDf, reportTime, 12, "")
  2158. openAccountDf.loc[openAccountIndex, '近24个月贷款账户开户数'] = lip.getOpenAccount(loanDf, reportTime, 24, "")
  2159. openAccountDf.loc[openAccountIndex, '近3个月贷记卡账户开户数'] = cip.getOpenAccount(creditCardDf, reportTime, 3)
  2160. openAccountDf.loc[openAccountIndex, '近6个月贷记卡账户开户数'] = cip.getOpenAccount(creditCardDf, reportTime, 6)
  2161. openAccountDf.loc[openAccountIndex, '近9个月贷记卡账户开户数'] = cip.getOpenAccount(creditCardDf, reportTime, 9)
  2162. openAccountDf.loc[openAccountIndex, '近12个月贷记卡账户开户数'] = cip.getOpenAccount(creditCardDf, reportTime, 12)
  2163. openAccountDf.loc[openAccountIndex, '近24个月贷记卡账户开户数'] = cip.getOpenAccount(creditCardDf, reportTime, 24)
  2164. openAccountDf.loc[openAccountIndex, '近3个月准贷记卡账户开户数'] = cip.getOpenAccount(creditCardDfZ, reportTime, 3)
  2165. openAccountDf.loc[openAccountIndex, '近6个月准贷记卡账户开户数'] = cip.getOpenAccount(creditCardDfZ, reportTime, 6)
  2166. openAccountDf.loc[openAccountIndex, '近9个月准贷记卡账户开户数'] = cip.getOpenAccount(creditCardDfZ, reportTime, 9)
  2167. openAccountDf.loc[openAccountIndex, '近12个月准贷记卡账户开户数'] = cip.getOpenAccount(creditCardDfZ, reportTime, 12)
  2168. openAccountDf.loc[openAccountIndex, '近24个月准贷记卡账户开户数'] = cip.getOpenAccount(creditCardDfZ, reportTime, 24)
  2169. #三寿
  2170. sanshouDf.loc[sanshouIndex, '最近24M发卡数量'] = cip.getOpenAccount(creditCardDf, reportTime, 24)+cip.getOpenAccount(creditCardDfZ, reportTime, 24)
  2171. # 从“信贷交易信息明细”中“非循环贷账户”、“循环额度下分账户”、“循环贷账户”、“贷记卡账户”和“准贷记卡账户”里提取,5年里账户还款状态出现“1、2、3、4、5、6、7、D、Z、G、B”的账户数/所有账户数
  2172. overdueLoanPayRcdDf = loanPayRecordMergeDf[loanPayRecordMergeDf['账户编号'].isin(loanDf['账户编号'].values)]
  2173. overdueLoanPayRcdDf = utils.replacePayRcdStatusOverdue(overdueLoanPayRcdDf)
  2174. overdueLoanPayRcdDf = overdueLoanPayRcdDf[overdueLoanPayRcdDf['还款状态'] > 0]
  2175. overdueCreditPayRcdDf = creditCardPayRecordMergeDf[
  2176. creditCardPayRecordMergeDf['账户编号'].isin(creditCardDf['账户编号'].values)]
  2177. overdueCreditPayRcdDf = utils.replacePayRcdStatusOverdue(overdueCreditPayRcdDf)
  2178. overdueCreditPayRcdDf = overdueCreditPayRcdDf[overdueCreditPayRcdDf['还款状态'] > 0]
  2179. overdueCreditPayRcdDfZ = creditCardPayRecordMergeDfZ[
  2180. creditCardPayRecordMergeDfZ['账户编号'].isin(creditCardDfZ['账户编号'].values)]
  2181. overdueCreditPayRcdDfZ = utils.replacePayRcdStatusOverdue(overdueCreditPayRcdDfZ)
  2182. overdueCreditPayRcdDfZ = overdueCreditPayRcdDfZ[overdueCreditPayRcdDfZ['还款状态'] > 0]
  2183. loanAccountNum = loanPayRecordMergeDf['账户编号'].unique().size
  2184. creditAccountNum = creditCardPayRecordMergeDf['账户编号'].unique().size
  2185. creditAccountNumZ = creditCardPayRecordMergeDfZ['账户编号'].unique().size
  2186. overdueLoanNum = overdueLoanPayRcdDf['账户编号'].unique().size
  2187. overdueCreditNum = overdueCreditPayRcdDf['账户编号'].unique().size
  2188. overdueCreditNumZ = overdueCreditPayRcdDfZ['账户编号'].unique().size
  2189. if (loanAccountNum + creditAccountNum + creditAccountNumZ) > 0:
  2190. openAccountDf.loc[openAccountIndex, '有过逾期记录的账户/全账户数'] = round(
  2191. (overdueLoanNum + overdueCreditNum + overdueCreditNumZ) / (
  2192. loanAccountNum + creditAccountNum + creditAccountNumZ), 2)
  2193. otherPerLoanDf = loanDf[loanDf['业务种类'].isin(consts.bankList)]
  2194. otherPerLoanNum = otherPerLoanDf.index.size;
  2195. overdueOtherPerLoanNum = otherPerLoanDf[
  2196. otherPerLoanDf['账户编号'].isin(overdueLoanPayRcdDf['账户编号'].values)].index.size;
  2197. if otherPerLoanNum != 0:
  2198. openAccountDf.loc[openAccountIndex, '有过逾期记录的消费金融类账户/全消费金融类账户数'] = round(
  2199. overdueOtherPerLoanNum / otherPerLoanNum, 2)
  2200. if loanAccountNum != 0:
  2201. openAccountDf.loc[openAccountIndex, '有过逾期记录的贷款账户/全贷款账户数'] = round(overdueLoanNum / loanAccountNum, 2)
  2202. if creditAccountNum != 0:
  2203. openAccountDf.loc[openAccountIndex, '有过逾期记录的贷记卡账户/全贷记卡账户数'] = round(overdueCreditNum / creditAccountNum, 2)
  2204. if creditAccountNumZ != 0:
  2205. openAccountDf.loc[openAccountIndex, '有过透支记录的准贷记卡账户/全准贷记卡账户数'] = round(overdueCreditNumZ / creditAccountNumZ,
  2206. 2)
  2207. # 0525新增
  2208. pledgeLoanDf = loanDf[loanDf['担保方式'] == '抵押']
  2209. pledgeCreditCardDf = creditCardDf[creditCardDf['担保方式'] == '抵押']
  2210. pledgeCreditCardDfZ = creditCardDfZ[creditCardDfZ['担保方式'] == '抵押']
  2211. isPledge = "否"
  2212. if pledgeLoanDf.index.size + pledgeCreditCardDf.index.size + pledgeCreditCardDfZ.index.size > 0:
  2213. isPledge = "是"
  2214. creditLoanDf = loanDf[loanDf['担保方式'] == '信用/免担保']
  2215. creditCreditCardDf = creditCardDf[creditCardDf['担保方式'] == '信用/免担保']
  2216. creditCreditCardDfZ = creditCardDfZ[creditCardDfZ['担保方式'] == '信用/免担保']
  2217. isCredit = 0
  2218. if creditLoanDf.index.size + creditCreditCardDf.index.size + creditCreditCardDfZ.index.size > 0:
  2219. isCredit = creditLoanDf.index.size + creditCreditCardDf.index.size + creditCreditCardDfZ.index.size
  2220. briefInfoDf_loanTradeInfo.loc[loanTradeInfoIndex, '是否存在担保方式为抵押的贷款'] = isPledge
  2221. briefInfoDf_loanTradeInfo.loc[loanTradeInfoIndex, '担保方式为信用的贷款数量'] = isCredit
  2222. #使用中贷记卡平均发卡天数
  2223. try:
  2224. sanshouDf.loc[sanshouIndex, '使用中贷记卡平均发卡天数'] = cip.getAvgUseCreditCardDay(creditCardDf,creditCardDfZ,reportTime)
  2225. sanshouDf.loc[sanshouIndex, '最大信用账户天数(贷款&贷记卡人民账户)'] = cip.getMaxAmtAccountDay(loanDf,creditCardDf,creditCardDfZ ,reportTime)
  2226. sanshouDf.loc[sanshouIndex, '额度使用>=50%的贷记卡数'] = cip.getUseRateCount(creditCardDf,creditCardDfZ,0.5)
  2227. sanshouDf.loc[sanshouIndex, '额度使用>=75%的贷记卡数'] = cip.getUseRateCount(creditCardDf, creditCardDfZ, 0.75)
  2228. sanshouDf.loc[sanshouIndex, '额度使用>=100%的贷记卡数'] = cip.getUseRateCount(creditCardDf, creditCardDfZ, 1)
  2229. minMonthStr = ""
  2230. fstLoanMon = str(otherDf.loc[otherIndex, '首笔贷款发放月份'])
  2231. fstCreditCardMonth = str(otherDf.loc[otherIndex, '首张贷记卡发卡月份'])
  2232. if fstLoanMon=="nan":
  2233. fstLoanMon = ""
  2234. if fstCreditCardMonth=="nan":
  2235. fstCreditCardMonth = ""
  2236. if fstLoanMon=='' and fstCreditCardMonth!='':
  2237. minMonthStr = otherDf.loc[otherIndex, '首张贷记卡发卡月份']
  2238. elif fstLoanMon!='' and fstCreditCardMonth!='':
  2239. minMonth = [otherDf.loc[otherIndex, '首笔贷款发放月份'], otherDf.loc[otherIndex, '首张贷记卡发卡月份']]
  2240. minMonthStr = min(minMonth)
  2241. elif fstLoanMon!='' and fstCreditCardMonth=='':
  2242. minMonthStr = otherDf.loc[otherIndex, '首笔贷款发放月份']
  2243. if minMonthStr != '':
  2244. sanshouDf.loc[sanshouIndex, '贷款、贷记卡最大天数'] = utils.difDateReportTime(reportTime, minMonthStr)
  2245. if not loanDf.empty:
  2246. openAccount3MDf = loanDf[loanDf['开立日期'] < utils.getLastMonthDate(reportTime, 6)]
  2247. sanshouDf.loc[sanshouIndex, '开户180天以上的贷款笔数'] = openAccount3MDf.index.size
  2248. if not creditCardDf.empty:
  2249. sanshouDf.loc[sanshouIndex, '开户1年以内历史逾期90+贷记卡和准贷记卡数'] =cip.getOverDueCount(creditCardDf,creditCardPayRecordMergeDf,reportTime,3,12)\
  2250. +cip.getOverDueCount(creditCardDfZ,creditCardPayRecordMergeDfZ,reportTime,3,12)
  2251. sanshouDf.loc[sanshouIndex, '开户1年以内历史逾期贷记卡和准贷记卡数'] = cip.getOverDueCount(creditCardDf,creditCardPayRecordMergeDf,reportTime, 1, 12)\
  2252. +cip.getOverDueCount(creditCardDfZ, creditCardPayRecordMergeDfZ, reportTime, 1, 12)
  2253. sanshouDf.loc[sanshouIndex, '开户2年以内历史逾期贷记卡数'] = cip.getOverDueCount(creditCardDf,creditCardPayRecordMergeDf,reportTime, 1, 24)
  2254. except:
  2255. logger.error(traceback.print_exc())
  2256. logger.error(traceback.format_exc())
  2257. # 解析24期还款状态指标
  2258. def parsePayRcdStatus(self,loanMergeDf, creditCardMergeDf, creditCardMergeDfZ, loanPayRecordMergeDf,
  2259. creditCardPayRecordMergeDf, creditCardPayRecordMergeDfZ,reportTime):
  2260. # creditCardPayRecordMergeDf
  2261. # 去掉外币
  2262. creditCardMergeDf = creditCardMergeDf[creditCardMergeDf['币种'] == '人民币元']
  2263. creditCardPayRecordMergeDf = creditCardPayRecordMergeDf[
  2264. creditCardPayRecordMergeDf['账户编号'].isin(creditCardMergeDf['账户编号'].values)]
  2265. reportTime = str(np.datetime64(reportTime, "M")) + "-02" # 06-02,统计24期还款状态报告期,按每月的2号,避免chu'xian
  2266. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近3月逾期期数大于或等于“1”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2267. reportTime, 1, 3)
  2268. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近6月逾期期数大于或等于“1”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2269. reportTime, 1, 6)
  2270. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近12月逾期期数大于或等于“1”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2271. reportTime, 1, 12)
  2272. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近24月逾期期数大于或等于“1”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2273. reportTime, 1, 24)
  2274. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近6月逾期期数大于或等于“2”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2275. reportTime, 2, 6)
  2276. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近12月逾期期数大于或等于“2”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2277. reportTime, 2, 12)
  2278. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近24月逾期期数大于或等于“2”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2279. reportTime, 2, 24)
  2280. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近6月逾期期数大于或等于“3”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2281. reportTime, 3, 6)
  2282. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近12月逾期期数大于或等于“3”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2283. reportTime, 3, 12)
  2284. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近24月逾期期数大于或等于“3”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2285. reportTime, 3, 24)
  2286. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近12月逾期期数大于或大等于“4”的次数'] = prp.getLoanOverdueTimes(
  2287. loanPayRecordMergeDf, reportTime, 4, 12)
  2288. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近24月逾期期数大于或等于“4”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2289. reportTime, 4, 24)
  2290. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近3月逾期期数大于或等于“1”的次数'] = cip.getLoanOverdueTimes(
  2291. creditCardPayRecordMergeDf, reportTime, 1, 3)
  2292. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近6月逾期期数大于或等于“1”的次数'] = cip.getLoanOverdueTimes(
  2293. creditCardPayRecordMergeDf, reportTime, 1, 6)
  2294. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近12月逾期期数大于或等于“1”的次数'] = cip.getLoanOverdueTimes(
  2295. creditCardPayRecordMergeDf, reportTime, 1, 12)
  2296. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近24月逾期期数大于或等于“1”的次数'] = cip.getLoanOverdueTimes(
  2297. creditCardPayRecordMergeDf, reportTime, 1, 24)
  2298. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近6月逾期期数大于或等于“2”的次数'] = cip.getLoanOverdueTimes(
  2299. creditCardPayRecordMergeDf, reportTime, 2, 6)
  2300. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近12月逾期期数大于或等于“2”的次数'] = cip.getLoanOverdueTimes(
  2301. creditCardPayRecordMergeDf, reportTime, 2, 12)
  2302. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近24月逾期期数大于或等于“2”的次数'] = cip.getLoanOverdueTimes(
  2303. creditCardPayRecordMergeDf, reportTime, 2, 24)
  2304. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近6月逾期期数大于或等于“3”的次数'] = cip.getLoanOverdueTimes(
  2305. creditCardPayRecordMergeDf, reportTime, 3, 6)
  2306. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近12月逾期期数大于或等于“3”的次数'] = cip.getLoanOverdueTimes(
  2307. creditCardPayRecordMergeDf, reportTime, 3, 12)
  2308. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近24月逾期期数大于或等于“3”的次数'] = cip.getLoanOverdueTimes(
  2309. creditCardPayRecordMergeDf, reportTime, 3, 24)
  2310. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近12月逾期期数大于或等于“4”的次数'] = cip.getLoanOverdueTimes(
  2311. creditCardPayRecordMergeDf, reportTime, 4, 12)
  2312. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近24月逾期期数大于或等于“4”的次数'] = cip.getLoanOverdueTimes(
  2313. creditCardPayRecordMergeDf, reportTime, 4, 24)
  2314. payRcdStatusDf.loc[payRcdStatusIndex, '准贷记卡账户近6月逾期期数大于或等于“3”的次数'] = cip.getLoanOverdueTimes(
  2315. creditCardPayRecordMergeDfZ, reportTime, 3, 6)
  2316. payRcdStatusDf.loc[payRcdStatusIndex, '准贷记卡账户近12月逾期期数大于或等于“3”的次数'] = cip.getLoanOverdueTimes(
  2317. creditCardPayRecordMergeDfZ, reportTime, 3, 12)
  2318. payRcdStatusDf.loc[payRcdStatusIndex, '准贷记卡账户近24月逾期期数大于或等于“3”的次数'] = cip.getLoanOverdueTimes(
  2319. creditCardPayRecordMergeDfZ, reportTime, 3, 24)
  2320. payRcdStatusDf.loc[payRcdStatusIndex, '准贷记卡账户近6月逾期期数大于或等于“4”的次数'] = cip.getLoanOverdueTimes(
  2321. creditCardPayRecordMergeDfZ, reportTime, 4, 6)
  2322. payRcdStatusDf.loc[payRcdStatusIndex, '准贷记卡账户近12月逾期期数大于或等于“4”的次数'] = cip.getLoanOverdueTimes(
  2323. creditCardPayRecordMergeDfZ, reportTime, 4, 12)
  2324. payRcdStatusDf.loc[payRcdStatusIndex, '准贷记卡账户近24月逾期期数大于或等于“4”的次数'] = cip.getLoanOverdueTimes(
  2325. creditCardPayRecordMergeDfZ, reportTime, 4, 24)
  2326. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近3月逾期期数大于或等于“1”的次数'] = prp.getLoanOverdueTimes(loanPayRecordMergeDf,
  2327. reportTime, 1, 3) \
  2328. + cip.getLoanOverdueTimes(
  2329. creditCardPayRecordMergeDf, reportTime, 1, 3) + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ,
  2330. reportTime, 1, 3)
  2331. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近6月逾期期数大于或等于“1”的次数'] = \
  2332. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 1, 6) + cip.getLoanOverdueTimes(
  2333. creditCardPayRecordMergeDf, reportTime, 1, 6) \
  2334. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 1, 6)
  2335. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近12月逾期期数大于或等于“1”的次数'] = \
  2336. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 1, 12) + cip.getLoanOverdueTimes(
  2337. creditCardPayRecordMergeDf, reportTime, 1, 12) \
  2338. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 1, 12)
  2339. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近24月逾期期数大于或等于“1”的次数'] = \
  2340. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 1, 24) + cip.getLoanOverdueTimes(
  2341. creditCardPayRecordMergeDf, reportTime, 1, 24) \
  2342. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 1, 24)
  2343. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近6月逾期期数大于或等于“2”的次数'] = \
  2344. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 2, 6) + cip.getLoanOverdueTimes(
  2345. creditCardPayRecordMergeDf, reportTime, 2, 6) \
  2346. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 2, 6)
  2347. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近12月逾期期数大于或等于“2”的次数'] = \
  2348. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 2, 12) + cip.getLoanOverdueTimes(
  2349. creditCardPayRecordMergeDf, reportTime, 2, 12) \
  2350. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 2, 12)
  2351. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近24月逾期期数大于或等于“2”的次数'] = \
  2352. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 2, 24) + cip.getLoanOverdueTimes(
  2353. creditCardPayRecordMergeDf, reportTime, 2, 24) \
  2354. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 2, 24)
  2355. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近6月逾期期数大于或等于“3”的次数'] = \
  2356. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 3, 6) + cip.getLoanOverdueTimes(
  2357. creditCardPayRecordMergeDf, reportTime, 3, 6) \
  2358. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 3, 6)
  2359. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近12月逾期期数大于或等于“3”的次数'] = \
  2360. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 3, 12) + cip.getLoanOverdueTimes(
  2361. creditCardPayRecordMergeDf, reportTime, 3, 12) \
  2362. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 3, 12)
  2363. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近24月逾期期数大于或等于“3”的次数'] = \
  2364. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 3, 24) + cip.getLoanOverdueTimes(
  2365. creditCardPayRecordMergeDf, reportTime, 3, 24) \
  2366. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 3, 24)
  2367. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近12月逾期期数大于或等于“4”的次数'] = \
  2368. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 4, 12) + cip.getLoanOverdueTimes(
  2369. creditCardPayRecordMergeDf, reportTime, 4, 12) \
  2370. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 4, 12)
  2371. payRcdStatusDf.loc[payRcdStatusIndex, '全账户近24月逾期期数大于或等于“4”的次数'] = \
  2372. prp.getLoanOverdueTimes(loanPayRecordMergeDf, reportTime, 4, 24) + cip.getLoanOverdueTimes(
  2373. creditCardPayRecordMergeDf, reportTime, 4, 24) \
  2374. + cip.getLoanOverdueTimes(creditCardPayRecordMergeDfZ, reportTime, 4, 24)
  2375. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近24个月是否出现"G"'] = prp.isExistsInd(loanPayRecordMergeDf, reportTime,
  2376. "G", 24)
  2377. payRcdStatusDf.loc[payRcdStatusIndex, '贷记卡账户近24个月是否出现"G"'] = prp.isExistsInd(creditCardPayRecordMergeDf,
  2378. reportTime, "G", 24)
  2379. payRcdStatusDf.loc[payRcdStatusIndex, '准贷记卡账户近24个月是否出现"G"'] = prp.isExistsInd(creditCardPayRecordMergeDfZ,
  2380. reportTime, "G", 24)
  2381. payRcdStatusDf.loc[payRcdStatusIndex, '贷款账户近24个月是否出现"Z"'] = prp.isExistsInd(loanPayRecordMergeDf, reportTime,
  2382. "Z", 24)
  2383. payRcdStatusDf.loc[payRcdStatusIndex, '用户所有贷款账户过去24个月存在逾期的账户数目'] = prp.getLoanOverdueCount(loanPayRecordMergeDf,
  2384. reportTime, 24)
  2385. payRcdStatusDf.loc[payRcdStatusIndex, '用户所有贷款账户过去24个月状态正常账户数目'] = prp.getLoanNormalCount(loanPayRecordMergeDf,
  2386. reportTime, 24)
  2387. payRcdStatusDf.loc[payRcdStatusIndex, '用户所有贷记卡账户过去24个月存在逾期的账户数目'] = prp.getLoanOverdueCount(
  2388. creditCardPayRecordMergeDf, reportTime, 24)
  2389. payRcdStatusDf.loc[payRcdStatusIndex, '用户所有贷记卡账户过去24个月状态正常的账户数目'] = prp.getLoanNormalCount(
  2390. creditCardPayRecordMergeDf, reportTime, 24)
  2391. payRcdStatusDf.loc[payRcdStatusIndex, '用户所有准贷记卡账户过去24个月存在逾期的账户数目'] = prp.getLoanOverdueCount(
  2392. creditCardPayRecordMergeDfZ, reportTime, 24)
  2393. payRcdStatusDf.loc[payRcdStatusIndex, '用户所有准贷记卡账户过去24个月状态正常的账户数目'] = prp.getLoanNormalCount(
  2394. creditCardPayRecordMergeDfZ, reportTime, 24)
  2395. payRcdStatusDf.loc[payRcdStatusIndex, '用户过去3个月最大逾期期数'] = prp.getPayRcdMaxOverdueNumAllAccout(
  2396. loanPayRecordMergeDf, creditCardPayRecordMergeDf, creditCardPayRecordMergeDfZ, reportTime, 3)
  2397. payRcdStatusDf.loc[payRcdStatusIndex, '用户过去6个月最大逾期期数'] = prp.getPayRcdMaxOverdueNumAllAccout(
  2398. loanPayRecordMergeDf, creditCardPayRecordMergeDf, creditCardPayRecordMergeDfZ, reportTime, 6)
  2399. payRcdStatusDf.loc[payRcdStatusIndex, '用户过去12个月最大逾期期数'] = prp.getPayRcdMaxOverdueNumAllAccout(
  2400. loanPayRecordMergeDf, creditCardPayRecordMergeDf, creditCardPayRecordMergeDfZ, reportTime, 12)
  2401. payRcdStatusDf.loc[payRcdStatusIndex, '用户过去24个月最大逾期期数'] = prp.getPayRcdMaxOverdueNumAllAccout(
  2402. loanPayRecordMergeDf, creditCardPayRecordMergeDf, creditCardPayRecordMergeDfZ, reportTime, 24)
  2403. # 概要信息里的字段,从还款状态计算
  2404. briefInfoDf_overdueInfoSum.loc[overdueInfoSumIndex, '该用户过去5年出现逾期的所有账户数目'] = \
  2405. prp.getLoanOverdueCount(loanPayRecordMergeDf, reportTime, 24 * 5) + prp.getLoanOverdueCount(
  2406. creditCardPayRecordMergeDf, reportTime, 24 * 5) \
  2407. + prp.getLoanOverdueCount(creditCardPayRecordMergeDfZ, reportTime, 24 * 5)
  2408. #1112
  2409. otherDf.loc[otherIndex, '近12个月最大逾期期数'] = prp.getPayRcdMaxOverdueNumAccout(
  2410. loanPayRecordMergeDf, creditCardPayRecordMergeDf, reportTime, 12)
  2411. # 解析贷记卡还款记录指标
  2412. def parseCreditCardMergeAndPayRecordDf(self,df, payRcdDf,reportTime):
  2413. if not df.empty and not payRcdDf.empty:
  2414. # 正常
  2415. normalDf = df[(df['账户状态'] != '未激活') & (df['账户状态'] != '销户') & (df['账户状态'] != '呆账')]
  2416. if not normalDf.empty:
  2417. overduePayRcdDf = payRcdDf[payRcdDf['账户编号'].isin(normalDf['账户编号'].values)]
  2418. overduePayRcdDf = utils.replacePayRcdStatus(overduePayRcdDf)
  2419. # 计算当前贷款,为还款记录的最后一期 0529
  2420. curOverduePayRcdDf = overduePayRcdDf.sort_values(by=["账户编号", "还款日期"], ascending=(True, False))
  2421. curOverduePayRcdDf = curOverduePayRcdDf.groupby(['账户编号']).head(1)
  2422. curOverduePayRcdDf = curOverduePayRcdDf[curOverduePayRcdDf['还款状态'] > 0]
  2423. # 临时保存,不用过滤还款状态为0的
  2424. payRcdMaxOverdueDf = overduePayRcdDf;
  2425. # overduePayRcdDf = overduePayRcdDf[overduePayRcdDf['还款状态'] > 0]
  2426. # creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前贷记卡逾期账户数'] = curOverduePayRcdDf['账户编号'].unique().size
  2427. # 从“贷记卡信息”中提取,剔除“账户状态”为未激活、销户、呆账、呆帐后,“当前信用卡逾期账户数”/未销户贷记卡账户数(剔除“账户状态”为未激活、销户、呆账、呆帐后记录条数)
  2428. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前贷记卡逾期账户数占比'] = round(
  2429. curOverduePayRcdDf['账户编号'].unique().size / normalDf.index.size, 2)
  2430. # 从“贷记卡信息”中提取,剔除“账户状态”为未激活、销户、呆账、呆帐后,对(当前信用卡逾期账户数)按“开户机构代码”去重统计账户状态为逾期,按按“开户机构代码”去重后的记录条数
  2431. overdueCreditCardDf = normalDf[normalDf['账户编号'].isin(curOverduePayRcdDf['账户编号'].values)]
  2432. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前贷记卡逾期机构数'] = overdueCreditCardDf[
  2433. '发卡机构'].unique().size
  2434. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前贷记卡逾期机构数占比'] = round(
  2435. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '当前贷记卡逾期机构数'] / normalDf[
  2436. '发卡机构'].unique().size, 2)
  2437. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近3月贷记卡最大逾期期数'] = cip.getPayRcdMaxOverdueNum(
  2438. payRcdMaxOverdueDf, 3);
  2439. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近6月贷记卡最大逾期期数'] = cip.getPayRcdMaxOverdueNum(
  2440. payRcdMaxOverdueDf, 6);
  2441. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近9月贷记卡最大逾期期数'] = cip.getPayRcdMaxOverdueNum(
  2442. payRcdMaxOverdueDf, 9);
  2443. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近12月贷记卡最大逾期期数'] = cip.getPayRcdMaxOverdueNum(
  2444. payRcdMaxOverdueDf, 12);
  2445. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '近24月贷记卡最大逾期期数'] = cip.getPayRcdMaxOverdueNum(
  2446. payRcdMaxOverdueDf, 24);
  2447. creditCardAccountInfoDf.loc[
  2448. creditCardAccountInfoIndex, '近24月贷记卡最大逾期距离现在的月数'] = cip.getPayRcdMaxOverdueNumMonth(
  2449. payRcdMaxOverdueDf, normalDf, reportTime, 24);
  2450. creditCardAccountInfoDf.loc[
  2451. creditCardAccountInfoIndex, '最近3个月贷记卡最大连续逾期月份数'] = cip.getContinuousOverdueMonth(payRcdMaxOverdueDf,
  2452. normalDf, 3);
  2453. creditCardAccountInfoDf.loc[
  2454. creditCardAccountInfoIndex, '最近6个月贷记卡最大连续逾期月份数'] = cip.getContinuousOverdueMonth(payRcdMaxOverdueDf,
  2455. normalDf, 6);
  2456. creditCardAccountInfoDf.loc[
  2457. creditCardAccountInfoIndex, '最近9个月贷记卡最大连续逾期月份数'] = cip.getContinuousOverdueMonth(payRcdMaxOverdueDf,
  2458. normalDf, 9);
  2459. creditCardAccountInfoDf.loc[
  2460. creditCardAccountInfoIndex, '最近12个月贷记卡最大连续逾期月份数'] = cip.getContinuousOverdueMonth(
  2461. payRcdMaxOverdueDf, normalDf, 12);
  2462. creditCardAccountInfoDf.loc[
  2463. creditCardAccountInfoIndex, '最近24个月贷记卡最大连续逾期月份数'] = cip.getContinuousOverdueMonth(
  2464. payRcdMaxOverdueDf, normalDf, 24);
  2465. # payRcdTimesDf = payRcdDf[payRcdDf['账户编号'].isin(normalDf['账户编号'].values)]
  2466. # payRcdTimesDf = payRcdTimesDf.sort_values(by=["账户编号", "还款日期"], ascending=(True, False))
  2467. # payRcdTimesDf = payRcdTimesDf.groupby(['账户编号']).head(24)
  2468. # payStatus = ["G", "D", "C", "N", "M", "1", "2", "3", "4", "5", "6", "7"]
  2469. # payRcdTimesDf = payRcdTimesDf[payRcdTimesDf['还款状态'].isin(payStatus)]
  2470. # payRcdTimes = payRcdTimesDf.groupby(['账户编号'])['还款状态'].count()
  2471. # # 从“贷记卡信息”中提取,剔除未激活、销户、呆账、呆帐后,各账户的还款次数统计“24个月(账户)还款状态”包含"G","D","C","N","M"及数字的个数
  2472. # creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡24期还款记录次数'] = np.max(payRcdTimes)
  2473. creditCardAccountInfoDf.loc[creditCardAccountInfoIndex, '贷记卡24期还款记录次数'] = cip.getPayRcdCount(payRcdDf,normalDf,24)
  2474. otherDf.loc[otherIndex, '近6个月有贷记卡还款记录的月份数'] = cip.getPayRcdCountNew(payRcdDf,reportTime,6)
  2475. otherDf.loc[otherIndex, '近12个月有贷记卡还款记录的月份数'] = cip.getPayRcdCountNew(payRcdDf, reportTime, 12)
  2476. # 解析贷款还款记录指标
  2477. def parseLoanMergeAndPayRecordDf(self,df, payRcdDf,reportTime):
  2478. if not df.empty and not payRcdDf.empty:
  2479. # 正常
  2480. normalDf = df[(df['账户状态'] != '结清') & (df['账户状态'] != '转出') & (df['账户状态'] != '呆账')]
  2481. overduePayRcdDf = payRcdDf[payRcdDf['账户编号'].isin(normalDf['账户编号'].values)]
  2482. overduePayRcdDf = utils.replacePayRcdStatus(overduePayRcdDf)
  2483. # 计算当前贷款,为还款记录的最后一期 0529
  2484. curOverduePayRcdDf = overduePayRcdDf.sort_values(by=["账户编号", "还款日期"], ascending=(True, False))
  2485. curOverduePayRcdDf = curOverduePayRcdDf.groupby(['账户编号']).head(1)
  2486. curOverduePayRcdDf = curOverduePayRcdDf[curOverduePayRcdDf['还款状态'] > 0]
  2487. # 临时保存,不用过滤还款状态为0的
  2488. payRcdMaxOverdueDf = overduePayRcdDf;
  2489. # 所有逾期的记录
  2490. # overduePayRcdDf = overduePayRcdDf[overduePayRcdDf['还款状态']>0]
  2491. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款逾期账户数'] = curOverduePayRcdDf['账户编号'].unique().size
  2492. if normalDf.index.size > 0:
  2493. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款逾期账户数占比'] = round(
  2494. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款逾期账户数'] / normalDf.index.size, 3)
  2495. # 存在逾期的贷款账户 非结清的过滤出逾期的账户号
  2496. overdueLoanDf = normalDf[normalDf['账户编号'].isin(curOverduePayRcdDf['账户编号'].values)]
  2497. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款逾期机构数'] = overdueLoanDf['管理机构'].unique().size
  2498. if normalDf['管理机构'].unique().size > 0:
  2499. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款逾期机构数占比'] = round(
  2500. loanAccountInfoDf.loc[loanAccountInfoIndex, '当前贷款逾期机构数'] / normalDf['管理机构'].unique().size, 2)
  2501. # 还款记录按日期排序最近3笔的最大逾期期数
  2502. loanAccountInfoDf.loc[loanAccountInfoIndex, '近1月贷款的最大逾期期数'] = prp.getPayRcdMaxOverdueNum(payRcdMaxOverdueDf,
  2503. 1);
  2504. loanAccountInfoDf.loc[loanAccountInfoIndex, '近3月贷款的最大逾期期数'] = prp.getPayRcdMaxOverdueNum(payRcdMaxOverdueDf,
  2505. 3);
  2506. loanAccountInfoDf.loc[loanAccountInfoIndex, '近6月贷款的最大逾期期数'] = prp.getPayRcdMaxOverdueNum(payRcdMaxOverdueDf,
  2507. 6);
  2508. loanAccountInfoDf.loc[loanAccountInfoIndex, '近9月贷款的最大逾期期数'] = prp.getPayRcdMaxOverdueNum(payRcdMaxOverdueDf,
  2509. 9);
  2510. loanAccountInfoDf.loc[loanAccountInfoIndex, '近12月贷款的最大逾期期数'] = prp.getPayRcdMaxOverdueNum(
  2511. payRcdMaxOverdueDf, 12);
  2512. loanAccountInfoDf.loc[loanAccountInfoIndex, '近24月贷款的最大逾期期数'] = prp.getPayRcdMaxOverdueNum(
  2513. payRcdMaxOverdueDf, 24);
  2514. loanAccountInfoDf.loc[loanAccountInfoIndex, '近24月贷款最大逾期距离现在的月数'] = prp.getPayRcdMaxOverdueNumMonth(
  2515. payRcdMaxOverdueDf, normalDf, reportTime, 24);
  2516. payStatus = ["G", "D", "C", "N", "M", "1", "2", "3", "4", "5", "6", "7"]
  2517. # 贷款24期还款记录次数 剔除结清 转出 呆账
  2518. # payRcdTimesDf = payRcdDf[payRcdDf['账户编号'].isin(normalDf['账户编号'].values)]
  2519. # payRcdTimesDf = payRcdTimesDf.sort_values(by=["账户编号", "还款日期"], ascending=(True, False))
  2520. # payRcdTimesDf = payRcdTimesDf.groupby(['账户编号']).head(24)
  2521. # # 从“贷款信息”中提取,剔除“账户状态”为结清、转出、呆账、呆帐后,各账户的还款次数统计“24个月(账户)还款状态”包含"G","D","C","N","M"及数字的个数,MAX(各账户的还款次数)
  2522. # payRcdTimesDf = payRcdTimesDf[payRcdTimesDf['还款状态'].isin(payStatus)]
  2523. # payRcdTimes = payRcdTimesDf.groupby(['账户编号'])['还款状态'].count()
  2524. #loanAccountInfoDf.loc[loanAccountInfoIndex, '贷款24期还款记录次数'] = np.max(payRcdTimes)
  2525. loanAccountInfoDf.loc[loanAccountInfoIndex, '贷款24期还款记录次数'] = prp.getPayRcdCount(payRcdDf,normalDf,24);
  2526. otherDf.loc[otherIndex, '最近6个月有贷款还款记录的月份数'] = prp.getPayRcdCountNew(payRcdDf, reportTime, 6);
  2527. otherDf.loc[otherIndex, '最近12个月有贷款还款记录的月份数'] = prp.getPayRcdCountNew(payRcdDf, reportTime, 12);
  2528. #最近一次逾期距今月份数
  2529. def getLastOverdueMonth(self, loanMergeDf, creditCardMergeDf, loanPayRecordMergeDf, creditCardPayRecordMergeDf,
  2530. reportTime):
  2531. result = 120;
  2532. if np.sum(loanMergeDf['当前逾期期数']) > 0 or np.sum(creditCardMergeDf['当前逾期期数']) > 0:
  2533. result = 0
  2534. else:
  2535. payRcdDf = loanPayRecordMergeDf.sort_values(by=["账户编号", "还款日期"], ascending=(True, False))
  2536. payRcdDf = payRcdDf.groupby(['账户编号']).head(60)
  2537. payRcdDf = utils.replacePayRcdStatusOverdue(payRcdDf) # 替换逾期
  2538. payRcdDf = payRcdDf[payRcdDf['还款状态'] > 0]
  2539. payRcdDf = utils.replacePayRcdStatusOverdue(payRcdDf) # 替换逾期
  2540. loanOverdueDate = np.max(payRcdDf['还款日期'])
  2541. payRcdDfCredit = creditCardPayRecordMergeDf.sort_values(by=["账户编号", "还款日期"], ascending=(True, False))
  2542. payRcdDfCredit = utils.replacePayRcdStatusOverdue(payRcdDfCredit) # 替换逾期
  2543. payRcdDfCredit = payRcdDfCredit.groupby(['账户编号']).head(60)
  2544. payRcdDfCredit = payRcdDfCredit[payRcdDfCredit['还款状态'] > 0]
  2545. if not payRcdDf.empty or not payRcdDfCredit.empty:
  2546. creditOverdueDate = np.max(payRcdDfCredit['还款日期'])
  2547. # reportTime = str(np.datetime64(reportTime, "M")) + "-02"
  2548. reportTime = utils.get_last_month_first_day_v2(reportTime)
  2549. overdueDate = None
  2550. if str(loanOverdueDate) != "nan" and str(creditOverdueDate) != "nan":
  2551. overdueDate = max([loanOverdueDate, creditOverdueDate])
  2552. elif str(loanOverdueDate) == "nan" and str(creditOverdueDate) != "nan":
  2553. overdueDate = creditOverdueDate
  2554. elif str(loanOverdueDate) != "nan" and str(creditOverdueDate) == "nan":
  2555. overdueDate = loanOverdueDate
  2556. if overdueDate != None:
  2557. result = utils.difMonthReportTime(overdueDate, reportTime)
  2558. otherDf.loc[otherIndex, "最近一次逾期距今月份数"] = result
  2559. #近12个月贷款和贷记卡还款状态异常次数 慧算1112
  2560. #count(三类贷款账户m1-m12中D/Z/B/G的个数)+count(贷记卡m1-m12中D/Z/B/G的个数)
  2561. def calcPayRcdStatus(self,loanPayRecordMergeDf,creditCardPayRecordMergeDf,reportTime):
  2562. reportTime = str(np.datetime64(reportTime, "M")) + "-02"
  2563. statusList =['G','B','Z','D']
  2564. payDate = utils.getLastMonthDate(reportTime, 12)
  2565. loanPayRcdTmpDf = loanPayRecordMergeDf[loanPayRecordMergeDf['还款日期']>=payDate]
  2566. loanTimes = loanPayRcdTmpDf[(loanPayRcdTmpDf['还款状态'].isin(statusList))].index.size
  2567. creditPayRcdTmpDf = creditCardPayRecordMergeDf[creditCardPayRecordMergeDf['还款日期']>=payDate]
  2568. creditTimes = creditPayRcdTmpDf[(creditPayRcdTmpDf['还款状态'].isin(statusList))].index.size
  2569. result = loanTimes+creditTimes
  2570. otherDf.loc[otherIndex, "近12个月贷款和贷记卡还款状态异常次数"] = result
  2571. #yuan新开发部分,暂时不存入数据库
  2572. #基础个人信息1
  2573. def parseBaseIdentity(self,reportTime,docXml):
  2574. tmpNode =docXml.documentElement.getElementsByTagName("BASEINFO")
  2575. if len(tmpNode)>0:
  2576. baseInfo = docXml.documentElement.getElementsByTagName("BASEINFO")[0]
  2577. # print(str(baseInfo))
  2578. # self.saveNode(baseInfo)
  2579. tmpNode = docXml.documentElement.getElementsByTagName("MARRIAGEINFOSG")
  2580. baseIdentityInfoDf.loc[baseIdentityInfo, '性别'] = self.getNodeData(baseInfo,"SEXDESC")
  2581. baseIdentityInfoDf.loc[baseIdentityInfo, '出生日期'] = self.getNodeData(baseInfo,"BIRTHDAY")
  2582. baseIdentityInfoDf.loc[baseIdentityInfo, '国籍'] = self.getNodeData(baseInfo,"NATIONDESC")
  2583. baseIdentityInfoDf.loc[baseIdentityInfo, '户籍地址'] = self.getNodeData(baseInfo,"ADDRESS")
  2584. if len(tmpNode)>0:
  2585. marriageinfosg = docXml.documentElement.getElementsByTagName("MARRIAGEINFOSG")[0]
  2586. self.parseMate(marriageinfosg)
  2587. baseIdentityInfoDf.loc[baseIdentityInfo, '婚姻状况'] = self.getNodeData(marriageinfosg,"MARSTATUDESC")
  2588. baseIdentityInfoDf.loc[baseIdentityInfo, '学历'] = self.getNodeData(baseInfo,"DEGREEDESC")
  2589. baseIdentityInfoDf.loc[baseIdentityInfo, '学位'] = self.getNodeData(baseInfo,"DEGREEDESC")
  2590. baseIdentityInfoDf.loc[baseIdentityInfo, '通讯地址'] = self.getNodeData(baseInfo,"COMMUADDRESS")
  2591. baseIdentityInfoDf.loc[baseIdentityInfo, '就业状况'] = self.getNodeData(baseInfo,"WORKSTATUSDESC")
  2592. # mobiles = docXml.documentElement.getElementsByTagName("TELEPHONEINFOSGLS")
  2593. # if len(mobiles)>0:
  2594. # telephoneinfosgls = docXml.documentElement.getElementsByTagName("TELEPHONEINFOSGLS")[0]
  2595. # telephoneinfosg = telephoneinfosgls.getElementsByTagName("TELEPHONEINFOSG");
  2596. # identityInfoDf.loc[identityInfoIndex, '历史手机号码数'] = len(telephoneinfosg)
  2597. # identityInfoDf.loc[identityInfoIndex, '近3个月手机号码数'] = self.getLastMonthMobileCount(telephoneinfosg, 3, reportTime)
  2598. # identityInfoDf.loc[identityInfoIndex, '近6个月手机号码数'] = self.getLastMonthMobileCount(telephoneinfosg, 6, reportTime)
  2599. # identityInfoDf.loc[identityInfoIndex, '近12个月手机号码数'] = self.getLastMonthMobileCount(telephoneinfosg, 12, reportTime)
  2600. # identityInfoDf.loc[identityInfoIndex, '近24个月手机号码数'] = self.getLastMonthMobileCount(telephoneinfosg, 24, reportTime)
  2601. # print(identityInfoDf.to_json(orient="index",force_ascii=False))
  2602. #基础配偶信息2
  2603. def parseMate(self,marriageinfosg):
  2604. self.saveNode(marriageinfosg)
  2605. baseMateInfoDf.loc[baseMateInfo, '姓名'] = self.getNodeData(marriageinfosg,"SPUOSENAME")
  2606. baseMateInfoDf.loc[baseMateInfo, '证件号码'] = self.getNodeData(marriageinfosg,"CERTNUM")
  2607. baseMateInfoDf.loc[baseMateInfo, '工作单位'] = self.getNodeData(marriageinfosg,"COMPANY")
  2608. baseMateInfoDf.loc[baseMateInfo, '联系电话'] = self.getNodeData(marriageinfosg,"TELNUM")
  2609. # print(mateInfoDf.to_json(orient="index", force_ascii=False))
  2610. # 基础居住信息3
  2611. def parseLiveInfo(self,docXml):
  2612. # residenceinfosgls = docXml.documentElement.getElementsByTagName("RESIDENCEINFOSGLS")
  2613. residenceinfosg = docXml.documentElement.getElementsByTagName("RESIDENCEINFOSG");
  2614. df = pd.DataFrame()
  2615. for i in range(0, len(residenceinfosg)):
  2616. # self.saveNode(residenceinfosg[i])
  2617. resistatusdesc = self.getNodeData(residenceinfosg[i], "RESISTATUSDESC")
  2618. address = self.getNodeData(residenceinfosg[i], "ADDRESS")
  2619. telnum = self.getNodeData(residenceinfosg[i], "TELNUM")
  2620. updatedateinfo = self.getNodeData(residenceinfosg[i], "UPDATEDATEINFO")
  2621. df.loc[i, 0] = resistatusdesc
  2622. df.loc[i, 1] = address
  2623. df.loc[i, 2] = telnum
  2624. df.loc[i, 3] = updatedateinfo
  2625. if len(residenceinfosg)>0:
  2626. baseLiveInfoDf.loc[baseLiveInfo, '居住地址'] = self.getNodeData(residenceinfosg[0],"ADDRESS")
  2627. baseLiveInfoDf.loc[baseLiveInfo, '住宅电话'] = self.getNodeData(residenceinfosg[0],"TELNUM")
  2628. baseLiveInfoDf.loc[baseLiveInfo, '历史居住地址个数'] = len(residenceinfosg);
  2629. # curDate = np.datetime64(time.strftime("%Y-%m-%d"));
  2630. # last3year = str(curDate)[0:4]
  2631. # last3yearDate = str(int(last3year) - 3) + str(curDate)[4:10]
  2632. # lastLiveDf = df[df[3] >= last3yearDate];
  2633. # liveInfoDf.loc[liveInfoIndex, '最近3年内居住地址个数'] = lastLiveDf.index.size ;
  2634. # houseIndex = df[df[0] == '自置'].index.size > 0
  2635. # if (houseIndex):
  2636. # houseStr = '是'
  2637. # else:
  2638. # houseStr = '否'
  2639. # liveInfoDf.loc[liveInfoIndex, '当前居住状况-是否具有自有住房'] = houseStr;
  2640. baseLiveInfoDf.loc[baseLiveInfo, '居住状况'] = self.getNodeData(residenceinfosg[0],"RESISTATUSDESC")
  2641. baseLiveInfoDf.loc[baseLiveInfo, '信息更新日期'] = self.getNodeData(residenceinfosg[0],"UPDATEDATEINFO")
  2642. # print(liveInfoDf.to_json(orient="index", force_ascii=False))
  2643. # 基础职业信息4
  2644. def parseOccupationInfoDf(self,docXml):
  2645. vocationinfosg = docXml.documentElement.getElementsByTagName("VOCATIONINFOSG");
  2646. df = pd.DataFrame()
  2647. if len(vocationinfosg)>0:
  2648. for i in range(0, len(vocationinfosg)):
  2649. # df.loc[i, 0] = self.getNodeData(vocationinfosg[i], "WORDSTATUSDESC")
  2650. # self.saveNode(vocationinfosg[i])
  2651. df.loc[i, 0] = self.getNodeData(vocationinfosg[i], "CPNTYPEDESC")
  2652. df.loc[i, 1] = self.getNodeData(vocationinfosg[i], "TRADEDESC")
  2653. df.loc[i, 2] = self.getNodeData(vocationinfosg[i], "VOCATIONDESC")
  2654. df.loc[i, 3] = self.getNodeData(vocationinfosg[i], "VOCATIONTITLEDESC")
  2655. df.loc[i, 4] = self.getNodeData(vocationinfosg[i], "COMPANY")
  2656. df.loc[i, 5] = self.getNodeData(vocationinfosg[i], "CPNADDRESS")
  2657. df.loc[i, 6] = self.getNodeData(vocationinfosg[i], "CPNTELNUM")
  2658. df.loc[i, 7] = self.getNodeData(vocationinfosg[i], "BEGINYEAR")
  2659. df.loc[i, 8] = self.getNodeData(vocationinfosg[i], "INFOUPDATEDATE")
  2660. baseOccupationInfoDf.loc[baseOccupationInfo, '工作单位'] = self.getNodeData(vocationinfosg[0], "COMPANY")
  2661. # last3yearDate = utils.getLastMonthDate(reportTime, 12 * 3)
  2662. # last3yearOccDf = df[df[8] >= last3yearDate]
  2663. # baseOccupationInfoDf.loc[baseOccupationInfo, '最近3年内工作单位数'] = last3yearOccDf.index.size;
  2664. baseOccupationInfoDf.loc[baseOccupationInfo, '单位电话'] = self.getNodeData(vocationinfosg[0], "CPNTELNUM")
  2665. # try:
  2666. # minDateIndex = np.argmin(df[7]);
  2667. # maxDateIndex = np.argmax(df[7]);
  2668. # rowYearMin = df.loc[minDateIndex, :].dropna()
  2669. # rowYearMax = df.loc[maxDateIndex, :].dropna()
  2670. # if rowYearMin[7] != "":
  2671. # occupationInfoDf.loc[occupationInfoIndex, '最早进入本单位年份距报告日期时长'] = int(
  2672. # str(np.datetime64(reportTime, "Y"))) - int(rowYearMin[7])
  2673. # if rowYearMax[7] != "":
  2674. # occupationInfoDf.loc[occupationInfoIndex, '最新进入本单位年份距报告日期时长'] = int(
  2675. # str(np.datetime64(reportTime, "Y"))) - int(rowYearMax[7])
  2676. # except:
  2677. # logger.error("最早进入本单位年份距报告日期时长解析异常")
  2678. baseOccupationInfoDf.loc[baseOccupationInfo, '单位性质'] = self.getNodeData(vocationinfosg[0], "CPNTYPEDESC")
  2679. baseOccupationInfoDf.loc[baseOccupationInfo, '单位地址'] = self.getNodeData(vocationinfosg[0], "CPNADDRESS")
  2680. baseOccupationInfoDf.loc[baseOccupationInfo, '职业'] = self.getNodeData(vocationinfosg[0], "VOCATIONDESC")
  2681. baseOccupationInfoDf.loc[baseOccupationInfo, '行业'] = self.getNodeData(vocationinfosg[0], "TRADEDESC")
  2682. baseOccupationInfoDf.loc[baseOccupationInfo, '职务'] = self.getNodeData(vocationinfosg[0], "TITLEDESC")
  2683. baseOccupationInfoDf.loc[baseOccupationInfo, '职称'] = self.getNodeData(vocationinfosg[0], "VOCATIONTITLEDESC")
  2684. baseOccupationInfoDf.loc[baseOccupationInfo, '进入本单位年份'] =self.getNodeData(vocationinfosg[0], "BEGINYEAR")
  2685. baseOccupationInfoDf.loc[baseOccupationInfo, '信息更新日期'] = self.getNodeData(vocationinfosg[0], "INFOUPDATEDATE")
  2686. # occupationInfoDf.loc[occupationInfoIndex, '历史工作单位数'] = len(vocationinfosg)
  2687. # print(occupationInfoDf.to_json(orient="index", force_ascii=False))
  2688. # 个人信用报告"数字解读"5
  2689. def personalCreditInfo(self,docXml):
  2690. tmpNode =docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")
  2691. if len(tmpNode)>0:
  2692. personalCreditInfo = docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")[0]
  2693. personalCreditInfoDf.loc[baseMateInfo, '数字解读'] = self.getNodeData(personalCreditInfo,"NUMBERREAD")
  2694. personalCreditInfoDf.loc[baseMateInfo, '相对位置'] = self.getNodeData(personalCreditInfo,"RELPOSITION")
  2695. personalCreditInfoDf.loc[baseMateInfo, '说明'] = self.getNodeData(personalCreditInfo,"SCOREEXPLAINNUM")
  2696. # 信贷交易信息提示6
  2697. def parseBriefInfoHeaderLoanTradeInfo(self,docXml):
  2698. credittipsinfo = docXml.documentElement.getElementsByTagName("CREDITTIPSINFO");
  2699. if len(credittipsinfo)>0:
  2700. briefInfoHeaderLoanTradeInfoDf.loc[briefInfoHeaderLoanTradeInfo, '个人住房贷款账户数'] = utils.toInt(self.getNodeData(credittipsinfo[0],"ACCOUNTNUM"))
  2701. briefInfoHeaderLoanTradeInfoDf.loc[briefInfoHeaderLoanTradeInfo, '个人住房贷款首笔业务发放月份'] = self.getNodeData(credittipsinfo[0],"FIRSTBUSMONTH")
  2702. # self.saveNode(credittipsinfo[0])
  2703. briefInfoHeaderLoanTradeInfoDf.loc[briefInfoHeaderLoanTradeInfo, '个人商用房贷款(包括商住两用)账户数'] = utils.toInt(self.getNodeData(credittipsinfo[1],"ACCOUNTNUM"))
  2704. briefInfoHeaderLoanTradeInfoDf.loc[briefInfoHeaderLoanTradeInfo, '个人商用房贷款(包括商住两用)首笔业务发放月份'] = self.getNodeData(credittipsinfo[1],"FIRSTBUSMONTH")
  2705. # self.saveNode(credittipsinfo[1])
  2706. briefInfoHeaderLoanTradeInfoDf.loc[briefInfoHeaderLoanTradeInfo, '其他类贷款账户数'] = utils.toInt(self.getNodeData(credittipsinfo[2],"ACCOUNTNUM"))
  2707. briefInfoHeaderLoanTradeInfoDf.loc[briefInfoHeaderLoanTradeInfo, '其他类贷款首笔业务发放月份'] = self.getNodeData(credittipsinfo[2],"FIRSTBUSMONTH")
  2708. # self.saveNode(credittipsinfo[2])
  2709. briefInfoHeaderLoanTradeInfoDf.loc[briefInfoHeaderLoanTradeInfo, '贷记卡账户数'] = utils.toInt(self.getNodeData(credittipsinfo[3],"ACCOUNTNUM"))
  2710. briefInfoHeaderLoanTradeInfoDf.loc[briefInfoHeaderLoanTradeInfo, '贷记卡首笔业务发放月份'] = self.getNodeData(credittipsinfo[3],"FIRSTBUSMONTH")
  2711. # self.saveNode(credittipsinfo[3])
  2712. briefInfoHeaderLoanTradeInfoDf.loc[briefInfoHeaderLoanTradeInfo, '准贷记卡账户数'] = utils.toInt(self.getNodeData(credittipsinfo[4],"ACCOUNTNUM"))
  2713. briefInfoHeaderLoanTradeInfoDf.loc[briefInfoHeaderLoanTradeInfo, '准贷记卡首笔业务发放月份'] = self.getNodeData(credittipsinfo[4],"FIRSTBUSMONTH")
  2714. # self.saveNode(credittipsinfo[4])
  2715. #汇算
  2716. # moths = [self.getNodeData(credittipsinfo[0], "FIRSTBUSMONTH"),
  2717. # self.getNodeData(credittipsinfo[1], "FIRSTBUSMONTH"),self.getNodeData(credittipsinfo[2], "FIRSTBUSMONTH")]
  2718. # moths=utils.get_real_arr(moths)
  2719. # if len(moths)>0:
  2720. # otherDf.loc[otherIndex, '首笔贷款发放月份'] = min(moths)
  2721. # otherDf.loc[otherIndex, '首张贷记卡发卡月份'] = self.getNodeData(credittipsinfo[3], "FIRSTBUSMONTH")
  2722. #信贷交易违约信息概要7
  2723. def parseCreditTransactionDefault(self,docXml):
  2724. recoveredinfosumsmry = docXml.documentElement.getElementsByTagName("RECOVEREDINFOSUMSMRY");
  2725. recorinfosumsg = docXml.documentElement.getElementsByTagName("RECORINFOSUMSG")
  2726. if len(recoveredinfosumsmry)>0:
  2727. if len(recorinfosumsg)>0:
  2728. self.saveNode(recorinfosumsg[0])
  2729. briefInfoDf_recoveryInfoSumY.loc[recoveryInfoSumIndexY, '资产处置业务账户数'] = utils.toInt(self.getNodeData(recorinfosumsg[0],"ACCOUNTNUM"))
  2730. briefInfoDf_recoveryInfoSumY.loc[recoveryInfoSumIndexY, '资产处置业务余额'] = utils.replaceAmt(self.getNodeData(recorinfosumsg[0],"BALANCE"))
  2731. briefInfoDf_recoveryInfoSumY.loc[recoveryInfoSumIndexY, '垫款业务账户数'] = utils.toInt(self.getNodeData(recorinfosumsg[1],"ACCOUNTNUM"))
  2732. briefInfoDf_recoveryInfoSumY.loc[recoveryInfoSumIndexY, '垫款业务余额'] = utils.replaceAmt(self.getNodeData(recorinfosumsg[1],"BALANCE"))
  2733. briefInfoDf_recoveryInfoSumY.loc[recoveryInfoSumIndexY, '合计总账户数'] = utils.toInt(self.getNodeData(recoveredinfosumsmry[0],"ACCOUNTNUMSUM"))
  2734. briefInfoDf_recoveryInfoSumY.loc[recoveryInfoSumIndexY, '合计总余额'] = utils.replaceAmt(self.getNodeData(recoveredinfosumsmry[0],"BALANCESUM"))
  2735. # 信贷交易授信及负债信息概要8
  2736. def parseCreditTransactionCredit(self,docXml):
  2737. tmpNode =docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")
  2738. if len(tmpNode)>0:
  2739. personalCreditInfo = docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")[0]
  2740. personalCreditInfoDf.loc[baseMateInfo, '数字解读'] = self.getNodeData(personalCreditInfo,"NUMBERREAD")
  2741. personalCreditInfoDf.loc[baseMateInfo, '相对位置'] = self.getNodeData(personalCreditInfo,"RELPOSITION")
  2742. personalCreditInfoDf.loc[baseMateInfo, '说明'] = self.getNodeData(personalCreditInfo,"SCOREEXPLAINNUM")
  2743. # 非信贷交易信息概要9
  2744. def personalCreditInfo(self,docXml):
  2745. tmpNode =docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")
  2746. if len(tmpNode)>0:
  2747. personalCreditInfo = docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")[0]
  2748. personalCreditInfoDf.loc[baseMateInfo, '数字解读'] = self.getNodeData(personalCreditInfo,"NUMBERREAD")
  2749. personalCreditInfoDf.loc[baseMateInfo, '相对位置'] = self.getNodeData(personalCreditInfo,"RELPOSITION")
  2750. personalCreditInfoDf.loc[baseMateInfo, '说明'] = self.getNodeData(personalCreditInfo,"SCOREEXPLAINNUM")
  2751. # 公共信息概要10
  2752. def personalCreditInfo(self,docXml):
  2753. tmpNode =docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")
  2754. if len(tmpNode)>0:
  2755. personalCreditInfo = docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")[0]
  2756. personalCreditInfoDf.loc[baseMateInfo, '数字解读'] = self.getNodeData(personalCreditInfo,"NUMBERREAD")
  2757. personalCreditInfoDf.loc[baseMateInfo, '相对位置'] = self.getNodeData(personalCreditInfo,"RELPOSITION")
  2758. personalCreditInfoDf.loc[baseMateInfo, '说明'] = self.getNodeData(personalCreditInfo,"SCOREEXPLAINNUM")
  2759. # 查询记录概要11
  2760. def personalCreditInfo(self,docXml):
  2761. tmpNode =docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")
  2762. if len(tmpNode)>0:
  2763. personalCreditInfo = docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")[0]
  2764. personalCreditInfoDf.loc[baseMateInfo, '数字解读'] = self.getNodeData(personalCreditInfo,"NUMBERREAD")
  2765. personalCreditInfoDf.loc[baseMateInfo, '相对位置'] = self.getNodeData(personalCreditInfo,"RELPOSITION")
  2766. personalCreditInfoDf.loc[baseMateInfo, '说明'] = self.getNodeData(personalCreditInfo,"SCOREEXPLAINNUM")
  2767. # 被追偿信息12
  2768. def personalCreditInfo(self,docXml):
  2769. tmpNode =docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")
  2770. if len(tmpNode)>0:
  2771. personalCreditInfo = docXml.documentElement.getElementsByTagName("GRADEINFOSMRY")[0]
  2772. personalCreditInfoDf.loc[baseMateInfo, '数字解读'] = self.getNodeData(personalCreditInfo,"NUMBERREAD")
  2773. personalCreditInfoDf.loc[baseMateInfo, '相对位置'] = self.getNodeData(personalCreditInfo,"RELPOSITION")
  2774. personalCreditInfoDf.loc[baseMateInfo, '说明'] = self.getNodeData(personalCreditInfo,"SCOREEXPLAINNUM")
  2775. #欠税记录
  2776. def parseTaxArrears(self,docXml,reportTime):
  2777. tax = docXml.documentElement.getElementsByTagName("OWINGTAXES")
  2778. # for item in civil:
  2779. # self.saveNode(item)
  2780. if len(tax)>0:
  2781. taxArrearsDf.loc[taxArrearsIndex, '立案法院'] = self.getNodeData(tax[0],"COURT")
  2782. # 民事判决记录
  2783. def parseCivilJudgment(self,docXml):
  2784. civil = docXml.documentElement.getElementsByTagName("CIVIL")
  2785. # for item in civil:
  2786. # self.saveNode(item)
  2787. if len(civil)>0:
  2788. civilJudgmentDf.loc[civilJudgmentIndex, '立案法院'] = self.getNodeData(civil[0],"COURT")
  2789. civilJudgmentDf.loc[civilJudgmentIndex, '案由'] = self.getNodeData(civil[0],"CAUSEOFACTION")
  2790. civilJudgmentDf.loc[civilJudgmentIndex, '立案日期'] = self.getNodeData(civil[0],"FILINGDATE")
  2791. civilJudgmentDf.loc[civilJudgmentIndex, '结案方式代码'] = self.getNodeData(civil[0],"CLOSEMCODE")
  2792. civilJudgmentDf.loc[civilJudgmentIndex, '结案方式描述'] = self.getNodeData(civil[0],"CLOSEMDESC")
  2793. civilJudgmentDf.loc[civilJudgmentIndex, '判决/调解结果'] = self.getNodeData(civil[0],"JUDRESULT")
  2794. civilJudgmentDf.loc[civilJudgmentIndex, '判决/调解生效日期'] = self.getNodeData(civil[0],"JUDDATE")
  2795. civilJudgmentDf.loc[civilJudgmentIndex, '诉讼标的'] = self.getNodeData(civil[0],"OBJECTOFACTION")
  2796. civilJudgmentDf.loc[civilJudgmentIndex, '诉讼标的金额'] = self.getNodeData(civil[0],"OBJOFACTMONEY")
  2797. #还有近24个月的属性值