<?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>Vladi PATOK</title><generator>teletype.in</generator><description><![CDATA[Vladi PATOK]]></description><image><url>https://img3.teletype.in/files/a5/71/a571671c-52d0-48f6-be99-e3b0b2c0d7e4.png</url><title>Vladi PATOK</title><link>https://teletype.in/@vladimirvanalytics</link></image><link>https://teletype.in/@vladimirvanalytics?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/vladimirvanalytics?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/vladimirvanalytics?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sun, 05 Apr 2026 16:07:42 GMT</pubDate><lastBuildDate>Sun, 05 Apr 2026 16:07:42 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@vladimirvanalytics/analytics_skills</guid><link>https://teletype.in/@vladimirvanalytics/analytics_skills?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics</link><comments>https://teletype.in/@vladimirvanalytics/analytics_skills?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics#comments</comments><dc:creator>vladimirvanalytics</dc:creator><title>Какими навыками должен обладать аналитик данных?</title><pubDate>Mon, 25 Sep 2023 14:47:51 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/9d/b2/9db2464a-ca92-4ff4-8189-b43c9fd50850.png"></media:content><category>parser</category><description><![CDATA[<img src="https://img4.teletype.in/files/7b/6c/7b6c4046-e3ac-4334-bee0-3449e4782a32.png"></img>Задался вопросом какими навыками должен обладать аналитик данных и чтобы не рыть весь интернет, решил провести свое мини исследование.]]></description><content:encoded><![CDATA[
  <p id="ZEa9">Задался вопросом, какими навыками должен обладать аналитик данных, и чтобы не рыть весь интернет, решил провести своё мини-исследование.</p>
  <p id="aTLE">На сегодняшний день, 25.09.2023, на hh.ru 607 вакансий по запросу &quot;аналитик данных&quot; и 292 по запросу &quot;Data analyst&quot;. Соберу описание всех вакансий и построю облако тегов.</p>
  <figure id="wBXm" class="m_retina">
    <img src="https://img4.teletype.in/files/3f/3c/3f3c3fbb-2022-4f2f-afc7-337607089f64.png" width="471.5" />
  </figure>
  <figure id="aI1U" class="m_retina">
    <img src="https://img4.teletype.in/files/33/29/33299b69-f611-4188-bfcb-fe9f474307e3.png" width="469.5" />
  </figure>
  <h2 id="vqlZ">Поехали</h2>
  <p id="3Obp">Первое облако </p>
  <figure id="oZfE" class="m_original">
    <img src="https://img1.teletype.in/files/48/db/48dba754-4643-4a4f-989c-c0da52a6f61c.png" width="877" />
  </figure>
  <p id="htWM">Из этого облака не видно, какие навыки необходимы — алгоритм просто показал наиболее употребляемые слова. Добавляю нерелевантные фразы в список минус-слов (например, что-то из интернет-маркетинга).</p>
  <h2 id="CaEI">Второй раунд</h2>
  <p id="jmEY">Добавил список минус слов. </p>
  <figure id="hNAr" class="m_original">
    <img src="https://img3.teletype.in/files/60/25/60255bda-3d05-4883-8d45-77975943baa6.png" width="821" />
  </figure>
  <p id="kHm3">В этом варианте уже можно рассмотреть некоторые теги, однако слова &quot;данные&quot;, &quot;анализ&quot; мешают. Добавлю их в список.</p>
  <figure id="0Di2" class="m_original">
    <img src="https://img3.teletype.in/files/ed/4b/ed4bf524-97d9-413b-ba75-bc0b5571f401.png" width="839" />
  </figure>
  <p id="7DJK">Уже лучше, но всё равно много &quot;шума&quot;.</p>
  <h2 id="oEZk">Третий вариант</h2>
  <figure id="3CwQ" class="m_original">
    <img src="https://img4.teletype.in/files/3b/80/3b806121-2c2c-4007-b6ec-4f9784ebc9de.png" width="819" />
  </figure>
  <p id="TuSH">Могу предположить, что вы <strong><u><em>должны уметь разбираться в бизнес-процессах</em></u></strong>. Добавлю &quot;бизнес&quot;, &quot;процесс&quot;, &quot;работа&quot;, &quot;рост&quot;, &quot;информация&quot;, &quot;современный&quot; в список минус-слов.</p>
  <figure id="D1Py" class="m_original">
    <img src="https://img1.teletype.in/files/07/56/0756c188-eb22-4017-8adc-c444b1fe93f2.png" width="828" />
  </figure>
  <p id="IqII">Здесь уже можно рассмотреть SQL, Excel, Python, визуализацию. А также выделяются &quot;отчёт&quot;, &quot;построение&quot;.</p>
  <p id="pUPD">Делаем вывод: <strong><em><u>умение построить и визуализировать отчёт, сбор и обработка данных. </u></em></strong></p>
  <p id="LY2i">Разобрались с &quot;умением&quot; - добавлю его в список минус слов.</p>
  <h2 id="sAjr">Окончательный вариант</h2>
  <p id="tZ9b">Максимально окончательный вариант. Добавил больше 300 минус-слов, со словоформами и вот итог:</p>
  <figure id="4oZi" class="m_original">
    <img src="https://img3.teletype.in/files/6c/23/6c235ca5-e611-4277-b33e-675dfcfb2d97.png" width="821" />
  </figure>
  <p id="mqgj"><em><strong>В любом случае придется работать как бы намёк!</strong></em></p>
  <p id="8PnP">Делаем вывод, для аналитика данных, основные навыки:</p>
  <ul id="E4Nu">
    <li id="4HI3">Умение работать)</li>
    <li id="mBJD">Построение различный моделей</li>
    <li id="YRGl">Визуализация отчетов</li>
    <li id="EK38">Умение разбираться в бизнес процессах</li>
    <li id="rtlB">Умеете sql, python, excel</li>
  </ul>
  <p id="LcAv"></p>
  <h2 id="IX1p">Финал</h2>
  <p id="jKVN">После двух дней и 3000 минус-слов, получилось добраться до технологий</p>
  <figure id="uEpm" class="m_original">
    <img src="https://img2.teletype.in/files/91/dc/91dc78bc-9e00-4bbb-936d-4f248560d178.png" width="815" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@vladimirvanalytics/cars_predict</guid><link>https://teletype.in/@vladimirvanalytics/cars_predict?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics</link><comments>https://teletype.in/@vladimirvanalytics/cars_predict?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics#comments</comments><dc:creator>vladimirvanalytics</dc:creator><title>Предсказание цены автомобиля с помощью методов машинного обучения</title><pubDate>Sat, 23 Sep 2023 22:14:13 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/03/af/03af0697-6f26-4db2-bc36-ec7bf682228e.png"></media:content><category>machine learning</category><description><![CDATA[<img src="https://img1.teletype.in/files/0a/85/0a85d267-cf69-4fd2-b3b1-775c6c133bed.png"></img>В прошлом посте провели разведочный анализ данных по автомобилям собранным с сайта.]]></description><content:encoded><![CDATA[
  <p id="Q6N7">В прошлом <a href="https://teletype.in/@vladimirvanalytics/pandas_eda_analysis" target="_blank">посте</a> провел разведочный анализ данных по автомобилям собранным с сайта. </p>
  <p id="jXeG">В этом посте применим методы машинного обучения чтобы попытаться предсказать цену автомобиля.</p>
  <p id="lI2v">Вот несколько алгоритмов, которые могут подойти для этой задачи:</p>
  <ol id="MNlc">
    <li id="bWFG"><strong>Линейная регрессия (Linear Regression)</strong>:</li>
    <ul id="vZhq">
      <li id="wzOK">Простой и интерпретируемый метод.</li>
      <li id="3Fj2">Хорошо работает, если существует линейная зависимость между признаками и целевой переменной.</li>
    </ul>
    <li id="4jQg"><strong>Решающие деревья (Decision Trees) и Случайный лес (Random Forest)</strong>:</li>
    <ul id="Jfgm">
      <li id="PFDV">Могут улавливать нелинейные зависимости.</li>
      <li id="QRxB">Random Forest обычно предоставляет более точные прогнозы, чем отдельное решающее дерево, за счет усреднения прогнозов множества деревьев.</li>
    </ul>
    <li id="eUD1"><strong>Градиентный бустинг (Gradient Boosting)</strong>, например, XGBoost или LightGBM:</li>
    <ul id="8IjS">
      <li id="Jtws">Эффективные алгоритмы, которые часто показывают высокую производительность в задачах регрессии.</li>
      <li id="JN6z">Они строят ансамбль деревьев последовательно, каждое следующее дерево пытается исправить ошибки предыдущих.</li>
    </ul>
    <li id="vsUC"><strong>Нейронные сети (Neural Networks)</strong>:</li>
    <ul id="begf">
      <li id="Qgi4">Могут быть полезными, если у вас большое количество данных.</li>
      <li id="gnUA">Способны улавливать сложные нелинейные зависимости.</li>
    </ul>
  </ol>
  <p id="CXgd"></p>
  <h3 id="Iaz5">Линейная регрессия</h3>
  <p id="BTUY">Линейная регрессия предполагает, что мы хотим прогнозировать одну переменную на основе других переменных. </p>
  <p id="0ArT"></p>
  <pre id="aDw1" data-lang="python"># Разделение данных на обучающие и тестовые 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)</pre>
  <pre id="84Wh" data-lang="python"># Создание и обучение модели 
