<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>@vachana</title><generator>teletype.in</generator><description><![CDATA[@vachana]]></description><image><url>https://teletype.in/files/75/75a4ac5c-2ddf-4b44-a0ac-53a0d3ae6199.jpeg</url><title>@vachana</title><link>https://teletype.in/@vachana</link></image><link>https://teletype.in/@vachana?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vachana</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/vachana?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/vachana?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 13 May 2026 20:43:43 GMT</pubDate><lastBuildDate>Wed, 13 May 2026 20:43:43 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@vachana/SJ9iSCVyQ</guid><link>https://teletype.in/@vachana/SJ9iSCVyQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vachana</link><comments>https://teletype.in/@vachana/SJ9iSCVyQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vachana#comments</comments><dc:creator>vachana</dc:creator><title>Реклама.Гуру или как стать маркетологом</title><pubDate>Wed, 30 May 2018 06:37:27 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/dc/dca29384-99d2-4452-b5ab-c7726e7d6b1d.png"></media:content><category>Аналитика</category><category>python</category><category>sql</category><description><![CDATA[<img src="https://lh6.googleusercontent.com/zsGgVW52RSU0yxrR0SNaf9WwGgtOWKbXoExIuYLoQ7NzPwcKVOT-MhS7nGdYvb7w0sXrQ2Dq-iqMdZtATKL7sfrQZT69_8vVjsLT5QK2k0cZfz93nwNEJVvAM5w7oIWKNSvq2_uV"></img>Здесь все предельно просто: задачка на sql, задачка на анализ и логический квестик.]]></description><content:encoded><![CDATA[
  <p>Здесь все предельно просто: задачка на sql, задачка на анализ и логический квестик.</p>
  <p><strong>Задача на Sql:</strong></p>
  <p>Есть три таблицы:</p>
  <p>1. Справочник категорий (id, name). <em>Тут просто лежат названия категорий и айдишки, ничего сложного.</em></p>
  <p>2. Справочник сущностей (id, category_id, name). <em>Сущности, как я понимаю, что-то вроде подкатегорий или типов транзакций, но для нас они просто склейка между таблицами. Внутри одной категории может быть несколько сущностей, а к одной сущности может относиться несколько операций.</em></p>
  <p>3. Основная таблица записи операций (id, date_time, item_id, cost, revenue, profit). <em>Здесь item_id=id сущности, а profit это cost-revenue. Также сказано, что прибыль функционально зависит от цен покупки и продажи, таблица умышленно денормализована для упрощения выборок (кажется, это просто пояснение колонки profit).</em></p>
  <figure class="m_custom">
    <img src="https://lh6.googleusercontent.com/zsGgVW52RSU0yxrR0SNaf9WwGgtOWKbXoExIuYLoQ7NzPwcKVOT-MhS7nGdYvb7w0sXrQ2Dq-iqMdZtATKL7sfrQZT69_8vVjsLT5QK2k0cZfz93nwNEJVvAM5w7oIWKNSvq2_uV" width="505" />
  </figure>
  <p><strong>Задача</strong>:</p>
  <p>получить топ-10 по прибыльности операций за текущий день в разрезе категорий.</p>
  <h2><strong>Решение</strong>:</h2>
  <p>Сначала нужно закрепить названия за таблицами, так как в первичных данных этого нет.</p>
  <p>Допустим, что:</p>
  <ol>
    <li>справочник категорий - categories_table,</li>
    <li>справочник сущностей - items_table,</li>
    <li>таблица записи операций - operations_table.</li>
  </ol>
  <p>Теперь нам нужна база данных, чтобы проверять на ней наши запросы. Я использую MariaDB. Insert code:</p>
  <pre>/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=&#x27;NO_AUTO_VALUE_ON_ZERO&#x27; */;

-- Дамп структуры для таблица reclama_guru.categories_table
CREATE TABLE IF NOT EXISTS &#x60;categories_table&#x60; (
  &#x60;id&#x60; int(11) DEFAULT NULL,
  &#x60;name&#x60; varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Дамп данных таблицы reclama_guru.categories_table: ~3 rows (приблизительно)
