Рубрики
Без рубрики

Понимание моего шаблона просмотра, используя Pandas и Meanborn

Автор оригинала: FreeCodeCapm Team.

КАРТИК ГОДАВАТ

С целью отслеживания времени я провожу на браузере, я использую Безгранично Расширение на хрома. Хотя это дает мне время, потраченное в соответствии с категориями, я подумал, что может быть полезен для проверки всех моих данных просмотра в течение прошлого года.

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

В процессе я использовал Pandas и Meanborn. Пандас это библиотека Python для манипулирования и анализа данных. Морской построен на вершине MatPlotlib, что делает создание визуализации проще, чем когда-либо.

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

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

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

Как только данные были загружены, я начал с загрузки данных в DataFrame 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)

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

Page_transition: Содержит информацию о типе страницы открытой, как перезагрузка, введите и введите, ссылка открыта и т. Д. Я был доволен фильтрацией только по ссылке и набран

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

Извлечение/экстраполяция новых столбцов (особенности):

Чтобы начать, мне нужно было разбить время (в микросекундах) для читаемого человеком DateTime Format. Тогда мне нужно было получить черты от него, как час, день, месяц или Day_of_week. Из полей URL извлечение домена верхнего уровня может быть полезным поле для анализа. Так что я использовал TLDEXTRACT Чтобы создать новую колонку домена в DataFrame.

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)

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

Доступные столбцы: Название, дата, час, месяц, IS_SECURE, IS_WEEKEND, DAY_OF_WEEK, домен, категория

Исследуя данные и создание визуализации

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

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

import seaborn as snssns.countplot(x="month", hue="is_secure", data=df)
# 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), наряду с электронной почтой и мобильным, при бронировании джунглей Safari, через http. Я не смог заметить это раньше! Окончательное бронирование обрабатывается через отдельный и безопасный шлюз. Тем не менее, я все еще чувствую себя более безопасным, набирая мою демографию и паспорт данных по HTTPS.

Вместо того, чтобы вручную исследующуюся строки, одно более строгое решение может быть добавление всех таких доменов на расширение, как Блокс Отказ Они могут быть включены как и когда это необходимо.

Weekday VS Weekend Browser Использование:

#is_weekend="Y" for saturday and sunday, "N" otherwisesns.countplot(x="hour", hue="is_weekend", data=df)

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

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

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")

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

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

Визиты браузера к дням недели и часа:

Я создал другой тип агрегированного тепловая карта, где я попробовал визуализацию WRT часов, и какой день недели это.

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")

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

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

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

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

Самые пересмотренные вопросы 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)

Может быть, я должен кэшировать страницу, которая показывает мне, как итерации по поводу DataFrame PandaS!

Помимо Stackoverflow, один из моих самых посещаемых сайтов, связанных с пандами, был бы Примечания Криса Албона на Python и Data-Warngling Отказ

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

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

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

Рабочая ноутбук присутствует на Github С некоторыми дополнительными визуализациями и некоторые быстрые хаки вокруг данных. Пожалуйста, попробуйте его с собственной историей Dump и поделитесь интересными идеями!