LR = LinearRegression() 
LR.fit(X_train, y_train)</pre>
  <pre id="3iGP" data-lang="python"># Прогнозирование 
y_pred = LR.predict(X_test)
</pre>
  <pre id="DpTy" data-lang="python"># Оценка модели 
mse = mean_squared_error(y_test, y_pred) 
rmse = mean_squared_error(y_test, y_pred, squared=False) 
mae = mean_absolute_error(y_test, y_pred) 
r2 = r2_score(y_test, y_pred) 
adj_r2 = 1 - (1-r2)*(len(y_test)-1)/(len(y_test)-X_test.shape[1]-1) 
print(f&#x27;Mean Squared Error: {mse}&#x27;) 
print(f&#x27;Root Mean Squared Error: {rmse}&#x27;) 
print(f&#x27;Mean Absolute Error: {mae}&#x27;) 
print(f&#x27;R^2: {r2}&#x27;) 
print(f&#x27;Adjusted R^2: {adj_r2}&#x27;)
Mean Squared Error: 16902445328.964172 
Root Mean Squared Error: 130009.40477120943 
Mean Absolute Error: 102777.23299243717 
R^2: 0.3387269809586828 Adjusted 
R^2: 0.3318098991695476</pre>
  <p id="Vkvx">интерпретируем метрики:</p>
  <ol id="IxF9">
    <li id="LDPS"><strong>Mean Squared Error (MSE): 16,902,445,328.96</strong><br />MSE является мерой качества, где меньшее значение MSE указывает на лучшее качество. Это значение довольно высокое, что может указывать на наличие больших ошибок между фактическими и прогнозируемыми значениями.</li>
    <li id="LtwK"><strong>Root Mean Squared Error (RMSE): 130,009.40</strong><br />RMSE интерпретируется в тех же единицах измерения, что и исходные данные (в данном случае, цена). Модель ошибается в среднем на 130,009.40  рублей при прогнозировании цены.</li>
    <li id="4Mp2"><strong>Mean Absolute Error (MAE): 102,777.23</strong><br />MAE представляет собой среднюю абсолютную ошибку между прогнозируемыми и фактическими значениями. Это говорит о том, что модель в среднем ошибается на 102,777.23 единиц.</li>
    <li id="IOCr"><strong>R^2: 0.3387</strong><br />R^2 измеряет долю дисперсии зависимой переменной, объясненную моделью. Значение 0.3387 говорит о том, модель объясняет только 33.87% дисперсии в данных. Это довольно низкое значение, что указывает на то, что модель может быть не очень хорошо подобрана или что может быть много нерассмотренных или нерелевантных признаков.</li>
    <li id="S8Wx"><strong>Adjusted R^2: 0.3318</strong><br />Это корректировка R^2, учитывающая количество признаков в модели. Поскольку оно близко к обычному R^2</li>
  </ol>
  <p id="2f5S">В целом, на основе представленных метрик, модель не идеальна и может потребовать доработки. Это может включать добавление новых признаков, преобразование существующих признаков, проверку на наличие выбросов в данных или использование другой модели для прогнозирования.</p>
  <figure id="i43p" class="m_original">
    <img src="https://img1.teletype.in/files/0a/85/0a85d267-cf69-4fd2-b3b1-775c6c133bed.png" width="387" />
  </figure>
  <p id="JuPT"></p>
  <h3 id="8hzg">Настройка модели</h3>
  <p id="cO4l">Проверяем на наличием выбросов. </p>
  <figure id="xquG" class="m_original">
    <img src="https://img4.teletype.in/files/7c/0f/7c0fc578-46f4-4ee0-8b24-d84365c8cd34.png" width="939" />
    <figcaption>Красным выделены значения которые считаются выбросами</figcaption>
  </figure>
  <pre id="HSQ5" data-lang="python">#Есть выбросы их надо удалить
for column in [&#x27;price&#x27;, &#x27;Year&#x27;,&#x27;Mileage&#x27;,&#x27;Power&#x27;]:
  # если столбец числовой  
  Q1 = data[column].quantile(0.25)  
  Q3 = data[column].quantile(0.75)  IQR = Q3 - Q1
  # Границы выбросов  
  lower_bound = Q1 - 1.5 * IQR  
  upper_bound = Q3 + 1.5 * IQR
  # Отфильтровать выбросы  
  data = data[(data[column] &gt;= lower_bound) &amp; (data[column] &lt;= upper_bound)]</pre>
  <p id="K6jZ"></p>
  <figure id="loY3" class="m_original">
    <img src="https://img4.teletype.in/files/7e/9d/7e9d1c8a-450a-4f6d-8392-c23a4a99cbea.png" width="941" />
  </figure>
  <figure id="KkkR" class="m_original">
    <img src="https://img3.teletype.in/files/61/37/61370561-86c4-4290-bfa5-2a71ebf99722.png" width="393" />
  </figure>
  <p id="HB52">Удаление выбросов не помогло.</p>
  <p id="6bNP"></p>
  <p id="KsGb">Полный код есть на <a href="https://github.com/vladbegin/pandas_eda_analysis/blob/main/_avito_car_analyze_ipynb_.ipynb" target="_blank">github</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@vladimirvanalytics/t-kavFplHSf</guid><link>https://teletype.in/@vladimirvanalytics/t-kavFplHSf?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics</link><comments>https://teletype.in/@vladimirvanalytics/t-kavFplHSf?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics#comments</comments><dc:creator>vladimirvanalytics</dc:creator><title>Продвинутые возможности SQL: Погружение в конструкцию WITH</title><pubDate>Sat, 23 Sep 2023 19:55:16 GMT</pubDate><description><![CDATA[Многие специалисты по базам данных начинают свой путь с изучения основ SQL. Они быстро осваивают базовые запросы, такие как SELECT, INSERT, UPDATE и DELETE. Однако после освоения этих базовых навыков многие останавливаются, полагая, что это достаточно для большинства задач. На самом деле, SQL предлагает гораздо более мощные инструменты, которые могут существенно упростить и оптимизировать вашу работу с данными. Одним из таких инструментов является конструкция WITH, также известная как Common Table Expressions (CTE).]]></description><content:encoded><![CDATA[
  <p id="YvDY">Многие специалисты по базам данных начинают свой путь с изучения основ SQL. Они быстро осваивают базовые запросы, такие как <code>SELECT</code>, <code>INSERT</code>, <code>UPDATE</code> и <code>DELETE</code>. Однако после освоения этих базовых навыков многие останавливаются, полагая, что это достаточно для большинства задач. На самом деле, SQL предлагает гораздо более мощные инструменты, которые могут существенно упростить и оптимизировать вашу работу с данными. Одним из таких инструментов является конструкция <code>WITH</code>, также известная как Common Table Expressions (CTE).</p>
  <h3 id="0Gz7">Что такое CTE (Common Table Expressions)?</h3>
  <p id="7yyx">CTE представляет собой временный результат запроса, который можно использовать в последующем запросе. Это похоже на создание временной таблицы, но CTE существует только во время выполнения запроса.</p>
  <h3 id="qN3S">Преимущества использования CTE:</h3>
  <p id="h5Pf">Допустим у нас есть таблица <code>org_structure</code>, которая представляет собой иерархическую структуру организации. Нам нужно получить полный путь иерархии для каждого сотрудника.</p>
  <pre id="9CgU" data-lang="sql">WITH Hierarchy AS (
    -- Базовый случай: верхний уровень иерархии (например, компания)
    SELECT ID, Name, ParentID, 
           CAST(Name AS VARCHAR(255)) AS Path
    FROM org_structure
    WHERE ParentID IS NULL

    UNION ALL

    -- Рекурсивный случай: добавляем каждый следующий уровень иерархии
    SELECT o.ID, o.Name, o.ParentID,
           CAST(h.Path + &#x27; -&gt; &#x27; + o.Name AS VARCHAR(255))
    FROM org_structure o
    JOIN Hierarchy h ON o.ParentID = h.ID
)

SELECT Path AS Hierarchy
FROM Hierarchy
WHERE Name = &#x27;Сотрудник&#x27;
ORDER BY Path;</pre>
  <p id="7cO0">Иерархические структуры данных часто встречаются в реальной жизни, особенно в организационных структурах, деревьях категорий и так далее. Также часто такие задания дают на собеседованиях. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@vladimirvanalytics/pandas_eda_analysis</guid><link>https://teletype.in/@vladimirvanalytics/pandas_eda_analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics</link><comments>https://teletype.in/@vladimirvanalytics/pandas_eda_analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics#comments</comments><dc:creator>vladimirvanalytics</dc:creator><title>Разведочный анализ данных с использованием библиотеки Pandas</title><pubDate>Sat, 23 Sep 2023 07:21:35 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/39/8e/398ef1c1-666d-4113-ac41-bd9f24ecb2c0.png"></media:content><category>Pandas</category><description><![CDATA[<img src="https://img1.teletype.in/files/42/20/4220c2ca-5a50-45b2-a6b6-edfdc5107ce5.png"></img>В прошлой статье собрал данные с сайта о продаже автомобилей, и теперь хочу провести первичный анализ этих данных.]]></description><content:encoded><![CDATA[
  <p id="cSGO">В прошлой<a href="https://teletype.in/@vladimirvanalytics/parsing_avito" target="_blank"> статье </a>собрал данные с сайта о продаже автомобилей, и теперь хочу провести первичный анализ этих данных.</p>
  <p id="toSN"></p>
  <pre id="XMSu" data-lang="python">import pandas as pd

# Загружаем данные из CSV
data = pd.read_csv(&quot;path_to_file.csv&quot;)</pre>
  <p id="za2F"></p>
  <h4 id="bDLg">2. Осмотр данных</h4>
  <pre id="cNvk" data-lang="python"># Первые 5 записей
print(data.head())

# Основная информация о данных
print(data.info())

# Описательная статистика
print(data.desc</pre>
  <h4 id="ybvh">3. Проверка пропущенных значений</h4>
  <pre id="CNyK" data-lang="python"># Считаем количество пропущенных значений для каждой колонки
print(data.isnull().sum())</pre>
  <h4 id="5b2Z">4. Визуализация данных</h4>
  <pre id="6VwX" data-lang="python">import matplotlib.pyplot as plt
import seaborn as sns
f# График средней цены автомобилей по годам выпуска
avg_price_per_year.plot(kind=&#x27;bar&#x27;)
plt.title(&quot;Средняя цена автомобилей по годам&quot;)
plt.ylabel(&quot;Средняя цена&quot;)
plt.xlabel(&quot;Год выпуска&quot;)
plt.show()</pre>
  <figure id="hTmh" class="m_original">
    <img src="https://img3.teletype.in/files/60/eb/60ebc464-58a5-41d3-a1e8-7dcc66b0f39b.png" width="567" />
  </figure>
  <h3 id="OidP">Ящик с усами. Ищу выбросы</h3>
  <pre id="4S7S" data-lang="python">data.plot(kind=&#x27;box&#x27;, subplots=True, layout=(4,4), sharex=False, sharey=False, figsize=(15,18))
plt.show()</pre>
  <figure id="QeQD" class="m_retina">
    <img src="https://img1.teletype.in/files/04/e9/04e92c26-da44-4f47-94e6-295b1395ac88.png" width="628" />
  </figure>
  <h3 id="XZSd">Scatter plot</h3>
  <pre id="6yvJ" data-lang="python">f plt.figure(figsize=(15, 10))
sns.stripplot(data=data, x=&quot;Year&quot;, y=&quot;price&quot;)
plt.axhline(y=data[&#x27;price&#x27;].quantile(0.25), color=&#x27;green&#x27;, label=&#x27;Цена ниже рынка&#x27;)
plt.axhline(y=data[&#x27;price&#x27;].quantile(0.5), color=&#x27;blue&#x27;, label=&#x27;средняя цена по рынку&#x27;)
plt.axhline(y=data[&#x27;price&#x27;].quantile(0.75),color=&#x27;red&#x27;, label=&#x27;цена выше рынка&#x27;)
plt.axvline(x=&#x27;2013&#x27;, label=&#x27;Медианный год&#x27;)
plt.axvline(x=&#x27;2011&#x27;, label=&#x27;25% самых старых автомобилей&#x27; )
plt.axvline(x=&#x27;2016&#x27;,label=&#x27;25% самых молодых автомобилей&#x27;)
plt.legend(loc=&quot;upper right&quot;)
plt.show()</pre>
  <figure id="5ThY" class="m_retina">
    <img src="https://img3.teletype.in/files/e3/9f/e39ffac6-babb-493c-b033-f809227dd468.png" width="616.5" />
  </figure>
  <hr />
  <p id="vmrg">Эти базовые операции помогут быстро оценить собранные данные, увидеть основные тенденции и определить направления для дальнейшего анализа.</p>
  <p id="6CLs"></p>
  <p id="WZqq">C полным кодом можно знакомиться на <a href="https://github.com/vladbegin/pandas_eda_analysis/blob/main/_avito_car_analyze_ipynb_.ipynb" target="_blank">github</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@vladimirvanalytics/parsing_avito</guid><link>https://teletype.in/@vladimirvanalytics/parsing_avito?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics</link><comments>https://teletype.in/@vladimirvanalytics/parsing_avito?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics#comments</comments><dc:creator>vladimirvanalytics</dc:creator><title>Парсинг данных с avito.ru: Введение и Первые шаги</title><pubDate>Sat, 23 Sep 2023 06:54:55 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/cc/6e/cc6e2229-6113-49c6-849d-609f4cf1d1e2.png"></media:content><category>scraping</category><description><![CDATA[<img src="https://img3.teletype.in/files/6e/94/6e945f1e-9a4b-404e-a0cc-52c8a1b8cdd5.gif"></img>Avito.ru - один из крупнейших рекламных сайтов в России, и извлечение информации с него может быть полезным для многих задач: от изучения рынка до анализа конкурентов.]]></description><content:encoded><![CDATA[
  <p id="WAoS">Avito.ru - один из крупнейших рекламных сайтов в России, и извлечение информации с него может быть полезным для многих задач: от изучения рынка до анализа конкурентов.</p>
  <p id="e1kv"><strong>Основные понятия</strong></p>
  <ul id="7iur">
    <li id="EaJl"><strong>Selenium</strong> - инструмент для автоматизации браузерных действий, часто используется для тестирования веб-приложений или парсинга данных.</li>
    <li id="Hxah"><strong>Python</strong> - высокоуровневый язык программирования, который из-за своей универсальности и доступности стал стандартом в анализе данных и веб-парсинге.</li>
    <li id="wSCR"><strong>Базы данных</strong> - это структурированные наборы данных, которые могут легко быть доступны, управляемы и обновляемы.</li>
  </ul>
  <p id="C5fW"></p>
  <p id="HeZ3"><strong>Подготовка к работе</strong><br />Прежде всего, вам потребуется установить необходимое программное обеспечение:</p>
  <ul id="y9Xj">
    <li id="f8xq">Убедитесь, что у вас установлен Python. Если нет, его можно скачать <a href="https://www.python.org/downloads/" target="_blank">здесь</a>.</li>
    <li id="7UcI">Установите библиотеку Selenium. Это можно сделать с помощью pip:</li>
  </ul>
  <pre id="31mQ" data-lang="python">pip install selenium</pre>
  <p id="6GlI">Также рекомендуется установить браузерный драйвер для Selenium, например, для Chrome - chromedriver.</p>
  <figure id="EwJ5" class="m_retina">
    <img src="https://img3.teletype.in/files/6e/94/6e945f1e-9a4b-404e-a0cc-52c8a1b8cdd5.gif" width="607.5" />
  </figure>
  <p id="iQkA"><strong>Пример кода</strong><br />Вот простой пример того, как можно использовать Selenium для открытия браузера и перехода на avito.ru:</p>
  <pre id="x2Dt" data-lang="python">from selenium import webdriver

driver = webdriver.Chrome(executable_path=&#x27;path_to_chromedriver&#x27;)
driver.get(&#x27;https://www.avito.ru&#x27;)</pre>
  <figure id="n6VO" class="m_retina">
    <img src="https://img4.teletype.in/files/7c/d1/7cd1cb1f-24ca-4b49-b3fd-d810a74d191b.gif" width="607.5" />
  </figure>
  <h3 id="mrny">Поиск и взаимодействие с элементами сайта</h3>
  <p id="YDVp">Мы начинаем с доступа к URL с объявлениями о продаже автомобилей. Затем извлекаем количество объявлений на сайте и определяем количество страниц, которые нужно будет обработать.</p>
  <p id="vqPk">Далее, для каждой страницы, мы извлекаем ссылки на все объявления и сохраняем их в csv файл.</p>
  <p id="Pfat"><strong>Ищу ссылки на все объявления на странице</strong></p>
  <pre id="J1KC" data-lang="python">ads_elements = driver.find_elements(by=By.XPATH, 
                                    value=&#x27;//a[@data-marker=&quot;item-title&quot;]&#x27;)</pre>
  <p id="45yZ"></p>
  <p id="nb5L"><strong>Ищу количество объявлений </strong></p>
  <pre id="YJOn" data-lang="python">ads_count = driver.find_element(by=By.XPATH, value=&quot;//span[@data-marker=&#x27;page-title/count&#x27;]&quot;).text.replace(&#x27; &#x27;,&#x27;&#x27;)</pre>
  <ol id="zScQ">
    <li id="A2aj"><strong>by=By.XPATH</strong>:</li>
    <ul id="QI18">
      <li id="SUOz">Здесь используется метод поиска элемента по XPath. XPath (XML Path Language) — это язык, который позволяет определить местоположение элемента на веб-странице.</li>
    </ul>
    <li id="7SE4"><strong>value=&quot;//span[@data-marker=&#x27;page-title/count&#x27;]&quot;</strong>:</li>
    <ul id="tZ5P">
      <li id="zSHE">Это конкретный XPath запрос. Он ищет элемент <code>span</code> с атрибутом <code>data-marker</code>, значение которого равно &#x27;page-title/count&#x27;.</li>
    </ul>
    <li id="JIHz"><strong>.text</strong>:</li>
    <ul id="USyU">
      <li id="2sC6">Это свойство возвращает текстовое содержимое найденного элемента. То есть после того как вы нашли нужный элемент на странице.</li>
    </ul>
    <li id="uswf"><strong>.replace(&#x27; &#x27;,&#x27;&#x27;)</strong>:</li>
    <ul id="2tiT">
      <li id="wD9D">Этот метод строки Python заменяет все пробелы в строке на пустую строку, то есть удаляет их. Это может быть полезно, если в текстовом содержимом элемента есть пробелы, которые вы хотите удалить.</li>
    </ul>
  </ol>
  <p id="Umcn">В итоге, переменная <code>ads_count</code> будет содержать текстовое значение из элемента <code>span</code> без пробелов. </p>
  <p id="BT8R">Зная, что на каждой странице отображается 50 объявлений, рассчитываю общее количество страниц на сайте.</p>
  <pre id="4nbz" data-lang="python">if ads_count % 50 &gt; 0:
    page_count = (ads_count // 50) + 1
else:
    page_count = ads_count // 50</pre>
  <ul id="HNni">
    <li id="pL2L"><code>ads_count % 50</code> определяет остаток от деления количества объявлений на 50.</li>
    <li id="CnWb">Если остаток больше 0, это значит, что на последней странице будет менее 50 объявлений, поэтому нужно добавить еще одну страницу (<code>(ads_count // 50) + 1</code>).</li>
    <li id="WyIJ">В противном случае (если объявлений ровно 50 или кратно 50), общее количество страниц будет равно <code>ads_count // 50</code>.</li>
  </ul>
  <p id="zDWZ">Теперь, зная <code>page_count</code>, можно определить, сколько раз нужно будет переходить на следующую страницу, чтобы обработать все объявления на сайте.</p>
  <p id="SCde"><strong>Пагинация по страницам</strong></p>
  <pre id="D4V5" data-lang="python">for page in range(1, page_count + 1):
    driver.get(f&quot;{url}&amp;p={page}&quot;)    
    driver.implicitly_wait(3)    
    ads_elements = driver.find_elements(by=By.XPATH, 
                                        value=&#x27;//a[@data-marker=&quot;item-title&quot;]&#x27;) 
    
    for ad in ads_elements:
            link = ad.get_attribute(&quot;href&quot;)        
            #Записываем ссылку на страницу с объявлениями в csv
            with open(&quot;info.csv&quot;, mode=&#x27;a&#x27;, encoding=&#x27;utf-8-sig&#x27;) as csv_file:
             writer = csv.writer(csv_file)    
             # Записываем данные    
             writer.writerow((url))</pre>
  <p id="T5BP">Этот код переходит на следующую страницу сайта. К базовому URL сайта, добавляется параметр <code>p</code>, который указывает на номер страницы. Ищет на странице все объявления, и записывает их в файл csv</p>
  <figure id="eM1J" class="m_retina">
    <img src="https://img1.teletype.in/files/4b/55/4b5513fb-4358-446c-af9e-c019da1746f8.gif" width="607.5" />
  </figure>
  <p id="Jlua">Отлично, теперь у нас есть все ссылки на объявления. </p>
  <h3 id="fhK1">Собираем технические характеристики автомобиля</h3>
  <p id="qBrz"></p>
  <pre id="qBrz" data-lang="python">data = []
def open_info_csv():
    # Инициализация драйвера
    with open(&quot;info.csv&quot;, mode=&#x27;r&#x27;, encoding=&#x27;utf-8-sig&#x27;) as csv_file:
        reader = csv.reader(csv_file)
        for row in reader:
        data.append(row)
# Вызываем функцию
open_info_csv()
</pre>
  <pre id="7o8D" data-lang="python">list_of_url = open_info_csv()
for row in list_of_url:
    driver.get(row)
    #ищу название объявления
    title = driver.find_element(By.XPATH, &quot;//h1[@data-marker=&#x27;item-view/title-info&#x27;]&quot;).text.split(&#x27;,&#x27;)[0].strip(&#x27;&quot;&#x27;)
    #Цену
    price = driver.find_element(By.XPATH,&#x27;//span[@data-marker=&quot;item-view/item-price&quot;]&#x27;).get_attribute(&#x27;content&#x27;)
    #Тип продавца
    seller_type = driver.find_element(by=By.XPATH, value=&#x27;//div[@data-marker=&quot;seller-info/label&quot;]&#x27;).text
    #Адрес
    address = driver.find_element(by=By.XPATH, value=&quot;//div[@itemprop=&#x27;address&#x27;]/span&quot;).text
    
    #cохраняю в файл
    with open(&quot;car_info.csv&quot;, mode=&#x27;a&#x27;, encoding=&#x27;utf-8-sig&#x27;) as csv_file:
             writer = csv.writer(csv_file)    
             # Записываем данные    
             writer.writerow((title,price, seller_type,address))
    driver.close()
    driver.quit()</pre>
  <p id="FE2q"></p>
  <figure id="g7RR" class="m_retina">
    <img src="https://img3.teletype.in/files/29/e8/29e8f5a4-a1cd-4d02-aa28-5a959773afdd.gif" width="574" />
  </figure>
  <p id="rBMi"></p>
  <p id="jfkB"></p>
  <p id="Gya6">Полный код на код на <a href="https://boosty.to/vladiview/donate" target="_blank">Boosty</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@vladimirvanalytics/parsim_analiziruem_vibiraem</guid><link>https://teletype.in/@vladimirvanalytics/parsim_analiziruem_vibiraem?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics</link><comments>https://teletype.in/@vladimirvanalytics/parsim_analiziruem_vibiraem?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=vladimirvanalytics#comments</comments><dc:creator>vladimirvanalytics</dc:creator><title>Парсим, анализируем, предсказываем: Выбираем автомобиль</title><pubDate>Sat, 23 Sep 2023 05:05:31 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d8/a5/d8a51540-a881-430e-8d2d-7d91d4855287.png"></media:content><category>machine learning</category><description><![CDATA[<img src="https://img4.teletype.in/files/7f/ee/7feef1fd-57d1-405e-be99-5851d71da0bd.png"></img>Родственники жены, рассказали что выбирают автомобиль и как это обычно бывает, на эту роль претендовали несколько конкурентов. Их требованиям отвечали сотни, а для некоторых моделей и тысячи, автомобилей.  Решил им помочь отобрать выгодные (цена которых относительно рынка занижена).]]></description><content:encoded><![CDATA[
  <figure id="HBYl" class="m_original">
    <img src="https://img4.teletype.in/files/7f/ee/7feef1fd-57d1-405e-be99-5851d71da0bd.png" width="512" />
    <figcaption>сгенерировано нейросетью stable diffusion</figcaption>
  </figure>
  <h2 id="qIsx">Предыстория</h2>
  <p id="f8sY">Родственники жены, рассказали что выбирают автомобиль и как это обычно бывает, на эту роль претендовали несколько конкурентов. Их требованиям отвечали сотни, а для некоторых моделей и тысячи, автомобилей.  Решил им помочь отобрать выгодные (цена которых относительно рынка занижена). </p>
  <p id="HWNB"></p>
  <h2 id="yyxX">Сбор данных.</h2>
  <p id="tkA7">Данные собирал с одного известного сайта объявлений. Меня интересовали следующие параметры при выборе автомобиля:</p>
  <ul id="NudN">
    <li id="KHx2">Цена (price)</li>
    <li id="cFKI">Год выпуска(year)</li>
    <li id="HCP8">Пробег</li>
    <li id="2kJH">Количество владельцев по ПТС</li>
    <li id="3OFN">Мощность двигателя</li>
    <li id="iV6Z">Тип коробки передач</li>
  </ul>
  <h3 id="2mIL">Реализация.</h3>
  <p id="LNXj">Написал код, используя Selenium, для автоматического сбора данных с сайта. Данные по автомобилям сохранялись в базу данных SQLite3. Код состоит из двух основных функций <code>parser, worker</code></p>
  <p id="8fvu"><strong>Парсинг данных</strong>:</p>
  <ul id="4EFd">
    <li id="zijb">Функция <code>parser</code> принимает URL в качестве аргумента и начинает процесс сбора данных.</li>
    <li id="Z2GH">Открывается URL в браузере через драйвер Selenium.</li>
    <li id="znDm">Браузер пытается найти и взаимодействовать с некоторыми элементами на странице.</li>
    <li id="OKR0">Браузер определяет количество объявлений на странице и вычисляет, сколько всего страниц в пагинации.</li>
    <li id="05F3">Затем проходится по каждой странице, извлекает ссылки на объявления и их идентификаторы, после чего добавляет их в базу данных</li>
  </ul>
  <p id="WOjv"></p>
  <figure id="qS3r" class="m_retina">
    <img src="https://img4.teletype.in/files/7c/d1/7cd1cb1f-24ca-4b49-b3fd-d810a74d191b.gif" width="607.5" />
  </figure>
  <h3 id="G3OW">Функция <code> worker</code></h3>
  <ul id="g0iO">
    <li id="Y94D">В бесконечном цикле пытается извлекать следующий URL для обработки из базы данных.После получения URL, обновляет его статус на «обрабатывается»</li>
    <li id="mSzk">Открывает URL в драйвере Selenium.Проверяет наличие определенных элементов на странице (например, если объявление было снято с публикации).</li>
    <li id="8YSK">Если таких элементов нет, пытается сохранить данные с помощью функции <code>save_test_data</code>.</li>
    <li id="qDWr">Если возникнет исключение в любой части процесса, статус URL обновляется на «ожидание ошибки», драйвер закрывается и прерывает текущую итерацию.</li>
  </ul>
  <figure id="ty9F" class="m_retina">
    <img src="https://img3.teletype.in/files/29/e8/29e8f5a4-a1cd-4d02-aa28-5a959773afdd.gif" width="574" />
  </figure>
  <p id="KzmB"></p>
  <p id="BS85"></p>
  <h2 id="GhXA">Анализ полученных данных.</h2>
  <pre id="FFVH" data-lang="python">import pandas as pd
import numpy as np</pre>
  <p id="ir8r"><em>Код знакомый многим кто увлекается данными</em></p>
  <p id="ghEj">Подробно описано в предыдущем<a href="https://teletype.in/@vladimirvanalytics/pandas_eda_analysis" target="_blank"> посте</a></p>
  <p id="MJej"></p>
  <h3 id="mBiH">Первая попытка. Процентили, Квартили.</h3>
  <p id="xdDB">Первая попытка выбрать оптимальный автомобиль. Оптимальны автомобиль - у которого год, будет выше чем у 75% автомобилей в выборке, цена будет ниже чем у 25% самых дорогих автомобилей.</p>
  <figure id="eGsn" class="m_retina">
    <img src="https://img3.teletype.in/files/69/86/69866ebb-9bb2-4ee2-9c39-fa34a67f13d3.png" width="500.5" />
    <figcaption>График распределения автомобилей по цене и году. Точки это автомобили.</figcaption>
  </figure>
  <p id="XNvA">Зеленым цветом выделена область в которой находятся оптимальные автомобили. </p>
  <p id="Vszo">Этот подход был отвергнут так как не учитывал другие параметры - пробег, количество владельцев по ПТС</p>
  <p id="e1LC"></p>
  <h3 id="vpZw">Вторая попытка. Скоринг.</h3>
  <p id="KtXV">Следующая попытка расчет баллов для каждого автомобиля. Например если цена выше, то бал ниже, пробег выше цена ниже, год старше бал ниже. </p>
  <p id="oylg">Такой подход был получше, но чего-то не хватало. </p>
  <p id="J6dk"></p>
  <h3 id="b2Dm">Третья попытка. Машинное обучение нейросети</h3>
  <figure id="G3GT" class="m_original">
    <img src="https://img1.teletype.in/files/48/73/487377d0-e48e-4e83-9026-ca8f60ff4145.png" width="512" />
    <figcaption>изображение сгенерировано нейросетью Stable Diffusion</figcaption>
  </figure>
  <p id="rAB4"><strong>Подготовка данных</strong>:</p>
  <ul id="2C49">
    <li id="hlR8">Использовал Python и библиотеку Pandas для обработки и анализа данных.</li>
    <li id="Z1ps">Манипуляции с данными, такие как чистка, трансформация, поиск выбросов и масштабирование.</li>
  </ul>
  <h3 id="BcQ4">Прогноз</h3>
  <p id="kjgp">Для предсказания справедливой цены автомобиля использовал нейронные сети, обучил различные модели машинного обучения, начиная с простой множественной регрессии и заканчивая сложными методами ансамблирования, такими как стекинг. Пробовал различные алгоритмы бустинга, включая XGBoost, AdaBoost, GBM и LightGBM. </p>
  <p id="7n51">В целом, результаты говорят о том, что модель дает слабые прогнозы на новых данных. </p>
  <p id="HPuO">И как я не пытался улучшить данные для модели, удалить выбросы, &quot;поиграть&quot; с настройками сети. Результат был плюс, минус такой же - 60000 - 80000 разница между фактической ценой и предсказанной. </p>
  <p id="Kfas">Подробно об этом написано <a href="https://teletype.in/@vladimirvanalytics/cars_predict" target="_blank">здесь</a></p>
  <p id="iO2h"></p>
  <h3 id="LjiD">Четвертая попытка. Возврат к скорингу.</h3>
  <p id="uFws"></p>
  <p id="J2Gy">Для определения оптимального автомобиля разработал систему скоринга. Эта система учитывает разницу в цене, пробеге и количестве владельцев автомобиля. Каждому критерию был присвоен вес, и на основе этой информации для каждого автомобиля был рассчитан общий балл. Автомобиль с наивысшим баллом считается наиболее оптимальным.</p>
  <ol id="bKIy">
    <li id="cj8h"><strong>Определение весов для каждого критерия</strong>:</li>
    <ul id="QLZn">
      <li id="zqCN">Например, разница в цене может иметь больший вес, чем разница в пробеге, так как цена может быть более важным фактором для покупателя.</li>
    </ul>
    <li id="UOhX"><strong>Вычисление баллов для каждого автомобиля</strong>:</li>
    <ul id="5CkP">
      <li id="4CzN"><code>AveragePriceModelDiff</code>: Положительная разница (если средняя цена модели выше, чем цена конкретного автомобиля) будет добавлять баллы, так как это может указывать на более выгодное предложение.</li>
      <li id="M0GI"><code>average_mileage_model_year_diff</code>: Отрицательная разница (если пробег автомобиля выше среднего по модели и году) будет убавлять баллы.</li>
      <li id="gAVy"><code>average_pts_diff</code>: количество владельцев автомобиля, меньшее значение <code>PTS</code> будет предпочтительнее, так как автомобиль с меньшим количеством владельцев может быть в лучшем состоянии.</li>
    </ul>
    <li id="08Ze"><strong>Суммирование баллов для каждого автомобиля</strong>:</li>
    <ul id="1tYi">
      <li id="BXxo">Веса из пункта 1 умножались на разницы каждого критерия на его вес, а затем складывал все вместе, чтобы получить общий балл для каждого автомобиля.</li>
    </ul>
    <li id="L9Qz"><strong>Выбор автомобиля с наивысшим баллом</strong>:</li>
    <ul id="hAdl">
      <li id="gT8h">Автомобиль с наивысшим баллом будет считаться наиболее оптимальным.</li>
    </ul>
  </ol>
  <p id="HXGq">Такой подход оказался быстрым и эффективным. </p>
  <p id="Rx9K"></p>
  <h2 id="lh6C">Вишенка на торте</h2>
  <p id="Wfrv">Ну и на последок, сделал группу в телеграм, где бот присылает ссылки на автомобиль с расчетом показателей.</p>
  <figure id="xKWs" class="m_original">
    <img src="https://img1.teletype.in/files/48/a8/48a86875-14ec-4263-90a2-d953982570b5.png" width="716" />
  </figure>
  <p id="d3yw"></p>
  <hr />
  <p id="gdbj">В заключении хочется отметить для меня это было  уникальным опытом, который стал для меня первым глубоким погружением в область данных и машинного обучения. Этот проект стал своеобразным кульминационным моментом, объединив в себе все мои навыки и знания: от программирования на Python и работы с библиотекой pandas до парсинга веб-сайтов и сохранения данных в базу данных SQLite3. Это был настоящий вызов и большое удовольствие одновременно!</p>

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