In the last blog entry we developed a stock chart using Bokeh's advanced features. One problem of that implementation was that all the parameters were passed into the chart generator in the form of dictionaries; these dictionaries are easy to use, but are prone to typing errors.
Today we'll take advantage of Python's OO features to make this library less error-prone, intuitive, and extensible. An OO version of this library will allow a good IDE help developers navigate the available classes to generate charts.
The main two goals in today's changes are:
* Change the library so that I can inject my own indicators.
* Use a builder pattern to easily generate charts. The builder pattern is excellent to create interfaces with a large number of sparse parameters.
from bokeh.io import output_notebook, show
import pandas as pd
from stockcharts import *
output_notebook()
The main classes¶
We will not go over the details on these changes. If you are really interested in the code or a working version of this ipython notebook, you can access my github account.
However, let's have a look at the prototype of the main classes:
StockChart: main class - creates stock charts.
class StockChart:
def __init__(self, data):
def set_title(self, title):
def set_days(self, days):
def set_look_and_feel(self, look_and_feel):
def add_indicator(self, indicator):
def get_stock_chart(self):
LookAndFeel: encapsulates look and feel for this chart.
class LookAndFeel:
def __init__(self):
def set_color_up(self, color):
def set_color_down(self, color):
def set_height(self, height):
def set_width(self, width):
Indicator: extend this class to add your own indicators.
class Indicator(object):
def __init__(self, data, **kwargs):
def add_to_chart(self, stock_data, chart):
A basic chart¶
df = pd.read_csv("./data/spy.csv", nrows=350)
p= StockChart(df).get_stock_chart()
show(p)
Chart with some parameters and look and feel settings¶
df = pd.read_csv("./data/spy.csv", nrows=350)
p= StockChart(df) \
.set_title("SPY") \
.set_days(50) \
.set_look_and_feel(LookAndFeel() \
.set_height(350) \
.set_width(800)) \
.get_stock_chart()
show(p)
Chart with look and feel and indicators¶
df = pd.read_csv("./data/spy.csv", nrows=350)
p= StockChart(df) \
.set_title("SPY") \
.set_days(200) \
.set_look_and_feel(LookAndFeel().set_width(800)) \
.add_indicator(EmaIndicator(df, period=14)) \
.add_indicator(BollingerIndicator(df, period=14)) \
.get_stock_chart()
show(p)