{"action":"created","comment":{"url":"https://api.github.com/repos/quantopian/zipline/pulls/comments/41809107","id":41809107,"diff_hunk":"@@ -0,0 +1,870 @@\n+\"\"\"Blaze integration with the Pipeline API.\n+\n+For an overview of the blaze project, see blaze.pydata.org\n+\n+The blaze loader for the Pipeline API is designed to allow us to load\n+data from arbitrary sources as long as we can execute the needed expressions\n+against the data with blaze.\n+\n+Data Format\n+-----------\n+\n+The blaze Pipline API loader expects that data is formatted in a tabular way.\n+The only required column in your table is ``asof_date`` where this column\n+represents the date this data is referencing. For example, one might have a CSV\n+like:\n+\n+asof_date,value\n+2014-01-01,0\n+2014-01-02,1\n+2014-01-03,2\n+\n+This says that the value on 2014-01-01 was 0 and so on.\n+\n+Optionally, we may provide a ``timestamp`` column to be used to represent\n+point in time data. This column tells us when the data was known, or became\n+available to for use. Using our same CSV, we could write this with a timestamp\n+like:\n+\n+asof_date,timestamp,value\n+2014-01-01,2014-01-02,0\n+2014-01-02,2014-01-03,1\n+2014-01-03,2014-01-04,2\n+\n+This says that the value was 0 on 2014-01-01; however, we did not learn this\n+until 2014-01-02. This is useful for avoiding look-ahead bias in your pipelins.\n+If this column does not exist, the ``asof_date`` column will be used instead.\n+\n+If your data references a particular security, you can add a ``sid`` column to\n+your dataset to represent this. For example:\n+\n+asof_date,value,sid\n+2014-01-01,0,10\n+2014-01-01,1,20\n+2014-01-02,1,10\n+2014-01-02,2,20\n+2014-01-03,2,10\n+2014-01-03,3,20\n+\n+This says that on 2014-01-01, the asset with id 10 had a value of 0, and the\n+asset with id 20 had a value of 1.\n+\n+\n+One of the key features of the Pipeline API is the handling of adjusments and\n+restatements. Often our data will be amended after the fact and we would like\n+to trade on the newest information; however, we do not want to introduce this\n+knowledge to our model too early. The blaze loader handles this case by\n+accepting a second ``deltas`` expression that contains all of the restatements\n+in the original expression.\n+\n+For example, let's use our table from above:\n+\n+asof_date,value\n+2014-01-01,0\n+2014-01-02,1\n+2014-01-03,2\n+\n+Imagine that on the fourth the vendor realized that the calculation was\n+incorrect and the value on the first was actually -1. Then, on the fifth, they\n+realized that the value for the third was actually 3. We can construct a\n+``deltas`` expression to pass to our blaze loader that has the same shape as\n+our base table but only contains these new values like:\n+\n+asof_date,timestamp,value\n+2014-01-01,2014-01-04,-1\n+2014-01-03,2014-01-05,3\n+\n+This shows that we learned on the fourth that the value on the first was\n+actually -1 and that we learned on the fifth that the value on the third was\n+actually 3. By pulling our data into these two tables and not silently updating\n+our original table we can run our pipelines using the information we would\n+have had on that day, and we can prevent lookahead bias in the pipelines.\n+\n+Conversion from Blaze to the Pipeline API\n+-----------------------------------------\n+\n+Now that our data is structured in the way that the blaze loader expects we\n+are ready to convert our blaze expressions into Pipline API objects.\n+\n+This module (zipline.pipeline.loaders.blaze) exports a function called\n+``from_blaze`` which performs this mapping.\n+\n+The expression that you are trying to convert must either be tabular or\n+array-like. This means the ``dshape`` must be like:\n+\n+``Dim * {A: B}`` or ``Dim * A``.\n+\n+This represents an expression of dimension 1 which may be fixed or variable,\n+whose measure is either some record or a scalar.\n+\n+The record case defines the entire table with all of the columns, this maps the\n+blaze expression into a pipeline DataSet. This dataset will have a column for\n+each field of the record. Some datashape types cannot be coerced into Pipeline\n+API compatible types and in that case, a column cannot be constructed.\n+Currently any numeric type that may be promoted to a float64 is compatible with\n+the Pipeline API.\n+\n+The scalar case defines a single column pulled out a table. For example, let\n+``expr = bz.symbol('s', 'var * {field: int32, asof_date: datetime}')``.\n+When we pass ``expr.field`` to ``from_blaze``, we will walk back up the\n+expression tree until we find the table that ``field`` is defined on. We will\n+then proceed with the record case to construct a dataset; however, before\n+returning the dataset we will pull out only the column that was passed in.\n+\n+For full documentation, see ``help(from_blaze)`` or ``from_blaze?`` in jupyter.\n+\n+Using our Pipeline DataSets and Columns\n+---------------------------------------\n+\n+Once we have mapped our blaze expressions into Pipeline API objects, we may\n+use them just like any other datasets or columns. For more information on how\n+to run a pipeline or using the Pipeline API, see:\n+www.quantopian.com/help#pipeline-api\n+\"\"\"\n+from __future__ import division, absolute_import\n+\n+from abc import ABCMeta, abstractproperty\n+from collections import namedtuple, defaultdict\n+from itertools import count\n+import warnings\n+from weakref import WeakKeyDictionary\n+\n+import blaze as bz\n+from datashape import (\n+    Date,\n+    DateTime,\n+    Option,\n+    float64,\n+    isrecord,\n+    isscalar,\n+    promote,\n+)\n+from numpy.lib.stride_tricks import as_strided\n+from odo import odo\n+import pandas as pd\n+from toolz import (\n+    complement,\n+    compose,\n+    concat,\n+    flip,\n+    groupby,\n+    identity,\n+    memoize,\n+)\n+import toolz.curried.operator as op\n+from six import with_metaclass, PY2, iteritems\n+\n+\n+from ..data.dataset import DataSet, Column\n+from zipline.lib.adjusted_array import adjusted_array\n+from zipline.lib.adjustment import Float64Overwrite\n+\n+\n+AD_FIELD_NAME = 'asof_date'\n+TS_FIELD_NAME = 'timestamp'\n+SID_FIELD_NAME = 'sid'\n+valid_deltas_node_types = (\n+    bz.expr.Field,\n+    bz.expr.ReLabel,\n+    bz.expr.Symbol,\n+)\n+traversable_nodes = (\n+    bz.expr.Field,\n+    bz.expr.Label,\n+)\n+is_invalid_deltas_node = complement(flip(isinstance, valid_deltas_node_types))\n+getname = op.attrgetter('__name__')\n+\n+\n+class _ExprRepr(object):\n+    \"\"\"Box for repring expressions with the str of the expression.\n+\n+    Parameters\n+    ----------\n+    expr : Expr\n+        The expression to box for repring.\n+    \"\"\"\n+    __slots__ = 'expr',\n+\n+    def __init__(self, expr):\n+        self.expr = expr\n+\n+    def __repr__(self):\n+        return str(self.expr)\n+    __str__ = __repr__\n+\n+\n+class ExprData(namedtuple('ExprData', 'expr deltas resources')):\n+    \"\"\"A pair of expressions and a data resources.\n+\n+    Parameters\n+    ----------\n+    expr : Expr\n+        The first known values.\n+    deltas : Expr, optional\n+        The deltas for the data.\n+    resources : resource or dict of resources, optional\n+        The resources to compute the exprs against.\n+    \"\"\"\n+    def __new__(cls, expr, deltas=None, resources=None):\n+        return super(ExprData, cls).__new__(cls, expr, deltas, resources)\n+\n+    def __repr__(self):\n+        # If the expressions have _resources() then the repr will\n+        # drive computation so we box them.\n+        cls = type(self)\n+        return super(ExprData, cls).__repr__(cls(\n+            _ExprRepr(self.expr),\n+            _ExprRepr(self.deltas),\n+            self.resources,\n+        ))\n+\n+\n+class InvalidField(with_metaclass(ABCMeta)):\n+    \"\"\"A field that raises an exception that indicates that the\n+    field was invalid.\n+\n+    Parameters\n+    ----------\n+    field : str\n+        The name of the field.\n+    type_ : dshape\n+        The shape of the field.\n+    \"\"\"\n+    @abstractproperty\n+    def error_format(self):\n+        raise NotImplementedError('error_format')\n+\n+    def __init__(self, field, type_):\n+        self._field = field\n+        self._type = type_\n+\n+    def __get__(self, instance, owner):\n+        raise AttributeError(\n+            self.error_format.format(field=self._field, type_=self._type),\n+        )\n+\n+\n+class NonNumpyField(InvalidField):\n+    error_format = \"field '{field}' was a non numpy compatible type: '{type_}'\"\n+\n+\n+class NonPipelineField(InvalidField):\n+    error_format = (\n+        \"field '{field}' was a non Pipeline API compatible type:\"\n+        \" '{type_.__name__}'\"\n+    )\n+\n+\n+class NotPipelineCompatible(TypeError):\n+    \"\"\"Exception used to indicate that a dshape is not Pipeline API\n+    compatible.\n+    \"\"\"\n+    def __str__(self):\n+        return \"'%s' is a non Pipleine API compatible type'\" % self.args\n+\n+\n+_new_names = ('_%d' % n for n in count())","path":"zipline/pipeline/loaders/blaze.py","position":267,"original_position":267,"commit_id":"99b1fd8da945972bc83031f7bef28b2065d2f139","original_commit_id":"99b1fd8da945972bc83031f7bef28b2065d2f139","user":{"login":"ssanderson","id":1588357,"avatar_url":"https://avatars.githubusercontent.com/u/1588357?v=3","gravatar_id":"","url":"https://api.github.com/users/ssanderson","html_url":"https://github.com/ssanderson","followers_url":"https://api.github.com/users/ssanderson/followers","following_url":"https://api.github.com/users/ssanderson/following{/other_user}","gists_url":"https://api.github.com/users/ssanderson/gists{/gist_id}","starred_url":"https://api.github.com/users/ssanderson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ssanderson/subscriptions","organizations_url":"https://api.github.com/users/ssanderson/orgs","repos_url":"https://api.github.com/users/ssanderson/repos","events_url":"https://api.github.com/users/ssanderson/events{/privacy}","received_events_url":"https://api.github.com/users/ssanderson/received_events","type":"User","site_admin":false},"body":"Can this be \"BlazeDataSet_%d\" so that people can easily tell where their weirdly-named dataset came from?","created_at":"2015-10-12T22:41:20Z","updated_at":"2015-10-12T22:41:20Z","html_url":"https://github.com/quantopian/zipline/pull/768#discussion_r41809107","pull_request_url":"https://api.github.com/repos/quantopian/zipline/pulls/768","_links":{"self":{"href":"https://api.github.com/repos/quantopian/zipline/pulls/comments/41809107"},"html":{"href":"https://github.com/quantopian/zipline/pull/768#discussion_r41809107"},"pull_request":{"href":"https://api.github.com/repos/quantopian/zipline/pulls/768"}}},"pull_request":{"url":"https://api.github.com/repos/quantopian/zipline/pulls/768","id":47466060,"html_url":"https://github.com/quantopian/zipline/pull/768","diff_url":"https://github.com/quantopian/zipline/pull/768.diff","patch_url":"https://github.com/quantopian/zipline/pull/768.patch","issue_url":"https://api.github.com/repos/quantopian/zipline/issues/768","number":768,"state":"open","locked":false,"title":"Blaze loader","user":{"login":"llllllllll","id":3064397,"avatar_url":"https://avatars.githubusercontent.com/u/3064397?v=3","gravatar_id":"","url":"https://api.github.com/users/llllllllll","html_url":"https://github.com/llllllllll","followers_url":"https://api.github.com/users/llllllllll/followers","following_url":"https://api.github.com/users/llllllllll/following{/other_user}","gists_url":"https://api.github.com/users/llllllllll/gists{/gist_id}","starred_url":"https://api.github.com/users/llllllllll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/llllllllll/subscriptions","organizations_url":"https://api.github.com/users/llllllllll/orgs","repos_url":"https://api.github.com/users/llllllllll/repos","events_url":"https://api.github.com/users/llllllllll/events{/privacy}","received_events_url":"https://api.github.com/users/llllllllll/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-10-12T21:23:32Z","updated_at":"2015-10-12T22:41:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c2cb00e0da4a3b03269cc5d31cea8b3adbf5e5eb","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/quantopian/zipline/pulls/768/commits","review_comments_url":"https://api.github.com/repos/quantopian/zipline/pulls/768/comments","review_comment_url":"https://api.github.com/repos/quantopian/zipline/pulls/comments{/number}","comments_url":"https://api.github.com/repos/quantopian/zipline/issues/768/comments","statuses_url":"https://api.github.com/repos/quantopian/zipline/statuses/99b1fd8da945972bc83031f7bef28b2065d2f139","head":{"label":"quantopian:blaze-loader","ref":"blaze-loader","sha":"99b1fd8da945972bc83031f7bef28b2065d2f139","user":{"login":"quantopian","id":1393215,"avatar_url":"https://avatars.githubusercontent.com/u/1393215?v=3","gravatar_id":"","url":"https://api.github.com/users/quantopian","html_url":"https://github.com/quantopian","followers_url":"https://api.github.com/users/quantopian/followers","following_url":"https://api.github.com/users/quantopian/following{/other_user}","gists_url":"https://api.github.com/users/quantopian/gists{/gist_id}","starred_url":"https://api.github.com/users/quantopian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quantopian/subscriptions","organizations_url":"https://api.github.com/users/quantopian/orgs","repos_url":"https://api.github.com/users/quantopian/repos","events_url":"https://api.github.com/users/quantopian/events{/privacy}","received_events_url":"https://api.github.com/users/quantopian/received_events","type":"Organization","site_admin":false},"repo":{"id":6297520,"name":"zipline","full_name":"quantopian/zipline","owner":{"login":"quantopian","id":1393215,"avatar_url":"https://avatars.githubusercontent.com/u/1393215?v=3","gravatar_id":"","url":"https://api.github.com/users/quantopian","html_url":"https://github.com/quantopian","followers_url":"https://api.github.com/users/quantopian/followers","following_url":"https://api.github.com/users/quantopian/following{/other_user}","gists_url":"https://api.github.com/users/quantopian/gists{/gist_id}","starred_url":"https://api.github.com/users/quantopian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quantopian/subscriptions","organizations_url":"https://api.github.com/users/quantopian/orgs","repos_url":"https://api.github.com/users/quantopian/repos","events_url":"https://api.github.com/users/quantopian/events{/privacy}","received_events_url":"https://api.github.com/users/quantopian/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/quantopian/zipline","description":"Zipline, a Pythonic Algorithmic Trading Library","fork":false,"url":"https://api.github.com/repos/quantopian/zipline","forks_url":"https://api.github.com/repos/quantopian/zipline/forks","keys_url":"https://api.github.com/repos/quantopian/zipline/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quantopian/zipline/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quantopian/zipline/teams","hooks_url":"https://api.github.com/repos/quantopian/zipline/hooks","issue_events_url":"https://api.github.com/repos/quantopian/zipline/issues/events{/number}","events_url":"https://api.github.com/repos/quantopian/zipline/events","assignees_url":"https://api.github.com/repos/quantopian/zipline/assignees{/user}","branches_url":"https://api.github.com/repos/quantopian/zipline/branches{/branch}","tags_url":"https://api.github.com/repos/quantopian/zipline/tags","blobs_url":"https://api.github.com/repos/quantopian/zipline/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quantopian/zipline/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quantopian/zipline/git/refs{/sha}","trees_url":"https://api.github.com/repos/quantopian/zipline/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quantopian/zipline/statuses/{sha}","languages_url":"https://api.github.com/repos/quantopian/zipline/languages","stargazers_url":"https://api.github.com/repos/quantopian/zipline/stargazers","contributors_url":"https://api.github.com/repos/quantopian/zipline/contributors","subscribers_url":"https://api.github.com/repos/quantopian/zipline/subscribers","subscription_url":"https://api.github.com/repos/quantopian/zipline/subscription","commits_url":"https://api.github.com/repos/quantopian/zipline/commits{/sha}","git_commits_url":"https://api.github.com/repos/quantopian/zipline/git/commits{/sha}","comments_url":"https://api.github.com/repos/quantopian/zipline/comments{/number}","issue_comment_url":"https://api.github.com/repos/quantopian/zipline/issues/comments{/number}","contents_url":"https://api.github.com/repos/quantopian/zipline/contents/{+path}","compare_url":"https://api.github.com/repos/quantopian/zipline/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quantopian/zipline/merges","archive_url":"https://api.github.com/repos/quantopian/zipline/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quantopian/zipline/downloads","issues_url":"https://api.github.com/repos/quantopian/zipline/issues{/number}","pulls_url":"https://api.github.com/repos/quantopian/zipline/pulls{/number}","milestones_url":"https://api.github.com/repos/quantopian/zipline/milestones{/number}","notifications_url":"https://api.github.com/repos/quantopian/zipline/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quantopian/zipline/labels{/name}","releases_url":"https://api.github.com/repos/quantopian/zipline/releases{/id}","created_at":"2012-10-19T15:50:29Z","updated_at":"2015-10-11T23:59:47Z","pushed_at":"2015-10-12T21:37:50Z","git_url":"git://github.com/quantopian/zipline.git","ssh_url":"git@github.com:quantopian/zipline.git","clone_url":"https://github.com/quantopian/zipline.git","svn_url":"https://github.com/quantopian/zipline","homepage":"","size":24870,"stargazers_count":2588,"watchers_count":2588,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":706,"mirror_url":null,"open_issues_count":152,"forks":706,"open_issues":152,"watchers":2588,"default_branch":"master"}},"base":{"label":"quantopian:master","ref":"master","sha":"0fa6e72d1dd9157072f01a0da461f1003ff15da5","user":{"login":"quantopian","id":1393215,"avatar_url":"https://avatars.githubusercontent.com/u/1393215?v=3","gravatar_id":"","url":"https://api.github.com/users/quantopian","html_url":"https://github.com/quantopian","followers_url":"https://api.github.com/users/quantopian/followers","following_url":"https://api.github.com/users/quantopian/following{/other_user}","gists_url":"https://api.github.com/users/quantopian/gists{/gist_id}","starred_url":"https://api.github.com/users/quantopian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quantopian/subscriptions","organizations_url":"https://api.github.com/users/quantopian/orgs","repos_url":"https://api.github.com/users/quantopian/repos","events_url":"https://api.github.com/users/quantopian/events{/privacy}","received_events_url":"https://api.github.com/users/quantopian/received_events","type":"Organization","site_admin":false},"repo":{"id":6297520,"name":"zipline","full_name":"quantopian/zipline","owner":{"login":"quantopian","id":1393215,"avatar_url":"https://avatars.githubusercontent.com/u/1393215?v=3","gravatar_id":"","url":"https://api.github.com/users/quantopian","html_url":"https://github.com/quantopian","followers_url":"https://api.github.com/users/quantopian/followers","following_url":"https://api.github.com/users/quantopian/following{/other_user}","gists_url":"https://api.github.com/users/quantopian/gists{/gist_id}","starred_url":"https://api.github.com/users/quantopian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quantopian/subscriptions","organizations_url":"https://api.github.com/users/quantopian/orgs","repos_url":"https://api.github.com/users/quantopian/repos","events_url":"https://api.github.com/users/quantopian/events{/privacy}","received_events_url":"https://api.github.com/users/quantopian/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/quantopian/zipline","description":"Zipline, a Pythonic Algorithmic Trading Library","fork":false,"url":"https://api.github.com/repos/quantopian/zipline","forks_url":"https://api.github.com/repos/quantopian/zipline/forks","keys_url":"https://api.github.com/repos/quantopian/zipline/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quantopian/zipline/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quantopian/zipline/teams","hooks_url":"https://api.github.com/repos/quantopian/zipline/hooks","issue_events_url":"https://api.github.com/repos/quantopian/zipline/issues/events{/number}","events_url":"https://api.github.com/repos/quantopian/zipline/events","assignees_url":"https://api.github.com/repos/quantopian/zipline/assignees{/user}","branches_url":"https://api.github.com/repos/quantopian/zipline/branches{/branch}","tags_url":"https://api.github.com/repos/quantopian/zipline/tags","blobs_url":"https://api.github.com/repos/quantopian/zipline/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quantopian/zipline/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quantopian/zipline/git/refs{/sha}","trees_url":"https://api.github.com/repos/quantopian/zipline/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quantopian/zipline/statuses/{sha}","languages_url":"https://api.github.com/repos/quantopian/zipline/languages","stargazers_url":"https://api.github.com/repos/quantopian/zipline/stargazers","contributors_url":"https://api.github.com/repos/quantopian/zipline/contributors","subscribers_url":"https://api.github.com/repos/quantopian/zipline/subscribers","subscription_url":"https://api.github.com/repos/quantopian/zipline/subscription","commits_url":"https://api.github.com/repos/quantopian/zipline/commits{/sha}","git_commits_url":"https://api.github.com/repos/quantopian/zipline/git/commits{/sha}","comments_url":"https://api.github.com/repos/quantopian/zipline/comments{/number}","issue_comment_url":"https://api.github.com/repos/quantopian/zipline/issues/comments{/number}","contents_url":"https://api.github.com/repos/quantopian/zipline/contents/{+path}","compare_url":"https://api.github.com/repos/quantopian/zipline/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quantopian/zipline/merges","archive_url":"https://api.github.com/repos/quantopian/zipline/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quantopian/zipline/downloads","issues_url":"https://api.github.com/repos/quantopian/zipline/issues{/number}","pulls_url":"https://api.github.com/repos/quantopian/zipline/pulls{/number}","milestones_url":"https://api.github.com/repos/quantopian/zipline/milestones{/number}","notifications_url":"https://api.github.com/repos/quantopian/zipline/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quantopian/zipline/labels{/name}","releases_url":"https://api.github.com/repos/quantopian/zipline/releases{/id}","created_at":"2012-10-19T15:50:29Z","updated_at":"2015-10-11T23:59:47Z","pushed_at":"2015-10-12T21:37:50Z","git_url":"git://github.com/quantopian/zipline.git","ssh_url":"git@github.com:quantopian/zipline.git","clone_url":"https://github.com/quantopian/zipline.git","svn_url":"https://github.com/quantopian/zipline","homepage":"","size":24870,"stargazers_count":2588,"watchers_count":2588,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":706,"mirror_url":null,"open_issues_count":152,"forks":706,"open_issues":152,"watchers":2588,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/quantopian/zipline/pulls/768"},"html":{"href":"https://github.com/quantopian/zipline/pull/768"},"issue":{"href":"https://api.github.com/repos/quantopian/zipline/issues/768"},"comments":{"href":"https://api.github.com/repos/quantopian/zipline/issues/768/comments"},"review_comments":{"href":"https://api.github.com/repos/quantopian/zipline/pulls/768/comments"},"review_comment":{"href":"https://api.github.com/repos/quantopian/zipline/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/quantopian/zipline/pulls/768/commits"},"statuses":{"href":"https://api.github.com/repos/quantopian/zipline/statuses/99b1fd8da945972bc83031f7bef28b2065d2f139"}}}}