2016-06-30 34 views
12

Sto lavorando a un progetto che comporta l'elaborazione di un grande volume di documenti XBRL (> 1 m di file separati). Sono totalmente nuovo di XBRL e mi sento abbastanza perso al momento.Come importare i dati XBRL in MySQL?

Ho dati relativi a quei documenti XBRL in un database MySQL separato e vorrei aggiungere i dati XBRL in MySQL per archiviare tutto in un db.

Quali sono i metodi migliori per il trasferimento dei dati dai documenti XBRL in MySQL?

Sono disponibili librerie di elaborazione di massa?

Ho cercato tutorial su questi problemi ma non ho trovato nulla che fornisse un'introduzione di base, solo un sacco di informazioni di alto livello.

+0

Io non credo che ci sia alcuna, ho cercato di fare la stessa cosa su due anni fa, tranne la destinazione era SQL Server. Che tipi di file hai? –

+0

Invece di database SQL per database NoSql da prestazioni e scalabilità perpective –

risposta

7

Il paradigma naturale in teoria per l'archiviazione di XBRL in un database sarebbe OLAP, perché XBRL riguarda i cubi di dati. OLAP su un database relazionale sarebbe chiamato ROLAP.

Questo non è un problema banale, perché i fatti presi da un gran numero di tassonomie possono formare un cubo molto grande e sparse (per depositata presso la SEC è 10k + dimensioni), e anche perché la creazione di uno schema di SQL richiede la conoscenza delle tassonomie prima di qualsiasi importare. Se emergono nuove tassonomie, è necessario ri-ETL tutto. Ciò non rende i database relazionali adatti come soluzione generale.

Se i documenti condividono la stessa tassonomia e la tassonomia è molto semplice (come in: non troppe dimensioni), è possibile elaborare una mappatura ad hoc per archiviare tutti i fatti in un'unica tabella con molti righe nel senso ROLAP (fatti per righe, aspetti per colonne). Alcuni produttori sono specializzati nell'archiviazione di fatti XBRL non dimensionali, nel qual caso le offerte SQL tradizionali (o "post-SQL" che scalano con righe) funzionano bene.

Alcuni fornitori creano una tabella per ciascun ipercubo XBRL nella tassonomia, con uno schema derivato dalla rete di definizione ma diverso per ciascun ipercubo. Ciò può portare a molte tabelle nel database e richiede molti join per le query che coinvolgono più hypercubes.

Alcuni altri fornitori fanno ipotesi sulla struttura XBRL sottostante o sul tipo di query che i loro utenti devono eseguire. Limitare l'ambito del problema consente di trovare architetture specifiche o schemi SQL che possono anche svolgere il lavoro per queste esigenze specifiche.

Per importare grandi quantità di documenti (ad esempio tutti i documenti SEC), noi (il mio datore di lavoro) abbiamo creato uno generic mapping in cima agli archivi dati NoSQL piuttosto che ai database relazionali. Un gran numero di fatti con un numero variabile di dimensioni si adattano a grandi raccolte di documenti semi-strutturati e le reti si adattano bene in un formato gerarchico.

2

Per prima cosa è necessario rendersi conto che i documenti XBRL (istanze) contengono molti tipi diversi di informazioni. Ad esempio: può contenere informazioni sui prezzi giornalieri per i fondi di investimento, ma anche rapporti IVA trimestrali o informazioni di merito di credito. XBRL è un modo standard di comunicare, ma i contenuti hanno le proprie tassonomie (XBRL standardizzate). Ad esempio: esiste una tassonomia olandese, su cui è costruita l'agenzia di entrate olandese (con una propria tassonomia), sulla quale esiste una tassonomia specifica per la presentazione delle relazioni IVA. Queste tassonomie sono definite usando XSD, Xlink e linkbase. Consideralo come il concetto di un Dictionairy: il modo in cui i dizionari sono costruiti è lo stesso ovunque (usa ogni lettera dell'alfabeto per creare "capitoli", ordinare le parole in ordine alfabetico, ecc. Ecc.), Ma un dizionario greco usa il suo alfabeto, il suo proprie parole e una propria lingua per spiegare i contenuti.

Quindi, se si utilizzano solo uno o alcuni tipi diversi di documenti XBRL (che condividono le stesse tassonomie), è possibile creare una mappatura da queste tassonomie ai propri oggetti (di database). Se disponi di una gamma più ampia di tassonomie, dovrai creare una soluzione più generica che possa "importare" le tassonomie. Sarà una vera sfida (il motivo per cui non ci sono molti strumenti disponibili sul mercato).

