I wish I could easily create a graph ↓ like the one posted on MarketHack, so I wrote a script that spits out a performance graph just by inserting XBRL using the separately created securities report XBRL parser.
Industrial commodity prices are strong and Tech Resources are doing well-Market Hack
Use the following self-made class as a parser.
I made a class to download and parse XBRL from UFO Catcher --Qiita
As an example, let's use JustSystems' financial report for the year ended March 31, 2017.
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)
It will be output like this. It may be better to add a tooltip etc. using Hover. Since bokeh has a lot of settings, there are still many things to remember.
Recommended Posts