[Project] Taiwan XBRL filter Python Script - 貓囧丸ct9w

文章推薦指數: 80 %
投票人數:10人

2017年5月17日星期三. [Project] Taiwan XBRL filter Python Script. 這篇的程式依舊是從開源筆記商 ... 2017年5月17日星期三 [Project]TaiwanXBRLfilterPythonScript 這篇的程式依舊是從開源筆記商庫區的這一篇延伸出來的, 本篇是根據開源筆記倉庫的xbrl-filter做註解與功能修改, 要了解這篇程式碼,需要對XBRL有基本的了解, 研究XBRL一段時間,再看看那篇的xbrl-filter, 會發現那個程式碼只有針對2012年前GAAP的形式做處理, 而他的做法就是從xbrl的根裡面去搜尋所有namespace, 看看有沒有包含符合檔名分類格式的主要XMLSchema, 因為不同產業有不同的財報架構跟表達方式,所以會有各自的架構, 而XMLSchema連結到的xsd檔就是表達架構的檔案, 所以透過lxml裡面的etree去掃xml的架構, 找根裡面的namespace確保xml有引用相對應正確的xsd, 下面這段是程式碼裡面的註解,解釋了檔名的命名規則: 2013年後全面開始採用"台灣國際財務報導準則"(TaiwanIFRS) 國際財務報導準則(InternationalFinancialReportingStandards,縮寫IFRS) 安裝使用公開資訊觀測站XBRL財報建檔工具可測出檔名規律與意義 IFRS檔名規則:   tifrs-財報別-市場別-行業別-報告別-公司代號-年度季別.xml tifrs:TaiwanIFRS 財報/財測別:   fr0:首次使用,fr1:一般,fr2:追朔重大/追朔   ff:財務預測, fc:財測-預結 市場別:   m1:上市/上櫃,m2:興櫃/興櫃(已申請上市)/公開發行/未公開發行 行業別代號:   BASI(basi):金融業,BD(bd):證券期貨業,CI(ci):一般工商業   FH(fh):金控業,  INS(ins):保險業, MIM(mim):異業合併 報告別代號:   cr:合併財報,er:個體財報,ir:個別財報 2012年以前採用"中華民國財務會計準則"(ROCGAAP) 一般公認會計原則(GenerallyAcceptedAccountingPrinciples,簡稱GAAP) 一樣已經採用XBRL架構 檔名規則:   tw-gaap-行業別-公司代號-年度季別.xml   tw-gaap-行業別-公司代號-年度季別-cr.xml 瞭解檔名規則,也可以了解相關的財報檔案命名的規則, 因為是同個縮寫跟意思,再來就可以看code了, 不過這邊需要對XML有一定程度的了解, 可以把程式碼中的變數print出來看看會更清楚, 執行遇到沒有裝lxml:參考本篇 由於用pip安裝遇到問題,所以改用easy_install (Windows) easy_installlxml taiwan_xbrl_filter.py程式碼&註解: #-*-coding:utf-8-*- #file:xbrl_filter.py # importglob importio importtaiwan_xbrl_commonascommon importos fromlxmlimportetree classTaiwanXbrlFilter(): #DebugPrintFlagSettings print_deatil=False show_error=True enable_log=True def__init__(self): #抓取XBRLfiles的路徑 self.xbrl_files_folder=common.get_settings('taiwan_xbrl_settings','xbrl_files_folder') self.log=common.LogMessage('xbrl_filter_log_file') defget_xbrl_namespace_from_filename(self,full_path): #從檔名中擷取出相對應類型使用的XBRLSchema框架設定的namespace flie_name=common.get_filename(full_path)#切割路徑跟檔名 ifflie_name[:5]=='tifrs':#取檔名0-4前五個字元=tifrs(找TaiwanIFRS檔) #2013年後全面開始採用"台灣國際財務報導準則"(TaiwanIFRS) #國際財務報導準則(InternationalFinancialReportingStandards,縮寫IFRS) #安裝使用公開資訊觀測站XBRL財報建檔工具可測出檔名規律與意義 #檔名規則: #tifrs-財報別-市場別-行業別-報告別-公司代號-年度季別.xml #tifrs:TaiwanIFRS #財報/財測別: #fr0:首次使用,fr1:一般,fr2:追朔重大/追朔 #ff:財務預測,fc:財測-預結 #市場別: #m1:上市/上櫃,m2:興櫃/興櫃(已申請上市)/公開發行/未公開發行 #行業別代號: #BASI(basi):金融業,BD(bd):證券期貨業,CI(ci):一般工商業 #FH(fh):金控業,INS(ins):保險業,MIM(mim):異業合併 #報告別代號: #cr:合併財報,er:個體財報,ir:個別財報 #flie_name.split('-')[:1]+flie_name.split('-')[3:5] #把filename透過"-"切割,抓取0第一個元素 #把filename透過"-"切割,抓取3-4第四第五個元素 #變成['tifrs','行業別','報告別'] #'-'.join(flie_name.split('-')[:1]+flie_name.split('-')[3:5]) #再把"-"加回三個元素中,變成:tifrs-行業別-報告別 tifrs_namespace='-'.join(flie_name.split('-')[:1]+flie_name.split('-')[3:5]) if"".join(flie_name.split('-')[3:4])=='fh'or"".join(flie_name.split('-')[3:4])=='mim': #IFRS中,唯獨「金控業FH」和「異業合併MIM」的schema,檔名是不含行業別 tifrs_namespace='-'.join(flie_name.split('-')[:1]+flie_name.split('-')[3:4]) returntifrs_namespace elifflie_name[:7]=='tw-gaap':#取檔名0-6前七個字元=tw-gaap(找TaiwanGAAP檔) #2012年以前採用"中華民國財務會計準則"(ROCGAAP) #一般公認會計原則(GenerallyAcceptedAccountingPrinciples,簡稱GAAP) #一樣已經採用XBRL架構 #檔名規則: #tw-gaap-行業別-公司代號-年度季別.xml #tw-gaap-行業別-公司代號-年度季別-cr.xml #flie_name.split('-')[0:3] #把filename透過"-"切割,抓取0-2前三個元素 #變成['tw','gaap','行業別'] #'-'.join(flie_name.split('-')[0:3]) #再把"-"加回前三個元素,變成:tw-gaap-行業別 gaap_namespace='-'.join(flie_name.split('-')[0:3]) #print("gaap_namespace:",gaap_namespace) #if"".join(flie_name.split('-')[3:4])=='fh'or"".join(flie_name.split('-')[3:4])=='mim': returngaap_namespace else: #資料夾裡面假如有除了TaiwanIFRS或GAAP之外的xml檔案就會顯示出錯誤 ifxbrl_filter.show_error:print("ThisfileisnotTaiwanIFRSorGAAPXBRLfile:",flie_name) defcheck_xbrl_namespace(self,full_path,namespace): flie_name=common.get_filename(full_path)#切割路徑跟檔名 ifself.print_deatil:print("Filename:",flie_name) ifos.stat(full_path).st_size==0: print("FileisEmpty:",flie_name) return #抓取TaiwanGAAPorIFRSnamespace是要找到相對應的XBRLSchema定義檔 #XBRLSchema定義檔,定義了相對應產業別財報應有的架構 #相對應產業別,也要找到相對應類別的財報架構定義檔才會正確 xbrl_tree=etree.parse(full_path)#開啟XML檔 root=xbrl_tree.getroot()#抓取XBRL檔唯一的根root try: xbrl_namespace="{"+root.nsmap[namespace]+"}*"#抓出符合檔名格式的namespace #print("xbrl_namespace:",xbrl_namespace) ifself.print_deatil:print(xbrl_namespace) except: ifself.show_error:print("CheckError:",flie_name)#假如沒有找到符合的namespace就顯示檔名 ifself.enable_log: self.log.log_message_to_file("CheckError:"+flie_name) if__name__=='__main__': #檢查有問題的xml檔 xbrl_filter=TaiwanXbrlFilter() files=glob.glob(xbrl_filter.xbrl_files_folder+'*.xml')#生成xml文件列表 forfull_pathinfiles: namespace=xbrl_filter.get_xbrl_namespace_from_filename(full_path) xbrl_filter.check_xbrl_namespace(full_path,namespace) 最終跑出的log,2013IFRS之後都是金融保險或異業有問題, [2018/8/22更新] 感謝yuhsin指正那是因為FH跟MIM的schema檔,不包含行業別,修正過後檢測沒問題。