Se la società (r azienda) può permetterselo, consiglio di esaminare l'esistente tools come Altova's MapForce. In questo modo non è necessario imparare XBRL, XSD, Xlink e linkbase solo per iniziare a sviluppare il tuo strumento per analizzare questi file, puoi sfruttare i prodotti esistenti per mappare le tassonomie XBRL al tuo database/applicazione.

+0

Sai se MapForce supporta iXBRL, in uso da [Companies House (Regno Unito)] (http://download.companieshouse.gov.uk/en_accountsdata.html) ? –

+1

iXBRL è XBRL in linea, che è fondamentalmente un file HTML contenente i dati XBRL, creando un documento leggibile dagli stessi identici dati contenuti nell'XBRL "grezzo".Quando guardo il tuo link, offre i dati in entrambi i formati. Normalmente, un iXBRL viene creato applicando un modello (spesso un XSLT) al file XBRL. Per quanto riguarda la tua domanda: MapForce non è pensato per funzionare con iXBRL ... Ma una rapida panoramica del loro sito mostra che Altova ha strumenti per gestire iXBRL: StyleVision, il loro strumento di reporting. – DdW

+0

Grazie per la risposta. Ho trovato solo circa l'1% dei file sono offerti come XBRL (.xml) e il resto sono in iXBRL (.html) e quindi MapForce non è stato in grado di elaborare la maggior parte di essi. Potrei vedere se StyleVision è in grado di leggere iXBRL e l'output su XBRL non elaborato in modo che MapForce possa leggerlo anche se speravo di trovare uno strumento per fare tutto. –

2

Spero che sappiate che MySQL è un archivio di dati strutturato mentre XBRL è solo una rappresentazione per mappare il documento aziendale in formato digitale. XBRL è il documento basato su XML, che implica che non è strutturato e che i dati richiesti dal documento possono o non possono essere visualizzati in quel documento specifico. Può contenere anche altre informazioni aggiuntive. XSD definisce come può essere strutturato XML e quante volte può accadere qualsiasi tag. Ora per rispondere alla tua domanda, potresti usare eXistDB, che ho usato anche in passato per memorizzare il documento XBRL. Tuttavia, a volte può essere lento. Se hai bisogno solo di alcuni dati da XBRL e ne hai bisogno per memorizzare nel database MySQL potresti usare XPATH. Nel seguente codice Python semplice, è possibile prendere i valori di EquityTotalEndingBalance e ReservesTotalEndingBalance da this document.

from lxml import etree 
root = etree.fromstring(open("file.xml").read()) 
nsmap = root.nsmap 
nsmap.pop(None) # There was some error without this. 
data_one = root.xpath("//iascf-pfs:EquityTotalEndingBalance/text()",namespaces=nsmap) 
data_two = root.xpath("//novartis:ReservesTotalEndingBalance/text()",namespaces=nsmap) 
print data_one 
print data_two 

Questo codice stamperà i valori:

['37216000000', '36862000000', '42245000000'] 
['35903000000', '35558000000', '40971000000'] 

Così come si può risolvere il problema, allora?

  1. O si dovrà scegliere un memorizzazione dei documenti XML NoSQL based come eXistDB e scrivere XPath per ottenere i dati particolari.

  2. È possibile analizzare manualmente il documento XBRL come sopra e avviare XPath direttamente e archiviare i dati.

La complessità insorge se è necessario consumare tutti i dati da tutti i tipi di documento. Quindi dovresti limitare ciò che consumerai da quei documenti.

+0

Questo metodo può supportare diversi 'contextRef'? (senza doverli definire manualmente) Ho visto alcuni usare 'contextRef =" current-mud "' e altri usano 'contextRef =" cfwd_31_12_2014 "' o 'contextRef =" FY1 "' e vorrei ottenere il valore corrente/più recente. –

+0

Sì, è possibile. Dovresti modificare xpath per supportare l'attributo. considera di volere il valore da ' 37216000000'. In questo caso xpath sarebbe 'data_one = root.xpath (" // iascf-pfs: EquityTotalEndingBalance [@ numericContext = 'Group1999AsOf']/text() ", namespaces = nsmap)'. Questo restituirà solo '' 37216000000''. Spero che questo ti aiuti. Per favore accetta la risposta se questo funziona per te. Grazie, – Pant

+0

Grazie per la risposta. Sai come farlo dinamicamente? Sto cercando di elaborare ~ 6.000 file in cui il contesto è sconosciuto per me. –

Problemi correlati