Skip to content

Instantly share code, notes, and snippets.

@sergiks
Last active March 15, 2018 14:04
Show Gist options
  • Save sergiks/ece86fd561a8745feb505e5f5c3b6028 to your computer and use it in GitHub Desktop.
Save sergiks/ece86fd561a8745feb505e5f5c3b6028 to your computer and use it in GitHub Desktop.
Deserter vs. TargetHunter
Display the source blob
Display the rendered blob
Raw
{
"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