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
檢視我的完整簡介