Last active
March 15, 2018 14:04
-
-
Save sergiks/ece86fd561a8745feb505e5f5c3b6028 to your computer and use it in GitHub Desktop.
Deserter vs. TargetHunter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Сравнение аудиторий\n", | |
"### полученных в Дезертире и в Таргет Хантере\n", | |
"\n", | |
"В группе поддержки приложения «Дезертир» [пользователь](https://vk.com/rchegletsov) [спрашивает](https://vk.com/wall-46994534_10242):\n", | |
"> Сравнил количество вступивших с помощью парсера таргетхантер по нескольким группам. Почему-то у них количество вступивших гораздо выше, чем данные дезертира. Не знаю чья правда. У кого данные точнее?\n", | |
"\n", | |
"> «Дезертир» – группа поддержки приложения, вот тут я залил списки дезертира и таргетхантера за 14 и 15 марта по одной группе вк. Прошу вас сравнить. https://yadi.sk/d/E413Z1rr3TPbxw" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from os import walk\n", | |
"from os.path import join\n", | |
"\n", | |
"\n", | |
"def read_folder(folder):\n", | |
" files = []\n", | |
" for (dirpath, dirnames, filenames) in walk(folder):\n", | |
" files.extend(filenames)\n", | |
" break\n", | |
" return files\n", | |
"\n", | |
"\n", | |
"def read_ids(filename):\n", | |
" ids = []\n", | |
" with open(filename, 'rt', encoding='UTF-8') as f:\n", | |
" for line in f:\n", | |
" line = line.strip()\n", | |
" if line:\n", | |
" id = int(line)\n", | |
" ids.append(id)\n", | |
" print('{:4d} id в файле \"{}\"'.format(len(ids), filename))\n", | |
" return ids" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Файлы из архива" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['535 пришли в endaily в среду 14 мар. время 10 часов 10 минут.csv',\n", | |
" '5k_14_марта_12.04_15.03.2018.txt',\n", | |
" '613 пришли в endaily в четверг 15 мар. время 02 часа 46 минут.csv',\n", | |
" '620_15_марта_12.05_15.03.2018.txt',\n", | |
" 'ссылка на группу.txt']" | |
] | |
}, | |
"execution_count": 31, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"folder = 'unzipped'\n", | |
"files = read_folder(folder); files" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 535 id в файле \"unzipped/535 пришли в endaily в среду 14 мар. время 10 часов 10 минут.csv\"\n", | |
" 613 id в файле \"unzipped/613 пришли в endaily в четверг 15 мар. время 02 часа 46 минут.csv\"\n", | |
"5042 id в файле \"unzipped/5k_14_марта_12.04_15.03.2018.txt\"\n", | |
" 620 id в файле \"unzipped/620_15_марта_12.05_15.03.2018.txt\"\n" | |
] | |
} | |
], | |
"source": [ | |
"ids = dict({\n", | |
" 'des14': read_ids( join(folder, files[0])),\n", | |
" 'des15': read_ids(join(folder, files[2])),\n", | |
" 'th14': read_ids(join(folder, files[1])),\n", | |
" 'th15': read_ids(join(folder, files[3]))\n", | |
"})" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Объединим в один сет\n", | |
"Сет оставляет только уникальные значения. Объединяем в один сет оба дня из Дезертира. И в другой сет оба дня из ТХ." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Исходных id в файлах Дезертир: 1148\n", | |
"Уникальных id: 1148\n", | |
"\n", | |
"Исходных id в файлах TargetHunter: 5662\n", | |
"Уникальных id: 5661\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"def makeset(data, label):\n", | |
" set_ = set(data)\n", | |
" print(\n", | |
" \"Исходных id в файлах {}: {}\\nУникальных id: {}\\n\"\n", | |
" .format(label, len(data), len(set_))\n", | |
" )\n", | |
" return set_\n", | |
"\n", | |
"\n", | |
"set_des = makeset( ids['des14'] + ids['des15'], 'Дезертир')\n", | |
"set_th = makeset(ids['th14'] + ids['th15'], 'TargetHunter')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"В двух файлах ТХ какой-то один id присутствует дважды. Дубль был исключён, что привело к сокращению длины на 1." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Сравним сеты Дезертира и ТХ" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"1148" | |
] | |
}, | |
"execution_count": 26, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"match = set_des & set_th; len(match)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"В представленных даных все 1148 id Дезертира присутствуют и в файлах ТаргетХантера." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0 присутствуют в Дезертире, но отсутствуют в ТХ\n" | |
] | |
} | |
], | |
"source": [ | |
"des_only = set_des - set_th\n", | |
"print(len(des_only), \"присутствуют в Дезертире, но отсутствуют в ТХ\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"4513 присутствуют в ТХ, но отсутствуют в Дезертире\n" | |
] | |
} | |
], | |
"source": [ | |
"th_only = set_th - set_des\n", | |
"print(len(th_only), \"присутствуют в ТХ, но отсутствуют в Дезертире\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## данные Дезертира за предыдущие дни\n", | |
"Формат имени файла:\n", | |
"\n", | |
"id_группы, подчёркивание, дата и время в формате `ГГГГММДДЧЧММСС` (год месяц день часы минуты секунды)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 482 id в файле \"more_des/-25153764_20180228044544_in.csv\"\n", | |
" 447 id в файле \"more_des/-25153764_20180228205710_in.csv\"\n", | |
" 313 id в файле \"more_des/-25153764_20180301114331_in.csv\"\n", | |
" 454 id в файле \"more_des/-25153764_20180302033527_in.csv\"\n", | |
" 399 id в файле \"more_des/-25153764_20180302180820_in.csv\"\n", | |
" 438 id в файле \"more_des/-25153764_20180303090940_in.csv\"\n", | |
" 669 id в файле \"more_des/-25153764_20180304005636_in.csv\"\n", | |
" 339 id в файле \"more_des/-25153764_20180304153227_in.csv\"\n", | |
" 466 id в файле \"more_des/-25153764_20180305070013_in.csv\"\n", | |
" 590 id в файле \"more_des/-25153764_20180305232633_in.csv\"\n", | |
" 280 id в файле \"more_des/-25153764_20180306134750_in.csv\"\n", | |
" 414 id в файле \"more_des/-25153764_20180307063337_in.csv\"\n", | |
" 507 id в файле \"more_des/-25153764_20180307232323_in.csv\"\n", | |
" 280 id в файле \"more_des/-25153764_20180308152210_in.csv\"\n", | |
" 323 id в файле \"more_des/-25153764_20180309074534_in.csv\"\n", | |
" 619 id в файле \"more_des/-25153764_20180310012917_in.csv\"\n", | |
" 439 id в файле \"more_des/-25153764_20180310172017_in.csv\"\n", | |
" 465 id в файле \"more_des/-25153764_20180311094749_in.csv\"\n", | |
" 677 id в файле \"more_des/-25153764_20180312035235_in.csv\"\n", | |
" 623 id в файле \"more_des/-25153764_20180312223444_in.csv\"\n", | |
" 410 id в файле \"more_des/-25153764_20180313150432_in.csv\"\n" | |
] | |
} | |
], | |
"source": [ | |
"more_files = read_folder('more_des')\n", | |
"more_data = dict()\n", | |
"for filename in more_files:\n", | |
" more_data[filename] = read_ids('more_des/' + filename)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Сколько id из файлов предыдущих дней ОТСУТСТВУЮТ в файле от ТХ" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"482 from -25153764_20180228044544_in.csv are NOT in TH\n", | |
"447 from -25153764_20180228205710_in.csv are NOT in TH\n", | |
"312 from -25153764_20180301114331_in.csv are NOT in TH\n", | |
"454 from -25153764_20180302033527_in.csv are NOT in TH\n", | |
"399 from -25153764_20180302180820_in.csv are NOT in TH\n", | |
"438 from -25153764_20180303090940_in.csv are NOT in TH\n", | |
"669 from -25153764_20180304005636_in.csv are NOT in TH\n", | |
"338 from -25153764_20180304153227_in.csv are NOT in TH\n", | |
"466 from -25153764_20180305070013_in.csv are NOT in TH\n", | |
"590 from -25153764_20180305232633_in.csv are NOT in TH\n", | |
"280 from -25153764_20180306134750_in.csv are NOT in TH\n", | |
"414 from -25153764_20180307063337_in.csv are NOT in TH\n", | |
"6 from -25153764_20180307232323_in.csv are NOT in TH\n", | |
"1 from -25153764_20180308152210_in.csv are NOT in TH\n", | |
"0 from -25153764_20180309074534_in.csv are NOT in TH\n", | |
"0 from -25153764_20180310012917_in.csv are NOT in TH\n", | |
"1 from -25153764_20180310172017_in.csv are NOT in TH\n", | |
"0 from -25153764_20180311094749_in.csv are NOT in TH\n", | |
"0 from -25153764_20180312035235_in.csv are NOT in TH\n", | |
"0 from -25153764_20180312223444_in.csv are NOT in TH\n", | |
"0 from -25153764_20180313150432_in.csv are NOT in TH\n" | |
] | |
} | |
], | |
"source": [ | |
"for day in more_data:\n", | |
" not_in = set(more_data[day]) - th_only\n", | |
" print('{} from {} are NOT in TH'.format(len(not_in), day))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"В файлах за 8–13 марта в ТХ есть практически все обнаруженные Дезертиром id. Единичные различия могут быть связаны с вступлением и отпиской от группы через небольшое время.\n", | |
"\n", | |
"До 7-го марта уже все id обнаруженные Дезертиром не находятся в списке от ТХ. \n", | |
"\n", | |
"#### Значит, список ТХ, обозначенный 14-м числом, содержит в себе фактически id вступивших с 8 марта." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment