Понимание моей модели просмотра с помощью Pandas и Seaborn

1658350829 ponimanie moej modeli prosmotra s pomoshhyu pandas i seaborn

от Kartik Godawat

NMCjgOzASRekdlignaAAjeYZ8li9LTKG-MCM
https://unsplash.com/photos/vVIwtmqsIuk

С помощью трех методов мы можем научиться мудрости. Во-первых, путем размышлений, что самое благородное; Во-вторых, имитацией, что легче всего; и третье – опытом, который является наихудшим. — Конфуций

Чтобы отслеживать время, которое я провожу в браузере, я использую расширение Limitless в Chrome. Хотя это дает мне время, потраченное по категориям, я подумал, что может оказаться полезным проверить все мои данные веб-просмотра за прошлый год.

Здесь начинается мой поиск понимания все что было в моих данных просмотра.

В процессе я использовал Pandas и Seaborn. Pandas – это библиотека Python для обработки и анализа данных. Seaborn создан на основе matplotlib, что делает создание визуализаций более легким, чем когда-либо.

Получение данных истории

Первым шагом в процессе было получить все данные веб-просмотра за прошлый год. Google Chrome сохраняет историю за последние 3 месяца на устройствах в формате SQLite, но я экспортировал отслеженные данные Google с помощью Google TakeOut. Экспортированный json содержит мою историю просмотра на всех устройствах, включая мобильные.

История, которую хранит Chrome или отслеживает Google, не дает мне информации о сеансе, то есть время, затраченное на каждую вкладку. Поэтому мой анализ сосредоточен на количестве посещений и времени посещения, а не на сеансе или продолжительности. Часть меня действительно ощущает облегчение, когда я знаю, что Google не отслеживает это еще.

После загрузки данных я начал с загрузки данных во фрейм данных Pandas:

import pandas as pdwith open("BrowserHistory.json") as f:    data = json.loads(f.read())    df = pd.DataFrame(data["Browser History"])
# A possible param if differentiation is needed b/w different clientsdf.drop('client_id', axis=1, inplace=True)df.drop('favicon_url', axis=1, inplace=True)df.sample(1)

Вот как выглядит выход:

YA-NrAjL7fL7vNCLCI-qL2ljqXb7dfPBZTq2

page_transition: Содержит информацию о типе открытой страницы, например, перезагрузке, вводе и вводе, открытии ссылок и т.д. Я был доволен фильтрацией только по ССЫЛКЕ и ВВЕДЕННЫМ

df = df[(df['page_transition'] == "LINK") | (df['page_transition'] == "TYPED")]

Удаление/экстраполяция новых столбцов (функции):

Для начала мне нужно было перевести время (в микросекундах) в формат даты и времени, понятное человеку. Затем мне понадобилось вывести из него такие функции, как час, день, месяц или день недели. Извлечение домена верхнего уровня из поля URL может быть полезным полем для анализа. Итак, я использовал tldextract, чтобы создать новый столбец домена во фрейме данных.

