{"action":"created","comment":{"url":"https://api.github.com/repos/mne-tools/mne-python/pulls/comments/73932919","id":73932919,"diff_hunk":"@@ -0,0 +1,298 @@\n+\"\"\"Classes for transforming, preprocessing, and fitting encoding models.\"\"\"\n+# Authors: Chris Holdgraf <choldgraf@gmail.com>\n+#          Jona Sassenhagen <jona.sassenhagen@gmail.de>\n+#          Jean-Remi King <jeanremi.king@gmail.com>\n+#\n+# License: BSD (3-clause)\n+import numpy as np\n+from scipy import sparse\n+from ..utils import warn\n+\n+\n+class FeatureDelayer(object):\n+    \"\"\"Creates delayed versions of an input stimulus.\n+\n+    Parameters\n+    ----------\n+    delays: array of floats, shape (n_delays,)\n+        The time (in seconds) of each delay for specifying\n+        pre-defined delays. Negative means timepoints in the past,\n+        positive means timepoints in the future.\n+    sfreq: float\n+        The sampling frequency of the series. Defaults to 1.0\n+    \"\"\"\n+    def __init__(self, delays=None, sfreq=1.):\n+        delays, sfreq = _check_delayer_params(\n+            delays, sfreq)\n+        self.delays = delays\n+        self.sfreq = float(sfreq)\n+\n+    def fit(self, X, y=None):\n+        \"\"\"Does nothing, only used for sklearn compatibility.\n+\n+        Parameters\n+        ----------\n+        X : array\n+        y : array\n+\n+        Returns\n+        -------\n+        self\n+        \"\"\"\n+        return self\n+\n+    def transform(self, X=None, y=None):\n+        \"\"\"Create a time-lagged representation of X.\n+\n+        Parameters\n+        ----------\n+        X : array-like, shape (n_times, n_features)\n+            The input data to be time-lagged and returned.\n+\n+        Returns\n+        -------\n+        X_delayed : array, shape (n_times, n_feature * n_delays)\n+            The delayed featuers of X.\n+        \"\"\"\n+        X_delayed, names = delay_timeseries(X, delays=self.delays,\n+                                            sfreq=self.sfreq)\n+        self.delays_ = names\n+        return X_delayed\n+\n+    def fit_transform(self, X, y=None):\n+        \"\"\"Does nothing, only used for sklearn compatibility.\n+\n+        Parameters\n+        ----------\n+        X : array\n+        y : array\n+\n+        Returns\n+        -------\n+        self\n+        \"\"\"\n+        return self.transform(X)\n+\n+\n+class EventsBinarizer(object):\n+    \"\"\"Create a continuous-representation of event onsets.\n+\n+    Parameters\n+    ----------\n+    n_times : int\n+        The total number of times in the output array.\n+    sfreq : float\n+        The sampling frequency used to convert times to sample indices.\n+        Defaults to 1.0\n+    sparse : bool\n+        Whether to output continuous events as a dense array or a sparse\n+        matrix. Defaults to False.\n+    \"\"\"\n+    def __init__(self, n_times, sfreq=1., sparse=False):\n+        self.n_times = n_times\n+        self.sfreq = sfreq\n+        self.feature_type = 'event_id'\n+        self.sparse = sparse\n+\n+    def fit(self, X=None, y=None):\n+        \"\"\"Does nothing, only used for sklearn compatibility.\n+\n+        Parameters\n+        ----------\n+        X : array\n+        y : array\n+\n+        Returns\n+        -------\n+        self\n+        \"\"\"\n+        return self\n+\n+    def transform(self, event_ixs, event_ids=None, event_dict=None,\n+                  covariates=None, covariate_names=None):\n+        \"\"\"Binarize events and return as continuous data.\n+\n+        Parameters\n+        ----------\n+        event_ixs : array, shape (n_events)\n+            The event indices or onsets in seconds. `If self.sfreq == 1`,\n+            then these are assumed to be indices. If `self.sfreq != 1`, these\n+            should be onsets in seconds and will be multiplied by `sfreq`.\n+        event_ids : array-like, shape (n_events) | None\n+            The event ID for each event. If None, all events are assumed to be\n+            of same type.\n+        event_dict : dict\n+            A dictionary of (event_id: event_id_name) pairs. Defines a string\n+            name for each event type.\n+        covariates : array, shape (n_events, n_covariates) | None\n+            Optional covariates (e.g., continuous values) for each event.\n+        covariate_names : array, shape (n_covariates,) | None\n+            Optional covariate names.\n+\n+        Returns\n+        -------\n+        events_continuous : array, shape (n_times, n_unique_events)\n+            A binary array with one column for each unique event type. 1s\n+            in the array correspond to event onsets for that row.\n+        \"\"\"\n+        if event_ixs.ndim > 1:\n+            raise ValueError(\"events must be shape (n_events,),\"\n+                             \" found shape %s\" % str(event_ixs.shape))\n+        event_ids = np.ones_like(event_ixs) if event_ids is None else event_ids\n+        unique_event_types = np.unique(event_ids)\n+        covs, cov_names = _check_covariates(event_ixs, covariates,\n+                                            covariate_names)\n+        n_covs = covs.shape[-1]\n+\n+        # Create names for event types\n+        if event_dict is None:\n+            event_dict = dict(('event_%s' % ii, ii)\n+                              for ii in unique_event_types)\n+        ev_dict_rev = dict((value, key) for key, value in event_dict.items())\n+\n+        # Turn event_ixs from seconds to indices in case sfreq != 1\n+        event_ixs = (event_ixs * self.sfreq).astype(int)\n+\n+        # Iterate through event types and create columns of event onsets.\n+        events_continuous = np.zeros([self.n_times,\n+                                      len(unique_event_types) + n_covs])\n+        event_names = []\n+        for ii, ev_type in enumerate(unique_event_types):\n+            msk_events = event_ids == ev_type\n+            i_ev = event_ixs[msk_events]\n+            events_continuous[i_ev, ii] = 1\n+\n+            # Handle event names\n+            event_names.append(ev_dict_rev[ev_type])\n+        if n_covs > 0:\n+            for iev, icov in zip(event_ixs, covs):\n+                events_continuous[iev, -n_covs:] = icov\n+            event_names = event_names + cov_names\n+            events_continuous = sparse.csr_matrix(events_continuous)\n+\n+        self.names_ = event_names\n+        self.unique_event_types_ = unique_event_types\n+        return events_continuous\n+\n+    def fit_transform(self, event_ixs, event_ids=None, event_dict=None,\n+                      covariates=None, covariate_names=None):\n+        \"\"\"Does nothing, only used for sklearn compatibility.\n+\n+        Parameters\n+        ----------\n+        X : array\n+        y : array\n+\n+        Returns\n+        -------\n+        self\n+        \"\"\"\n+        out = self.transform(\n+            event_ixs, event_ids=event_ids, event_dict=event_dict,\n+            covariates=covariates, covariate_names=covariate_names)\n+        return out\n+\n+\n+def delay_timeseries(ts, delays, sfreq=1.):\n+    \"\"\"Return a time-lagged input timeseries.\n+\n+    Parameters\n+    ----------\n+    ts: array, shape (n_times, n_feats)\n+        The timeseries to delay\n+    delays: array of floats, shape (n_delays) |\n+            list of arrays, len == n_feats\n+        The time (in seconds) of each delay for specifying\n+        pre-defined delays. Negative means timepoints in the past,\n+        positive means timepoints in the future. If a list, then\n+        one may supply a different number of delays per feature.\n+    sfreq: int\n+        The sampling frequency of the series\n+\n+    Returns\n+    -------\n+    delayed: array, shape(n_times, n_feats * n_delays)","path":"mne/encoding/feature.py","position":214,"original_position":214,"commit_id":"45c35dbab0792852a735cdaf42c97144944216f1","original_commit_id":"45c35dbab0792852a735cdaf42c97144944216f1","user":{"login":"choldgraf","id":1839645,"avatar_url":"https://avatars.githubusercontent.com/u/1839645?v=3","gravatar_id":"","url":"https://api.github.com/users/choldgraf","html_url":"https://github.com/choldgraf","followers_url":"https://api.github.com/users/choldgraf/followers","following_url":"https://api.github.com/users/choldgraf/following{/other_user}","gists_url":"https://api.github.com/users/choldgraf/gists{/gist_id}","starred_url":"https://api.github.com/users/choldgraf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/choldgraf/subscriptions","organizations_url":"https://api.github.com/users/choldgraf/orgs","repos_url":"https://api.github.com/users/choldgraf/repos","events_url":"https://api.github.com/users/choldgraf/events{/privacy}","received_events_url":"https://api.github.com/users/choldgraf/received_events","type":"User","site_admin":false},"body":"agree that a vectorizer parameter makes sense though - but I still haven't wrapped my head around the best way to use it given the examples you guys have in the decoding module","created_at":"2016-08-08T18:55:51Z","updated_at":"2016-08-08T18:55:51Z","html_url":"https://github.com/mne-tools/mne-python/pull/3310#discussion_r73932919","pull_request_url":"https://api.github.com/repos/mne-tools/mne-python/pulls/3310","_links":{"self":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/comments/73932919"},"html":{"href":"https://github.com/mne-tools/mne-python/pull/3310#discussion_r73932919"},"pull_request":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/3310"}}},"pull_request":{"url":"https://api.github.com/repos/mne-tools/mne-python/pulls/3310","id":74009397,"html_url":"https://github.com/mne-tools/mne-python/pull/3310","diff_url":"https://github.com/mne-tools/mne-python/pull/3310.diff","patch_url":"https://github.com/mne-tools/mne-python/pull/3310.patch","issue_url":"https://api.github.com/repos/mne-tools/mne-python/issues/3310","number":3310,"state":"open","locked":false,"title":"WIP: sklearn-style encoding / modularizing encoding pipelines","user":{"login":"choldgraf","id":1839645,"avatar_url":"https://avatars.githubusercontent.com/u/1839645?v=3","gravatar_id":"","url":"https://api.github.com/users/choldgraf","html_url":"https://github.com/choldgraf","followers_url":"https://api.github.com/users/choldgraf/followers","following_url":"https://api.github.com/users/choldgraf/following{/other_user}","gists_url":"https://api.github.com/users/choldgraf/gists{/gist_id}","starred_url":"https://api.github.com/users/choldgraf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/choldgraf/subscriptions","organizations_url":"https://api.github.com/users/choldgraf/orgs","repos_url":"https://api.github.com/users/choldgraf/repos","events_url":"https://api.github.com/users/choldgraf/events{/privacy}","received_events_url":"https://api.github.com/users/choldgraf/received_events","type":"User","site_admin":false},"body":"Hey all - this is is a WIP change to port the `linear_regression_raw` code into a more scikit-learn friendly interface. The hope is that this will be more modular and easier to use with cross-validation routines. It also allows support for both continuous and events-based inputs for the regression.\r\n\r\nI haven't changed much of @jona-sassenhagen's code so we can make comparisons, but I can start to do this if the `EncodingModel` class is on the right track. I also wrote a simple example but this should also be improved as well.\r\n\r\nMy hope is that this can be a somewhat incremental PR, and not implement the full preprocessing pipelines / feature extractions / cross validation that people eventually want, so that this doesn't take forever. But agreeing on a general API and making this code function and useful would be a good first step.\r\n\r\n@jona-sassenhagen and @kingjr probably have lots of opinions :)","created_at":"2016-06-16T01:20:58Z","updated_at":"2016-08-08T18:55:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5d1dcc90394facd638b32172a28244d85aa79e72","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/mne-tools/mne-python/pulls/3310/commits","review_comments_url":"https://api.github.com/repos/mne-tools/mne-python/pulls/3310/comments","review_comment_url":"https://api.github.com/repos/mne-tools/mne-python/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mne-tools/mne-python/issues/3310/comments","statuses_url":"https://api.github.com/repos/mne-tools/mne-python/statuses/45c35dbab0792852a735cdaf42c97144944216f1","head":{"label":"choldgraf:continuous_encoding","ref":"continuous_encoding","sha":"45c35dbab0792852a735cdaf42c97144944216f1","user":{"login":"choldgraf","id":1839645,"avatar_url":"https://avatars.githubusercontent.com/u/1839645?v=3","gravatar_id":"","url":"https://api.github.com/users/choldgraf","html_url":"https://github.com/choldgraf","followers_url":"https://api.github.com/users/choldgraf/followers","following_url":"https://api.github.com/users/choldgraf/following{/other_user}","gists_url":"https://api.github.com/users/choldgraf/gists{/gist_id}","starred_url":"https://api.github.com/users/choldgraf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/choldgraf/subscriptions","organizations_url":"https://api.github.com/users/choldgraf/orgs","repos_url":"https://api.github.com/users/choldgraf/repos","events_url":"https://api.github.com/users/choldgraf/events{/privacy}","received_events_url":"https://api.github.com/users/choldgraf/received_events","type":"User","site_admin":false},"repo":{"id":29602471,"name":"mne-python","full_name":"choldgraf/mne-python","owner":{"login":"choldgraf","id":1839645,"avatar_url":"https://avatars.githubusercontent.com/u/1839645?v=3","gravatar_id":"","url":"https://api.github.com/users/choldgraf","html_url":"https://github.com/choldgraf","followers_url":"https://api.github.com/users/choldgraf/followers","following_url":"https://api.github.com/users/choldgraf/following{/other_user}","gists_url":"https://api.github.com/users/choldgraf/gists{/gist_id}","starred_url":"https://api.github.com/users/choldgraf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/choldgraf/subscriptions","organizations_url":"https://api.github.com/users/choldgraf/orgs","repos_url":"https://api.github.com/users/choldgraf/repos","events_url":"https://api.github.com/users/choldgraf/events{/privacy}","received_events_url":"https://api.github.com/users/choldgraf/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/choldgraf/mne-python","description":"MNE : Magnetoencephalography (MEG) and Electroencephalography (EEG) in Python","fork":true,"url":"https://api.github.com/repos/choldgraf/mne-python","forks_url":"https://api.github.com/repos/choldgraf/mne-python/forks","keys_url":"https://api.github.com/repos/choldgraf/mne-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/choldgraf/mne-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/choldgraf/mne-python/teams","hooks_url":"https://api.github.com/repos/choldgraf/mne-python/hooks","issue_events_url":"https://api.github.com/repos/choldgraf/mne-python/issues/events{/number}","events_url":"https://api.github.com/repos/choldgraf/mne-python/events","assignees_url":"https://api.github.com/repos/choldgraf/mne-python/assignees{/user}","branches_url":"https://api.github.com/repos/choldgraf/mne-python/branches{/branch}","tags_url":"https://api.github.com/repos/choldgraf/mne-python/tags","blobs_url":"https://api.github.com/repos/choldgraf/mne-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/choldgraf/mne-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/choldgraf/mne-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/choldgraf/mne-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/choldgraf/mne-python/statuses/{sha}","languages_url":"https://api.github.com/repos/choldgraf/mne-python/languages","stargazers_url":"https://api.github.com/repos/choldgraf/mne-python/stargazers","contributors_url":"https://api.github.com/repos/choldgraf/mne-python/contributors","subscribers_url":"https://api.github.com/repos/choldgraf/mne-python/subscribers","subscription_url":"https://api.github.com/repos/choldgraf/mne-python/subscription","commits_url":"https://api.github.com/repos/choldgraf/mne-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/choldgraf/mne-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/choldgraf/mne-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/choldgraf/mne-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/choldgraf/mne-python/contents/{+path}","compare_url":"https://api.github.com/repos/choldgraf/mne-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/choldgraf/mne-python/merges","archive_url":"https://api.github.com/repos/choldgraf/mne-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/choldgraf/mne-python/downloads","issues_url":"https://api.github.com/repos/choldgraf/mne-python/issues{/number}","pulls_url":"https://api.github.com/repos/choldgraf/mne-python/pulls{/number}","milestones_url":"https://api.github.com/repos/choldgraf/mne-python/milestones{/number}","notifications_url":"https://api.github.com/repos/choldgraf/mne-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/choldgraf/mne-python/labels{/name}","releases_url":"https://api.github.com/repos/choldgraf/mne-python/releases{/id}","deployments_url":"https://api.github.com/repos/choldgraf/mne-python/deployments","created_at":"2015-01-21T17:41:37Z","updated_at":"2016-07-26T20:46:29Z","pushed_at":"2016-08-04T17:16:07Z","git_url":"git://github.com/choldgraf/mne-python.git","ssh_url":"git@github.com:choldgraf/mne-python.git","clone_url":"https://github.com/choldgraf/mne-python.git","svn_url":"https://github.com/choldgraf/mne-python","homepage":"http://martinos.org/mne/","size":87998,"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":"mne-tools:master","ref":"master","sha":"859d2814d9b78c86396de176715457f3d3ef513a","user":{"login":"mne-tools","id":583875,"avatar_url":"https://avatars.githubusercontent.com/u/583875?v=3","gravatar_id":"","url":"https://api.github.com/users/mne-tools","html_url":"https://github.com/mne-tools","followers_url":"https://api.github.com/users/mne-tools/followers","following_url":"https://api.github.com/users/mne-tools/following{/other_user}","gists_url":"https://api.github.com/users/mne-tools/gists{/gist_id}","starred_url":"https://api.github.com/users/mne-tools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mne-tools/subscriptions","organizations_url":"https://api.github.com/users/mne-tools/orgs","repos_url":"https://api.github.com/users/mne-tools/repos","events_url":"https://api.github.com/users/mne-tools/events{/privacy}","received_events_url":"https://api.github.com/users/mne-tools/received_events","type":"Organization","site_admin":false},"repo":{"id":1301584,"name":"mne-python","full_name":"mne-tools/mne-python","owner":{"login":"mne-tools","id":583875,"avatar_url":"https://avatars.githubusercontent.com/u/583875?v=3","gravatar_id":"","url":"https://api.github.com/users/mne-tools","html_url":"https://github.com/mne-tools","followers_url":"https://api.github.com/users/mne-tools/followers","following_url":"https://api.github.com/users/mne-tools/following{/other_user}","gists_url":"https://api.github.com/users/mne-tools/gists{/gist_id}","starred_url":"https://api.github.com/users/mne-tools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mne-tools/subscriptions","organizations_url":"https://api.github.com/users/mne-tools/orgs","repos_url":"https://api.github.com/users/mne-tools/repos","events_url":"https://api.github.com/users/mne-tools/events{/privacy}","received_events_url":"https://api.github.com/users/mne-tools/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mne-tools/mne-python","description":"MNE : Magnetoencephalography (MEG) and Electroencephalography (EEG) in Python","fork":false,"url":"https://api.github.com/repos/mne-tools/mne-python","forks_url":"https://api.github.com/repos/mne-tools/mne-python/forks","keys_url":"https://api.github.com/repos/mne-tools/mne-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mne-tools/mne-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mne-tools/mne-python/teams","hooks_url":"https://api.github.com/repos/mne-tools/mne-python/hooks","issue_events_url":"https://api.github.com/repos/mne-tools/mne-python/issues/events{/number}","events_url":"https://api.github.com/repos/mne-tools/mne-python/events","assignees_url":"https://api.github.com/repos/mne-tools/mne-python/assignees{/user}","branches_url":"https://api.github.com/repos/mne-tools/mne-python/branches{/branch}","tags_url":"https://api.github.com/repos/mne-tools/mne-python/tags","blobs_url":"https://api.github.com/repos/mne-tools/mne-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mne-tools/mne-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mne-tools/mne-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/mne-tools/mne-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mne-tools/mne-python/statuses/{sha}","languages_url":"https://api.github.com/repos/mne-tools/mne-python/languages","stargazers_url":"https://api.github.com/repos/mne-tools/mne-python/stargazers","contributors_url":"https://api.github.com/repos/mne-tools/mne-python/contributors","subscribers_url":"https://api.github.com/repos/mne-tools/mne-python/subscribers","subscription_url":"https://api.github.com/repos/mne-tools/mne-python/subscription","commits_url":"https://api.github.com/repos/mne-tools/mne-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/mne-tools/mne-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/mne-tools/mne-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/mne-tools/mne-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/mne-tools/mne-python/contents/{+path}","compare_url":"https://api.github.com/repos/mne-tools/mne-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mne-tools/mne-python/merges","archive_url":"https://api.github.com/repos/mne-tools/mne-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mne-tools/mne-python/downloads","issues_url":"https://api.github.com/repos/mne-tools/mne-python/issues{/number}","pulls_url":"https://api.github.com/repos/mne-tools/mne-python/pulls{/number}","milestones_url":"https://api.github.com/repos/mne-tools/mne-python/milestones{/number}","notifications_url":"https://api.github.com/repos/mne-tools/mne-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mne-tools/mne-python/labels{/name}","releases_url":"https://api.github.com/repos/mne-tools/mne-python/releases{/id}","deployments_url":"https://api.github.com/repos/mne-tools/mne-python/deployments","created_at":"2011-01-28T03:31:13Z","updated_at":"2016-08-07T18:27:05Z","pushed_at":"2016-08-08T17:34:53Z","git_url":"git://github.com/mne-tools/mne-python.git","ssh_url":"git@github.com:mne-tools/mne-python.git","clone_url":"https://github.com/mne-tools/mne-python.git","svn_url":"https://github.com/mne-tools/mne-python","homepage":"http://martinos.org/mne/","size":180629,"stargazers_count":221,"watchers_count":221,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":208,"mirror_url":null,"open_issues_count":191,"forks":208,"open_issues":191,"watchers":221,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/3310"},"html":{"href":"https://github.com/mne-tools/mne-python/pull/3310"},"issue":{"href":"https://api.github.com/repos/mne-tools/mne-python/issues/3310"},"comments":{"href":"https://api.github.com/repos/mne-tools/mne-python/issues/3310/comments"},"review_comments":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/3310/comments"},"review_comment":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/3310/commits"},"statuses":{"href":"https://api.github.com/repos/mne-tools/mne-python/statuses/45c35dbab0792852a735cdaf42c97144944216f1"}}}}
{"actor":{"display_login":"choldgraf"}}