{"action":"created","comment":{"url":"https://api.github.com/repos/Featuretools/featuretools/pulls/comments/197892285","pull_request_review_id":131724794,"id":197892285,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5Nzg5MjI4NQ==","diff_hunk":"@@ -1,68 +1,219 @@\n+import math\n import os\n+import re\n from builtins import str\n \n+import boto3\n import pandas as pd\n+from botocore.handlers import disable_signing\n+from tqdm import tqdm\n \n import featuretools as ft\n+import featuretools.variable_types as vtypes\n from featuretools.config import config as ft_config\n \n \n-def load_flight(entity_id='flight_dataset', nrows=None, force=False):\n-    '''\n-    Returns the flight dataset. Publishes the dataset if it has not been\n-    published before. This function requires Dask, which is not a requirement\n-    of Featuretools.\n-\n-    Args:\n-        entity_id (str):  Id of retail dataset on scheduler.\n-    '''\n-    try:\n-        import dask.dataframe as dd\n-    except:\n-        raise ImportError('Dask is a requirement of load_flight. Please make sure you have the latest version installed.')\n-\n-    demo_save_path = make_flight_pathname(nrows)\n-\n-    es = ft.EntitySet(entity_id)\n-    csv_s3 = \"s3://featuretools-static/raw_flight_data/raw_csv_data/data_*.csv\"\n-\n-    if not os.path.isfile(demo_save_path) or force:\n-        df = dd.read_csv(csv_s3,\n-                         parse_dates=[\"FL_DATE\"],\n-                         blocksize=None,\n-                         low_memory=False,\n-                         storage_options={'anon': True})\n-        if nrows:\n-            df = df.head(n=nrows, npartitions=-1, compute=False)\n-        df = df.compute()\n-        df.to_csv(demo_save_path, index=False)\n-\n-    df = pd.read_csv(demo_save_path,\n-                     nrows=nrows,\n-                     parse_dates=[\"FL_DATE\"])\n-\n-    df.drop(\"Unnamed: 27\", axis=1, inplace=True)\n-    df = df.reset_index(drop=True)\n-    df['trip_id'] = df.index.values\n-\n-    es.entity_from_dataframe(\"trips\",\n-                             index='trip_id',\n-                             dataframe=df,\n-                             time_index='FL_DATE')\n-\n-    es.combine_variables(\"trips\", \"flight_id\", [\n-                         \"UNIQUE_CARRIER\", \"TAIL_NUM\", \"FL_NUM\"])\n-\n-    es.normalize_entity(base_entity_id=\"trips\",\n-                        new_entity_id=\"flights\",\n-                        index=\"flight_id\",\n-                        additional_variables=[\"UNIQUE_CARRIER\", \"TAIL_NUM\", \"FL_NUM\", \"ORIGIN_AIRPORT_ID\",\n-                                              \"ORIGIN_CITY_MARKET_ID\", \"DEST_AIRPORT_ID\", \"DEST_CITY_MARKET_ID\"],\n-                        make_time_index=True)\n-    es.add_last_time_indexes()\n+def load_flight(month_filter=None,\n+                categorical_filter=None,\n+                nrows=None,\n+                use_cache=True,\n+                demo=True,\n+                return_single_table=False,\n+                verbose=False):\n+    \"\"\" Download, clean, and filter flight data from 2017.\n+        Input:\n+            month_filter (list[int]): Only use data from these months (example is [1, 2]).\n+                To skip, set to None.\n+            categorical_filter (dict[str->str]): Use only specified categorical values.\n+                Example is {'dest_city': ['Boston, MA'], 'origin_city': ['Boston, MA']}\n+                which returns all flights in OR out of Boston. To skip, set to None.\n+            nrows (int): Passed to nrows in pd.read_csv. Used before filtering.\n+            use_cache (bool): Use previously downloaded csv if possible.\n+            demo (bool): Use only two months of data. If False, use the whole year.\n+            return_single_table (bool): Exit the function early and return a dataframe.\n+            verbose (bool): Show a progress bar while loading the data.\n+    \"\"\"\n+    demo_save_path, key, csv_length = make_flight_pathname(demo=demo)\n+\n+    if not use_cache or not os.path.isfile(demo_save_path):\n+        print('Downloading data from s3...')\n+        bucket_name = 'featuretools-static'\n+        key = key\n+\n+        s3 = boto3.resource('s3')\n+        s3.meta.client.meta.events.register('choose-signer.s3.*', disable_signing)\n+        s3.Bucket(bucket_name).download_file(key, demo_save_path)\n+\n+    chunksize = math.ceil(csv_length / 99)\n+    pd.options.display.max_columns = 200\n+    iter_csv = pd.read_csv(demo_save_path,\n+                           iterator=True,\n+                           nrows=nrows,\n+                           chunksize=chunksize)\n+    if verbose:\n+        iter_csv = tqdm(iter_csv, total=100)\n+\n+    partial_df_list = []\n+    for chunk in iter_csv:\n+        df = filter_data(_clean_data(chunk),\n+                         month_filter=month_filter,\n+                         categorical_filter=categorical_filter)\n+        partial_df_list.append(df)\n+    data = pd.concat(partial_df_list)\n+\n+    if return_single_table:\n+        return data\n+\n+    print('Making EntitySet...')\n+    es = make_es(data)\n+\n     return es\n \n \n-def make_flight_pathname(nrows):\n-    file_name = 'raw_flight_data_' + str(nrows) + '.csv'\n-    return os.path.join(ft_config['csv_save_location'], file_name)\n+def make_es(data):\n+    es = ft.EntitySet('Flight Data')\n+    labely_columns = ['arr_delay', 'dep_delay', 'carrier_delay', 'weather_delay',\n+                      'national_airspace_delay', 'security_delay',\n+                      'late_aircraft_delay', 'cancelled', 'diverted',\n+                      'taxi_in', 'taxi_out', 'air_time']\n+\n+    variable_types = {'flight_num': vtypes.Categorical,\n+                      'distance_group': vtypes.Ordinal,\n+                      'cancelled': vtypes.Boolean,\n+                      'diverted': vtypes.Boolean}\n+\n+    es.entity_from_dataframe('trip_logs',\n+                             data,\n+                             index='trip_log_id',\n+                             make_index=True,\n+                             time_index='time_index',\n+                             secondary_time_index={'arr_time': labely_columns},\n+                             variable_types=variable_types)\n+\n+    es.normalize_entity('trip_logs', 'flights', 'flight_id',\n+                        additional_variables=['origin', 'origin_city', 'origin_state',\n+                                              'dest', 'dest_city', 'dest_state',\n+                                              'distance_group', 'carrier', 'flight_num'])\n+\n+    es.normalize_entity('flights', 'airlines', 'carrier',\n+                        make_time_index=False)\n+\n+    es.normalize_entity('flights', 'airports', 'dest',\n+                        additional_variables=['dest_city', 'dest_state'],\n+                        make_time_index=False)\n+    return es\n+\n+\n+def _clean_data(data):\n+\n+    # Make column names snake case\n+    clean_data = data.rename(\n+        columns={col: convert(col) for col in data})\n+\n+    # Chance crs -> \"scheduled\" and other minor clarifications\n+    clean_data = clean_data.rename(columns={'crs_arr_time': 'scheduled_arr_time',\n+                                            'crs_dep_time': 'scheduled_dep_time',\n+                                            'crs_elapsed_time': 'scheduled_elapsed_time',\n+                                            'nas_delay': 'national_airspace_delay',\n+                                            'origin_city_name': 'origin_city',\n+                                            'dest_city_name': 'dest_city'})\n+\n+    # Combine strings like 0130 (1:30 AM) with dates (2017-01-01)\n+    clean_data['scheduled_dep_time'] = clean_data['scheduled_dep_time'].apply(lambda x: str(x)) + clean_data['flight_date'].astype(str)\n+\n+    # Parse combined string as a date\n+    clean_data.loc[:, 'scheduled_dep_time'] = pd.to_datetime(\n+        clean_data['scheduled_dep_time'], format='%H%M%Y-%m-%d', errors='coerce')\n+\n+    clean_data['scheduled_elapsed_time'] = pd.to_timedelta(clean_data['scheduled_elapsed_time'], unit='m')\n+\n+    clean_data = _reconstruct_times(clean_data)\n+\n+    # Create a time index 6 months before scheduled_dep\n+    clean_data.loc[:, 'time_index'] = clean_data['scheduled_dep_time'] - \\\n+        pd.Timedelta('120d')\n+\n+    # A null entry for a delay means no delay\n+    clean_data = _fill_labels(clean_data)\n+\n+    # Nulls for scheduled values are too problematic. Remove them.\n+    clean_data = clean_data.dropna(\n+        axis='rows', subset=['scheduled_dep_time', 'scheduled_arr_time'])\n+\n+    # Make a flight id. Define a flight as a combination of:\n+    # 1. carrier 2. flight number 3. origin airport 4. dest airport\n+    clean_data.loc[:, 'flight_id'] = clean_data['carrier'] + '-' + \\\n+        clean_data['flight_num'].apply(lambda x: str(x)) + ':' + clean_data['origin'] + '->' + clean_data['dest']\n+\n+    return clean_data\n+\n+\n+def _fill_labels(clean_data):\n+    labely_columns = ['arr_delay', 'dep_delay', 'carrier_delay', 'weather_delay',\n+                      'national_airspace_delay', 'security_delay',\n+                      'late_aircraft_delay', 'cancelled', 'diverted',\n+                      'taxi_in', 'taxi_out', 'air_time']\n+    for col in labely_columns:\n+        clean_data.loc[:, col] = clean_data[col].fillna(0)\n+\n+    return clean_data\n+\n+\n+def _reconstruct_times(clean_data):\n+    \"\"\" Reconstruct departure_time, scheduled_dep_time,\n+        arrival_time and scheduled_arr_time by adding known delays\n+        to known times. We do:\n+            - dep_time is scheduled_dep + dep_delay\n+            - arr_time is dep_time + taxiing and air_time\n+            - scheduled arrival is scheduled_dep + scheduled_elapsed\n+    \"\"\"\n+    clean_data.loc[:, 'dep_time'] = clean_data['scheduled_dep_time'] + \\\n+        pd.to_timedelta(clean_data['dep_delay'], unit='m')\n+\n+    clean_data.loc[:, 'arr_time'] = clean_data['dep_time'] + \\\n+        pd.to_timedelta(clean_data['taxi_out'] +\n+                        clean_data['air_time'] +\n+                        clean_data['taxi_in'], unit='m')\n+\n+    clean_data.loc[:, 'scheduled_arr_time'] = clean_data['scheduled_dep_time'] + \\\n+        clean_data['scheduled_elapsed_time']\n+    return clean_data\n+\n+\n+def filter_data(clean_data,\n+                month_filter=None,\n+                categorical_filter=None):\n+    if month_filter is not None:\n+        tmp = False\n+        for month in month_filter:\n+            tmp = tmp | (clean_data['scheduled_dep_time'].apply(lambda x: x.month) == month)\n+        clean_data = clean_data[tmp]\n+\n+    if categorical_filter is not None:\n+        tmp = False\n+        for key, values in categorical_filter.items():\n+            tmp = tmp | clean_data[key].isin(values)\n+        clean_data = clean_data[tmp]\n+\n+    return clean_data\n+\n+\n+def convert(name):\n+    # Rename columns to underscore\n+    # Code via SO https://stackoverflow.com/questions/1175208/elegant-python-function-to-convert-camelcase-to-snake-case\n+    s1 = re.sub('(.)([A-Z][a-z]+)', r'\\1_\\2', name)\n+    return re.sub('([a-z0-9])([A-Z])', r'\\1_\\2', s1).lower()\n+\n+\n+def make_flight_pathname(demo=True):\n+    if demo:\n+        filename = 'flight_dataset_sample.csv.zip'\n+        key = 'bots_flight_data_2017/data_2017_jan_feb.csv.zip'\n+        rows = 860457.0","path":"featuretools/demo/flight.py","position":268,"original_position":268,"commit_id":"0060558e090288b899a3963ba76f9cec733b4a1b","original_commit_id":"0060558e090288b899a3963ba76f9cec733b4a1b","user":{"login":"Seth-Rothschild","id":27442755,"node_id":"MDQ6VXNlcjI3NDQyNzU1","avatar_url":"https://avatars2.githubusercontent.com/u/27442755?v=4","gravatar_id":"","url":"https://api.github.com/users/Seth-Rothschild","html_url":"https://github.com/Seth-Rothschild","followers_url":"https://api.github.com/users/Seth-Rothschild/followers","following_url":"https://api.github.com/users/Seth-Rothschild/following{/other_user}","gists_url":"https://api.github.com/users/Seth-Rothschild/gists{/gist_id}","starred_url":"https://api.github.com/users/Seth-Rothschild/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Seth-Rothschild/subscriptions","organizations_url":"https://api.github.com/users/Seth-Rothschild/orgs","repos_url":"https://api.github.com/users/Seth-Rothschild/repos","events_url":"https://api.github.com/users/Seth-Rothschild/events{/privacy}","received_events_url":"https://api.github.com/users/Seth-Rothschild/received_events","type":"User","site_admin":false},"body":"We do `rows/ 99` earlier. Not sure if the cleanest solution is to do this, `99.` or `float(rows)` when we divide.","created_at":"2018-06-25T18:14:16Z","updated_at":"2018-06-25T18:14:16Z","html_url":"https://github.com/Featuretools/featuretools/pull/175#discussion_r197892285","pull_request_url":"https://api.github.com/repos/Featuretools/featuretools/pulls/175","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/Featuretools/featuretools/pulls/comments/197892285"},"html":{"href":"https://github.com/Featuretools/featuretools/pull/175#discussion_r197892285"},"pull_request":{"href":"https://api.github.com/repos/Featuretools/featuretools/pulls/175"}},"in_reply_to_id":197888652},"pull_request":{"url":"https://api.github.com/repos/Featuretools/featuretools/pulls/175","id":197184782,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk3MTg0Nzgy","html_url":"https://github.com/Featuretools/featuretools/pull/175","diff_url":"https://github.com/Featuretools/featuretools/pull/175.diff","patch_url":"https://github.com/Featuretools/featuretools/pull/175.patch","issue_url":"https://api.github.com/repos/Featuretools/featuretools/issues/175","number":175,"state":"open","locked":false,"title":"Update flight","user":{"login":"Seth-Rothschild","id":27442755,"node_id":"MDQ6VXNlcjI3NDQyNzU1","avatar_url":"https://avatars2.githubusercontent.com/u/27442755?v=4","gravatar_id":"","url":"https://api.github.com/users/Seth-Rothschild","html_url":"https://github.com/Seth-Rothschild","followers_url":"https://api.github.com/users/Seth-Rothschild/followers","following_url":"https://api.github.com/users/Seth-Rothschild/following{/other_user}","gists_url":"https://api.github.com/users/Seth-Rothschild/gists{/gist_id}","starred_url":"https://api.github.com/users/Seth-Rothschild/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Seth-Rothschild/subscriptions","organizations_url":"https://api.github.com/users/Seth-Rothschild/orgs","repos_url":"https://api.github.com/users/Seth-Rothschild/repos","events_url":"https://api.github.com/users/Seth-Rothschild/events{/privacy}","received_events_url":"https://api.github.com/users/Seth-Rothschild/received_events","type":"User","site_admin":false},"body":"Rework the `load_flight` data to use newly uploaded csvs from 2017. New functionality:\r\n1. Can take in a `month_filter` to restrict which months are used (e.g. [3, 5] to use March and May)\r\n2. Can take in a `categorical_filter` to restrict which categorical values are loaded. As an example  `{'dest_city': ['Boston, MA'], 'origin_city': ['Washington, DC']}` will take all flights into Boston and all flights out of Washington DC). \r\n3. An optional `verbose` argument which gives a progress bar while loading the data.","created_at":"2018-06-25T17:33:51Z","updated_at":"2018-06-25T18:14:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"daa41b05d3a472d3e31841ee20b5524684af6849","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Featuretools/featuretools/pulls/175/commits","review_comments_url":"https://api.github.com/repos/Featuretools/featuretools/pulls/175/comments","review_comment_url":"https://api.github.com/repos/Featuretools/featuretools/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Featuretools/featuretools/issues/175/comments","statuses_url":"https://api.github.com/repos/Featuretools/featuretools/statuses/0060558e090288b899a3963ba76f9cec733b4a1b","head":{"label":"Featuretools:update-flight","ref":"update-flight","sha":"0060558e090288b899a3963ba76f9cec733b4a1b","user":{"login":"Featuretools","id":31513623,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNTEzNjIz","avatar_url":"https://avatars1.githubusercontent.com/u/31513623?v=4","gravatar_id":"","url":"https://api.github.com/users/Featuretools","html_url":"https://github.com/Featuretools","followers_url":"https://api.github.com/users/Featuretools/followers","following_url":"https://api.github.com/users/Featuretools/following{/other_user}","gists_url":"https://api.github.com/users/Featuretools/gists{/gist_id}","starred_url":"https://api.github.com/users/Featuretools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Featuretools/subscriptions","organizations_url":"https://api.github.com/users/Featuretools/orgs","repos_url":"https://api.github.com/users/Featuretools/repos","events_url":"https://api.github.com/users/Featuretools/events{/privacy}","received_events_url":"https://api.github.com/users/Featuretools/received_events","type":"Organization","site_admin":false},"repo":{"id":102908804,"node_id":"MDEwOlJlcG9zaXRvcnkxMDI5MDg4MDQ=","name":"featuretools","full_name":"Featuretools/featuretools","owner":{"login":"Featuretools","id":31513623,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNTEzNjIz","avatar_url":"https://avatars1.githubusercontent.com/u/31513623?v=4","gravatar_id":"","url":"https://api.github.com/users/Featuretools","html_url":"https://github.com/Featuretools","followers_url":"https://api.github.com/users/Featuretools/followers","following_url":"https://api.github.com/users/Featuretools/following{/other_user}","gists_url":"https://api.github.com/users/Featuretools/gists{/gist_id}","starred_url":"https://api.github.com/users/Featuretools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Featuretools/subscriptions","organizations_url":"https://api.github.com/users/Featuretools/orgs","repos_url":"https://api.github.com/users/Featuretools/repos","events_url":"https://api.github.com/users/Featuretools/events{/privacy}","received_events_url":"https://api.github.com/users/Featuretools/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Featuretools/featuretools","description":"automated feature engineering","fork":false,"url":"https://api.github.com/repos/Featuretools/featuretools","forks_url":"https://api.github.com/repos/Featuretools/featuretools/forks","keys_url":"https://api.github.com/repos/Featuretools/featuretools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Featuretools/featuretools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Featuretools/featuretools/teams","hooks_url":"https://api.github.com/repos/Featuretools/featuretools/hooks","issue_events_url":"https://api.github.com/repos/Featuretools/featuretools/issues/events{/number}","events_url":"https://api.github.com/repos/Featuretools/featuretools/events","assignees_url":"https://api.github.com/repos/Featuretools/featuretools/assignees{/user}","branches_url":"https://api.github.com/repos/Featuretools/featuretools/branches{/branch}","tags_url":"https://api.github.com/repos/Featuretools/featuretools/tags","blobs_url":"https://api.github.com/repos/Featuretools/featuretools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Featuretools/featuretools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Featuretools/featuretools/git/refs{/sha}","trees_url":"https://api.github.com/repos/Featuretools/featuretools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Featuretools/featuretools/statuses/{sha}","languages_url":"https://api.github.com/repos/Featuretools/featuretools/languages","stargazers_url":"https://api.github.com/repos/Featuretools/featuretools/stargazers","contributors_url":"https://api.github.com/repos/Featuretools/featuretools/contributors","subscribers_url":"https://api.github.com/repos/Featuretools/featuretools/subscribers","subscription_url":"https://api.github.com/repos/Featuretools/featuretools/subscription","commits_url":"https://api.github.com/repos/Featuretools/featuretools/commits{/sha}","git_commits_url":"https://api.github.com/repos/Featuretools/featuretools/git/commits{/sha}","comments_url":"https://api.github.com/repos/Featuretools/featuretools/comments{/number}","issue_comment_url":"https://api.github.com/repos/Featuretools/featuretools/issues/comments{/number}","contents_url":"https://api.github.com/repos/Featuretools/featuretools/contents/{+path}","compare_url":"https://api.github.com/repos/Featuretools/featuretools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Featuretools/featuretools/merges","archive_url":"https://api.github.com/repos/Featuretools/featuretools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Featuretools/featuretools/downloads","issues_url":"https://api.github.com/repos/Featuretools/featuretools/issues{/number}","pulls_url":"https://api.github.com/repos/Featuretools/featuretools/pulls{/number}","milestones_url":"https://api.github.com/repos/Featuretools/featuretools/milestones{/number}","notifications_url":"https://api.github.com/repos/Featuretools/featuretools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Featuretools/featuretools/labels{/name}","releases_url":"https://api.github.com/repos/Featuretools/featuretools/releases{/id}","deployments_url":"https://api.github.com/repos/Featuretools/featuretools/deployments","created_at":"2017-09-08T22:15:17Z","updated_at":"2018-06-25T17:53:00Z","pushed_at":"2018-06-25T18:12:27Z","git_url":"git://github.com/Featuretools/featuretools.git","ssh_url":"git@github.com:Featuretools/featuretools.git","clone_url":"https://github.com/Featuretools/featuretools.git","svn_url":"https://github.com/Featuretools/featuretools","homepage":"https://www.featuretools.com","size":1676,"stargazers_count":1494,"watchers_count":1494,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":159,"mirror_url":null,"archived":false,"open_issues_count":21,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":159,"open_issues":21,"watchers":1494,"default_branch":"master"}},"base":{"label":"Featuretools:master","ref":"master","sha":"b2aead53aded423988223e1bbfc7fd65e81ae995","user":{"login":"Featuretools","id":31513623,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNTEzNjIz","avatar_url":"https://avatars1.githubusercontent.com/u/31513623?v=4","gravatar_id":"","url":"https://api.github.com/users/Featuretools","html_url":"https://github.com/Featuretools","followers_url":"https://api.github.com/users/Featuretools/followers","following_url":"https://api.github.com/users/Featuretools/following{/other_user}","gists_url":"https://api.github.com/users/Featuretools/gists{/gist_id}","starred_url":"https://api.github.com/users/Featuretools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Featuretools/subscriptions","organizations_url":"https://api.github.com/users/Featuretools/orgs","repos_url":"https://api.github.com/users/Featuretools/repos","events_url":"https://api.github.com/users/Featuretools/events{/privacy}","received_events_url":"https://api.github.com/users/Featuretools/received_events","type":"Organization","site_admin":false},"repo":{"id":102908804,"node_id":"MDEwOlJlcG9zaXRvcnkxMDI5MDg4MDQ=","name":"featuretools","full_name":"Featuretools/featuretools","owner":{"login":"Featuretools","id":31513623,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNTEzNjIz","avatar_url":"https://avatars1.githubusercontent.com/u/31513623?v=4","gravatar_id":"","url":"https://api.github.com/users/Featuretools","html_url":"https://github.com/Featuretools","followers_url":"https://api.github.com/users/Featuretools/followers","following_url":"https://api.github.com/users/Featuretools/following{/other_user}","gists_url":"https://api.github.com/users/Featuretools/gists{/gist_id}","starred_url":"https://api.github.com/users/Featuretools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Featuretools/subscriptions","organizations_url":"https://api.github.com/users/Featuretools/orgs","repos_url":"https://api.github.com/users/Featuretools/repos","events_url":"https://api.github.com/users/Featuretools/events{/privacy}","received_events_url":"https://api.github.com/users/Featuretools/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Featuretools/featuretools","description":"automated feature engineering","fork":false,"url":"https://api.github.com/repos/Featuretools/featuretools","forks_url":"https://api.github.com/repos/Featuretools/featuretools/forks","keys_url":"https://api.github.com/repos/Featuretools/featuretools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Featuretools/featuretools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Featuretools/featuretools/teams","hooks_url":"https://api.github.com/repos/Featuretools/featuretools/hooks","issue_events_url":"https://api.github.com/repos/Featuretools/featuretools/issues/events{/number}","events_url":"https://api.github.com/repos/Featuretools/featuretools/events","assignees_url":"https://api.github.com/repos/Featuretools/featuretools/assignees{/user}","branches_url":"https://api.github.com/repos/Featuretools/featuretools/branches{/branch}","tags_url":"https://api.github.com/repos/Featuretools/featuretools/tags","blobs_url":"https://api.github.com/repos/Featuretools/featuretools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Featuretools/featuretools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Featuretools/featuretools/git/refs{/sha}","trees_url":"https://api.github.com/repos/Featuretools/featuretools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Featuretools/featuretools/statuses/{sha}","languages_url":"https://api.github.com/repos/Featuretools/featuretools/languages","stargazers_url":"https://api.github.com/repos/Featuretools/featuretools/stargazers","contributors_url":"https://api.github.com/repos/Featuretools/featuretools/contributors","subscribers_url":"https://api.github.com/repos/Featuretools/featuretools/subscribers","subscription_url":"https://api.github.com/repos/Featuretools/featuretools/subscription","commits_url":"https://api.github.com/repos/Featuretools/featuretools/commits{/sha}","git_commits_url":"https://api.github.com/repos/Featuretools/featuretools/git/commits{/sha}","comments_url":"https://api.github.com/repos/Featuretools/featuretools/comments{/number}","issue_comment_url":"https://api.github.com/repos/Featuretools/featuretools/issues/comments{/number}","contents_url":"https://api.github.com/repos/Featuretools/featuretools/contents/{+path}","compare_url":"https://api.github.com/repos/Featuretools/featuretools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Featuretools/featuretools/merges","archive_url":"https://api.github.com/repos/Featuretools/featuretools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Featuretools/featuretools/downloads","issues_url":"https://api.github.com/repos/Featuretools/featuretools/issues{/number}","pulls_url":"https://api.github.com/repos/Featuretools/featuretools/pulls{/number}","milestones_url":"https://api.github.com/repos/Featuretools/featuretools/milestones{/number}","notifications_url":"https://api.github.com/repos/Featuretools/featuretools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Featuretools/featuretools/labels{/name}","releases_url":"https://api.github.com/repos/Featuretools/featuretools/releases{/id}","deployments_url":"https://api.github.com/repos/Featuretools/featuretools/deployments","created_at":"2017-09-08T22:15:17Z","updated_at":"2018-06-25T17:53:00Z","pushed_at":"2018-06-25T18:12:27Z","git_url":"git://github.com/Featuretools/featuretools.git","ssh_url":"git@github.com:Featuretools/featuretools.git","clone_url":"https://github.com/Featuretools/featuretools.git","svn_url":"https://github.com/Featuretools/featuretools","homepage":"https://www.featuretools.com","size":1676,"stargazers_count":1494,"watchers_count":1494,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":159,"mirror_url":null,"archived":false,"open_issues_count":21,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":159,"open_issues":21,"watchers":1494,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Featuretools/featuretools/pulls/175"},"html":{"href":"https://github.com/Featuretools/featuretools/pull/175"},"issue":{"href":"https://api.github.com/repos/Featuretools/featuretools/issues/175"},"comments":{"href":"https://api.github.com/repos/Featuretools/featuretools/issues/175/comments"},"review_comments":{"href":"https://api.github.com/repos/Featuretools/featuretools/pulls/175/comments"},"review_comment":{"href":"https://api.github.com/repos/Featuretools/featuretools/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Featuretools/featuretools/pulls/175/commits"},"statuses":{"href":"https://api.github.com/repos/Featuretools/featuretools/statuses/0060558e090288b899a3963ba76f9cec733b4a1b"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"Seth-Rothschild"}}