{"action":"created","comment":{"url":"https://api.github.com/repos/numenta/numenta-apps/pulls/comments/51216646","id":51216646,"diff_hunk":"@@ -0,0 +1,536 @@\n+#!/usr/bin/env python\n+# ----------------------------------------------------------------------\n+# Numenta Platform for Intelligent Computing (NuPIC)\n+# Copyright (C) 2015, Numenta, Inc.  Unless you have purchased from\n+# Numenta, Inc. a separate commercial license for this software code, the\n+# following terms and conditions apply:\n+#\n+# This program is free software: you can redistribute it and/or modify\n+# it under the terms of the GNU Affero Public License version 3 as\n+# published by the Free Software Foundation.\n+#\n+# This program is distributed in the hope that it will be useful,\n+# but WITHOUT ANY WARRANTY; without even the implied warranty of\n+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n+# See the GNU Affero Public License for more details.\n+#\n+# You should have received a copy of the GNU Affero Public License\n+# along with this program.  If not, see http://www.gnu.org/licenses.\n+#\n+# http://numenta.org/licenses/\n+# ----------------------------------------------------------------------\n+\n+\"\"\"\n+Implements param finder, which automatically\n+1. identify appropriate data aggregation window\n+2. suggest whether to use TimeOfDay encoder\n+3. suggest data aggregation type (SUM or AVG)\n+\"\"\"\n+\n+import csv\n+import dateutil.parser\n+import numpy\n+from nupic.frameworks.opf.common_models.cluster_params import (\n+  getScalarMetricWithTimeOfDayAnomalyParams)\n+\n+_modeFromNameDict = {\n+  'v': 0,\n+  's': 1,\n+  'f': 2\n+}\n+\n+\n+\n+def _convolve(a, v, mode='full'):\n+  \"\"\"\n+  Returns the discrete, linear convolution of two one-dimensional sequences.\n+\n+  The convolution operator is often seen in signal processing, where it\n+  models the effect of a linear time-invariant system on a signal [1]_.  In\n+  probability theory, the sum of two independent random variables is\n+  distributed according to the convolution of their individual\n+  distributions.\n+\n+  If `v` is longer than `a`, the arrays are swapped before computation.\n+\n+  Parameters\n+  ----------\n+  :param a : (N,) array_like\n+      First one-dimensional input array.\n+  :param v : (M,) array_like\n+      Second one-dimensional input array.\n+  :param mode : {'full', 'valid', 'same'}, optional\n+      'full':\n+        By default, mode is 'full'.  This returns the convolution\n+        at each point of overlap, with an output shape of (N+M-1,). At\n+        the end-points of the convolution, the signals do not overlap\n+        completely, and boundary effects may be seen.\n+\n+      'same':\n+        Mode `same` returns output of length ``max(M, N)``.  Boundary\n+        effects are still visible.\n+\n+      'valid':\n+        Mode `valid` returns output of length\n+        ``max(M, N) - min(M, N) + 1``.  The convolution product is only given\n+        for points where the signals overlap completely.  Values outside\n+        the signal boundary have no effect.\n+\n+  Returns\n+  -------\n+  :return out : ndarray\n+      Discrete, linear convolution of `a` and `v`.\n+\n+  References\n+  ----------\n+  .. [1] Wikipedia, \"Convolution\", http://en.wikipedia.org/wiki/Convolution.\n+\n+  \"\"\"\n+  a, v = numpy.array(a, ndmin=1), numpy.array(v, ndmin=1)\n+  if len(v) > len(a):\n+    a, v = v, a\n+  if len(a) == 0:\n+    raise ValueError('a cannot be empty')\n+  if len(v) == 0:\n+    raise ValueError('v cannot be empty')\n+  mode = _modeFromName(mode)\n+  return numpy.core.multiarray.correlate(a, v[::-1], mode)\n+\n+\n+\n+def _modeFromName(mode):\n+  if isinstance(mode, basestring):\n+    return _modeFromNameDict[mode.lower()[0]]\n+  return mode\n+\n+\n+\n+def _rickerWavelet(points, a):\n+  \"\"\"\n+  Return a Ricker wavelet, also known as the \"Mexican hat wavelet\".\n+\n+  It models the function:\n+\n+      ``A (1 - x^2/a^2) exp(-t^2/a^2)``,\n+\n+  where ``A = 2/sqrt(3a)pi^1/3``.\n+\n+  Parameters\n+  ----------\n+  :param points : int\n+      Number of points in `vector`.\n+      Will be centered around 0.\n+  :param a : scalar\n+      Width parameter of the wavelet.\n+\n+  Returns\n+  -------\n+  :return vector : (N,) ndarray\n+      Array of length `points` in shape of ricker curve.\n+\n+  \"\"\"\n+  A = 2 / (numpy.sqrt(3 * a) * (numpy.pi ** 0.25))\n+  wsq = a ** 2\n+  vec = numpy.arange(0, points) - (points - 1.0) / 2\n+  tsq = vec ** 2\n+  mod = (1 - tsq / wsq)\n+  gauss = numpy.exp(-tsq / (2 * wsq))\n+  total = A * mod * gauss\n+  return total\n+\n+\n+\n+def _cwt(data, wavelet, widths):\n+  \"\"\"\n+  Continuous wavelet transform.\n+\n+  Performs a continuous wavelet transform on `data`,\n+  using the `wavelet` function. A CWT performs a convolution\n+  with `data` using the `wavelet` function, which is characterized\n+  by a width parameter and length parameter.\n+\n+  Parameters\n+  ----------\n+  :param data : (N,) ndarray\n+      data on which to perform the transform.\n+  :param wavelet : function\n+      Wavelet function, which should take 2 arguments.\n+      The first argument is the number of points that the returned vector\n+      will have (len(wavelet(width,length)) == length).\n+      The second is a width parameter, defining the size of the wavelet\n+      (e.g. standard deviation of a gaussian). See `ricker`, which\n+      satisfies these requirements.\n+  widths : (M,) sequence\n+      Widths to use for transform.\n+\n+  :return Returns\n+  -------\n+  cwt: (M, N) ndarray\n+      Will have shape of (len(data), len(widths)).\n+\n+  \"\"\"\n+  output = numpy.zeros([len(widths), len(data)])\n+  for ind, width in enumerate(widths):\n+    waveletData = wavelet(min(10 * width, len(data)), width)\n+    output[ind, :] = _convolve(data, waveletData,\n+                               mode='same')\n+  return output\n+\n+\n+\n+class paramFinder(object):\n+  def __init__(self,\n+               fileName,\n+               rowOffset=1,\n+               timestampIndex=0,\n+               valueIndex=1):\n+    \"\"\"\n+    :param fileName: str, path to input csv file\n+    :param rowOffset: int, index of first data row in csv\n+    :param timestampIndex: int, column index of the timeStamp\n+    :param valueIndex: int, column index of the value\n+    \"\"\"\n+\n+    self._thresh = 0.2\n+    self._fileName = fileName\n+    self._rowOffset = rowOffset\n+    self._timestampIndex = timestampIndex\n+    self._valueIndex = valueIndex\n+\n+\n+  def run(self):\n+    \"\"\"\n+    Run paramFinder on input csv file\n+\n+    :return: JSON object with the following properties\n+      \"aggInfo\" aggregation information, JSON null if no aggregation is needed\n+        otherwise, a JSON object contains the folowing properties\n+          \"windowSize\": aggregation window size in seconds (integer)\n+          \"func\": A string representation of the aggregation function (string)\n+            the following values are supported: \"sum\", \"mean\"\n+    \"\"\"\n+    (timeStamp, value) = self.readCSVFiles(self._fileName,\n+                                           self._rowOffset,\n+                                           self._timestampIndex,\n+                                           self._valueIndex)\n+    numDataPts = len(value)\n+\n+    (self.medianSamplingInterval,\n+     self.medianAbsoluteDevSamplingInterval) = self.getMedianSamplingInterval(\n+      timeStamp)\n+\n+    (timeStamp, value) = self.resampleData(timeStamp,\n+                                           value,\n+                                           self.medianSamplingInterval)\n+\n+    (self._cwtVar, self._timeScale) = self.calculateContinuousWaveletTransform(\n+      self.medianSamplingInterval, value)\n+\n+    self.suggestedSamplingInterval = self.determineAggregationWindow(\n+      self._timeScale,","path":"unicorn/py/unicorn_backend/param_finder.py","position":230,"original_position":230,"commit_id":"2c801f4a3a848d658724c272350215b0e808a865","original_commit_id":"2c801f4a3a848d658724c272350215b0e808a865","user":{"login":"vitaly-krugl","id":1441066,"avatar_url":"https://avatars.githubusercontent.com/u/1441066?v=3","gravatar_id":"","url":"https://api.github.com/users/vitaly-krugl","html_url":"https://github.com/vitaly-krugl","followers_url":"https://api.github.com/users/vitaly-krugl/followers","following_url":"https://api.github.com/users/vitaly-krugl/following{/other_user}","gists_url":"https://api.github.com/users/vitaly-krugl/gists{/gist_id}","starred_url":"https://api.github.com/users/vitaly-krugl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vitaly-krugl/subscriptions","organizations_url":"https://api.github.com/users/vitaly-krugl/orgs","repos_url":"https://api.github.com/users/vitaly-krugl/repos","events_url":"https://api.github.com/users/vitaly-krugl/events{/privacy}","received_events_url":"https://api.github.com/users/vitaly-krugl/received_events","type":"User","site_admin":false},"body":"When more than 1-2 args, pass then as keyword args. Error-prone and often not readable otherwise.","created_at":"2016-01-29T01:49:14Z","updated_at":"2016-01-29T01:49:14Z","html_url":"https://github.com/numenta/numenta-apps/pull/571#discussion_r51216646","pull_request_url":"https://api.github.com/repos/numenta/numenta-apps/pulls/571","_links":{"self":{"href":"https://api.github.com/repos/numenta/numenta-apps/pulls/comments/51216646"},"html":{"href":"https://github.com/numenta/numenta-apps/pull/571#discussion_r51216646"},"pull_request":{"href":"https://api.github.com/repos/numenta/numenta-apps/pulls/571"}}},"pull_request":{"url":"https://api.github.com/repos/numenta/numenta-apps/pulls/571","id":56966909,"html_url":"https://github.com/numenta/numenta-apps/pull/571","diff_url":"https://github.com/numenta/numenta-apps/pull/571.diff","patch_url":"https://github.com/numenta/numenta-apps/pull/571.patch","issue_url":"https://api.github.com/repos/numenta/numenta-apps/issues/571","number":571,"state":"open","locked":false,"title":"[UNI-299] Implementation of paramFinder and paramFinder runner","user":{"login":"ywcui1990","id":5067931,"avatar_url":"https://avatars.githubusercontent.com/u/5067931?v=3","gravatar_id":"","url":"https://api.github.com/users/ywcui1990","html_url":"https://github.com/ywcui1990","followers_url":"https://api.github.com/users/ywcui1990/followers","following_url":"https://api.github.com/users/ywcui1990/following{/other_user}","gists_url":"https://api.github.com/users/ywcui1990/gists{/gist_id}","starred_url":"https://api.github.com/users/ywcui1990/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ywcui1990/subscriptions","organizations_url":"https://api.github.com/users/ywcui1990/orgs","repos_url":"https://api.github.com/users/ywcui1990/repos","events_url":"https://api.github.com/users/ywcui1990/events{/privacy}","received_events_url":"https://api.github.com/users/ywcui1990/received_events","type":"User","site_admin":false},"body":"@marionleborgne @vitaly-krugl \r\n\r\nA first version of paramFinder class (for future nupic use) and the paramFinder runner (for unicorn)\r\n\r\nI am still working on the tests. But any early feedback on this implementation is appreciated!\r\n","created_at":"2016-01-23T03:36:32Z","updated_at":"2016-01-29T01:49:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c856c791f52d24b9a99804958ca6d8c21257899f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/numenta/numenta-apps/pulls/571/commits","review_comments_url":"https://api.github.com/repos/numenta/numenta-apps/pulls/571/comments","review_comment_url":"https://api.github.com/repos/numenta/numenta-apps/pulls/comments{/number}","comments_url":"https://api.github.com/repos/numenta/numenta-apps/issues/571/comments","statuses_url":"https://api.github.com/repos/numenta/numenta-apps/statuses/2c801f4a3a848d658724c272350215b0e808a865","head":{"label":"ywcui1990:paramFinder","ref":"paramFinder","sha":"2c801f4a3a848d658724c272350215b0e808a865","user":{"login":"ywcui1990","id":5067931,"avatar_url":"https://avatars.githubusercontent.com/u/5067931?v=3","gravatar_id":"","url":"https://api.github.com/users/ywcui1990","html_url":"https://github.com/ywcui1990","followers_url":"https://api.github.com/users/ywcui1990/followers","following_url":"https://api.github.com/users/ywcui1990/following{/other_user}","gists_url":"https://api.github.com/users/ywcui1990/gists{/gist_id}","starred_url":"https://api.github.com/users/ywcui1990/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ywcui1990/subscriptions","organizations_url":"https://api.github.com/users/ywcui1990/orgs","repos_url":"https://api.github.com/users/ywcui1990/repos","events_url":"https://api.github.com/users/ywcui1990/events{/privacy}","received_events_url":"https://api.github.com/users/ywcui1990/received_events","type":"User","site_admin":false},"repo":{"id":43030304,"name":"numenta-apps","full_name":"ywcui1990/numenta-apps","owner":{"login":"ywcui1990","id":5067931,"avatar_url":"https://avatars.githubusercontent.com/u/5067931?v=3","gravatar_id":"","url":"https://api.github.com/users/ywcui1990","html_url":"https://github.com/ywcui1990","followers_url":"https://api.github.com/users/ywcui1990/followers","following_url":"https://api.github.com/users/ywcui1990/following{/other_user}","gists_url":"https://api.github.com/users/ywcui1990/gists{/gist_id}","starred_url":"https://api.github.com/users/ywcui1990/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ywcui1990/subscriptions","organizations_url":"https://api.github.com/users/ywcui1990/orgs","repos_url":"https://api.github.com/users/ywcui1990/repos","events_url":"https://api.github.com/users/ywcui1990/events{/privacy}","received_events_url":"https://api.github.com/users/ywcui1990/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ywcui1990/numenta-apps","description":"HTM based applications and support libraries. Includes Grok for IT Analytics and Grok for Stocks (code name \"Taurus\").","fork":true,"url":"https://api.github.com/repos/ywcui1990/numenta-apps","forks_url":"https://api.github.com/repos/ywcui1990/numenta-apps/forks","keys_url":"https://api.github.com/repos/ywcui1990/numenta-apps/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ywcui1990/numenta-apps/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ywcui1990/numenta-apps/teams","hooks_url":"https://api.github.com/repos/ywcui1990/numenta-apps/hooks","issue_events_url":"https://api.github.com/repos/ywcui1990/numenta-apps/issues/events{/number}","events_url":"https://api.github.com/repos/ywcui1990/numenta-apps/events","assignees_url":"https://api.github.com/repos/ywcui1990/numenta-apps/assignees{/user}","branches_url":"https://api.github.com/repos/ywcui1990/numenta-apps/branches{/branch}","tags_url":"https://api.github.com/repos/ywcui1990/numenta-apps/tags","blobs_url":"https://api.github.com/repos/ywcui1990/numenta-apps/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ywcui1990/numenta-apps/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ywcui1990/numenta-apps/git/refs{/sha}","trees_url":"https://api.github.com/repos/ywcui1990/numenta-apps/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ywcui1990/numenta-apps/statuses/{sha}","languages_url":"https://api.github.com/repos/ywcui1990/numenta-apps/languages","stargazers_url":"https://api.github.com/repos/ywcui1990/numenta-apps/stargazers","contributors_url":"https://api.github.com/repos/ywcui1990/numenta-apps/contributors","subscribers_url":"https://api.github.com/repos/ywcui1990/numenta-apps/subscribers","subscription_url":"https://api.github.com/repos/ywcui1990/numenta-apps/subscription","commits_url":"https://api.github.com/repos/ywcui1990/numenta-apps/commits{/sha}","git_commits_url":"https://api.github.com/repos/ywcui1990/numenta-apps/git/commits{/sha}","comments_url":"https://api.github.com/repos/ywcui1990/numenta-apps/comments{/number}","issue_comment_url":"https://api.github.com/repos/ywcui1990/numenta-apps/issues/comments{/number}","contents_url":"https://api.github.com/repos/ywcui1990/numenta-apps/contents/{+path}","compare_url":"https://api.github.com/repos/ywcui1990/numenta-apps/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ywcui1990/numenta-apps/merges","archive_url":"https://api.github.com/repos/ywcui1990/numenta-apps/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ywcui1990/numenta-apps/downloads","issues_url":"https://api.github.com/repos/ywcui1990/numenta-apps/issues{/number}","pulls_url":"https://api.github.com/repos/ywcui1990/numenta-apps/pulls{/number}","milestones_url":"https://api.github.com/repos/ywcui1990/numenta-apps/milestones{/number}","notifications_url":"https://api.github.com/repos/ywcui1990/numenta-apps/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ywcui1990/numenta-apps/labels{/name}","releases_url":"https://api.github.com/repos/ywcui1990/numenta-apps/releases{/id}","deployments_url":"https://api.github.com/repos/ywcui1990/numenta-apps/deployments","created_at":"2015-09-23T22:18:46Z","updated_at":"2016-01-19T23:24:57Z","pushed_at":"2016-01-23T03:32:06Z","git_url":"git://github.com/ywcui1990/numenta-apps.git","ssh_url":"git@github.com:ywcui1990/numenta-apps.git","clone_url":"https://github.com/ywcui1990/numenta-apps.git","svn_url":"https://github.com/ywcui1990/numenta-apps","homepage":"http://numenta.com","size":52898,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"numenta:master","ref":"master","sha":"87bdafa9f4e7da8185f9714c32062f832ebe3358","user":{"login":"numenta","id":1039191,"avatar_url":"https://avatars.githubusercontent.com/u/1039191?v=3","gravatar_id":"","url":"https://api.github.com/users/numenta","html_url":"https://github.com/numenta","followers_url":"https://api.github.com/users/numenta/followers","following_url":"https://api.github.com/users/numenta/following{/other_user}","gists_url":"https://api.github.com/users/numenta/gists{/gist_id}","starred_url":"https://api.github.com/users/numenta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/numenta/subscriptions","organizations_url":"https://api.github.com/users/numenta/orgs","repos_url":"https://api.github.com/users/numenta/repos","events_url":"https://api.github.com/users/numenta/events{/privacy}","received_events_url":"https://api.github.com/users/numenta/received_events","type":"Organization","site_admin":false},"repo":{"id":36754402,"name":"numenta-apps","full_name":"numenta/numenta-apps","owner":{"login":"numenta","id":1039191,"avatar_url":"https://avatars.githubusercontent.com/u/1039191?v=3","gravatar_id":"","url":"https://api.github.com/users/numenta","html_url":"https://github.com/numenta","followers_url":"https://api.github.com/users/numenta/followers","following_url":"https://api.github.com/users/numenta/following{/other_user}","gists_url":"https://api.github.com/users/numenta/gists{/gist_id}","starred_url":"https://api.github.com/users/numenta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/numenta/subscriptions","organizations_url":"https://api.github.com/users/numenta/orgs","repos_url":"https://api.github.com/users/numenta/repos","events_url":"https://api.github.com/users/numenta/events{/privacy}","received_events_url":"https://api.github.com/users/numenta/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/numenta/numenta-apps","description":"HTM based applications and support libraries. Includes Grok for IT Analytics and Grok for Stocks (code name \"Taurus\").","fork":false,"url":"https://api.github.com/repos/numenta/numenta-apps","forks_url":"https://api.github.com/repos/numenta/numenta-apps/forks","keys_url":"https://api.github.com/repos/numenta/numenta-apps/keys{/key_id}","collaborators_url":"https://api.github.com/repos/numenta/numenta-apps/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/numenta/numenta-apps/teams","hooks_url":"https://api.github.com/repos/numenta/numenta-apps/hooks","issue_events_url":"https://api.github.com/repos/numenta/numenta-apps/issues/events{/number}","events_url":"https://api.github.com/repos/numenta/numenta-apps/events","assignees_url":"https://api.github.com/repos/numenta/numenta-apps/assignees{/user}","branches_url":"https://api.github.com/repos/numenta/numenta-apps/branches{/branch}","tags_url":"https://api.github.com/repos/numenta/numenta-apps/tags","blobs_url":"https://api.github.com/repos/numenta/numenta-apps/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/numenta/numenta-apps/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/numenta/numenta-apps/git/refs{/sha}","trees_url":"https://api.github.com/repos/numenta/numenta-apps/git/trees{/sha}","statuses_url":"https://api.github.com/repos/numenta/numenta-apps/statuses/{sha}","languages_url":"https://api.github.com/repos/numenta/numenta-apps/languages","stargazers_url":"https://api.github.com/repos/numenta/numenta-apps/stargazers","contributors_url":"https://api.github.com/repos/numenta/numenta-apps/contributors","subscribers_url":"https://api.github.com/repos/numenta/numenta-apps/subscribers","subscription_url":"https://api.github.com/repos/numenta/numenta-apps/subscription","commits_url":"https://api.github.com/repos/numenta/numenta-apps/commits{/sha}","git_commits_url":"https://api.github.com/repos/numenta/numenta-apps/git/commits{/sha}","comments_url":"https://api.github.com/repos/numenta/numenta-apps/comments{/number}","issue_comment_url":"https://api.github.com/repos/numenta/numenta-apps/issues/comments{/number}","contents_url":"https://api.github.com/repos/numenta/numenta-apps/contents/{+path}","compare_url":"https://api.github.com/repos/numenta/numenta-apps/compare/{base}...{head}","merges_url":"https://api.github.com/repos/numenta/numenta-apps/merges","archive_url":"https://api.github.com/repos/numenta/numenta-apps/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/numenta/numenta-apps/downloads","issues_url":"https://api.github.com/repos/numenta/numenta-apps/issues{/number}","pulls_url":"https://api.github.com/repos/numenta/numenta-apps/pulls{/number}","milestones_url":"https://api.github.com/repos/numenta/numenta-apps/milestones{/number}","notifications_url":"https://api.github.com/repos/numenta/numenta-apps/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/numenta/numenta-apps/labels{/name}","releases_url":"https://api.github.com/repos/numenta/numenta-apps/releases{/id}","deployments_url":"https://api.github.com/repos/numenta/numenta-apps/deployments","created_at":"2015-06-02T18:49:30Z","updated_at":"2016-01-25T19:18:20Z","pushed_at":"2016-01-29T00:50:04Z","git_url":"git://github.com/numenta/numenta-apps.git","ssh_url":"git@github.com:numenta/numenta-apps.git","clone_url":"https://github.com/numenta/numenta-apps.git","svn_url":"https://github.com/numenta/numenta-apps","homepage":"http://numenta.com","size":53342,"stargazers_count":83,"watchers_count":83,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":50,"mirror_url":null,"open_issues_count":5,"forks":50,"open_issues":5,"watchers":83,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/numenta/numenta-apps/pulls/571"},"html":{"href":"https://github.com/numenta/numenta-apps/pull/571"},"issue":{"href":"https://api.github.com/repos/numenta/numenta-apps/issues/571"},"comments":{"href":"https://api.github.com/repos/numenta/numenta-apps/issues/571/comments"},"review_comments":{"href":"https://api.github.com/repos/numenta/numenta-apps/pulls/571/comments"},"review_comment":{"href":"https://api.github.com/repos/numenta/numenta-apps/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/numenta/numenta-apps/pulls/571/commits"},"statuses":{"href":"https://api.github.com/repos/numenta/numenta-apps/statuses/2c801f4a3a848d658724c272350215b0e808a865"}}}}