{"action":"created","comment":{"url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/comments/204709784","pull_request_review_id":139834654,"id":204709784,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNDcwOTc4NA==","diff_hunk":"@@ -0,0 +1,415 @@\n+import json\n+import os\n+from os.path import join, exists\n+from warnings import warn\n+\n+try:\n+    # Python 3+\n+    from urllib.request import urlopen\n+except ImportError:\n+    # Python 2\n+    from urllib2 import urlopen\n+\n+\n+import numpy as np\n+\n+from sklearn.externals import arff\n+from .base import get_data_home\n+from ..externals.six import string_types, PY2\n+from ..externals.six.moves.urllib.error import HTTPError\n+from ..utils import Bunch, Memory\n+\n+__all__ = ['fetch_openml']\n+\n+\n+_SEARCH_NAME = \"https://openml.org/api/v1/json/data/list/data_name/{}/limit/1\"\n+_DATA_INFO = \"https://openml.org/api/v1/json/data/{}\"\n+_DATA_FEATURES = \"https://openml.org/api/v1/json/data/features/{}\"\n+_DATA_FILE = \"https://openml.org/data/v1/download/{}\"\n+\n+\n+def _get_json_content_from_openml_api(url, error_message, raise_if_error):\n+    \"\"\"\n+    Loads json data from the openml api\n+\n+    Parameters\n+    ----------\n+    url : str\n+        The URL to load from. Should be an official OpenML endpoint\n+\n+    error_message : str or None\n+        The error message to raise if an acceptable OpenML error is thrown\n+        (acceptable error is, e.g., data id not found. Other errors, like 404's\n+        will throw the native error message)\n+\n+    raise_if_error : bool\n+        Whether to raise an error if OpenML returns an acceptable error (e.g.,\n+        date not found). If this argument is set to False, a None is returned\n+        in case of acceptable errors. Note that all other errors (e.g., 404)\n+        will still be raised as normal.\n+\n+    Returns\n+    -------\n+    json_data : json or None\n+        the json result from the OpenML server if the call was successful;\n+        None otherwise iff raise_if_error was set to False and the error was\n+        ``acceptable``\n+    \"\"\"\n+    data_found = True\n+    try:\n+        response = urlopen(url)\n+    except HTTPError as error:\n+        # 412 is an OpenML specific error code, indicating a generic error\n+        # (e.g., data not found)\n+        if error.code == 412:\n+            data_found = False\n+        else:\n+            raise error\n+    if not data_found:\n+        # not in except for nicer traceback\n+        if raise_if_error:\n+            raise ValueError(error_message)\n+        else:\n+            return None\n+    json_data = json.loads(response.read().decode(\"utf-8\"))\n+    response.close()\n+    return json_data\n+\n+\n+def _convert_arff_data(arff_data):\n+    \"\"\"\n+    converts the arff object into the appropriate matrix type (now: np.ndarray,\n+    later also: scipy.sparse.csr_matrix) based on the 'data part' (i.e., in the\n+    liac-arff dict, the object from the 'data' key)\n+\n+    Parameters\n+    ----------\n+    arff_data : list or dict\n+        as obtained from liac-arff object\n+\n+    Returns\n+    -------\n+    X : np.array\n+        (or later also: scipy.sparse.csr_matrix)\n+    \"\"\"\n+    if isinstance(arff_data, list):\n+        X = np.array(arff_data, dtype=object)\n+    # elif: extendable for sparse arff in future ()\n+    else:\n+        # This should never happen\n+        raise ValueError('Unexpected Data Type obtained from arff.')\n+    return X\n+\n+\n+def _get_data_info_by_name(name, version):\n+    \"\"\"\n+    Utilizes the openml dataset listing api to find a dataset by\n+    name/version\n+    OpenML api function:\n+    https://www.openml.org/api_docs#!/data/get_data_list_data_name_data_name\n+\n+    Parameters\n+    ----------\n+    name : str\n+        name of the dataset\n+\n+    version : int or str\n+        If version is an integer, the exact name/version will be obtained from\n+        OpenML. If version is a string (value: \"active\") it will take the first\n+        version from OpenML that is annotated as active. Any other string\n+        values except \"active\" are treated as integer.\n+\n+    Returns\n+    -------\n+    json_data['data']['dataset'][0]: json\n+        json representation of the first dataset object that adhired to the\n+        search criteria\n+\n+    \"\"\"\n+    if version == \"active\":\n+        # situation in which we return the oldest active version\n+        url = _SEARCH_NAME.format(name) + \"/status/active/\"\n+        error_msg = \"No active dataset {} found.\".format(name)\n+        json_data = _get_json_content_from_openml_api(url, error_msg, True)\n+        return json_data['data']['dataset'][0]\n+\n+    # an integer version has been provided\n+    url = (_SEARCH_NAME + \"/data_version/{}\").format(name, version)\n+    json_data = _get_json_content_from_openml_api(url, None, False)\n+    if json_data is None:\n+        # we can do this in 1 function call if OpenML does not require the\n+        # specification of the dataset status (i.e., return datasets with a\n+        # given name / version regardless of active, deactivated, etc. )\n+        # TODO: feature request OpenML.\n+        url += \"/status/deactivated\"\n+        error_msg = \"Dataset {} with version {} not found.\".format(name,\n+                                                                   version)\n+        json_data = _get_json_content_from_openml_api(url, error_msg, True)\n+\n+    return json_data['data']['dataset'][0]\n+\n+\n+def _get_data_description_by_id(data_id):\n+    # OpenML API function: https://www.openml.org/api_docs#!/data/get_data_id\n+    url = _DATA_INFO.format(data_id)\n+    error_message = \"Dataset with id {} not found.\".format(data_id)\n+    json_data = _get_json_content_from_openml_api(url, error_message, True)\n+    return json_data['data_set_description']\n+\n+\n+def _get_data_features(data_id):\n+    # OpenML function:\n+    # https://www.openml.org/api_docs#!/data/get_data_features_id\n+    url = _DATA_FEATURES.format(data_id)\n+    error_message = \"Dataset with id {} not found.\".format(data_id)\n+    json_data = _get_json_content_from_openml_api(url, error_message, True)\n+    return json_data['data_features']['feature']\n+\n+\n+def _download_data_arff(file_id):\n+    # Accesses an ARFF file on the OpenML server. Documentation:\n+    # https://www.openml.org/api_data_docs#!/data/get_download_id\n+    url = _DATA_FILE.format(file_id)\n+    response = urlopen(url)\n+    if PY2:\n+        # Because Python2.7 numpy can't handle unicode\n+        arff_file = arff.loads(response.read())\n+    else:\n+        arff_file = arff.loads(response.read().decode('utf-8'))\n+\n+    response.close()\n+    return arff_file\n+\n+\n+def _determine_default_target(features_list):\n+    # determines the default target based on the data feature results\n+    # (which is currently more reliable than the data description;\n+    # see issue: https://github.com/openml/OpenML/issues/768)\n+    results = []\n+    for feature in features_list:\n+        # note: string comparison (not boolean)\n+        if feature['is_target'] == \"true\":\n+            results.append(feature['name'])\n+\n+    if len(results) == 0:\n+        return None\n+    elif len(results) == 1:\n+        return results[0]\n+    else:\n+        return results\n+\n+\n+def _determine_single_target_data_type(features_dict, target_column_name):\n+    # determine the data type of the y array in case there is a single target\n+    if not isinstance(target_column_name, string_types):\n+        raise ValueError('target_column_name should be of string type, '\n+                         'got: %s' % type(target_column_name))\n+    if target_column_name not in features_dict:\n+        raise KeyError('Could not find target_column_name={}')\n+    feature = features_dict[target_column_name]\n+    # note: we compare to a string, not boolean\n+    if feature['is_ignore'] == 'true':\n+        warn('target_column_name={} has flag is_ignore.'.format(\n+            target_column_name))\n+    if feature['is_row_identifier'] == 'true':\n+        warn('target_column_name={} has flag is_row_identifier.'.format(\n+            target_column_name))\n+\n+    if feature['data_type'] == \"numeric\":\n+        return np.float64\n+    else:\n+        return object\n+\n+\n+def _determine_multi_target_data_type(features_dict, target_column_names):\n+    # determine the data type of the y array in case there are multiple targets\n+    # (throws an error if these targets do not comply with sklearn support)\n+    if not isinstance(target_column_names, list):\n+        raise ValueError('target_column_name should be list, '\n+                         'got: %s' % type(target_column_names))\n+    found_types = set()\n+    for target_column_name in target_column_names:\n+        if target_column_name not in features_dict:\n+            raise KeyError('Could not find target_column_name={}')\n+        if features_dict[target_column_name]['data_type'] == \"numeric\":\n+            found_types.add(np.float64)\n+        else:\n+            found_types.add(object)\n+\n+        # note: we compare to a string, not boolean\n+        if features_dict[target_column_name]['is_ignore'] == 'true':\n+            warn('target_column_name={} has flag is_ignore.'.format(\n+                target_column_name))\n+        if features_dict[target_column_name]['is_row_identifier'] == 'true':\n+            warn('target_column_name={} has flag is_row_identifier.'.format(\n+                target_column_name))\n+    if len(found_types) != 1:\n+        raise ValueError('Can only handle homogeneous multi-target datasets, '\n+                         'i.e., all targets are either numeric or '\n+                         'categorical.')\n+    return list(found_types)[0]\n+\n+\n+def fetch_openml(name=None, version='active', data_id=None, data_home=None,\n+                 target_column_name='default-target', cache=True):\n+    \"\"\"Fetch dataset from openml by name or dataset id.\n+\n+    Datasets are uniquely identified by either an integer ID or by a\n+    combination of name and version (i.e. there might be multiple\n+    versions of the 'iris' dataset). Please give either name or id\n+    (not both). In case a name is given, a version can also be\n+    provided.\n+\n+    Parameters\n+    ----------\n+    name : str or None\n+        String identifier of the dataset. Note that OpenML can have multiple\n+        datasets with the same name.\n+\n+    version : integer or 'active', default='active'\n+        Version of the dataset. Can only be provided if also ``name`` is given.\n+        If 'active' the oldest version that's still active is used.\n+\n+    data_id : int or None\n+        OpenML ID of the dataset. The most specific way of retrieving a\n+        dataset. If data_id is not given, name (and potential version) are\n+        used to obtain a dataset.\n+\n+    data_home : string or None, default None\n+        Specify another download and cache folder for the data sets. By default\n+        all scikit-learn data is stored in '~/scikit_learn_data' subfolders.\n+\n+    target_column_name : string, list or None, default 'default-target'\n+        Specify the column name in the data to use as target. If\n+        'default-target', the standard target column a stored on the server\n+        is used. If ``None``, all columns are returned as data and the\n+        target is ``None``. If list (of strings), all columns with these names\n+        are returned as multi-target (Note: not all scikit-learn classifiers\n+        can handle all types of multi-output combinations)\n+\n+    cache : boolean, default=True\n+        Whether to cache downloaded datasets using joblib.\n+\n+    Returns\n+    -------\n+\n+    data : Bunch\n+        Dictionary-like object, the interesting attributes are:\n+        'data', the data to learn, 'target', the regression target or\n+        classification labels, 'DESCR', the full description of the dataset,\n+        'feature_names', the original names of the dataset columns, and\n+        'details' which provide more information on the openml meta-data.\n+    \"\"\"\n+    data_home = get_data_home(data_home=data_home)\n+    data_home = join(data_home, 'openml')\n+    if cache:\n+        mem = Memory(join(data_home, 'cache'), verbose=0).cache\n+    else:\n+        def mem(func):\n+            return func\n+    cached_get_data_info_by_name = mem(_get_data_info_by_name)","path":"sklearn/datasets/openml.py","position":310,"original_position":310,"commit_id":"e6fe403410638b5bd265d4ef032fb6116e72d6ee","original_commit_id":"e6fe403410638b5bd265d4ef032fb6116e72d6ee","user":{"login":"jnothman","id":78827,"node_id":"MDQ6VXNlcjc4ODI3","avatar_url":"https://avatars2.githubusercontent.com/u/78827?v=4","gravatar_id":"","url":"https://api.github.com/users/jnothman","html_url":"https://github.com/jnothman","followers_url":"https://api.github.com/users/jnothman/followers","following_url":"https://api.github.com/users/jnothman/following{/other_user}","gists_url":"https://api.github.com/users/jnothman/gists{/gist_id}","starred_url":"https://api.github.com/users/jnothman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jnothman/subscriptions","organizations_url":"https://api.github.com/users/jnothman/orgs","repos_url":"https://api.github.com/users/jnothman/repos","events_url":"https://api.github.com/users/jnothman/events{/privacy}","received_events_url":"https://api.github.com/users/jnothman/received_events","type":"User","site_admin":false},"body":"Can we avoid cache invalidation in the case that any of these functions or their line in the file changes?? Is there a way to make the impact of changing this file have the least impact on the most problematic cache invalidation?\r\n\r\nI suggested use of joblib.Memory here, but it also means that datasets can't be shared across virtual environments, unless I'm much mistaken, again because the function being defined in a different file is enough to invalidate the cache.\r\n\r\nWe might, therefore, need a custom storage implementation, using `joblib.dump` but not `joblib.Memory`.","created_at":"2018-07-24T10:51:58Z","updated_at":"2018-07-24T10:57:56Z","html_url":"https://github.com/scikit-learn/scikit-learn/pull/11419#discussion_r204709784","pull_request_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/11419","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/comments/204709784"},"html":{"href":"https://github.com/scikit-learn/scikit-learn/pull/11419#discussion_r204709784"},"pull_request":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/11419"}}},"pull_request":{"url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/11419","id":199093093,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk5MDkzMDkz","html_url":"https://github.com/scikit-learn/scikit-learn/pull/11419","diff_url":"https://github.com/scikit-learn/scikit-learn/pull/11419.diff","patch_url":"https://github.com/scikit-learn/scikit-learn/pull/11419.patch","issue_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/11419","number":11419,"state":"open","locked":false,"title":"[MRG] Openml data loader","user":{"login":"janvanrijn","id":2292730,"node_id":"MDQ6VXNlcjIyOTI3MzA=","avatar_url":"https://avatars1.githubusercontent.com/u/2292730?v=4","gravatar_id":"","url":"https://api.github.com/users/janvanrijn","html_url":"https://github.com/janvanrijn","followers_url":"https://api.github.com/users/janvanrijn/followers","following_url":"https://api.github.com/users/janvanrijn/following{/other_user}","gists_url":"https://api.github.com/users/janvanrijn/gists{/gist_id}","starred_url":"https://api.github.com/users/janvanrijn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janvanrijn/subscriptions","organizations_url":"https://api.github.com/users/janvanrijn/orgs","repos_url":"https://api.github.com/users/janvanrijn/repos","events_url":"https://api.github.com/users/janvanrijn/events{/privacy}","received_events_url":"https://api.github.com/users/janvanrijn/received_events","type":"User","site_admin":false},"body":"<!--\r\nThanks for contributing a pull request! Please ensure you have taken a look at\r\nthe contribution guidelines: https://github.com/scikit-learn/scikit-learn/blob/master/CONTRIBUTING.md#pull-request-checklist\r\n-->\r\n\r\n#### Reference Issues/PRs\r\n<!--\r\nExample: Fixes #1234. See also #3456.\r\nPlease use keywords (e.g., Fixes) to create link to the issues or pull requests\r\nyou resolved, so that they will automatically be closed when your pull request\r\nis merged. See https://github.com/blog/1506-closing-issues-via-pull-requests\r\n-->\r\nFixes #9543 Fixes #9908\r\nThis is the work I performed on issue #9543,\r\nbuilding upon the work that @amueller wants to merge in #9908\r\n\r\n#### What does this implement/fix? Explain your changes.\r\nAdds an OpenMl data loader\r\n\r\n#### Any other comments?\r\nBuilds upon the work of @amueller. the latest version of liac-arff package is packed in externals and the unit tests are more extensive. \r\n\r\n<!--\r\nPlease be aware that we are a loose team of volunteers so patience is\r\nnecessary; assistance handling other issues is very welcome. We value\r\nall user contributions, no matter how minor they are. If we are slow to\r\nreview, either the pull request needs some benchmarking, tinkering,\r\nconvincing, etc. or more likely the reviewers are simply busy. In either\r\ncase, we ask for your understanding during the review process.\r\nFor more information, see our FAQ on this topic:\r\nhttp://scikit-learn.org/dev/faq.html#why-is-my-pull-request-not-getting-any-attention.\r\n\r\nThanks for contributing!\r\n-->\r\n","created_at":"2018-07-03T21:57:42Z","updated_at":"2018-07-24T10:57:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ccc76f2c6028df61ba6f2fa15eb3026d8184b593","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":273400470,"node_id":"MDU6TGFiZWwyNzM0MDA0NzA=","url":"https://api.github.com/repos/scikit-learn/scikit-learn/labels/Blocker","name":"Blocker","color":"e11d21","default":false}],"milestone":{"url":"https://api.github.com/repos/scikit-learn/scikit-learn/milestones/24","html_url":"https://github.com/scikit-learn/scikit-learn/milestone/24","labels_url":"https://api.github.com/repos/scikit-learn/scikit-learn/milestones/24/labels","id":2577444,"node_id":"MDk6TWlsZXN0b25lMjU3NzQ0NA==","number":24,"title":"0.20","description":"","creator":{"login":"jnothman","id":78827,"node_id":"MDQ6VXNlcjc4ODI3","avatar_url":"https://avatars2.githubusercontent.com/u/78827?v=4","gravatar_id":"","url":"https://api.github.com/users/jnothman","html_url":"https://github.com/jnothman","followers_url":"https://api.github.com/users/jnothman/followers","following_url":"https://api.github.com/users/jnothman/following{/other_user}","gists_url":"https://api.github.com/users/jnothman/gists{/gist_id}","starred_url":"https://api.github.com/users/jnothman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jnothman/subscriptions","organizations_url":"https://api.github.com/users/jnothman/orgs","repos_url":"https://api.github.com/users/jnothman/repos","events_url":"https://api.github.com/users/jnothman/events{/privacy}","received_events_url":"https://api.github.com/users/jnothman/received_events","type":"User","site_admin":false},"open_issues":20,"closed_issues":120,"state":"open","created_at":"2017-06-12T11:07:06Z","updated_at":"2018-07-24T09:09:47Z","due_on":"2018-07-31T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/11419/commits","review_comments_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/11419/comments","review_comment_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/11419/comments","statuses_url":"https://api.github.com/repos/scikit-learn/scikit-learn/statuses/e6fe403410638b5bd265d4ef032fb6116e72d6ee","head":{"label":"janvanrijn:master","ref":"master","sha":"e6fe403410638b5bd265d4ef032fb6116e72d6ee","user":{"login":"janvanrijn","id":2292730,"node_id":"MDQ6VXNlcjIyOTI3MzA=","avatar_url":"https://avatars1.githubusercontent.com/u/2292730?v=4","gravatar_id":"","url":"https://api.github.com/users/janvanrijn","html_url":"https://github.com/janvanrijn","followers_url":"https://api.github.com/users/janvanrijn/followers","following_url":"https://api.github.com/users/janvanrijn/following{/other_user}","gists_url":"https://api.github.com/users/janvanrijn/gists{/gist_id}","starred_url":"https://api.github.com/users/janvanrijn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janvanrijn/subscriptions","organizations_url":"https://api.github.com/users/janvanrijn/orgs","repos_url":"https://api.github.com/users/janvanrijn/repos","events_url":"https://api.github.com/users/janvanrijn/events{/privacy}","received_events_url":"https://api.github.com/users/janvanrijn/received_events","type":"User","site_admin":false},"repo":{"id":139430132,"node_id":"MDEwOlJlcG9zaXRvcnkxMzk0MzAxMzI=","name":"scikit-learn","full_name":"janvanrijn/scikit-learn","owner":{"login":"janvanrijn","id":2292730,"node_id":"MDQ6VXNlcjIyOTI3MzA=","avatar_url":"https://avatars1.githubusercontent.com/u/2292730?v=4","gravatar_id":"","url":"https://api.github.com/users/janvanrijn","html_url":"https://github.com/janvanrijn","followers_url":"https://api.github.com/users/janvanrijn/followers","following_url":"https://api.github.com/users/janvanrijn/following{/other_user}","gists_url":"https://api.github.com/users/janvanrijn/gists{/gist_id}","starred_url":"https://api.github.com/users/janvanrijn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janvanrijn/subscriptions","organizations_url":"https://api.github.com/users/janvanrijn/orgs","repos_url":"https://api.github.com/users/janvanrijn/repos","events_url":"https://api.github.com/users/janvanrijn/events{/privacy}","received_events_url":"https://api.github.com/users/janvanrijn/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/janvanrijn/scikit-learn","description":"scikit-learn: machine learning in Python","fork":true,"url":"https://api.github.com/repos/janvanrijn/scikit-learn","forks_url":"https://api.github.com/repos/janvanrijn/scikit-learn/forks","keys_url":"https://api.github.com/repos/janvanrijn/scikit-learn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/janvanrijn/scikit-learn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/janvanrijn/scikit-learn/teams","hooks_url":"https://api.github.com/repos/janvanrijn/scikit-learn/hooks","issue_events_url":"https://api.github.com/repos/janvanrijn/scikit-learn/issues/events{/number}","events_url":"https://api.github.com/repos/janvanrijn/scikit-learn/events","assignees_url":"https://api.github.com/repos/janvanrijn/scikit-learn/assignees{/user}","branches_url":"https://api.github.com/repos/janvanrijn/scikit-learn/branches{/branch}","tags_url":"https://api.github.com/repos/janvanrijn/scikit-learn/tags","blobs_url":"https://api.github.com/repos/janvanrijn/scikit-learn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/janvanrijn/scikit-learn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/janvanrijn/scikit-learn/git/refs{/sha}","trees_url":"https://api.github.com/repos/janvanrijn/scikit-learn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/janvanrijn/scikit-learn/statuses/{sha}","languages_url":"https://api.github.com/repos/janvanrijn/scikit-learn/languages","stargazers_url":"https://api.github.com/repos/janvanrijn/scikit-learn/stargazers","contributors_url":"https://api.github.com/repos/janvanrijn/scikit-learn/contributors","subscribers_url":"https://api.github.com/repos/janvanrijn/scikit-learn/subscribers","subscription_url":"https://api.github.com/repos/janvanrijn/scikit-learn/subscription","commits_url":"https://api.github.com/repos/janvanrijn/scikit-learn/commits{/sha}","git_commits_url":"https://api.github.com/repos/janvanrijn/scikit-learn/git/commits{/sha}","comments_url":"https://api.github.com/repos/janvanrijn/scikit-learn/comments{/number}","issue_comment_url":"https://api.github.com/repos/janvanrijn/scikit-learn/issues/comments{/number}","contents_url":"https://api.github.com/repos/janvanrijn/scikit-learn/contents/{+path}","compare_url":"https://api.github.com/repos/janvanrijn/scikit-learn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/janvanrijn/scikit-learn/merges","archive_url":"https://api.github.com/repos/janvanrijn/scikit-learn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/janvanrijn/scikit-learn/downloads","issues_url":"https://api.github.com/repos/janvanrijn/scikit-learn/issues{/number}","pulls_url":"https://api.github.com/repos/janvanrijn/scikit-learn/pulls{/number}","milestones_url":"https://api.github.com/repos/janvanrijn/scikit-learn/milestones{/number}","notifications_url":"https://api.github.com/repos/janvanrijn/scikit-learn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/janvanrijn/scikit-learn/labels{/name}","releases_url":"https://api.github.com/repos/janvanrijn/scikit-learn/releases{/id}","deployments_url":"https://api.github.com/repos/janvanrijn/scikit-learn/deployments","created_at":"2018-07-02T10:47:41Z","updated_at":"2018-07-23T17:02:43Z","pushed_at":"2018-07-23T21:07:09Z","git_url":"git://github.com/janvanrijn/scikit-learn.git","ssh_url":"git@github.com:janvanrijn/scikit-learn.git","clone_url":"https://github.com/janvanrijn/scikit-learn.git","svn_url":"https://github.com/janvanrijn/scikit-learn","homepage":"http://scikit-learn.org","size":91595,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"scikit-learn:master","ref":"master","sha":"da138c5f78e5a4bab0f5a8eea2591e0f25474db0","user":{"login":"scikit-learn","id":365630,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM2NTYzMA==","avatar_url":"https://avatars2.githubusercontent.com/u/365630?v=4","gravatar_id":"","url":"https://api.github.com/users/scikit-learn","html_url":"https://github.com/scikit-learn","followers_url":"https://api.github.com/users/scikit-learn/followers","following_url":"https://api.github.com/users/scikit-learn/following{/other_user}","gists_url":"https://api.github.com/users/scikit-learn/gists{/gist_id}","starred_url":"https://api.github.com/users/scikit-learn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scikit-learn/subscriptions","organizations_url":"https://api.github.com/users/scikit-learn/orgs","repos_url":"https://api.github.com/users/scikit-learn/repos","events_url":"https://api.github.com/users/scikit-learn/events{/privacy}","received_events_url":"https://api.github.com/users/scikit-learn/received_events","type":"Organization","site_admin":false},"repo":{"id":843222,"node_id":"MDEwOlJlcG9zaXRvcnk4NDMyMjI=","name":"scikit-learn","full_name":"scikit-learn/scikit-learn","owner":{"login":"scikit-learn","id":365630,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM2NTYzMA==","avatar_url":"https://avatars2.githubusercontent.com/u/365630?v=4","gravatar_id":"","url":"https://api.github.com/users/scikit-learn","html_url":"https://github.com/scikit-learn","followers_url":"https://api.github.com/users/scikit-learn/followers","following_url":"https://api.github.com/users/scikit-learn/following{/other_user}","gists_url":"https://api.github.com/users/scikit-learn/gists{/gist_id}","starred_url":"https://api.github.com/users/scikit-learn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scikit-learn/subscriptions","organizations_url":"https://api.github.com/users/scikit-learn/orgs","repos_url":"https://api.github.com/users/scikit-learn/repos","events_url":"https://api.github.com/users/scikit-learn/events{/privacy}","received_events_url":"https://api.github.com/users/scikit-learn/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/scikit-learn/scikit-learn","description":"scikit-learn: machine learning in Python","fork":false,"url":"https://api.github.com/repos/scikit-learn/scikit-learn","forks_url":"https://api.github.com/repos/scikit-learn/scikit-learn/forks","keys_url":"https://api.github.com/repos/scikit-learn/scikit-learn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scikit-learn/scikit-learn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scikit-learn/scikit-learn/teams","hooks_url":"https://api.github.com/repos/scikit-learn/scikit-learn/hooks","issue_events_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/events{/number}","events_url":"https://api.github.com/repos/scikit-learn/scikit-learn/events","assignees_url":"https://api.github.com/repos/scikit-learn/scikit-learn/assignees{/user}","branches_url":"https://api.github.com/repos/scikit-learn/scikit-learn/branches{/branch}","tags_url":"https://api.github.com/repos/scikit-learn/scikit-learn/tags","blobs_url":"https://api.github.com/repos/scikit-learn/scikit-learn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scikit-learn/scikit-learn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scikit-learn/scikit-learn/git/refs{/sha}","trees_url":"https://api.github.com/repos/scikit-learn/scikit-learn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scikit-learn/scikit-learn/statuses/{sha}","languages_url":"https://api.github.com/repos/scikit-learn/scikit-learn/languages","stargazers_url":"https://api.github.com/repos/scikit-learn/scikit-learn/stargazers","contributors_url":"https://api.github.com/repos/scikit-learn/scikit-learn/contributors","subscribers_url":"https://api.github.com/repos/scikit-learn/scikit-learn/subscribers","subscription_url":"https://api.github.com/repos/scikit-learn/scikit-learn/subscription","commits_url":"https://api.github.com/repos/scikit-learn/scikit-learn/commits{/sha}","git_commits_url":"https://api.github.com/repos/scikit-learn/scikit-learn/git/commits{/sha}","comments_url":"https://api.github.com/repos/scikit-learn/scikit-learn/comments{/number}","issue_comment_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/comments{/number}","contents_url":"https://api.github.com/repos/scikit-learn/scikit-learn/contents/{+path}","compare_url":"https://api.github.com/repos/scikit-learn/scikit-learn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scikit-learn/scikit-learn/merges","archive_url":"https://api.github.com/repos/scikit-learn/scikit-learn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scikit-learn/scikit-learn/downloads","issues_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues{/number}","pulls_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls{/number}","milestones_url":"https://api.github.com/repos/scikit-learn/scikit-learn/milestones{/number}","notifications_url":"https://api.github.com/repos/scikit-learn/scikit-learn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scikit-learn/scikit-learn/labels{/name}","releases_url":"https://api.github.com/repos/scikit-learn/scikit-learn/releases{/id}","deployments_url":"https://api.github.com/repos/scikit-learn/scikit-learn/deployments","created_at":"2010-08-17T09:43:38Z","updated_at":"2018-07-24T10:29:15Z","pushed_at":"2018-07-24T09:28:11Z","git_url":"git://github.com/scikit-learn/scikit-learn.git","ssh_url":"git@github.com:scikit-learn/scikit-learn.git","clone_url":"https://github.com/scikit-learn/scikit-learn.git","svn_url":"https://github.com/scikit-learn/scikit-learn","homepage":"http://scikit-learn.org","size":92450,"stargazers_count":29482,"watchers_count":29482,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":14641,"mirror_url":null,"archived":false,"open_issues_count":1654,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":14641,"open_issues":1654,"watchers":29482,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/11419"},"html":{"href":"https://github.com/scikit-learn/scikit-learn/pull/11419"},"issue":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/11419"},"comments":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/11419/comments"},"review_comments":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/11419/comments"},"review_comment":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/11419/commits"},"statuses":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/statuses/e6fe403410638b5bd265d4ef032fb6116e72d6ee"}},"author_association":"NONE"}}
{"actor":{"display_login":"jnothman"}}