diff --git a/analysis/github.ipynb b/analysis/github.ipynb index 2e57634..9ac84eb 100644 --- a/analysis/github.ipynb +++ b/analysis/github.ipynb @@ -2679,7 +2679,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -2696,7 +2696,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -3183,7 +3183,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -3193,7 +3193,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -3202,7 +3202,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -3211,7 +3211,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -3220,7 +3220,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -3255,7 +3255,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -3264,7 +3264,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -3287,6 +3287,171 @@ "plt.show()" ] }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
commitscontributor
authorweek_since_repo_creation
elnjensen-10False
00False
10False
20False
30False
............
jlillo17348True
17448True
17549True
17649True
17749True
\n", + "

358 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " commits contributor\n", + "author week_since_repo_creation \n", + "elnjensen -1 0 False\n", + " 0 0 False\n", + " 1 0 False\n", + " 2 0 False\n", + " 3 0 False\n", + "... ... ...\n", + "jlillo 173 48 True\n", + " 174 48 True\n", + " 175 49 True\n", + " 176 49 True\n", + " 177 49 True\n", + "\n", + "[358 rows x 2 columns]" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "became_active = team_df.groupby(level=\"author\").cumsum()\n", + "became_active[\"contributor\"] = became_active.commits > 0\n", + "became_active" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "team_growth = became_active.groupby(level=\"week_since_repo_creation\")[\"contributor\"].value_counts()[:,True].reindex(became_active.index.levels[1], fill_value=0)\n", + "#windowed_team_df[\"active contributor\"] = windowed_team_df.commits > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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9erVsd1228Vmm23WYFD9Bx980OjXWrVqVfTt2zdOOumkOProoxt1zDHHHBPvvvtuTJo0KbbffvtYunRpVFdXZ/QZAGh+lWtrIsLtvwAAAADIXxmHKldffXWTvfmQIUNiyJAhjd7/oYceipkzZ8brr78eHTp0iIiIbbfdtsnqASB70itVhCoAAAAA5KmMQ5URI0Zko45Guf/++6N///5xxRVXxO9///to06ZNHHHEEfHTn/40Wrduvc5jKisro7KyMv14+fLlzVUuAJ/x75kqQhUAAAAA8lPGocpnrVmzJtauXVtvWzaH2L/++usxe/bsaNWqVfz5z3+O9957L04//fT44IMP1jtXZcKECTF+/Pis1QRA4whVAAAAAMh3GXe2Vq1aFWeeeWZ07tw5Nt9889hyyy3rfWVTbW1tpFKpuOOOO2LvvfeOoUOHxlVXXRWTJ0+ONWvWrPOYsWPHxrJly9JfixYtymqNAKyb238BAAAAkO8y7myNGTMmHnnkkbj++uujtLQ0brrpphg/fnyUlZXFbbfdlo0a07p16xZbb711tG/fPr1t5513jiRJ4q233lrnMaWlpdGuXbt6XwA0v8q1n4YqRUIVAAAAAPJTxp2tBx54IK6//vr49re/HcXFxXHAAQfET37yk7j88svjjjvuyEaNafvtt1+88847sXLlyvS2l19+OVq0aBHbbLNNVt8bgC/GShUAAAAA8l3Gna0PPvggevXqFRGfzE/54IMPIiJi//33j1mzZmX0WitXrozy8vIoLy+PiIiKioooLy+PhQsXRsQnt+4aPnx4ev/jjjsuttpqqzjppJPixRdfjFmzZsUFF1wQJ5988noH1QPw5VCZnqlSlONKAAAAAODzyThU6d27d7zxxhsREbHLLrvEn/70p4j4ZAXLFltskdFrzZkzJ/r16xf9+vWLiIjRo0dHv3794pJLLomIiMWLF6cDloiIzTffPKZPnx4fffRR9O/fP44//vgYNmxYXHvttZl+DACaWd2geitVAAAAAMhXxZkecNJJJ8UzzzwTAwYMiLFjx8bhhx8ev/nNb6K6ujquuuqqjF5r4MCBkSTJep+fPHlyg2077bRTTJ8+PdOyAcixyuqaiBCqAAAAAJC/Mg5Vzj333PT3gwYNipdeeinmzJkT2223XfTt27dJiwOgcKRXqhhUDwAAAECeyjhU+ayPP/44evToET169GiqegAoUHWhSmlLoQoAAAAA+SnjzlZNTU389Kc/ja233jo233zzeP311yMi4uKLL45JkyY1eYEAFIaqGitVAAAAAMhvGXe2fvazn8XkyZPjiiuuiJKSkvT23XbbLW666aYmLQ6AwlG59tOVKmaqAAAAAJCnMu5s3XbbbfG73/0ujj/++CgqKkpv33333eOll15q0uIAKBzplSpCFQAAAADyVMadrbfffju23377Bttra2tj7dq1TVIUAIUnPVOluGgjewIAAADAl1PGocquu+4ajz32WIPtd999d/Tr169JigKg8NSFKlaqAAAAAJCvijM94NJLL43vf//78fbbb0dtbW1MmTIlFixYELfddlv85S9/yUaNABSAyuqaiDCoHgAAAID8lXFna9iwYXHXXXfFgw8+GKlUKi655JKYP39+PPDAA3HwwQdno0YACkCllSoAAAAA5LmMV6pERBx66KFx6KGHNnUtABSwukH1pUIVAAAAAPJUxp2t3r17x/vvv99g+0cffRS9e/dukqIAKDxmqgAAAACQ7zLubL3xxhtRU1PTYHtlZWW8/fbbTVIUAIXH7b8AAAAAyHeNvv3X/fffn/5+2rRp0b59+/Tjmpqa+Pvf/x7bbrttkxYHQOGoW6ni9l8AAAAA5KtGhypHHnlkRESkUqkYMWJEvedatmwZ2267bVx55ZVNWhwAhSN9+6+iohxXAgAAAACfT6NDldraT5phvXr1iqeeeio6duyYtaIAKDzpQfUtrVQBAAAAID81OlSpU1FRkY06AChg1TW1UVObRERESZFQBQAAAID8pLMFQNbVrVKJMKgeAAAAgPylswVA1tXNU4kQqgAAAACQv3S2AMi6ulClRSqiuEUqx9UAAAAAwOeTUahSXV0dt956ayxZsiRb9QBQgCo/DVVKiltEKiVUAQAAACA/ZRSqFBcXxw9/+MOorKzMVj0AFKB0qGJIPQAAAAB5LOPu1te+9rUoLy/PQikAFKqq9EqVohxXAgAAAACfX3GmB5x++ukxevToWLRoUey5557Rpk2bes/vvvvuTVYcAIWhquaTUKXUkHoAAAAA8ljGocqxxx4bERGjRo1Kb0ulUpEkSaRSqaipqWm66gAoCHUrVYQqAAAAAOSzjEOVioqKbNQBQAGrrP4kcC8RqgAAAACQxzIOVXr27JmNOgAo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g+pbutQAAAAAUBh0ugDIirqVKqVWqgAAAABQIHS6AMgKg+oBAAAAKDQ6XQBkRZVQBQAAAIACo9MFQFakb/9VXJTjSgAAAACgaQhVAMgKK1UAAAAAKDQ6XQBkhZkqAAAAABQanS4AmlySJFFV82moUuRSAwAAAEBhyGmna9asWTFs2LAoKyuLVCoVU6dO3egxM2fOjD333DNatWoVvXv3jhtuuCH7hQKQkbpAJSKitKVQBQAAAIDCkNNO16pVq6Jv375x3XXXNWr/ioqKGDp0aBxwwAHx9NNPx0UXXRSjRo2Ke++9N8uVApCJunkqEVaqAAAAAFA4inP55kOGDIkhQ4Y0ev8bbrghevToEVdffXVEROy8884xZ86c+NWvfhVHH310lqrcNCxbszaeeO29XJcBFIgVH1envxeqAAAAAFAochqqZOqJJ56IQw45pN62Qw89NCZNmhRr166Nli1bNjimsrIyKisr04+XL1+e9Trz0dsfronTbp+X6zKAAlNa3CJatEjlugwAAAAAaBJ5FaosWbIkunTpUm9bly5dorq6Ot57773o1q1bg2MmTJgQ48ePb64S89ZmJUXRv+eWuS4DKDCH9ema6xIAAAAAoMnkVagSEZFK1f+N5yRJ1rm9ztixY2P06NHpx8uXL4/u3btnr8A8tW3HNnHPD/fNdRkAAAAAAPCllVehSteuXWPJkiX1ti1dujSKi4tjq622WucxpaWlUVpa2hzlAQAAAAAABSyvpgfvs88+MX369HrbHn744ejfv/8656kAAAAAAAA0lZyGKitXrozy8vIoLy+PiIiKioooLy+PhQsXRsQnt+4aPnx4ev/TTjst3nzzzRg9enTMnz8/br755pg0aVKcf/75uSgfAAAAAADYhOT09l9z5syJQYMGpR/XzT4ZMWJETJ48ORYvXpwOWCIievXqFQ8++GCce+658dvf/jbKysri2muvjaOPPrrZawcAAAAAADYtqaRu0vsmYvny5dG+fftYtmxZtGvXLtflAAAAAAAAOZRJbpBXM1UAAAAAAAByRagCAAAAAADQCEIVAAAAAACARhCqAAAAAAAANIJQBQAAAAAAoBGEKgAAAAAAAI1QnOsCmluSJBERsXz58hxXAgAAAAAA5FpdXlCXH2zIJheqrFixIiIiunfvnuNKAAAAAACAL4sVK1ZE+/btN7hPKmlM9FJAamtr45133om2bdtGKpXKdTl5Zfny5dG9e/dYtGhRtGvXLtflwJeC8wIacl5Afc4JaMh5AQ05L6Ah5wU05LzIjiRJYsWKFVFWVhYtWmx4asomt1KlRYsWsc022+S6jLzWrl07Jyz8B+cFNOS8gPqcE9CQ8wIacl5AQ84LaMh50fQ2tkKljkH1AAAAAAAAjSBUAQAAAAAAaAShCo1WWloal156aZSWlua6FPjScF5AQ84LqM85AQ05L6Ah5wU05LyAhpwXubfJDaoHAAAAAAD4PKxUAQAAAAAAaAShCgAAAAAAQCMIVQAAAAAAABpBqAIAAAAAANAIQhUa5frrr49evXpFq1atYs8994zHHnss1yVBs5kwYULstdde0bZt2+jcuXMceeSRsWDBgnr7nHjiiZFKpep9ff3rX89RxZB948aNa/BvvmvXrunnkySJcePGRVlZWbRu3ToGDhwYL7zwQg4rhuzbdtttG5wXqVQqzjjjjIhwrWDTMGvWrBg2bFiUlZVFKpWKqVOn1nu+MdeHysrKOOuss6Jjx47Rpk2bOOKII+Ktt95qxk8BTWtD58XatWvjwgsvjN122y3atGkTZWVlMXz48HjnnXfqvcbAgQMbXEO++93vNvMngaaxsWtFY35mcq2g0GzsvFjX/zNSqVT88pe/TO/jWtF8hCps1F133RXnnHNO/PjHP46nn346DjjggBgyZEgsXLgw16VBs5g5c2acccYZ8eSTT8b06dOjuro6DjnkkFi1alW9/Q477LBYvHhx+uvBBx/MUcXQPHbdddd6/+afe+659HNXXHFFXHXVVXHdddfFU089FV27do2DDz44VqxYkcOKIbueeuqpeufE9OnTIyLiO9/5Tnof1woK3apVq6Jv375x3XXXrfP5xlwfzjnnnPjzn/8cf/zjH2P27NmxcuXK+K//+q+oqalpro8BTWpD58Xq1atj3rx5cfHFF8e8efNiypQp8fLLL8cRRxzRYN9TTjml3jXkxhtvbI7yoclt7FoRsfGfmVwrKDQbOy8+ez4sXrw4br755kilUnH00UfX28+1onkU57oAvvyuuuqqGDlyZPzgBz+IiIirr746pk2bFhMnTowJEybkuDrIvoceeqje41tuuSU6d+4cc+fOjQMPPDC9vbS0tN5v6kOhKy4uXue/+SRJ4uqrr44f//jHcdRRR0VExK233hpdunSJP/zhD3Hqqac2d6nQLDp16lTv8c9//vPYbrvtYsCAAeltrhUUuiFDhsSQIUPW+Vxjrg/Lli2LSZMmxe9///s46KCDIiLi9ttvj+7du8ff/va3OPTQQ5vts0BT2dB50b59+3QIX+c3v/lN7L333rFw4cLo0aNHevtmm23mGkJB2NA5UWdDPzO5VlCINnZe/Of5cN9998WgQYOid+/e9ba7VjQPK1XYoKqqqpg7d24ccsgh9bYfcsgh8Y9//CNHVUFuLVu2LCIiOnToUG/7jBkzonPnzrHjjjvGKaecEkuXLs1FedBsXnnllSgrK4tevXrFd7/73Xj99dcjIqKioiKWLFlS79pRWloaAwYMcO1gk1FVVRW33357nHzyyZFKpdLbXSvYlDXm+jB37txYu3ZtvX3KysqiT58+riFsMpYtWxapVCq22GKLetvvuOOO6NixY+y6665x/vnnWwFMQdvQz0yuFWzq3n333fjrX/8aI0eObPCca0XzsFKFDXrvvfeipqYmunTpUm97ly5dYsmSJTmqCnInSZIYPXp07L///tGnT5/09iFDhsR3vvOd6NmzZ1RUVMTFF18cgwcPjrlz50ZpaWkOK4bs+NrXvha33XZb7LjjjvHuu+/GZZddFvvuu2+88MIL6evDuq4db775Zi7KhWY3derU+Oijj+LEE09Mb3OtYFPXmOvDkiVLoqSkJLbccssG+/j/B5uCjz/+OH70ox/FcccdF+3atUtvP/7446NXr17RtWvXeP7552Ps2LHxzDPPNFjlAoVgYz8zuVawqbv11lujbdu26ZW/dVwrmo9QhUb57G9YRnzSWP7PbbApOPPMM+PZZ5+N2bNn19t+7LHHpr/v06dP9O/fP3r27Bl//etfG1zkoBB8dlnybrvtFvvss09st912ceutt6aHSLp2sCmbNGlSDBkyJMrKytLbXCvgE5/n+uAawqZg7dq18d3vfjdqa2vj+uuvr/fcKaeckv6+T58+scMOO0T//v1j3rx5scceezR3qZBVn/dnJtcKNhU333xzHH/88dGqVat6210rmo/bf7FBHTt2jKKiogZJ/9KlSxv8hhkUurPOOivuv//+ePTRR2ObbbbZ4L7dunWLnj17xiuvvNJM1UFutWnTJnbbbbd45ZVX0vdvde1gU/Xmm2/G3/72t/Q8uvVxrWBT05jrQ9euXaOqqio+/PDD9e4DhWjt2rVxzDHHREVFRUyfPr3eKpV12WOPPaJly5auIWwS/vNnJtcKNmWPPfZYLFiwYKP/14hwrcgmoQobVFJSEnvuuWeDZWLTp0+PfffdN0dVQfNKkiTOPPPMmDJlSjzyyCPRq1evjR7z/vvvx6JFi6Jbt27NUCHkXmVlZcyfPz+6deuWXm782WtHVVVVzJw507WDTcItt9wSnTt3jsMPP3yD+7lWsKlpzPVhzz33jJYtW9bbZ/HixfH888+7hlCw6gKVV155Jf72t7/FVltttdFjXnjhhVi7dq1rCJuE//yZybWCTdmkSZNizz33jL59+250X9eK7HH7LzZq9OjR8f3vfz/69+8f++yzT/zud7+LhQsXxmmnnZbr0qBZnHHGGfGHP/wh7rvvvmjbtm36tyvbt28frVu3jpUrV8a4cePi6KOPjm7dusUbb7wRF110UXTs2DG+9a1v5bh6yI7zzz8/hg0bFj169IilS5fGZZddFsuXL48RI0ZEKpWKc845Jy6//PLYYYcdYocddojLL788NttsszjuuONyXTpkVW1tbdxyyy0xYsSIKC7+94/arhVsKlauXBmvvvpq+nFFRUWUl5dHhw4dokePHhu9PrRv3z5GjhwZ5513Xmy11VbRoUOHOP/882O33XaLgw46KFcfC76QDZ0XZWVl8e1vfzvmzZsXf/nLX6Kmpib9/40OHTpESUlJvPbaa3HHHXfE0KFDo2PHjvHiiy/GeeedF/369Yv99tsvVx8LPrcNnRMdOnTY6M9MrhUUoo39DBURsXz58rj77rvjyiuvbHC8a0UzS6ARfvvb3yY9e/ZMSkpKkj322COZOXNmrkuCZhMR6/y65ZZbkiRJktWrVyeHHHJI0qlTp6Rly5ZJjx49khEjRiQLFy7MbeGQRccee2zSrVu3pGXLlklZWVly1FFHJS+88EL6+dra2uTSSy9NunbtmpSWliYHHnhg8txzz+WwYmge06ZNSyIiWbBgQb3trhVsKh599NF1/tw0YsSIJEkad31Ys2ZNcuaZZyYdOnRIWrdunfzXf/2Xc4W8tqHzoqKiYr3/33j00UeTJEmShQsXJgceeGDSoUOHpKSkJNluu+2SUaNGJe+//35uPxh8Ths6Jxr7M5NrBYVmYz9DJUmS3HjjjUnr1q2Tjz76qMHxrhXNK5UkSZL15AYAAAAAACDPmakCAAAAAADQCEIVAAAAAACARhCqAAAAAAAANIJQBQAAAAAAoBGEKgAAAAAAAI0gVAEAAAAAAGgEoQoAAAAAAEAjCFUAAIB1mjx5cmyxxRZN9noDBw6Mc845p8lej6b1xhtvRCqVivLy8lyXAgAAX1rFuS4AAADYNEyZMiVatmyZ6zKIiBNPPDE++uijmDp1anpb9+7dY/HixdGxY8fcFQYAAF9yQhUAAKBZdOjQIdclNFBVVRUlJSW5LqNRkiSJmpqaKC7Ozn/jioqKomvXrll5bQAAKBRu/wUAAHnggQceiC222CJqa2sjIqK8vDxSqVRccMEF6X1OPfXU+N73vpd+/I9//CMOPPDAaN26dXTv3j1GjRoVq1atSj9fVVUVY8aMia233jratGkTX/va12LGjBnrreH999+PvffeO4444oj4+OOP17nP9ddfHzvssEO0atUqunTpEt/+9rfTz/3n7b+23XbbuPzyy+Pkk0+Otm3bRo8ePeJ3v/tdvdd766234rvf/W506NAh2rRpE/37949//vOf9f5c9txzz2jVqlX07t07xo8fH9XV1ev9DCeeeGIceeSRMWHChCgrK4sdd9wxIiLefvvtOPbYY2PLLbeMrbbaKr75zW/GG2+80eC48ePHR+fOnaNdu3Zx6qmnRlVVVXqfysrKGDVqVHTu3DlatWoV+++/fzz11FPrraXumDFjxkT37t2jtLQ0dthhh5g0aVJERMyYMSNSqVRMmzYt+vfvH6WlpfHYY49FkiRxxRVXRO/evaN169bRt2/fuOeee9KvWVNTEyNHjoxevXpF69at4ytf+Upcc8016efHjRsXt956a9x3332RSqUilUrFjBkz1nn7r5kzZ8bee+8dpaWl0a1bt/jRj35U78934MCBMWrUqBgzZkx06NAhunbtGuPGjdvgZwYAgHwmVAEAgDxw4IEHxooVK+Lpp5+OiE+a3R07doyZM2em95kxY0YMGDAgIiKee+65OPTQQ+Ooo46KZ599Nu66666YPXt2nHnmmen9TzrppHj88cfjj3/8Yzz77LPxne98Jw477LB45ZVXGrz/W2+9FQcccEDstNNOMWXKlGjVqlWDfebMmROjRo2K//mf/4kFCxbEQw89FAceeOAGP9eVV14Z/fv3j6effjpOP/30+OEPfxgvvfRSRESsXLkyBgwYEO+8807cf//98cwzz8SYMWPSwdK0adPihBNOiFGjRsWLL74YN954Y0yePDl+9rOfbfA9//73v8f8+fNj+vTp8Ze//CVWr14dgwYNis033zxmzZoVs2fPjs033zwOO+yweqFJ3XGPPvpo3HnnnfHnP/85xo8fn35+zJgxce+998att94a8+bNi+233z4OPfTQ+OCDD9Zby/Dhw+OPf/xjXHvttTF//vy44YYbYvPNN6+3z5gxY2LChAkxf/782H333eMnP/lJ3HLLLTFx4sR44YUX4txzz40TTjgh/W+htrY2ttlmm/jTn/4UL774YlxyySVx0UUXxZ/+9KeIiDj//PPjmGOOicMOOywWL14cixcvjn333bdBbW+//XYMHTo09tprr3jmmWdi4sSJMWnSpLjsssvq7XfrrbdGmzZt4p///GdcccUV8T//8z8xffr0Df4dAABA3koAAIC8sMceeyS/+tWvkiRJkiOPPDL52c9+lpSUlCTLly9PFi9enEREMn/+/CRJkuT73/9+8t///d/1jn/ssceSFi1aJGvWrEleffXVJJVKJW+//Xa9fb7xjW8kY8eOTZIkSW655Zakffv2yYIFC5IePXokZ511VlJbW7ve+u69996kXbt2yfLly9f5/IABA5Kzzz47/bhnz57JCSeckH5cW1ubdO7cOZk4cWKSJEly4403Jm3btk3ef//9db7eAQcckFx++eX1tv3+979PunXrtt4aR4wYkXTp0iWprKxMb5s0aVLyla98pd5nq6ysTFq3bp1MmzYtfVyHDh2SVatWpfeZOHFisvnmmyc1NTXJypUrk5YtWyZ33HFH+vmqqqqkrKwsueKKK9ZZy4IFC5KISKZPn77O5x999NEkIpKpU6emt61cuTJp1apV8o9//KPeviNHjky+973vrfdzn3766cnRRx9d78/hm9/8Zr19KioqkohInn766SRJkuSiiy5q8Ofy29/+Nv2Zk+STv9P999+/3uvstddeyYUXXrjeWgAAIJ+ZqQIAAHli4MCBMWPGjBg9enQ89thjcdlll8W9994bs2fPjo8++ii6dOkSO+20U0REzJ07N1599dW444470scnSRK1tbVRUVERzz//fCRJkr79VZ3KysrYaqut0o/XrFkT+++/f3zve9+rdwupdTn44IOjZ8+e0bt37zjssMPisMMOi29961ux2WabrfeY3XffPf19KpWKrl27xtKlSyPik1uc9evXb72zWObOnRtPPfVUvZUpNTU18fHHH8fq1avX+7677bZbvTkqdX9Wbdu2rbffxx9/HK+99lr6cd++feu95j777BMrV66MRYsWxbJly2Lt2rWx3377pZ9v2bJl7L333jF//vx11lFeXh5FRUXp1UXr079///T3L774Ynz88cdx8MEH19unqqoq+vXrl358ww03xE033RRvvvlmrFmzJqqqquKrX/3qBt/nP82fPz/22WefSKVS6W377bdfrFy5Mt56663o0aNHRNT/O4yI6NatW/rvEAAACo1QBQAA8sTAgQNj0qRJ8cwzz0SLFi1il112iQEDBsTMmTPjww8/rNecr62tjVNPPTVGjRrV4HV69OgRzz77bBQVFcXcuXOjqKio3vOfvf1UaWlpHHTQQfHXv/41Lrjggthmm23WW1/btm1j3rx5MWPGjHj44YfjkksuiXHjxsVTTz0VW2yxxTqPadmyZb3HqVQqfXuv1q1bb/DPo7a2NsaPHx9HHXVUg+fWdXuyOm3atGnwOnvuuWe9AKpOp06dNlhDXc1JkqS//6wkSRpsq7Oxz7eueuv+bP7617/G1ltvXW+/0tLSiIj405/+FOeee25ceeWVsc8++0Tbtm3jl7/8Zb1ZNI2xrtrX9Tk39HcIAACFRqgCAAB5om6uytVXXx0DBgyIVCoVAwYMiAkTJsSHH34YZ599dnrfPfbYI1544YXYfvvt1/la/fr1i5qamli6dGkccMAB633PFi1axO9///s47rjjYvDgwTFjxowoKytb7/7FxcVx0EEHxUEHHRSXXnppbLHFFvHII4+sM/jYmN133z1uuumm+OCDD9a5WmWPPfaIBQsWrPczNtYee+wRd911V3oA/fo888wzsWbNmnQY8uSTT8bmm28e22yzTWy11VZRUlISs2fPjuOOOy4iItauXRtz5syJc845Z52vt9tuu0VtbW3MnDkzDjrooEbVussuu0RpaWksXLhwvStcHnvssdh3333j9NNPT2/77IqbiIiSkpKoqanZ6Hvde++99cKVf/zjH9G2bdsGgQ4AAGwqDKoHAIA80b59+/jqV78at99+ewwcODAiPgla5s2bFy+//HJ6W0TEhRdeGE888UScccYZUV5eHq+88krcf//9cdZZZ0VExI477hjHH398DB8+PKZMmRIVFRXx1FNPxS9+8Yt48MEH671vUVFR3HHHHdG3b98YPHhwLFmyZJ31/eUvf4lrr702ysvL480334zbbrstamtr4ytf+crn+rzf+973omvXrnHkkUfG448/Hq+//nrce++98cQTT0RExCWXXBK33XZbjBs3Ll544YWYP39+3HXXXfGTn/wko/c5/vjjo2PHjvHNb34zHnvssaioqIiZM2fG2WefHW+99VZ6v6qqqhg5cmS8+OKL8b//+79x6aWXxplnnhktWrSINm3axA9/+MO44IIL4qGHHooXX3wxTjnllFi9enWMHDlyne+77bbbxogRI+Lkk0+OqVOnRkVFRcyYMSM9UH5d2rZtG+eff36ce+65ceutt8Zrr70WTz/9dPz2t7+NW2+9NSIitt9++5gzZ05MmzYtXn755bj44ovjqaeeavDezz77bCxYsCDee++9WLt2bYP3Ov3002PRokVx1llnxUsvvRT33XdfXHrppTF69Oho0cJ/JQEA2DT5SRgAAPLIoEGDoqamJh2gbLnllrHLLrtEp06dYuedd07vt/vuu8fMmTPjlVdeiQMOOCD69esXF198cXTr1i29zy233BLDhw+P8847L77yla/EEUccEf/85z+je/fuDd63uLg47rzzzth1111j8ODB65yZscUWW8SUKVNi8ODBsfPOO8cNN9yQPubzKCkpiYcffjg6d+4cQ4cOjd122y1+/vOfp29Xduihh8Zf/vKXmD59euy1117x9a9/Pa666qro2bNnRu+z2WabxaxZs6JHjx5x1FFHxc477xwnn3xyrFmzpt7KlW984xuxww47xIEHHhjHHHNMDBs2LMaNG5d+/uc//3kcffTR8f3vfz/22GOPePXVV2PatGmx5ZZbrve9J06cGN/+9rfj9NNPj5122ilOOeWUWLVq1Qbr/elPfxqXXHJJTJgwIXbeeec49NBD44EHHohevXpFRMRpp50WRx11VBx77LHxta99Ld5///16q1YiIk455ZT4yle+Ev37949OnTrF448/3uB9tt5663jwwQfjX//6V/Tt2zdOO+20GDlyZMahFQAAFJJUUndTXAAAANbpxBNPjI8++iimTp2a61IAAIAcslIFAAAAAACgEYQqAAAAAAAAjeD2XwAAAAAAAI1gpQoAAAAAAEAjCFUAAAAAAAAaQagCAAAAAADQCEIVAAAAAACARhCqAAAAAAAANIJQBQAAAAAAoBGEKgAAAAAAAI0gVAEAAAAAAGgEoQoAAAAAAEAj/H85h9/c0tTrBQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "team_growth.plot(\n", + " figsize=(20, 4),\n", + " xlabel=\"week since repo creation\",\n", + " ylabel=\"contributor team size\",\n", + ")\n", + "plt.show()" + ] + }, { "attachments": {}, "cell_type": "markdown", diff --git a/analysis/repository_timeline.py b/analysis/repository_timeline.py index 8fb7c1a..f962b40 100644 --- a/analysis/repository_timeline.py +++ b/analysis/repository_timeline.py @@ -104,10 +104,17 @@ def contributor_team(contributions, metadata, forks, stars, axs): # plot team_size.plot( ax=axs[1], - color="black", lw=2, # xlabel="week since repo creation", - ylabel="contributor team size", + ylabel="number of contributors", + ) + # overall pool of contributors + contributor_pool_df = team_df.groupby(level="author").cumsum() + contributor_pool_df["contributors"] = contributor_pool_df.commits > 0 + contrib_pool = contributor_pool_df.groupby(level="week_since_repo_creation")["contributors"].value_counts()[:,True].reindex(contributor_pool_df.index.levels[1], fill_value=0) + contrib_pool.plot( + ax=axs[1], + lw=2, ) def no_open_and_closed_issues(issues, metadata, ax):