IRC-SPHERE/HyperStream

View on GitHub
examples/utils.py

Summary

Maintainability
C
7 hrs
Test Coverage
from IPython.core.display import display, HTML
import random
from dateutil.parser import parse
from datetime import datetime

epoch = datetime.utcfromtimestamp(0).replace(tzinfo=None)

def unix_time_miliseconds(dt):
    return (dt.replace(tzinfo=None) - epoch).total_seconds() * 1000.0


def plot_high_chart(time, data, title="title", yax="Y", type="high_chart"):
    if len(time) != len(data):
        print "Length of time and data must agree"
        return None

    if type == "high_chart":
        type_a = "Highcharts.chart"
        type_b = "type: 'linear'"
    else:
        type_a = "Highcharts.stockChart"
        type_b = "type: 'datetime', ordinal: false"
        time = [unix_time_miliseconds(parse(dt)) for dt in time]

    r = str(random.randint(0,10000))

    # braces braces need to be doubled in the template {{ = { and }} = }
    template = """
        <html>
        <head>
        <title>{title}</title>
           <!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>-->
           <!--<script src="https://code.highcharts.com/stock/highstock.js"></script>-->
           <!--<script src="https://code.highcharts.com/stock/modules/exporting.js"></script>-->
           <script src="./scripts/jquery.min.js"></script>
           <script src="./scripts/highstock.js"></script>
           <script src="./scripts/exporting.js"></script>
        </head>
        <body>

        <div id="container{randint}" style="width: 800px; height: 600px; margin: 125 auto"></div>

        <script language="JavaScript">
               var data = {data};

            {type_a}('container{randint}', {{
                chart: {{
                    zoomType: 'x'
                }},
                title: {{
                    text: '{title}'
                }},
                xAxis: {{
                    {type_b}
                }},
                yAxis: {{
                    title: {{
                        text: '{yax}'
                    }}
                }},
                legend: {{
                    enabled: false
                }},

                series: [{{
                    type: 'spline',
                    name: '{yax}',
                    data: data
                }}]
            }});
        </script>

        </body>
        </html>
    """

    data = [[i,j] for i, j in zip(time, data)]
    data = str(data)
    f = template.format(title=title, randint=r, data=data, type_a=type_a,
                        type_b=type_b, yax=yax)

    display(HTML(f))


def plot_multiple_stock(data, time=None, names=None, htype=None, title='title', ylabel=None):
    if isinstance(data, list) and isinstance(data[0], dict):
        seriesOptions = data
    else:
        if names is not None:
            assert(len(data) == len(names))
        if htype is not None:
            if isinstance(htype, list):
                assert(len(data) == len(htype))

        seriesOptions = []
        for i, serie_data in enumerate(data):
            serie = {}
            if time is not None:
                if isinstance(time[i], list):
                    serie_time = time[i]
                else:
                    serie_time = time
                if len(serie_time) > 0 and type(serie_time[0]) is str:
                    serie_time = [unix_time_miliseconds(parse(dt)) for dt in serie_time]
                serie['data'] = [list(a) for a in zip(serie_time, serie_data)]
            else:
                print('there is no time')
                serie['data'] = serie_data
            if htype is not None:
                if isinstance(htype, list):
                    serie['type'] = htype[i]
                else:
                    serie['type'] = htype
            if names is not None:
                if len(names) > 0:
                    serie['name'] = names[i]
                else:
                    serie['name'] = names
            seriesOptions.append(serie)

    template = """
     <html>
        <head>
        <title>{title}</title>
           <script src="./scripts/jquery.min.js"></script>
           <script src="./scripts/highstock.js"></script>
           <script src="./scripts/exporting.js"></script>
        </head>
        <body>

        <div id="container{randint}" style="width: 800px; height: 600px; margin: 125 auto"></div>

        <script language="JavaScript">
            var seriesOptions = {seriesOptions};

            /**
             * Create the chart when all data is loaded
             * @returns {{undefined}}
             */
            Highcharts.stockChart('container{randint}', {{
              chart: {{
                zoomType: 'x'
              }},
              title: {{
                  text: '{title}'
              }},
              plotOptions: {{
                series: {{
                  showInNavigator: true,
                }}
              }},
                yAxis: {{
                    title: {{
                        text: '{ylabel}'
                    }}
                }},
              tooltip: {{
                pointFormat: '<span style="color:{{series.color}}">{{series.name}}</span>:<b>{{point.y}}</b>',
                valueDecimals: 2,
                split: true
              }},
              series: seriesOptions
            }});
        </script>

        </body>
        </html>
    """

    r = str(random.randint(0,10000))
    f = template.format(randint=r, seriesOptions=seriesOptions, title=title,
                        ylabel=ylabel)

    display(HTML(f))