而GAAP的看起來是早期還不熟悉造成的錯誤, 測試後似乎不會對convert造成影響, 應該是目前資料的分析跟資料庫架構不夠嚴謹, 都丟進去是比較簡單的做法,但後續還會遇到些問題 CheckError:tw-gaap-basi-5842-2009Q4.xml CheckError:tw-gaap-basi-5842-2010Q1.xml CheckError:tw-gaap-ci-3379-2009Q4-cr.xml CheckError:tw-gaap-ci-5315-2010Q1-cr.xml CheckError:tw-gaap-ci-6148-2010Q1-cr.xml CheckError:tw-gaap-ci-6247-2010Q1.xml CheckError:tw-gaap-ci-8127-2009Q4.xml CheckError:tw-gaap-ci-8927-2009Q4.xml on 5月17,2017 標籤: [Project], [Python], [XBRL] 2則留言: yuhsin2017年9月13日下午6:32在IFRS,唯獨「金控業FH」和「異業合併MIN」的schema,檔名是不含行業別⋯⋯回覆刪除回覆回覆ct9w2018年8月22日凌晨1:08謝謝你,改好了回覆刪除回覆回覆新增留言載入更多… 較新的文章 較舊的文章 首頁 訂閱: 張貼留言(Atom) 首頁 搜尋此網誌 標籤 [Blogger] (1) [Project] (5) [Python] (8) [SublimeText] (1) [XBRL] (4) 網誌存檔 ▼  2017 (12) 6月2017 (1) 5月2017 (6) 3月2017 (5) 關於我自己 ct9w 檢視我的完整簡介



請為這篇文章評分?