def convert_time(x):    return datetime.datetime.fromtimestamp(x/1000000)
days_arr = ["Mon","Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]def get_day_of_week(x):    return days_arr[x.weekday()]
def get_domain(x):    domain = tldextract.extract(x)[1]    sub_domain = tldextract.extract(x)[0]    if sub_domain == "mail":        return sub_domain + "." + domain    # Ugly hack to differentiate b/w drive.google.com and google.com    if domain == "google" and sub_domain=="www":        return "google_search"     return domain
# time_usec column is picked and for each row, convert_time(row) is called. The result is stored in the same dataframe under column dtdf['dt'] = df['time_usec'].apply(convert_time)...df['domain'] = df['url'].apply(get_domain)

Затем я экстраполировал информацию о домене, чтобы сгруппировать хорошо известные домены в одну или другие категории (ведра), определенные мной:

def get_category(x):    if x in ["coursera", "kadenze", "fast", "kaggle", "freecodecamp"]:        return "Learning"    elif x in ["ycombinator", "medium", "hackernoon"]:        return "TechReads"    ...    else:        return "Other"
# Cluster popular domains into a categorydf['category'] = df['domain'].apply(get_category)

После всех операций фрейм данных теперь содержит следующие столбцы и базовый анализ можно начинать.

Доступные столбцы: название, дата, час, месяц, безопасно, выходные, день_недели, домен, категория

Изучение данных и создание визуализаций

Безопасное против незащищенного использования:

Когда у меня есть кадр данных с несколькими числовыми и категориальными столбцами (месяц), создать график становится очень легко.

import seaborn as snssns.countplot(x="month", hue="is_secure", data=df)
uegjuXfIh-7mrHWSIKdSoPeyOcNdtdai1YzK
Тенденция к снижению количества веб-сайтов только с http при просмотре в последнее время
# Manual inspection, picking 50 random domains which were insecurerandom.sample(df[df["is_secure"] == "N"].domain.unique(), 50)
# To view data for such domainsdf[(df["domain"] == "mydomain") & (df["is_secure"] == "N")]["url"]

Просмотрев несколько посещений, я закончил проверкой этого сайта. Это запрашивает номер паспорта или Aadhar (индийский эквивалент SSN), а также номер электронной почты и мобильного телефона при бронировании сафари по джунглям через HTTP. Раньше я этого не заметил! Окончательное бронирование обрабатывается через отдельный безопасный шлюз. Однако я бы чувствовал себя гораздо безопаснее, вводя свои демографические и паспортные данные через HTTPS.

Вместо того, чтобы исследовать строки вручную, одним из более строгих решений может быть добавление всех таких доменов в расширение, например BlockSite. Их можно включить при необходимости.

Использование браузера в будние и выходные дни:

#is_weekend="Y" for saturday and sunday, "N" otherwisesns.countplot(x="hour", hue="is_weekend", data=df)
GU7zJ5c5iZlF8uSdCFdkVb9BHVGH6H5WIIvL
Показатель того, что я дольше сплю на выходных 😛

Использование браузера в течение месяцев:

Чтобы достичь этого, я выбрал подмножество строк на основе условий месяца, а затем сгруппировал все по часам и датам, чтобы сформировать тепловую карту в стиле GitHub, а именно.

from matplotlib import pyplot as plt
# Getting unique values after grouping by hour and datedf_new = df[(df["month"] >= 11)].groupby(["hour", "date"])["domain"].size()df_new = df_new.reset_index(name="count")
plt.figure(figsize = (16,5))
# Pivot the dataframe to create a [hour x date] matrix containing countssns.heatmap(df_new.pivot("hour", "date", "count"), annot=False, cmap="PuBuGn")
MWUr2PnFaw8DDH6sH-daaQPSbPwA1Mi5ofwo
Вертикально пустые строчки означают, что я был в отпуске или не использовал браузер Chrome.

Вышеприведенный код можно легко отфильтровать. Это можно сделать, добавив больше условий для определения времени открытия производительных и непроизводительных вкладок и просмотра моделей за дни. Например:

cat_arr = ["Shopping", "TravelBookings", "YouTube", "Social"]
df_new = df[(df["category"] in cat_arr)].groupby(["hour", "date"])["domain"].size()

Посещение браузера по дням недели и часам:

Я создал другой тип агрегированной тепловой карты, где я попытался визуализировать часы и день недели.

df_heat = df.groupby(["hour", "day_of_week"])["domain"].size().reset_index()df_heat2 = df_heat.pivot("hour", "day_of_week", "domain")sns.heatmap(df_heat2[days_arr] , cmap="YlGnBu")
md9YvYsDlyvOm-lt74KFkUSPoD8PBtpIjPQI
22:00–16:00 в рабочие дни, продуктивные часы с большим количеством посещений браузеров в четверг вечером

Можно ожидать, что почта с пяти вечера с пятницы до утра понедельника будет небольшой. Но мне было интересно поразмышлять о светлых участках в среду вечером.

Теперь используйте специальные категории, в которые я вручную разбил домены. Я снова создаю ту же тепловую карту. Но теперь условие на популярных торговых сайтах. Обратите внимание, что список создан вручную на основе моей памяти и случайного просмотра уникальных доменов, которые я посетил.

df_heat = df[df["category"] == "Shopping"].groupby(["hour", "day_of_week"])["category"].size().reset_index()
9Nafi1Ehl3rFMRAL5cOhQy1oFhEXWjxxT0dF

Приятно иметь удовольствие от того, что я обычно не хожу по магазинам в рабочее время. Однако диаграмма побудила меня исследовать вручную четверг (20:00–21:00) и пятницу (15:00–16:00, 00:00–01:00). На высшем уровне я был очень уверен, что никогда не совершаю покупки во время рабочего времени. Однако тепловая карта показывает некоторые случаи визитов, которые разбивают мои иллюзии.

Часто задаваемые вопросы в stackoverflow:

Хороший друг однажды сказал мне:

Понимание использования stackoverflow поможет вам понять сферы усовершенствования или конфигурации/синтаксиса, которые вам следует запомнить.

В любом случае, хорошо вскользь просмотреть самые частые посещения за каждый месяц/квартал.

df_so = df[df["domain"] == "stackoverflow"].groupby(["url", "title"]).size()df_so = df_so.reset_index(name="count").sort_values('count',ascending=False)[["title", 'count']]
df_so.head(15)
wIQT4eK6PSmKyUnpS7ytYzuuht482UI0GW1o
Строки «Последний вопрос» и «Нет заголовков» показывают, что в этом контексте есть возможность предварительной обработки данных

Возможно, я должен кэшировать страницу, которая показывает мне, как итерировать кадр данных Pandas!

Кроме stackoverflow, одним из моих наиболее посещаемых сайтов, связанных с Pandas, были бы заметки Криса Альбона о python и спорах с данными.

В общем, очень интересно наблюдать за тем, как ваши наиболее посещаемые страницы меняют тему в течение месяцев. Например, они могут переходить от простых вопросов к более сложным, более глубоким. Это правда, когда вы строите свое понимание чего-нибудь нового.

Наконец, просто развлечения ради, я объединил заголовки всех своих поисков с переполнением стека за прошлый год. Затем я создал из него приличное облако слов.

vJmTP5yIcxmdjD887Avv-9REXxDs8TIpoXPX

Большое спасибо за ваше время. Если вам понравилось читать, похлопайте меня, чтобы больше людей увидели статью. Спасибо! И, до следующего раза, хорошего дня 🙂

На GitHub есть рабочий блокнот с дополнительными визуализациями и некоторыми быстрыми хаками по поводу данных. Пожалуйста, попробуйте со своим собственным дампом истории и поделитесь интересной информацией!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *