{"action":"created","comment":{"url":"https://api.github.com/repos/ironmussa/Optimus/pulls/comments/224979509","pull_request_review_id":164484757,"id":224979509,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNDk3OTUwOQ==","diff_hunk":"@@ -0,0 +1,652 @@\n+# -*- coding: utf-8 -*-\n+# ---\n+# jupyter:\n+#   jupytext_format_version: '1.2'\n+#   jupytext_formats: ipynb,py\n+#   kernel_info:\n+#     name: python3\n+#   kernelspec:\n+#     display_name: Python 3\n+#     language: python\n+#     name: python3\n+#   language_info:\n+#     codemirror_mode:\n+#       name: ipython\n+#       version: 3\n+#     file_extension: .py\n+#     mimetype: text/x-python\n+#     name: python\n+#     nbconvert_exporter: python\n+#     pygments_lexer: ipython3\n+#     version: 3.6.5\n+#   nteract:\n+#     version: 0.11.6\n+# ---\n+\n+# Hi, this notebook will show you almost all the columns operation availables in Optimus. For row operation, IO, ML and DL please go to the examples folder in the repo\n+\n+# %load_ext autoreload\n+# %autoreload 2\n+\n+import sys\n+sys.path.append(\"..\")\n+\n+# ## Columns Operations\n+#\n+# In this notebook you can see a detailed overview ok all the columns operations available in Optimus. You can access the operation via df.cols.\n+\n+from optimus import Optimus\n+\n+# Create optimus\n+op = Optimus()\n+\n+# ## Create dataframe\n+\n+# +\n+from pyspark.sql.types import StructType, StructField, StringType, BooleanType, IntegerType, ArrayType\n+\n+df = op.create.df(\n+            [\n+                (\"words\", \"str\", True),\n+                (\"num\", \"int\", True),\n+                (\"animals\", \"str\", True),\n+                (\"thing\", StringType(), True),\n+                (\"two strings\", StringType(), True),\n+                (\"filter\", StringType(), True),\n+                (\"num 2\", \"string\", True),\n+                (\"col_array\",  ArrayType(StringType()), True),\n+                (\"col_int\",  ArrayType(IntegerType()), True)\n+\n+            ]\n+,\n+[\n+                (\"  I like     fish  \", 1, \"dog\", \"housé\", \"cat-car\", \"a\",\"1\",[\"baby\", \"sorry\"],[1,2,3]),\n+                (\"    zombies\", 2, \"cat\", \"tv\", \"dog-tv\", \"b\",\"2\",[\"baby 1\", \"sorry 1\"],[3,4]),\n+                (\"simpsons   cat lady\", 2, \"frog\", \"table\",\"eagle-tv-plus\",\"1\",\"3\", [\"baby 2\", \"sorry 2\"], [5,6,7]),\n+                (None, 3, \"eagle\", \"glass\", \"lion-pc\", \"c\",\"4\", [\"baby 3\", \"sorry 3\"] ,[7,8])\n+            ])\n+\n+df.table()\n+# -\n+\n+# ## Create Columns\n+# ### Spark\n+# * You can not create multiple columns at the same time\n+# * You need to use the lit function. lit???\n+#\n+# ### Pandas\n+# * Assing function seems to do the job https://stackoverflow.com/questions/12555323/adding-new-column-to-existing-dataframe-in-python-pandas\n+#\n+\n+# ### Create a column with a constant value\n+\n+# + {\"scrolled\": true}\n+df = df.cols.append(\"new_col_1\", 1)\n+df.table()\n+# -\n+\n+# ### Create multiple columns with a constant value\n+\n+# +\n+from pyspark.sql.functions import *\n+\n+df.cols.append([\n+    (\"new_col_2\", 2.22),\n+    (\"new_col_3\", lit(3))\n+    ]).table()\n+# -\n+\n+# ### Create multiple columns with a constant string, a new column with existing columns value and an array\n+\n+# +\n+from pyspark.sql.functions import *\n+\n+df.cols.append([\n+    (\"new_col_4\", \"test\"),\n+    (\"new_col_5\", df['num']*2),\n+    (\"new_col_6\", [1,2,3])\n+    ]).table()\n+# -\n+\n+# ## Select columns\n+# ### Spark\n+# * You can not select columns by string and index at the same time\n+#\n+# ### Pandas\n+# * You can not select columns by string and index at the same time\n+\n+df.table()\n+columns = [\"words\", 1, \"animals\", 3]\n+df.cols.select(columns).table()\n+\n+# ### Select columns with a Regex\n+\n+df.cols.select(\"n.*\", regex = True).table()\n+\n+# ### Select all the columns of type string\n+\n+df.cols.select(\"*\", data_type = \"str\").table()\n+\n+# ## Rename Column\n+# ### Spark\n+# You can not rename multiple columns using Spark Vanilla API\n+#\n+#\n+# ### Pandas\n+# * Almost the same behavior https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html\n+\n+df.cols.rename('num','number').table()\n+\n+# ### Rename multiple columns and uppercase all the columns\n+\n+df.cols.rename([('num','number'),(\"animals\",\"gods\")], str.upper).table()\n+\n+# ### Convert to lower case\n+\n+df.cols.rename(str.lower).table()\n+\n+# ### Convert to uppercase\n+\n+df.cols.rename(str.upper).table()\n+\n+# ## Cast a columns\n+#\n+# This is a opinionated way to handle column casting. \n+# One of the first thing that every data cleaning process need to acomplish is define a data dictionary.\n+# Because of that we prefer to create a tuple like this:\n+#\n+# df.cols().cast(\n+# [(\"words\",\"str\"),\n+# (\"num\",\"int\"),\n+# (\"animals\",\"float\"),\n+# (\"thing\",\"str\")]\n+# )\n+#\n+# ### Spark\n+# * Can not cast multiple columns\n+#\n+# ### Pandas\n+#\n+# with astype()\n+# https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.astype.html\n+\n+df.cols.cast([(\"num\", \"string\"),(\"num 2\", \"integer\")]).dtypes\n+\n+# ### Cast a column to string\n+\n+df.cols.cast(\"num\", \"string\").dtypes\n+\n+# ### Cast all columns to string\n+\n+df.cols.cast(\"*\", \"string\").dtypes\n+\n+# ### Cast a column to Vectors\n+\n+# +\n+from pyspark.ml.linalg import Vectors\n+\n+df.cols.cast(\"col_int\", Vectors)\n+# -\n+\n+# ## Keep columns\n+# ### Spark\n+# * You can you df.select() to get the columns you want\n+#\n+# ### Pandas\n+# * Via drop()\n+#\n+\n+from pyspark.sql.functions import *\n+df.withColumn(\"num\", col(\"num\").cast(StringType()))\n+\n+\n+df.table()\n+df.cols.keep(\"num\").show()\n+\n+# ## Move columns\n+# ### Spark\n+# Do not exist in spark\n+#\n+# ### Pandas\n+# Do not exist in pandas\n+\n+df.cols.move(\"words\", \"after\", \"thing\").table()\n+\n+# ## Sorting Columns\n+# ### Spark\n+# You can not sort columns using Spark Vanilla API \n+#\n+# ### Pandas\n+# df.reindex_axis(sorted(df.columns), axis=1)\n+\n+# ### Sort in Alphabetical order\n+\n+df.cols.sort().table()\n+\n+# ### Sort in Reverse Alphabetical order\n+\n+df.cols.sort(order = \"desc\").table()\n+\n+# ## Drop columns\n+# ### Spark \n+# * You can not delete multiple colums\n+#\n+# ### Pandas\n+# * Almost the same as pandas\n+# https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop.html\n+\n+# ###  Drop one columns\n+\n+df2 = df.cols.drop(\"num\")\n+df2.table()\n+\n+# ### Drop multiple columns\n+\n+df2 = df.cols.drop([\"num\",\"words\"])\n+df2.table()\n+\n+df.table()\n+\n+# ## Chaining\n+#\n+# .cols y .rows attributes are used to organize and encapsulate `optimus` functionality apart from Apache Spark Dataframe API.\n+#\n+# At the same time it can be helpfull when you look at the code because every line is self explained.\n+#\n+# The past transformations were done step by step, but this can be achieved by chaining all operations into one line of code, like the cell below. This way is much more efficient and scalable because it uses all optimization issues from the lazy evaluation approach.\n+\n+df.table()\n+df\\\n+    .cols.rename([('num','number')])\\\n+    .cols.drop([\"number\",\"words\"])\\\n+    .withColumn(\"new_col_2\", lit(\"spongebob\"))\\\n+    .cols.append(\"new_col_1\", 1)\\\n+    .cols.sort(order= \"desc\")\\\n+    .rows.drop(df[\"num 2\"] == 3)\\\n+    .table()\n+\n+# ## Unnest  Columns\n+#\n+# With unnest you can convert one column into multiple ones. it can hadle string, array and vectors\n+#\n+# ### Spark\n+# Can split strings with split()\n+#\n+# ### Pandas\n+# via str.split()\n+\n+df.table()\n+df.cols.unnest(\"two strings\",\"-\")\\\n+    .table()\n+\n+# ### Only get the first element\n+\n+df.cols.unnest(\"two strings\",\"-\", index = 1).table()\n+\n+# ### Unnest array of string\n+\n+df\\\n+    .cols.unnest([\"col_array\"])\\\n+    .table()\n+\n+# ### Unnest and array of ints\n+\n+df\\\n+    .cols.unnest([\"col_int\"])\\\n+    .table()\n+\n+# ### Spits in 3 parts\n+\n+df\\\n+    .cols.unnest([\"two strings\"], n= 3, mark = \"-\")\\\n+    .table()\n+\n+# ### Unnest a Vector\n+\n+# +\n+from pyspark.ml.linalg import Vectors\n+\n+df1 = op.sc.parallelize([\n+    (\"assert\", Vectors.dense([1, 2, 3])),\n+    (\"require\", Vectors.sparse(3, {1: 2}))\n+]).toDF([\"word\", \"vector\"])    \n+# -\n+\n+df1\\\n+    .cols.unnest([\"vector\"])\\\n+    .table()\n+\n+df = df.cols.append(\"new_col_1\", 1)\n+\n+# ## Impute\n+\n+# ### Fill missing data\n+\n+# +\n+df_fill = op.spark.createDataFrame([(1.0, float(\"nan\")), (2.0, float(\"nan\")), \n+                               (float(\"nan\"), 3.0), (4.0, 4.0), (5.0, 5.0)], [\"a\", \"b\"])\n+\n+imputer = df_fill.cols.impute([\"a\", \"b\"], [\"out_a\", \"out_b\"], \"median\").table()\n+# -\n+\n+# ## Get columns by type\n+# ### Spark\n+# Not implemented in Spark Vanilla\n+#\n+# ### Pandas\n+\n+df.cols.select_by_dtypes(\"int\").table()\n+\n+# ## Apply custom function\n+#\n+# Spark have few ways to transform data rdd, Columns Expression, UDF and Pandas UDF. apply() and apply_expr() try to make a consistent way to call this expression without knowing the implementation details.\n+#\n+# ### Spark\n+# You need to declare a UDF Spark function\n+#\n+# ### Pandas\n+# Almost the same behavior that Optimus\n+\n+df.table()\n+\n+# ### Create a function that only apply to string value in column filter\n+#\n+# Sometimes there are columns with for example with numbers even when are supposed to be only of words or letters. \n+#\n+# In order to solve this problem, apply_by_dtypes() function can be used. \n+#\n+# In the next example we replace a number in a string column with \"new string\"\n+\n+# +\n+def func(val, attr):\n+    return attr\n+\n+df.cols.apply_by_dtypes(\"filter\", func, \"string\", \"new string\", data_type=\"integer\").table()\n+# -\n+\n+# ### Create a UDF function that sum a values(32 in this case) to two columns\n+\n+# +\n+def func(val, attr):\n+    return val + attr\n+\n+df.cols.apply([\"num\", \"new_col_1\"], func, \"int\", 32 ,\"udf\").table()\n+# -\n+\n+# ### Create a Pandas UDF function that sum a values(32 in this case) to two columns\n+\n+# +\n+def func(val, attr):\n+    return val + attr\n+\n+df.cols.apply([\"num\", \"new_col_1\"], func, \"int\", 10).table()\n+# -\n+\n+# ### Select row where column \"filter\" is \"integer\"\n+\n+# +\n+from optimus.functions import filter_row_by_data_type as fbdt\n+\n+df.rows.select(fbdt(\"filter\", \"integer\")).table()\n+# -\n+\n+# ### Create an abstract dataframe to filter a rows where the value of column \"num\"> 1\n+\n+# +\n+from optimus.functions import abstract_udf as audf ","path":"examples/new-api-column.py","position":396,"original_position":396,"commit_id":"37035d488251a16e9065f9d4ea6cffae4a76d3bf","original_commit_id":"37035d488251a16e9065f9d4ea6cffae4a76d3bf","user":{"login":"codacy-bot","id":19940114,"node_id":"MDQ6VXNlcjE5OTQwMTE0","avatar_url":"https://avatars1.githubusercontent.com/u/19940114?v=4","gravatar_id":"","url":"https://api.github.com/users/codacy-bot","html_url":"https://github.com/codacy-bot","followers_url":"https://api.github.com/users/codacy-bot/followers","following_url":"https://api.github.com/users/codacy-bot/following{/other_user}","gists_url":"https://api.github.com/users/codacy-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/codacy-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codacy-bot/subscriptions","organizations_url":"https://api.github.com/users/codacy-bot/orgs","repos_url":"https://api.github.com/users/codacy-bot/repos","events_url":"https://api.github.com/users/codacy-bot/events{/privacy}","received_events_url":"https://api.github.com/users/codacy-bot/received_events","type":"User","site_admin":false},"body":"![Codacy](https://app.codacy.com/assets/images/favicon.png) Issue found: [Trailing whitespace](https://app.codacy.com/app/favio.vazquezp/Optimus/pullRequest?prid=2345901)","created_at":"2018-10-14T04:53:43Z","updated_at":"2018-10-14T04:53:43Z","html_url":"https://github.com/ironmussa/Optimus/pull/359#discussion_r224979509","pull_request_url":"https://api.github.com/repos/ironmussa/Optimus/pulls/359","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/ironmussa/Optimus/pulls/comments/224979509"},"html":{"href":"https://github.com/ironmussa/Optimus/pull/359#discussion_r224979509"},"pull_request":{"href":"https://api.github.com/repos/ironmussa/Optimus/pulls/359"}}},"pull_request":{"url":"https://api.github.com/repos/ironmussa/Optimus/pulls/359","id":222209143,"node_id":"MDExOlB1bGxSZXF1ZXN0MjIyMjA5MTQz","html_url":"https://github.com/ironmussa/Optimus/pull/359","diff_url":"https://github.com/ironmussa/Optimus/pull/359.diff","patch_url":"https://github.com/ironmussa/Optimus/pull/359.patch","issue_url":"https://api.github.com/repos/ironmussa/Optimus/issues/359","number":359,"state":"open","locked":false,"title":"Preparing new release 2.1.1","user":{"login":"FavioVazquez","id":10162068,"node_id":"MDQ6VXNlcjEwMTYyMDY4","avatar_url":"https://avatars2.githubusercontent.com/u/10162068?v=4","gravatar_id":"","url":"https://api.github.com/users/FavioVazquez","html_url":"https://github.com/FavioVazquez","followers_url":"https://api.github.com/users/FavioVazquez/followers","following_url":"https://api.github.com/users/FavioVazquez/following{/other_user}","gists_url":"https://api.github.com/users/FavioVazquez/gists{/gist_id}","starred_url":"https://api.github.com/users/FavioVazquez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FavioVazquez/subscriptions","organizations_url":"https://api.github.com/users/FavioVazquez/orgs","repos_url":"https://api.github.com/users/FavioVazquez/repos","events_url":"https://api.github.com/users/FavioVazquez/events{/privacy}","received_events_url":"https://api.github.com/users/FavioVazquez/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-10-11T16:53:43Z","updated_at":"2018-10-14T04:53:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f69b674f89c901454819e5e3b43457ad1b16856b","assignee":{"login":"FavioVazquez","id":10162068,"node_id":"MDQ6VXNlcjEwMTYyMDY4","avatar_url":"https://avatars2.githubusercontent.com/u/10162068?v=4","gravatar_id":"","url":"https://api.github.com/users/FavioVazquez","html_url":"https://github.com/FavioVazquez","followers_url":"https://api.github.com/users/FavioVazquez/followers","following_url":"https://api.github.com/users/FavioVazquez/following{/other_user}","gists_url":"https://api.github.com/users/FavioVazquez/gists{/gist_id}","starred_url":"https://api.github.com/users/FavioVazquez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FavioVazquez/subscriptions","organizations_url":"https://api.github.com/users/FavioVazquez/orgs","repos_url":"https://api.github.com/users/FavioVazquez/repos","events_url":"https://api.github.com/users/FavioVazquez/events{/privacy}","received_events_url":"https://api.github.com/users/FavioVazquez/received_events","type":"User","site_admin":false},"assignees":[{"login":"FavioVazquez","id":10162068,"node_id":"MDQ6VXNlcjEwMTYyMDY4","avatar_url":"https://avatars2.githubusercontent.com/u/10162068?v=4","gravatar_id":"","url":"https://api.github.com/users/FavioVazquez","html_url":"https://github.com/FavioVazquez","followers_url":"https://api.github.com/users/FavioVazquez/followers","following_url":"https://api.github.com/users/FavioVazquez/following{/other_user}","gists_url":"https://api.github.com/users/FavioVazquez/gists{/gist_id}","starred_url":"https://api.github.com/users/FavioVazquez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FavioVazquez/subscriptions","organizations_url":"https://api.github.com/users/FavioVazquez/orgs","repos_url":"https://api.github.com/users/FavioVazquez/repos","events_url":"https://api.github.com/users/FavioVazquez/events{/privacy}","received_events_url":"https://api.github.com/users/FavioVazquez/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"argenisleon","id":37144,"node_id":"MDQ6VXNlcjM3MTQ0","avatar_url":"https://avatars0.githubusercontent.com/u/37144?v=4","gravatar_id":"","url":"https://api.github.com/users/argenisleon","html_url":"https://github.com/argenisleon","followers_url":"https://api.github.com/users/argenisleon/followers","following_url":"https://api.github.com/users/argenisleon/following{/other_user}","gists_url":"https://api.github.com/users/argenisleon/gists{/gist_id}","starred_url":"https://api.github.com/users/argenisleon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/argenisleon/subscriptions","organizations_url":"https://api.github.com/users/argenisleon/orgs","repos_url":"https://api.github.com/users/argenisleon/repos","events_url":"https://api.github.com/users/argenisleon/events{/privacy}","received_events_url":"https://api.github.com/users/argenisleon/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":645896929,"node_id":"MDU6TGFiZWw2NDU4OTY5Mjk=","url":"https://api.github.com/repos/ironmussa/Optimus/labels/enhancement","name":"enhancement","color":"84b6eb","default":true},{"id":721871911,"node_id":"MDU6TGFiZWw3MjE4NzE5MTE=","url":"https://api.github.com/repos/ironmussa/Optimus/labels/testing","name":"testing","color":"d93f0b","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ironmussa/Optimus/pulls/359/commits","review_comments_url":"https://api.github.com/repos/ironmussa/Optimus/pulls/359/comments","review_comment_url":"https://api.github.com/repos/ironmussa/Optimus/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ironmussa/Optimus/issues/359/comments","statuses_url":"https://api.github.com/repos/ironmussa/Optimus/statuses/37035d488251a16e9065f9d4ea6cffae4a76d3bf","head":{"label":"ironmussa:develop","ref":"develop","sha":"37035d488251a16e9065f9d4ea6cffae4a76d3bf","user":{"login":"ironmussa","id":30134402,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwMTM0NDAy","avatar_url":"https://avatars2.githubusercontent.com/u/30134402?v=4","gravatar_id":"","url":"https://api.github.com/users/ironmussa","html_url":"https://github.com/ironmussa","followers_url":"https://api.github.com/users/ironmussa/followers","following_url":"https://api.github.com/users/ironmussa/following{/other_user}","gists_url":"https://api.github.com/users/ironmussa/gists{/gist_id}","starred_url":"https://api.github.com/users/ironmussa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ironmussa/subscriptions","organizations_url":"https://api.github.com/users/ironmussa/orgs","repos_url":"https://api.github.com/users/ironmussa/repos","events_url":"https://api.github.com/users/ironmussa/events{/privacy}","received_events_url":"https://api.github.com/users/ironmussa/received_events","type":"Organization","site_admin":false},"repo":{"id":97071697,"node_id":"MDEwOlJlcG9zaXRvcnk5NzA3MTY5Nw==","name":"Optimus","full_name":"ironmussa/Optimus","private":false,"owner":{"login":"ironmussa","id":30134402,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwMTM0NDAy","avatar_url":"https://avatars2.githubusercontent.com/u/30134402?v=4","gravatar_id":"","url":"https://api.github.com/users/ironmussa","html_url":"https://github.com/ironmussa","followers_url":"https://api.github.com/users/ironmussa/followers","following_url":"https://api.github.com/users/ironmussa/following{/other_user}","gists_url":"https://api.github.com/users/ironmussa/gists{/gist_id}","starred_url":"https://api.github.com/users/ironmussa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ironmussa/subscriptions","organizations_url":"https://api.github.com/users/ironmussa/orgs","repos_url":"https://api.github.com/users/ironmussa/repos","events_url":"https://api.github.com/users/ironmussa/events{/privacy}","received_events_url":"https://api.github.com/users/ironmussa/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ironmussa/Optimus","description":":truck: Agile Data Science Workflows made easy with Python and Spark.","fork":false,"url":"https://api.github.com/repos/ironmussa/Optimus","forks_url":"https://api.github.com/repos/ironmussa/Optimus/forks","keys_url":"https://api.github.com/repos/ironmussa/Optimus/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ironmussa/Optimus/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ironmussa/Optimus/teams","hooks_url":"https://api.github.com/repos/ironmussa/Optimus/hooks","issue_events_url":"https://api.github.com/repos/ironmussa/Optimus/issues/events{/number}","events_url":"https://api.github.com/repos/ironmussa/Optimus/events","assignees_url":"https://api.github.com/repos/ironmussa/Optimus/assignees{/user}","branches_url":"https://api.github.com/repos/ironmussa/Optimus/branches{/branch}","tags_url":"https://api.github.com/repos/ironmussa/Optimus/tags","blobs_url":"https://api.github.com/repos/ironmussa/Optimus/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ironmussa/Optimus/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ironmussa/Optimus/git/refs{/sha}","trees_url":"https://api.github.com/repos/ironmussa/Optimus/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ironmussa/Optimus/statuses/{sha}","languages_url":"https://api.github.com/repos/ironmussa/Optimus/languages","stargazers_url":"https://api.github.com/repos/ironmussa/Optimus/stargazers","contributors_url":"https://api.github.com/repos/ironmussa/Optimus/contributors","subscribers_url":"https://api.github.com/repos/ironmussa/Optimus/subscribers","subscription_url":"https://api.github.com/repos/ironmussa/Optimus/subscription","commits_url":"https://api.github.com/repos/ironmussa/Optimus/commits{/sha}","git_commits_url":"https://api.github.com/repos/ironmussa/Optimus/git/commits{/sha}","comments_url":"https://api.github.com/repos/ironmussa/Optimus/comments{/number}","issue_comment_url":"https://api.github.com/repos/ironmussa/Optimus/issues/comments{/number}","contents_url":"https://api.github.com/repos/ironmussa/Optimus/contents/{+path}","compare_url":"https://api.github.com/repos/ironmussa/Optimus/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ironmussa/Optimus/merges","archive_url":"https://api.github.com/repos/ironmussa/Optimus/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ironmussa/Optimus/downloads","issues_url":"https://api.github.com/repos/ironmussa/Optimus/issues{/number}","pulls_url":"https://api.github.com/repos/ironmussa/Optimus/pulls{/number}","milestones_url":"https://api.github.com/repos/ironmussa/Optimus/milestones{/number}","notifications_url":"https://api.github.com/repos/ironmussa/Optimus/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ironmussa/Optimus/labels{/name}","releases_url":"https://api.github.com/repos/ironmussa/Optimus/releases{/id}","deployments_url":"https://api.github.com/repos/ironmussa/Optimus/deployments","created_at":"2017-07-13T02:31:18Z","updated_at":"2018-10-14T02:47:29Z","pushed_at":"2018-10-14T04:52:07Z","git_url":"git://github.com/ironmussa/Optimus.git","ssh_url":"git@github.com:ironmussa/Optimus.git","clone_url":"https://github.com/ironmussa/Optimus.git","svn_url":"https://github.com/ironmussa/Optimus","homepage":"https://hioptimus.com","size":9106,"stargazers_count":367,"watchers_count":367,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":95,"mirror_url":null,"archived":false,"open_issues_count":14,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":95,"open_issues":14,"watchers":367,"default_branch":"master"}},"base":{"label":"ironmussa:master","ref":"master","sha":"824f7680c0789c14680887d301c51bcba9cae90b","user":{"login":"ironmussa","id":30134402,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwMTM0NDAy","avatar_url":"https://avatars2.githubusercontent.com/u/30134402?v=4","gravatar_id":"","url":"https://api.github.com/users/ironmussa","html_url":"https://github.com/ironmussa","followers_url":"https://api.github.com/users/ironmussa/followers","following_url":"https://api.github.com/users/ironmussa/following{/other_user}","gists_url":"https://api.github.com/users/ironmussa/gists{/gist_id}","starred_url":"https://api.github.com/users/ironmussa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ironmussa/subscriptions","organizations_url":"https://api.github.com/users/ironmussa/orgs","repos_url":"https://api.github.com/users/ironmussa/repos","events_url":"https://api.github.com/users/ironmussa/events{/privacy}","received_events_url":"https://api.github.com/users/ironmussa/received_events","type":"Organization","site_admin":false},"repo":{"id":97071697,"node_id":"MDEwOlJlcG9zaXRvcnk5NzA3MTY5Nw==","name":"Optimus","full_name":"ironmussa/Optimus","private":false,"owner":{"login":"ironmussa","id":30134402,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwMTM0NDAy","avatar_url":"https://avatars2.githubusercontent.com/u/30134402?v=4","gravatar_id":"","url":"https://api.github.com/users/ironmussa","html_url":"https://github.com/ironmussa","followers_url":"https://api.github.com/users/ironmussa/followers","following_url":"https://api.github.com/users/ironmussa/following{/other_user}","gists_url":"https://api.github.com/users/ironmussa/gists{/gist_id}","starred_url":"https://api.github.com/users/ironmussa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ironmussa/subscriptions","organizations_url":"https://api.github.com/users/ironmussa/orgs","repos_url":"https://api.github.com/users/ironmussa/repos","events_url":"https://api.github.com/users/ironmussa/events{/privacy}","received_events_url":"https://api.github.com/users/ironmussa/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ironmussa/Optimus","description":":truck: Agile Data Science Workflows made easy with Python and Spark.","fork":false,"url":"https://api.github.com/repos/ironmussa/Optimus","forks_url":"https://api.github.com/repos/ironmussa/Optimus/forks","keys_url":"https://api.github.com/repos/ironmussa/Optimus/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ironmussa/Optimus/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ironmussa/Optimus/teams","hooks_url":"https://api.github.com/repos/ironmussa/Optimus/hooks","issue_events_url":"https://api.github.com/repos/ironmussa/Optimus/issues/events{/number}","events_url":"https://api.github.com/repos/ironmussa/Optimus/events","assignees_url":"https://api.github.com/repos/ironmussa/Optimus/assignees{/user}","branches_url":"https://api.github.com/repos/ironmussa/Optimus/branches{/branch}","tags_url":"https://api.github.com/repos/ironmussa/Optimus/tags","blobs_url":"https://api.github.com/repos/ironmussa/Optimus/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ironmussa/Optimus/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ironmussa/Optimus/git/refs{/sha}","trees_url":"https://api.github.com/repos/ironmussa/Optimus/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ironmussa/Optimus/statuses/{sha}","languages_url":"https://api.github.com/repos/ironmussa/Optimus/languages","stargazers_url":"https://api.github.com/repos/ironmussa/Optimus/stargazers","contributors_url":"https://api.github.com/repos/ironmussa/Optimus/contributors","subscribers_url":"https://api.github.com/repos/ironmussa/Optimus/subscribers","subscription_url":"https://api.github.com/repos/ironmussa/Optimus/subscription","commits_url":"https://api.github.com/repos/ironmussa/Optimus/commits{/sha}","git_commits_url":"https://api.github.com/repos/ironmussa/Optimus/git/commits{/sha}","comments_url":"https://api.github.com/repos/ironmussa/Optimus/comments{/number}","issue_comment_url":"https://api.github.com/repos/ironmussa/Optimus/issues/comments{/number}","contents_url":"https://api.github.com/repos/ironmussa/Optimus/contents/{+path}","compare_url":"https://api.github.com/repos/ironmussa/Optimus/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ironmussa/Optimus/merges","archive_url":"https://api.github.com/repos/ironmussa/Optimus/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ironmussa/Optimus/downloads","issues_url":"https://api.github.com/repos/ironmussa/Optimus/issues{/number}","pulls_url":"https://api.github.com/repos/ironmussa/Optimus/pulls{/number}","milestones_url":"https://api.github.com/repos/ironmussa/Optimus/milestones{/number}","notifications_url":"https://api.github.com/repos/ironmussa/Optimus/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ironmussa/Optimus/labels{/name}","releases_url":"https://api.github.com/repos/ironmussa/Optimus/releases{/id}","deployments_url":"https://api.github.com/repos/ironmussa/Optimus/deployments","created_at":"2017-07-13T02:31:18Z","updated_at":"2018-10-14T02:47:29Z","pushed_at":"2018-10-14T04:52:07Z","git_url":"git://github.com/ironmussa/Optimus.git","ssh_url":"git@github.com:ironmussa/Optimus.git","clone_url":"https://github.com/ironmussa/Optimus.git","svn_url":"https://github.com/ironmussa/Optimus","homepage":"https://hioptimus.com","size":9106,"stargazers_count":367,"watchers_count":367,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":95,"mirror_url":null,"archived":false,"open_issues_count":14,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":95,"open_issues":14,"watchers":367,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ironmussa/Optimus/pulls/359"},"html":{"href":"https://github.com/ironmussa/Optimus/pull/359"},"issue":{"href":"https://api.github.com/repos/ironmussa/Optimus/issues/359"},"comments":{"href":"https://api.github.com/repos/ironmussa/Optimus/issues/359/comments"},"review_comments":{"href":"https://api.github.com/repos/ironmussa/Optimus/pulls/359/comments"},"review_comment":{"href":"https://api.github.com/repos/ironmussa/Optimus/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ironmussa/Optimus/pulls/359/commits"},"statuses":{"href":"https://api.github.com/repos/ironmussa/Optimus/statuses/37035d488251a16e9065f9d4ea6cffae4a76d3bf"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"codacy-bot"}}