diff --git a/src/explore.ipynb b/src/explore.ipynb index a4da28a20aa26a09ee9a20d6cb5e6ef11f8a27ee..35c0d00fd3ae2b1152892e0f401015e06f4fd94c 100644 --- a/src/explore.ipynb +++ b/src/explore.ipynb @@ -1545,7 +1545,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -1570,8 +1570,8 @@ "94.181.170.143 247\n", "Theadityapratap 239\n", "94.181.156.128 229\n", - "93.124.46.78 222\n", "Achat cialis 222\n", + "93.124.46.78 222\n", "93.124.28.116 213\n", "176.97.116.140 202\n", "5.165.186.39 192\n", @@ -1582,40 +1582,40 @@ "37.113.28.187 185\n", "64.62.219.98 180\n", " ... \n", - "Dharmendra780 1\n", - "Robertdenningraider13 1\n", - "SLCHT 1\n", - "2601:153:700:6870:B8D9:5791:192D:1DAE 1\n", - "59.96.9.214 1\n", - "207.32.26.5 1\n", - "208.61.1.124 1\n", - "149.126.106.19 1\n", - "121.216.118.139 1\n", - "HegerLoyneszhFG 1\n", - "2607:FB90:1903:33F9:4C08:6E2:70C7:20F6 1\n", - "Clutchmaster163955 1\n", - "86.160.200.85 1\n", - "38.78.194.51 1\n", - "69.174.87.60 1\n", - "PujolBoatmanJvfh 1\n", - "89.240.83.117 1\n", - "MarrowWylyLRFj 1\n", - "173.31.204.16 1\n", - "PettigrewSparacioETJg 1\n", - "Ednopsniwagn 1\n", - "Kevinfigs 1\n", - "162.228.50.214 1\n", - "LoeberArelUVURo 1\n", - "50.82.26.116 1\n", - "Kaileefiles 1\n", - "Bestraight 1\n", - "Dexon Software 1\n", - "203.59.81.156 1\n", - "119.154.88.171 1\n", + "2602:306:3449:D8B0:1D59:35A1:E776:9D24 1\n", + "65.30.148.79 1\n", + "100.11.133.143 1\n", + "178.20.148.10 1\n", + "CanalesHakansonKLaM 1\n", + "BreslinMuckleoAhV 1\n", + "CalisePopielsxeFt 1\n", + "2605:E000:5B04:C000:F8CB:904:9135:B38C 1\n", + "2601:981:C002:EE25:B01D:3AD9:A364:7018 1\n", + "Flyingfalconer 1\n", + "CharliBaughman0 1\n", + "Nicholaslimmm 1\n", + "Elvis783929030 1\n", + "207.170.199.15 1\n", + "166.170.57.137 1\n", + "Cagonhenrio 1\n", + "FawnHib4113 1\n", + "110.138.157.45 1\n", + "66.177.171.107 1\n", + "Deepanshubhati 1\n", + "BernardiAllgeyergBLB 1\n", + "197.156.81.2 1\n", + "2605:6001:E605:5700:7527:2E8C:D4A:EB12 1\n", + "81.148.221.230 1\n", + "Marems79 1\n", + "14.98.111.171 1\n", + "2601:1C0:4000:F7:411F:C606:F304:B28C 1\n", + "VincentFrisina 1\n", + "FranceBramwellMyFNS 1\n", + "Abhishekhegde11502 1\n", "Name: afl_user_text, Length: 139586, dtype: int64" ] }, - "execution_count": 42, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -1637,25 +1637,483 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 10, "metadata": {}, "outputs": [ { - "ename": "AttributeError", - "evalue": "'DataFrame' object has no attribute 'value_counts'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-49-7bf774e7d58b>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Try to intersect users with actions/pages\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdf_jan2016\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'afl_user_text'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'afl_action'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue_counts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/uni/ma-arbeit-filters/src/env3/lib/python3.6/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m 4374\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4375\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4376\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4377\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4378\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mAttributeError\u001b[0m: 'DataFrame' object has no attribute 'value_counts'" - ] + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>afl_user_text</th>\n", + " <th>afl_action</th>\n", + " <th>0</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>141604</th>\n", + " <td>ï¾ ï¾ ï¾ ï¾ ï¾ ï¾ ï¾ ï¾ ï¾ </td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141603</th>\n", + " <td>ï¾ ï¾ ï¾ </td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141602</th>\n", + " <td>RIEAKI</td>\n", + " <td>edit</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141601</th>\n", + " <td>해림김수진</td>\n", + " <td>edit</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141600</th>\n", + " <td>타설현황</td>\n", + " <td>edit</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141599</th>\n", + " <td>지드ë¼ê³µ</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141598</th>\n", + " <td>지드ë¼ê³¤</td>\n", + " <td>createaccount</td>\n", + " <td>3</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141597</th>\n", + " <td>ì´ê°•ë¯¼2</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141596</th>\n", + " <td>박강준</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141595</th>\n", + " <td>鹿晗7</td>\n", + " <td>createaccount</td>\n", + " <td>3</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141594</th>\n", + " <td>é¹å¾™åŒ—冥</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141593</th>\n", + " <td>鴻途</td>\n", + " <td>createaccount</td>\n", + " <td>4</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141592</th>\n", + " <td>鱼雨玉</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141591</th>\n", + " <td>鱼粑粑.</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141590</th>\n", + " <td>é±¼.</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141589</th>\n", + " <td>高欣-与七书</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141588</th>\n", + " <td>飞奔的油桶</td>\n", + " <td>edit</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141587</th>\n", + " <td>風動雲è¯å¾®å·</td>\n", + " <td>createaccount</td>\n", + " <td>3</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141586</th>\n", + " <td>韋情</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141585</th>\n", + " <td>雨良辰</td>\n", + " <td>createaccount</td>\n", + " <td>4</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141584</th>\n", + " <td>陈守二</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141583</th>\n", + " <td>阳懿轩</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141582</th>\n", + " <td>闫致敬</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141581</th>\n", + " <td>里雅也</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141580</th>\n", + " <td>邹鸿</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141579</th>\n", + " <td>邱繼群</td>\n", + " <td>edit</td>\n", + " <td>4</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141578</th>\n", + " <td>邪门æªé“</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141577</th>\n", + " <td>é‚“å°å¹³</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141576</th>\n", + " <td>邓一苇</td>\n", + " <td>createaccount</td>\n", + " <td>4</td>\n", + " </tr>\n", + " <tr>\n", + " <th>141575</th>\n", + " <td>辣笔å°çƒ</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>29</th>\n", + " <td>'hkvbjkv</td>\n", + " <td>edit</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>28</th>\n", + " <td>'O.o)wlnight</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>27</th>\n", + " <td>'Cheery sunny</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>26</th>\n", + " <td>$owndharyaS</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>25</th>\n", + " <td>$owmiyaR</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>24</th>\n", + " <td>$owmeyaksr</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>23</th>\n", + " <td>$owmeya</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>22</th>\n", + " <td>$nade</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>21</th>\n", + " <td>$hubham20</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>20</th>\n", + " <td>$eek. 4</td>\n", + " <td>createaccount</td>\n", + " <td>15</td>\n", + " </tr>\n", + " <tr>\n", + " <th>19</th>\n", + " <td>$akash$</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>18</th>\n", + " <td>$SomenewInTown$</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>17</th>\n", + " <td>$Kartik$13</td>\n", + " <td>createaccount</td>\n", + " <td>3</td>\n", + " </tr>\n", + " <tr>\n", + " <th>16</th>\n", + " <td>$CEC 02$</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>15</th>\n", + " <td>$$pistel$$</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>14</th>\n", + " <td>$$Killagang100$$</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>13</th>\n", + " <td>$$$killagang300$$$</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>12</th>\n", + " <td>\"enteryourusername\"isadumbusername</td>\n", + " <td>edit</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>11</th>\n", + " <td>\"To bring engineering to the heart of society\"</td>\n", + " <td>edit</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>10</th>\n", + " <td>\"Rushikeshraje\"</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>\"Rushikesh\"</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>\"Prince of Fortune</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>!trimitemipemata</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>!ceMaan</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>!WKatie</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>!Hasil!</td>\n", + " <td>createaccount</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>! marrich !</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>! ma75rrich !</td>\n", + " <td>createaccount</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>! m4rrich19 !</td>\n", + " <td>createaccount</td>\n", + " <td>3</td>\n", + " </tr>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>! m4rrich !</td>\n", + " <td>createaccount</td>\n", + " <td>4</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>141605 rows × 3 columns</p>\n", + "</div>" + ], + "text/plain": [ + " afl_user_text afl_action 0\n", + "141604 ï¾ ï¾ ï¾ ï¾ ï¾ ï¾ ï¾ ï¾ ï¾ createaccount 1\n", + "141603 ï¾ ï¾ ï¾ createaccount 1\n", + "141602 RIEAKI edit 1\n", + "141601 해림김수진 edit 2\n", + "141600 타설현황 edit 2\n", + "141599 지드ë¼ê³µ createaccount 2\n", + "141598 지드ë¼ê³¤ createaccount 3\n", + "141597 ì´ê°•ë¯¼2 createaccount 2\n", + "141596 박강준 createaccount 2\n", + "141595 鹿晗7 createaccount 3\n", + "141594 é¹å¾™åŒ—冥 createaccount 2\n", + "141593 鴻途 createaccount 4\n", + "141592 鱼雨玉 createaccount 1\n", + "141591 鱼粑粑. createaccount 1\n", + "141590 é±¼. createaccount 2\n", + "141589 高欣-与七书 createaccount 2\n", + "141588 飞奔的油桶 edit 2\n", + "141587 風動雲è¯å¾®å· createaccount 3\n", + "141586 韋情 createaccount 2\n", + "141585 雨良辰 createaccount 4\n", + "141584 陈守二 createaccount 1\n", + "141583 阳懿轩 createaccount 1\n", + "141582 闫致敬 createaccount 1\n", + "141581 里雅也 createaccount 2\n", + "141580 邹鸿 createaccount 1\n", + "141579 邱繼群 edit 4\n", + "141578 邪门æªé“ createaccount 2\n", + "141577 é‚“å°å¹³ createaccount 1\n", + "141576 邓一苇 createaccount 4\n", + "141575 辣笔å°çƒ createaccount 1\n", + "... ... ... ..\n", + "29 'hkvbjkv edit 2\n", + "28 'O.o)wlnight createaccount 2\n", + "27 'Cheery sunny createaccount 2\n", + "26 $owndharyaS createaccount 1\n", + "25 $owmiyaR createaccount 1\n", + "24 $owmeyaksr createaccount 1\n", + "23 $owmeya createaccount 1\n", + "22 $nade createaccount 2\n", + "21 $hubham20 createaccount 1\n", + "20 $eek. 4 createaccount 15\n", + "19 $akash$ createaccount 1\n", + "18 $SomenewInTown$ createaccount 1\n", + "17 $Kartik$13 createaccount 3\n", + "16 $CEC 02$ createaccount 1\n", + "15 $$pistel$$ createaccount 1\n", + "14 $$Killagang100$$ createaccount 1\n", + "13 $$$killagang300$$$ createaccount 2\n", + "12 \"enteryourusername\"isadumbusername edit 1\n", + "11 \"To bring engineering to the heart of society\" edit 2\n", + "10 \"Rushikeshraje\" createaccount 1\n", + "9 \"Rushikesh\" createaccount 1\n", + "8 \"Prince of Fortune createaccount 1\n", + "7 !trimitemipemata createaccount 1\n", + "6 !ceMaan createaccount 1\n", + "5 !WKatie createaccount 1\n", + "4 !Hasil! createaccount 1\n", + "3 ! marrich ! createaccount 2\n", + "2 ! ma75rrich ! createaccount 2\n", + "1 ! m4rrich19 ! createaccount 3\n", + "0 ! m4rrich ! createaccount 4\n", + "\n", + "[141605 rows x 3 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ "# Try to intersect users with actions/pages\n", - "df_jan2016[['afl_user_text', 'afl_action']].value_counts() " + "grouped = df_jan2016.groupby(['afl_user_text','afl_action']).size().reset_index()\n", + "grouped.sort_index(ascending=False)" ] }, { @@ -6363,13 +6821,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mh. The comparison is not really insightful. It's just a proportionally smaller numbers of all actions." + "Mh. The comparison is not really insightful. It's just a proportionally smaller numbers of all actions. That's not exactly true though. The edits ration is 2/3, whereas the createaccount ration is 1/3 (3 being the Jan values)" ] }, { "cell_type": "code", "execution_count": 48, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -6455,6 +6915,433 @@ "The comparison of number of edits per user reveals that in January there were a couple of particularly active IPs. It would be interesting to know what they were trying to do. (Answer: they were spamming.)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Filter hits Februrary 2016" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "edit 298610\n", + "createaccount 67721\n", + "move 282\n", + "gatheredit 18\n", + "autocreateaccount 5\n", + "delete 1\n", + "Name: afl_action, dtype: int64" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_feb2016 = pd.read_csv(\"quarry-37514-abuselog-entries-en-wiki-in-february-2016-run389412.csv\", sep=',')\n", + "\n", + "# Number of hits per editor's actions\n", + "df_feb2016['afl_action'].value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again, quite a high createaccount counts.." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "UserLogin 67726\n", + "Bob_Ezrin 816\n", + "Billboard_(magazine) 576\n", + "WikiProject_Film 404\n", + "Bulletin_board_system 362\n", + "Skateboard 334\n", + "Board_game 249\n", + "Randy_Gardner_(record_holder) 234\n", + "Computer_keyboard 186\n", + "Tripoli_under_Italian_rule 163\n", + "Snowboarding 137\n", + "Rameez_Raja 136\n", + "British_Board_of_Film_Classification 133\n", + "Reserve_Forces_Policy_Board 131\n", + "Undertale 128\n", + "Nadeshot 127\n", + "Carolina_Panthers 122\n", + "The_Life_of_Pablo 116\n", + "Achinoam_Nini 114\n", + "Jonathan_Scott_(politician) 113\n", + "Keyboard_instrument 111\n", + "New_York_Jets 109\n", + "WikiProject_India 109\n", + "Harry_Roque 106\n", + "March_to_WrestleMania:_Live_from_Toronto 106\n", + "Rhetoric 100\n", + "Ernst_von_Glasersfeld 98\n", + "Bad_Aibling_rail_accident 96\n", + "Trihex 95\n", + "Antonin_Scalia 95\n", + " ... \n", + "Synergy 1\n", + "Ford_Mustang_(second_generation) 1\n", + "List_of_Storage_Wars_episodes 1\n", + "Rotation_around_a_fixed_axis 1\n", + "Ashurst_Wood 1\n", + "Pillar_coral 1\n", + "Josh_Freeman 1\n", + "Jacques_Lecoq 1\n", + "A_Bar_at_the_Folies-Bergère 1\n", + "Morgana_Robinson 1\n", + "Laurelwood_Pub_and_Brewery 1\n", + "Results_of_the_Tasmanian_state_election,_1931 1\n", + "Mactan–Cebu_International_Airport 1\n", + "Johann_Reinhold_Forster 1\n", + "Battle_of_Saragarhi 1\n", + "Improvised_explosive_device 1\n", + "Malabar_region 1\n", + "The_Girl_Is_Mine_(99_Souls_song) 1\n", + "Frappuccino 1\n", + "Passive_Wi-Fi 1\n", + "The_Hunting_Ground 1\n", + "Craig_Dawson 1\n", + "20th_Century_Fox_Television 1\n", + "County_roads_in_St._Croix_County,_Wisconsin 1\n", + "Marco_Scandella 1\n", + "Shajal_Noor 1\n", + "Made_in_America_(The_Carpenters_album) 1\n", + "Chinkhoy 1\n", + "Yamato_1 1\n", + "Plutocracy 1\n", + "Name: afl_title, Length: 89050, dtype: int64" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Number of hits per intended edit page\n", + "df_feb2016['afl_title'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "95.152.10.186 920\n", + "37.113.42.202 707\n", + "5.166.253.56 336\n", + "RichardEi 286\n", + "Achat cialis 241\n", + "46.188.71.226 236\n", + "93.124.87.217 212\n", + "176.212.131.244 201\n", + "5.167.191.123 197\n", + "95.152.49.234 191\n", + "95.152.40.97 178\n", + "94.181.143.54 176\n", + "95.152.9.227 169\n", + "Prix cialis 166\n", + "Acheter cialis 157\n", + "41.225.84.56 155\n", + "46.118.114.195 149\n", + "Elisa314 146\n", + "93.124.114.195 145\n", + "Brightgalrs 144\n", + "125.238.47.82 144\n", + "95.152.32.236 143\n", + "5.167.177.64 137\n", + "93.124.107.61 136\n", + "109.162.125.254 131\n", + "AlButch 128\n", + "93.124.42.25 127\n", + "84.90.219.128 123\n", + "95.152.15.40 117\n", + "117.68.217.44 117\n", + " ... \n", + "CinnamonFishbackCMxls 1\n", + "5.103.226.148 1\n", + "Shalom Delmar 1\n", + "40.134.150.205 1\n", + "188.29.164.213 1\n", + "Wayure 1\n", + "107.145.96.252 1\n", + "50.4.131.152 1\n", + "Bonadae 1\n", + "MontandonSamitWLOY 1\n", + "Daddy Doggy 1\n", + "87.21.243.230 1\n", + "Moby223 1\n", + "GronerPedenJsxEW 1\n", + "119.30.35.166 1\n", + "StraughnHormannfdTy 1\n", + "BellinLoricklqyB 1\n", + "172.56.2.39 1\n", + "101.127.44.164 1\n", + "151.181.44.210 1\n", + "Cosgrove360 1\n", + "FeyMenghinihngD 1\n", + "5.68.199.202 1\n", + "BarryBell677 1\n", + "109.86.209.75 1\n", + "WildCherry06 1\n", + "M12333S 1\n", + "StadelmanDacostajPLu 1\n", + "99.98.168.9 1\n", + "Djthunda 1\n", + "Name: afl_user_text, Length: 134875, dtype: int64" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Number of hits per editor\n", + "df_feb2016['afl_user_text'].value_counts() #TODO intersect users with actions/pages" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An inquiry into 95.152.10.186's edits shows, it's same viagra spam as in January. Some of the top named accounts: \"Prix cialis\" ,\"Acheter cialis\" and \"Achat cialis\" sound very similar to the viagra spam domains, so it's probably socks of the same thing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Filter hits March 2016" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "edit 308138\n", + "createaccount 51812\n", + "move 352\n", + "autocreateaccount 23\n", + "delete 2\n", + "Name: afl_action, dtype: int64" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_mar2016 = pd.read_csv(\"quarry-37515-abuselog-entries-en-wiki-in-march-2016-run389414.csv\", sep=',')\n", + "\n", + "# Number of hits per editor's actions\n", + "df_mar2016['afl_action'].value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again, quite a high createaccount counts.." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "UserLogin 51835\n", + "209.236.119.231 2221\n", + "Skateboard 718\n", + "Billboard_(magazine) 629\n", + "WikiProject_Film 592\n", + "Bulletin_board_system 561\n", + "Jason_Rothenberg_(television_producer) 501\n", + "Snowboarding 435\n", + "Board_game 387\n", + "Reserve_Forces_Policy_Board 355\n", + "British_Board_of_Film_Classification 334\n", + "Dvorak_Simplified_Keyboard 327\n", + "UFC_196 270\n", + "WikiProject_India 239\n", + "Computer_keyboard 228\n", + "Sandbox 223\n", + "Board_of_directors 197\n", + "Josh_Boden 172\n", + "WikiProject_Radio_Stations 167\n", + "Keyboard_layout 167\n", + "Nate_Diaz 165\n", + "Harry_Potter 160\n", + "Printed_circuit_board 159\n", + "Baseboard 152\n", + "Ed_Miliband 146\n", + "WikiProject_Football 146\n", + "Storyboard 145\n", + "Boarding_school 134\n", + "Cumming_v._Richmond_County_Board_of_Education 131\n", + "Entertainment_Software_Rating_Board 128\n", + " ... \n", + "United_States_Senate_election_in_Louisiana,_2016 1\n", + "Traditional_Bachata 1\n", + "Park_Bom 1\n", + "Allison_Janney 1\n", + "Peyman_Yazdanian 1\n", + "Juliahatsmakemehappy 1\n", + "Yamaha_TDM_900 1\n", + "Arrested_Development_(TV_series) 1\n", + "Julia_Lennon 1\n", + "Nalin_Kohli 1\n", + "History_of_archaeology 1\n", + "Charlene,_Princess_of_Monaco 1\n", + "Garners_Beach,_Queensland 1\n", + "Dahanayake 1\n", + "Rugrats_Go_Wild 1\n", + "Medifast 1\n", + "Echo_Fox 1\n", + "Rounding 1\n", + "Jubilant_FoodWorks 1\n", + "Overcrowding 1\n", + "Voices_(Kenny_Thomas_album) 1\n", + "Drayton_Plains_State_Fish_Hatchery 1\n", + "Haystack_Mountain_(Pennsylvania) 1\n", + "Outline_of_North_Carolina 1\n", + "Percent-encoding 1\n", + "Abdullah_Ahmad_Badawi 1\n", + "Goodfella_Sound_Productions_Inc. 1\n", + "L.Flank/sandbox 1\n", + "O'Neill_dynasty 1\n", + "SBS_Drama_Special 1\n", + "Name: afl_title, Length: 92925, dtype: int64" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Number of hits per intended edit page\n", + "df_mar2016['afl_title'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "89.178.195.212 2928\n", + "209.236.119.231 2225\n", + "93.124.100.71 1101\n", + "RichardEi 529\n", + "176.213.105.10 487\n", + "Acheter viagra 476\n", + "95.152.29.103 379\n", + "Achat viagra 376\n", + "95.152.37.178 358\n", + "95.152.4.24 327\n", + "94.181.137.245 309\n", + "95.152.57.6 308\n", + "5.166.246.166 299\n", + "37.113.22.196 271\n", + "110.89.8.214 259\n", + "37.113.26.96 257\n", + "95.152.20.130 257\n", + "178.137.160.82 245\n", + "37.113.37.4 242\n", + "65.128.133.116 234\n", + "95.152.8.13 223\n", + "95.152.34.153 222\n", + "110.89.17.186 218\n", + "93.124.84.96 184\n", + "Gsaibudsagjj8is 179\n", + "5.167.188.42 177\n", + "70.71.88.88 173\n", + "GoldRingChip 170\n", + "95.152.50.38 164\n", + "185.130.5.163 160\n", + " ... \n", + "DaveCorwin166 1\n", + "80.111.184.119 1\n", + "Manjeet singh sadiwal 1\n", + "76.14.179.68 1\n", + "Sajinsaj 1\n", + "94.192.203.169 1\n", + "Jasmine.Yangtse 1\n", + "Michael A. Bucci 1\n", + "111.94.75.209 1\n", + "86.130.35.243 1\n", + "Cb1991 1\n", + "50.83.178.234 1\n", + "Benw2016 1\n", + "109.180.106.121 1\n", + "87.158.11.164 1\n", + "GildaColls20 1\n", + "RyceLowensteinAYyq 1\n", + "213.205.252.218 1\n", + "Vinyar 1\n", + "2601:247:301:7F:8F8:97B1:3EC1:E225 1\n", + "36.253.255.51 1\n", + "47.55.219.181 1\n", + "184.6.47.251 1\n", + "Jmnewcomer 1\n", + "216.73.65.90 1\n", + "152.93.202.203 1\n", + "CanadianBands 1\n", + "Sonu420 1\n", + "CraigPosadasNdita 1\n", + "173.51.99.200 1\n", + "Name: afl_user_text, Length: 127124, dtype: int64" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Number of hits per editor\n", + "df_mar2016['afl_user_text'].value_counts() #TODO intersect users with actions/pages" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ui,89.178.195.212 is something new: oxycothyn paragraphs instead of viagra links.. And RichardEi lässt grüßen" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -7077,8 +7964,10 @@ }, { "cell_type": "code", - "execution_count": 54, - "metadata": {}, + "execution_count": 12, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -7156,28 +8045,165 @@ " print(df_actions_year.fillna('log only'))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Where does this data come from? It looks kind of fishy that there are \"disallow,tag\" but not \"warn,tag\" actions, where there are a bunch of filters with \"warn,tag\" actions set." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>LogYear</th>\n", + " <th>FilterActions</th>\n", + " <th>Freq</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>2019-01-01 00:00:00</td>\n", + " <td>disallow,tag</td>\n", + " <td>18</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>2018-01-01 00:00:00</td>\n", + " <td>disallow,tag</td>\n", + " <td>71</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>2017-01-01 00:00:00</td>\n", + " <td>disallow,tag</td>\n", + " <td>961</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>2016-01-01 00:00:00</td>\n", + " <td>disallow,tag</td>\n", + " <td>27752</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>2015-01-01 00:00:00</td>\n", + " <td>disallow,tag</td>\n", + " <td>36971</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>2014-01-01 00:00:00</td>\n", + " <td>disallow,tag</td>\n", + " <td>3970</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>2010-01-01 00:00:00</td>\n", + " <td>disallow,tag</td>\n", + " <td>24</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>2009-01-01 00:00:00</td>\n", + " <td>disallow,tag</td>\n", + " <td>321</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>2013-01-01</td>\n", + " <td>disallow,tag</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>2012-01-01</td>\n", + " <td>disallow,tag</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>10</th>\n", + " <td>2011-01-01</td>\n", + " <td>disallow,tag</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " LogYear FilterActions Freq\n", + "0 2019-01-01 00:00:00 disallow,tag 18\n", + "1 2018-01-01 00:00:00 disallow,tag 71\n", + "2 2017-01-01 00:00:00 disallow,tag 961\n", + "3 2016-01-01 00:00:00 disallow,tag 27752\n", + "4 2015-01-01 00:00:00 disallow,tag 36971\n", + "5 2014-01-01 00:00:00 disallow,tag 3970\n", + "6 2010-01-01 00:00:00 disallow,tag 24\n", + "7 2009-01-01 00:00:00 disallow,tag 321\n", + "8 2013-01-01 disallow,tag 0\n", + "9 2012-01-01 disallow,tag 0\n", + "10 2011-01-01 disallow,tag 0" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#df_actions_year.fillna('log only')[df_actions_year [\"FilterActions\"]== \"log only\"]\n", + "test = df_actions_year.fillna('log only').query('FilterActions==\"disallow,tag\"')\n", + "df2 = pd.DataFrame([['2013-01-01', 'disallow,tag', 0], ['2012-01-01', 'disallow,tag', 0], ['2011-01-01', 'disallow,tag', 0]], columns=['LogYear', 'FilterActions', 'Freq'])\n", + "test.append(df2, ignore_index=True)" + ] + }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 30, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "ufunc subtract cannot use operands with types dtype('<M8[ns]') and dtype('float64')", + "ename": "ValueError", + "evalue": "shape mismatch: objects cannot be broadcast to a single shape", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-56-f24e07750944>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrotation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'20'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mylabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Num filters'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_values\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_values\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/uni/ma-arbeit-filters/src/env3/lib/python3.6/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mbar\u001b[0;34m(x, height, width, bottom, align, data, **kwargs)\u001b[0m\n\u001b[1;32m 2455\u001b[0m return gca().bar(\n\u001b[1;32m 2456\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbottom\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbottom\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0malign\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0malign\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2457\u001b[0;31m **({\"data\": data} if data is not None else {}), **kwargs)\n\u001b[0m\u001b[1;32m 2458\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2459\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-30-c11e9b229550>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mp3\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mind\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf_actions_year\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfillna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'log only'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquery\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'FilterActions==\"warn\"'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Freq'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbottom\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mp4\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mind\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf_actions_year\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfillna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'log only'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquery\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'FilterActions==\"disallow\"'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Freq'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbottom\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mp5\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mind\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf_actions_year\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfillna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'log only'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquery\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'FilterActions==\"disallow,tag\"'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Freq'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbottom\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0mp6\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mind\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf_actions_year\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfillna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'log only'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquery\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'FilterActions==\"blockautopromote,tag\"'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Freq'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbottom\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mp7\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mind\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf_actions_year\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfillna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'log only'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquery\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'FilterActions==\"blockautopromote\"'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Freq'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbottom\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/uni/ma-arbeit-filters/src/env3/lib/python3.6/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[0;34m(ax, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1808\u001b[0m \u001b[0;34m\"the Matplotlib list!)\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlabel_namer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1809\u001b[0m RuntimeWarning, stacklevel=2)\n\u001b[0;32m-> 1810\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1811\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1812\u001b[0m inner.__doc__ = _add_data_doc(inner.__doc__,\n", - "\u001b[0;32m~/uni/ma-arbeit-filters/src/env3/lib/python3.6/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mbar\u001b[0;34m(self, x, height, width, bottom, align, **kwargs)\u001b[0m\n\u001b[1;32m 2275\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0malign\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'center'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2276\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0morientation\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'vertical'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2277\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mwidth\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2278\u001b[0m \u001b[0mbottom\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2279\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0morientation\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'horizontal'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: ufunc subtract cannot use operands with types dtype('<M8[ns]') and dtype('float64')" + "\u001b[0;32m~/uni/ma-arbeit-filters/src/env3/lib/python3.6/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mbar\u001b[0;34m(self, x, height, width, bottom, align, **kwargs)\u001b[0m\n\u001b[1;32m 2249\u001b[0m x, height, width, y, linewidth = np.broadcast_arrays(\n\u001b[1;32m 2250\u001b[0m \u001b[0;31m# Make args iterable too.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2251\u001b[0;31m np.atleast_1d(x), height, width, y, linewidth)\n\u001b[0m\u001b[1;32m 2252\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2253\u001b[0m \u001b[0;31m# Now that units have been converted, set the tick locations.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/uni/ma-arbeit-filters/src/env3/lib/python3.6/site-packages/numpy/lib/stride_tricks.py\u001b[0m in \u001b[0;36mbroadcast_arrays\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 250\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_m\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubok\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msubok\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_m\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 251\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 252\u001b[0;31m \u001b[0mshape\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_broadcast_shape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 253\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mshape\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marray\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/uni/ma-arbeit-filters/src/env3/lib/python3.6/site-packages/numpy/lib/stride_tricks.py\u001b[0m in \u001b[0;36m_broadcast_shape\u001b[0;34m(*args)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;31m# use the old-iterator because np.nditer does not handle size 0 arrays\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;31m# consistently\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbroadcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m32\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m \u001b[0;31m# unfortunately, it cannot handle 32 or more arguments directly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpos\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m32\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m31\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: shape mismatch: objects cannot be broadcast to a single shape" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] @@ -7189,14 +8215,32 @@ } ], "source": [ - "#ap_actions_labels = [x[0] for x in active_public_actions]\n", - "x_values = df_actions_year['LogYear']\n", - "y_values = df_actions_year['Freq']\n", + "# Trying to plot a grouped bar chart\n", + "\n", + "N = 11\n", + "\n", + "fig, ax = plt.subplots()\n", + "\n", + "ind = np.arange(N) # the x locations for the groups\n", + "width = 0.2 # the width of the bars\n", + "p1 = ax.bar(ind, df_actions_year.fillna('log only').query('FilterActions==\"log only\"')['Freq'], width, bottom=0)\n", + "p2 = ax.bar(ind + width, df_actions_year.fillna('log only').query('FilterActions==\"tag\"')['Freq'], width, bottom=0)\n", + "p3 = ax.bar(ind + 2*width, df_actions_year.fillna('log only').query('FilterActions==\"warn\"')['Freq'], width, bottom=0)\n", + "p4 = ax.bar(ind + 3*width, df_actions_year.fillna('log only').query('FilterActions==\"disallow\"')['Freq'], width, bottom=0)\n", + "p5 = ax.bar(ind + 4*width, df_actions_year.fillna('log only').query('FilterActions==\"disallow,tag\"')['Freq'], width, bottom=0)\n", + "p6 = ax.bar(ind + 5*width, df_actions_year.fillna('log only').query('FilterActions==\"blockautopromote,tag\"')['Freq'], width, bottom=0)\n", + "p7 = ax.bar(ind + 6*width, df_actions_year.fillna('log only').query('FilterActions==\"blockautopromote\"')['Freq'], width, bottom=0)\n", + "p8 = ax.bar(ind + 7*width, df_actions_year.fillna('log only').query('FilterActions==\"aftv5flagabuse\"')['Freq'], width, bottom=0)\n", "\n", "plt.xlabel('actions')\n", "plt.xticks(rotation='20')\n", "plt.ylabel('Num filters')\n", - "plt.bar(x_values, y_values)\n", + "ax.set_title('Scores by group and gender')\n", + "ax.set_xticks(ind + 8*width / 9)\n", + "ax.set_xticklabels(('2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019'))\n", + "\n", + "ax.legend((p1[0], p2[0], p3[0], p4[0], p5[0], p6[0], p7[0], p8[0]), ('log only', 'tag', 'warn', 'disallow', 'disallow,tag', 'blockautopromote,tag', 'blockautopromote', 'aftv5flagabuse'))\n", + "ax.autoscale_view()\n", "plt.show()" ] },