/*!40000 ALTER TABLE &#x60;categories_table&#x60; DISABLE KEYS */;
INSERT INTO &#x60;categories_table&#x60; (&#x60;id&#x60;, &#x60;name&#x60;) VALUES
	(1, &#x27; Category 1&#x27;),
	(2, &#x27; Category 2&#x27;),
	(3, &#x27; Category 3&#x27;),
  (4, &#x27; Category 4&#x27;);

/*!40000 ALTER TABLE &#x60;categories_table&#x60; ENABLE KEYS */;

-- Дамп структуры для таблица reclama_guru.items_table
CREATE TABLE IF NOT EXISTS &#x60;items_table&#x60; (
  &#x60;id&#x60; int(11) DEFAULT NULL,
  &#x60;category_id&#x60; int(11) DEFAULT NULL,
  &#x60;name&#x60; varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

-- Дамп данных таблицы reclama_guru.items_table: ~3 rows (приблизительно)
/*!40000 ALTER TABLE &#x60;items_table&#x60; DISABLE KEYS */;
INSERT INTO &#x60;items_table&#x60; (&#x60;id&#x60;, &#x60;category_id&#x60;, &#x60;name&#x60;) VALUES
	(1, 1, &#x27;Item 100001&#x27;),
	(2, 1, &#x27;Item 100002&#x27;),
	(3, 2, &#x27;Item 100003&#x27;),
  (4, 5, &#x27;Item 100004&#x27;),
  (5, 3, &#x27;Item 100005&#x27;);
/*!40000 ALTER TABLE &#x60;items_table&#x60; ENABLE KEYS */;

-- Дамп структуры для таблица reclama_guru.operations_table
CREATE TABLE IF NOT EXISTS &#x60;operations_table&#x60; (
  &#x60;id&#x60; int(11) DEFAULT NULL,
  &#x60;date_time&#x60; datetime DEFAULT NULL,
  &#x60;item_id&#x60; int(11) DEFAULT NULL,
  &#x60;cost&#x60; float DEFAULT NULL,
  &#x60;revenue&#x60; float DEFAULT NULL,
  &#x60;profit&#x60; float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Дамп данных таблицы reclama_guru.operations_table: ~3 rows (приблизительно)
/*!40000 ALTER TABLE &#x60;operations_table&#x60; DISABLE KEYS */;
INSERT INTO &#x60;operations_table&#x60; (&#x60;id&#x60;, &#x60;date_time&#x60;, &#x60;item_id&#x60;, &#x60;cost&#x60;, &#x60;revenue&#x60;, &#x60;profit&#x60;) VALUES
	(1,&#x27;2018-04-18 0:00:01&#x27;,1,3.5,10,6.5),
(2,&#x27;2018-04-18 0:00:01&#x27;,1,3.8,9.8,6.0),
  (3,&#x27;2018-04-18 0:00:02&#x27;,3,5,4.9,-0.1),
  (4,&#x27;2018-04-18 0:00:02&#x27;,3,8,12,4.0),
  (5,&#x27;2018-04-18 0:00:01&#x27;,2,2,9.5,7.5),
  (6,&#x27;2018-04-18 0:00:01&#x27;,2,8,9.2,1.2),
  (7,&#x27;2018-04-18 0:00:02&#x27;,8,12,4.7,-7.3),
  (8,&#x27;2018-04-18 0:00:04&#x27;,1,3,3.4,0.4),
  (9,&#x27;2018-04-18 0:00:01&#x27;,1,0,9,9.0),
  (10,&#x27;2018-04-17 0:00:02&#x27;,2,4.3,1.2,-3.1),
  (11,&#x27;2018-04-18 0:00:01&#x27;,2,7.7,4.1,-3.6),
  (13,&#x27;2018-04-18 0:00:02&#x27;,3,0.3,9,8.7),
  (14,&#x27;2018-04-19 0:00:02&#x27;,9,5,7,2.0);

/*!40000 ALTER TABLE &#x60;operations_table&#x60; ENABLE KEYS */;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, &#x27;&#x27;) */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

</pre>
  <p>Далее определимся с итоговой выгрузкой, а именно ее видом. Нам точно понадобиться название и, для перестраховки, айди категории, прибыльность (profit), дата и время проведения операции и айди той самой операции, что бы если что восстановить все данные о ней.</p>
  <figure class="m_custom">
    <img src="https://lh6.googleusercontent.com/bvlJdIA8RxZnflolLlY3ZG2lrBthn8VZVxCwG9jI9Fz4tTT6Pv4LmNZUrkRKj5nXJ1qjyqAzc3G16JghSCmi6GCjeHcZTQiqXMszDC17i6R2fKmdXsiUXHEF7BXA2ck_hseqSr2C" width="602" />
  </figure>
  <p>Подготовка на этом закончена, пора и код писать.</p>
  <p>Основа кода здесь это соединение 3х таблиц. Я выбрала inner join для справочников, поскольку нам нужны только те категории, в которых прописаны сущности и наоборот. Для соединения с таблицей операций я использовала left join, поскольку операции без категорий тоже могут быть полезны при анализе. В случае если такие появлялись в выборке, они помечались как &#x27;no_catagory&#x27; и считались отдельной категорией.</p>
  <p>Для выборки топ 10, я использовала функцию row_number() с сортировкой по прибыли и выбрала только те строки, где значение было ниже 10.</p>
  <p>Вот и все . Никакой магии.</p>
  <pre>select id as transaction_id, coalesce(category,&#x27;no_catagory&#x27;) as category_name, item_id, date_time, profit, top
from
(select *,
row_number() over (partition by category order by profit desc) as top
from
(select *
from operations_table
where date(date_time)=date(&#x27;2018-04-18&#x27;))a
left join
(select a.name as category,a.id as category_id, b.id as item_id from
(select * from categories_table)a
inner join
(select * from items_table)b
on a.id=b.category_id
group by a.name,a.id,b.id)b
using(item_id))a where top&lt;=10
group by id,category, item_id, date_time, profit, top
order by category_name, top

</pre>
  <hr />
  <h2>Задача на статистику:</h2>
  <p>Представлено 200 измерений (первые 200 строк), каждое содержит значение 5 признаков(A,B,C,D,E) и 1 показатель (R).</p>
  <figure class="m_custom">
    <img src="http://dl4.joxi.net/drive/2018/05/24/0021/3146/1432650/50/b62f95e2c1.png" width="607" />
  </figure>
  <p><strong>Задача:</strong></p>
  <p>1. построить модель зависимости показателя от признаков (подсказка: не все из признаков могут влиять на показатель),</p>
  <p>2. предсказать значение показателя на основе значений признаков для последних 10 строк.</p>
  <h2>Решение:</h2>
  <p>Для начала посмотрим, чем это можно решать.</p>
  <p>Первое, что приходит в голову, кончено же, excel, а точнее google spreadsheets. Для них есть хороший пакет <strong>XLMiner Analysis ToolPak </strong>с полным набором всякой аналитической всячины. Тут тебе и регрессии, и Anova, и вообще много чего. Но как и всякий пакет на таблицы, эта штука работает сложно и поверить ей - не самое легкое дело.</p>
  <p>По результатам не долгих игр с линейной регрессией, кажется будто влияют на показатель данные из B,D,E.</p>
  <p>Тут не выдержало мое сердечко трудностей использования excel, и мы переходим к Python.</p>
  <p>В основном я пользовалась статьей о множественной регрессии с <a href="https://habr.com/post/206306/" target="_blank">Хабра</a>.</p>
  <p>Итак мы смотрим на корреляцию показателей.</p>
  <figure class="m_custom">
    <img src="http://dl3.joxi.net/drive/2018/05/25/0030/0356/2023780/80/29d0ba2b7e.png" width="440" />
  </figure>
  <p>Тут явно видно, что B и D имеют хоть какой то вес и влияние. В принципе, E тоже ничего, но маловато. Посмотрим через тепловую карту.</p>
  <p>И снова с R сильно коррелируют B и D. Далее все вычисления производились в Ipython notebook: <a href="https://github.com/anyvachana/Guru/tree/master" target="_blank">проект в Git</a>.</p>
  <p>В итоге победила KNeighborsRegressor модель. Предсказанные значения R:</p>
  <figure class="m_custom">
    <img src="http://dl3.joxi.net/drive/2018/06/08/0030/0356/2023780/80/1066bfef5d.png" width="812" />
  </figure>
  <hr />
  <h2>Задача на логику:</h2>
  <p>Василий каждый день приходит на работу в офис. Каждый раз когда Василий заходит в свой кабинет в офисе раздаётся звук кукушки, оповещающий сотрудников о начале рабочего дня.</p>
  <p><strong>Задача</strong>:</p>
  <ol>
    <li>Является ли приход Василия на работу причиной звука кукушки?</li>
    <li>Как можно доказать наличие или отсутствие причинно-следственной связи?</li>
  </ol>
  <h2>Решение:</h2>
  <p>Итак, у нас есть событие A - появление Василия в офисе с целью немного поработать, и событие B - крик пушки - кукушки.</p>
  <p>Возможно, Василий и есть кукушка?</p>
  <p>Так или иначе, для доказательства связи между событиями, нам нужно определить есть ли ситуации, когда кукушка выполняет свой долг без Василия или, может, Василий пришел на работу раньше и кукушка сработала до срока?</p>
  <p>Получив дополнительные данные можно было бы воспользоваться методом сопутствующих изменений.</p>
  <blockquote><strong>Метод сопутствующих изменений </strong>заключается в том, что, если какое-либо отдельно взятое явление изменяется каждый раз при изменении другого явления, с определенной степенью вероятности можно предположить, что второе явление влечет изменение первого и, следовательно, они находятся в причинной взаимозависимости.</blockquote>
  <p>Однако, на данный момент, взаимосвязь между событиями кажется очевидной, но невозможно утверждать является ли событие A следствием или причиной события B.</p>

]]></content:encoded></item></channel></rss>