[PYTHON] Lisez XBRL et visualisez facilement les changements dans les performances de l'entreprise

Aperçu

J'aimerais pouvoir facilement créer un graphique ↓ comme celui publié sur MarketHack, j'ai donc écrit un script qui crache un graphique de performance simplement en insérant XBRL à l'aide de l'analyseur XBRL de rapport sur les titres créé séparément.

[Les prix des produits de base industriels sont élevés et les ressources techniques se portent bien --Markethack.net/archives/52053665.html) MarketHack テック・リソーシズの株価

code

Utilisez la classe personnalisée suivante comme analyseur.

J'ai créé une classe pour télécharger et analyser XBRL depuis UFO catcher --Qiita

À titre d'exemple, utilisons le rapport sur les titres FY03 / 17 de Just System.

python


import numpy as np
import pandas as pd
from UfoDataReader.util.parser import UfoXBRLParser
from bokeh.io import show
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.palettes import Spectral5
from bokeh.plotting import figure
from bokeh.transform import factor_cmap

ufoparser = UfoXBRLParser()

# target XBRL file
file = 'jpcrp030000-asr-001_E04996-000_2017-03-31_01_2017-06-23.xbrl'

xbrl = ufoparser.parse(file)
dei = ufoparser.parseDEI(xbrl)

# getting each years GAAP objects
contexts = ['Prior4', 'Prior3', 'Prior2', 'Prior1', 'Current']
gaaps = [ufoparser.parseGAAP(xbrl, context=context) for context in contexts]

# getting factors
share = np.array([float(gaap.shares_outstanding) for gaap in gaaps])
sale = np.array([float(gaap.netsales) for gaap in gaaps])
cf = np.array([float(gaap.cf_from_operating) +
               float(gaap.cf_from_financing) +
               float(gaap.cf_from_financing) for gaap in gaaps])

df = pd.DataFrame(
    dict(
        year=contexts,
        dps=np.array([float(gaap.dps) for gaap in gaaps]),
        eps=np.array([float(gaap.basic_eps) for gaap in gaaps]),
        cfps=cf / share,
        sps=sale / share
    )
)


# bokeh setting
years = contexts
factors = ['dps', 'eps', 'cfps', 'sps']

x = [(year, factor) for year in years for factor in factors]
amounts = sum(zip(df['dps'], df['eps'], df['cfps'], df['sps']), ())

source = ColumnDataSource(data=dict(x=x, counts=amounts))

p = figure(x_range=FactorRange(*x), plot_height=300, title=dei.company_name)

p.vbar(x='x', top='counts', width=1.0, source=source,
       fill_color=factor_cmap('x', palette=Spectral5, factors=factors, start=1, end=2))

p.y_range.start = 0
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = 1
p.xgrid.grid_line_color = None

# open browser
show(p)

résultat

Ce sera sorti comme ça. Il peut être préférable d'ajouter une info-bulle, etc. en utilisant le survol. Étant donné que le bokeh a beaucoup de paramètres, il y a encore beaucoup de choses à retenir.

bokeh_plot.png

Recommended Posts

Lisez XBRL et visualisez facilement les changements dans les performances de l'entreprise
Affectations et modifications des objets Python
Conserver et lire l'ordre dans PyYAML
Ignorer # ligne et lire avec les pandas
Créer et lire des paquets de messages en Python
Lire et écrire des fichiers JSON avec Python
Représentez facilement des données graphiques dans le shell et Python