Как Avito.ru, Drom.ru и Auto.ru делят автомобильную Россию → Roem.ru
Roem.ru
Auto.ru, Avito, Drom.ru, Авто, Дальний Восток, Новосибирск, Рейтинг, Статистика ru-RU 2015 ООО «Роем» Кейсы
Самые сильные позиции у «Авито» по отношению к Drom.ru в Нижнем Новгороде (3,5 млн просмотров в сутки против 166 тыс.), самые слабые — во Владивостоке (97 тыс. против почти 4 млн)
Развитие событий: Auto.ru поднял нерекламную выручку до 50% и получил в Яндексе новый дизайн (22 сентября 2015)
Сайт объявлений «Авито» открыл свою статистику LiveInternet по разделу «Авто», что позволило сравнить его позиции с прямым конкурентом по автомобилям — сайтом Drom.ru. Drom.ru уверенно выглядит на Дальнем Востоке и в Сибири: по количеству просмотров Drom превышает «Авито» во Владивостоке, Новосибирске, Томске, Барнауле и некоторых других городах более чем в 10 раз.
Самые сильные позиции у «Авито» по отношению к Drom.ru в Нижнем Новгороде (3,5 млн просмотров в среднем за сутки против 166 тыс.), самые слабые — во Владивостоке (97 тыс. против почти 4 млн). Неплохо «Авито» держится на Урале — в Челябинске (лидирует) и Кургане (отстаёт всего в 2 раза). В Крыму предпочитают пользоваться Drom.ru, а на Украине — Avito.ru. В среднем за сутки Drom.ru набирает 40 млн просмотров, транспортный раздел Avito.ru — 58 млн.
У третьего крупного авторесурса Auto.ru, принадлежащего «Яндексу», открытых данных в LI нет, зато они есть в TNS, так что его можно сравнить с Avito. К сожалению, в TNS нет Drom.ru, так что сравнить напрямую все три площадки не получится.
Быстрый поиск: Auto.ru, Avito, Drom.ru, Авто, Дальний Восток, Новосибирск, Рейтинг, Статистика.
22 комментария
Поделиться
Avito приоткрыл статистику по категории «Авто» — вырвался на первое место рейтинга LI, обогнав Drom.
ru 3Avito.ru пытается обойтись без Auto.yandex.ru 16
Avito сделал контекстную рекламу а-ля Amazon 1
- Причины и последствия украинского кризиса — лекция профессора политологии чикагского университета Джона Миршаймера 24
- Фейковое цунами. Как распознавать фейки про спецоперацию на Украине 61
- Доклад Ашманова: как заставить платформы отказаться от плохого контента 189
- Пять главных ошибок в разговоре о средствах массовой информации. Для начинающих 25
- О сложности создания Матрицы в Брянской области 17
- Сценарий реорганизации Яндекса: российское юрлицо, фонд менеджеров, 51% акций у доверенных инвесторов 2
- Zoom загадочно уволила президента после финотчёта и не ищет нового 1
- У «Сбера» дефицит разработчиков: из эмиграции возвращаются сплошные джуниоры 1
- Tele2 теперь тоже берёт комиссию за пополнение — но чуть гуманнее, чем МТС 1
- В США опасаются, что ИИ поможет Китаю выиграть в экономической гонке
python — Сортировка строк в столбце и график печати
Вы можете сначала добавить новый столбец sort
в функцию f
, затем отсортировать значения по столбцу паре веб-сайтов
и последним drop_duplicates
по столбцам used_at
:3 и 90 sort
импортировать панды как pd импортировать itertools df = pd.read_csv("avito_trend.csv", parse_dates=[2]) защита f(df): дфс = [] я = 0 для x в [list(x) для x в itertools. combinations(df['address'].unique(), 2)]: я += 1 c1 = df.loc[df['адрес'].isin([x[0]]), 'ID'] c2 = df.loc[df['адрес'].isin([x[1]]), 'ID'] c = pd.Series(список(набор(c1).пересечение(набор(c2)))) # добавить перевернутое пересечение c2 и c1 c_invert = pd.Series (список (набор (c2). пересечение (набор (c1)))) dfs.append(pd.DataFrame({'обычные пользователи':len(c), 'пара веб-сайтов':' и '.join(x), 'sort': i}, index=[0])) # поменять местами значения в x х[1],х[0] = х[0],х[1] dfs.append(pd.DataFrame({'обычные пользователи':len(c_invert), 'пара веб-сайтов':' и '.join(x), 'sort': i}, index=[0])) вернуть pd.concat(dfs) common_users = df.groupby([df['используется_в'].dt.year]).apply(f).reset_index(drop=True, level=1).reset_index()
common_users = common_users.sort_values('пара веб-сайтов') common_users = common_users.drop_duplicates (подмножество = ['используется_в', 'сортировка']) #распечатать общие_пользователи graph_by_common_users = common_users. pivot(index='пара веб-сайтов', columns='used_at', values='обычные пользователи') #print graph_by_common_users #изменить порядок столбцов graph_by_common_users = graph_by_common_users[[2015, 2014]] graph_by_common_users = graph_by_common_users.sort_values (2014, по возрастанию = False) ax = graph_by_common_users.plot(kind='barh', width=0.5, figsize=(10,20)) [label.set_rotation(25) для метки в ax.get_xticklabels()] прямоугольники = ax.patches labels = [int(round(graph_by_common_users.loc[i, y])) для y в graph_by_common_users.columns.tolist() для i в graph_by_common_users.index] для прямоугольника, метки в zip (прямоугольники, метки): высота = rect.get_height() ax.text (rect.get_width() + 20, rect.get_y() - 0,25 + rect.get_height(), метка, размер шрифта = 8) #сортировка значений легенды ручки, метки = ax.get_legend_handles_labels() # сортируем и метки, и дескрипторы по меткам метки, ручки = zip (* sorted (zip (метки, ручки), ключ = лямбда t: t [0])) ax.legend (ручки, метки)
Мой график:
РЕДАКТИРОВАТЬ:
Комментарий:
Зачем вы создали c_invert и x1,x[0] = x[0],x1
Поскольку комбинации для годов 2014
и 2015
были разными — значения 4
отсутствовали в первом столбце и 4
во втором столбце:
used_at 2015 2014 пара веб-сайтов avito.ru и drom.ru 1491,0 1716,0 avito.ru и auto.ru 1473,0 1602,0 avito.ru и e1.ru 1153,0 1364,0 drom.ru и auto.ru NaN 874.0 e1.ru и drom.ru 539,0 634,0 avito.ru и irr.ru/cars 403,0 602,0 avito.ru и am.ru 262,0 579,0 e1.ru и auto.ru 451,0 475,0 avito.ru и cars.mail.ru/sale 256,0 424,0 drom.ru и irr.ru/cars 277,0 423,0 auto.ru и irr.ru/cars 288,0 409.0 auto.ru и am.ru 224,0 408,0 дром.ру и ам.ру 187,0 394,0 auto.ru и cars.mail.ru/sale 195,0 330,0 avito.ru и автомаркет.ру 205,0 299,0 drom.ru и cars.mail.ru/sale 189,0 292,0 дром.ру и автомаркет.ру 175,0 247,0 auto.ru и автомаркет.ру 162,0 243,0 e1.ru и irr.ru/cars 148,0 235,0 e1.ru и am.ru 99,0 224,0 am.ru и irr.ru/cars NaN 223.0 irr.ru/cars и cars.mail.ru/sale 94,0 197,0 am.ru и cars.mail.ru/sale NaN 166,0 e1.ru и cars.mail.ru/sale 105,0 154,0 e1.ru и автомаркет.ру 105,0 139,0 avtomarket.ru и irr.ru/cars NaN 139,0 avtomarket.ru и am.ru 72,0 133,0 avtomarket.ru и cars.mail.ru/sale 48,0 105,0 auto.ru и drom.ru 799,0 NaN cars.mail.ru/sale и am.ru 73,0 NaN irr. ru/cars и am.ru 102.0 NaN irr.ru/cars и avtomarket.ru 73,0 NaN
Затем я создаю все инвертированные комбинации — проблема была решена. Но почему есть NaN
? Почему комбинации 2014
и 2015
разные?
Я добавляю к функции f
:
def f(df): распечатать df['адрес'].unique() дфс = [] я = 0 для x в [list(x) для x в itertools.combinations((df['address'].unique()), 2)]: ... ...
и вывод был (почему первая печать дважды описана в предупреждении
здесь):
['avito.ru' 'e1.ru' 'drom.ru' 'auto.ru' 'avtomarket.ru' 'am.ru' «irr.ru/cars» «cars.mail.ru/sale»] ['avito.ru' 'e1.ru' 'drom.ru' 'auto.ru' 'avtomarket.ru' 'am.ru' «irr.ru/cars» «cars.mail.ru/sale»] ['avito.ru' 'e1.ru' 'auto.ru' 'drom.ru' 'irr.ru/cars' 'avtomarket.ru' 'cars.mail.ru/sale' 'am.ru']
Таким образом, списки разные, а затем и комбинации тоже разные -> я получаю некоторые значения NaN
.
Решение — сортировка списка комбинаций.
по умолч. f(df): #print (отсортировано(df['адрес'].unique())) дфс = [] для x в [list(x) для x в itertools.combinations(sorted(df['address'].unique()), 2)]: c1 = df.loc[df['адрес'].isin([x[0]]), 'ID'] ... ...
Весь код:
импортировать панды как pd импортировать itertools df = pd.read_csv("avito_trend.csv", parse_dates=[2]) защита f(df): #print (отсортировано(df['адрес'].unique())) дфс = [] для x в [list(x) для x в itertools.combinations(sorted(df['address'].unique()), 2)]: c1 = df.loc[df['адрес'].isin([x[0]]), 'ID'] c2 = df.loc[df['адрес'].isin([x[1]]), 'ID'] c = pd.Series(список(набор(c1).пересечение(набор(c2)))) dfs.append(pd.DataFrame({'обычные пользователи':len(c), 'пара веб-сайтов':' и '.join(x)}, index=[0])) вернуть pd.concat(dfs) common_users = df.groupby([df['используется_в']. dt.year]).apply(f).reset_index(drop=True, level=1).reset_index() #распечатать общие_пользователи graph_by_common_users = common_users.pivot(index='пара веб-сайтов', columns='used_at', values='обычные пользователи') #изменить порядок столбцов graph_by_common_users = graph_by_common_users[[2015, 2014]] graph_by_common_users = graph_by_common_users.sort_values (2014, по возрастанию = False) #print graph_by_common_users
топор = graph_by_common_users.plot(kind='barh', width=0.5, figsize=(10,20)) [label.set_rotation(25) для метки в ax.get_xticklabels()] прямоугольники = ax.patches labels = [int(round(graph_by_common_users.loc[i, y])) \ для y в graph_by_common_users.columns.tolist() \ для i в graph_by_common_users.index] для прямоугольника, метки в zip (прямоугольники, метки): высота = rect.get_height() ax.text(rect.get_width()+20, rect.get_y() - 0,25 + rect.get_height(), метка, размер шрифта=8) ручки, метки = ax.get_legend_handles_labels() # сортируем и метки, и дескрипторы по меткам метки, ручки = zip (* sorted (zip (метки, ручки), ключ = лямбда t: t [0])) ax.legend (ручки, метки)
И график:
python — горизонтальная диаграмма Barchart с использованием matplotlib
Задавать вопрос
спросил
Изменено 6 лет, 11 месяцев назад
Просмотрено 676 раз
У меня есть файл с данными avito_trend.csv, и я хочу распечатать гистограмму
импортировать панды как pd импортировать itertools df = pd.read_csv("avito_trend.csv", parse_dates=[2]) защита f(df): дфс = [] для x в [list(x) для x в itertools.combinations(df['address'].unique(), 2)]: c1 = df.loc[df['адрес'].isin([x[0]]), 'ID'] c2 = df.loc[df['адрес'].isin([x[1]]), 'ID'] c = pd.Series(список(набор(c1).пересечение(набор(c2)))) dfs. append(pd.DataFrame({'a':len(c), 'b':' и '.join(x)}, index=[0])) вернуть pd.concat(dfs) результат = df.groupby([df['used_at'].dt.year]).apply(f).reset_index(drop=True, level=1).reset_index() распечатать результат б/у б 0 2014 1364 avito.ru и e1.ru 1 2014 1716 avito.ru и drom.ru 2 2014 1602 avito.ru и auto.ru 3 2014 299 avito.ru и автомаркет.ру 4 2014 579 avito.ru и am.ru 5 2014 602 avito.ru и irr.ru/cars 6 2014 424 avito.ru и cars.mail.ru/sale 7 2014 634 e1.ru и drom.ru 8 2014 475 e1.ru и auto.ru 9 2014 139 e1.ru и avtomarket.ru 10 2014 224 e1.ru и am.ru 11 2014 235 e1.ru и irr.ru/cars 12 2014 154 e1.ru и cars.mail.ru/sale 13 2014 874 drom.ru и auto.ru 14 2014 247 drom.ru и avtomarket.ru 15 2014 394 дром.ру и ам.ру 16 2014 423 drom.ru и irr.ru/cars 17 2014 292 drom.ru и cars.mail.ru/sale 18 2014 243 auto.ru и avtomarket.ru 19 2014 408 auto.ru и am.ru 20 2014 409 auto.ru и irr.ru/cars 21 2014 330 auto.ru и cars.mail.ru/sale 22 2014 133 avtomarket.ru и am.ru 23 2014 139 avtomarket. ru и irr.ru/cars 24 2014 105 avtomarket.ru и cars.mail.ru/sale 25 2014 223 am.ru и irr.ru/cars 26 2014 166 am.ru и cars.mail.ru/sale 27 2014 197 irr.ru/cars и cars.mail.ru/sale 28 2015 1153 avito.ru и e1.ru 29 2015 1473 avito.ru и auto.ru 30 2015 1491 avito.ru и drom.ru 31 2015 403 avito.ru и irr.ru/cars 32 2015 205 avito.ru и avtomarket.ru 33 2015 256 avito.ru и cars.mail.ru/sale 34 2015 262 avito.ru и am.ru 35 2015 451 e1.ru и auto.ru 36 2015 539 e1.ru и drom.ru 37 2015 148 e1.ru и irr.ru/cars 38 2015 105 e1.ru и avtomarket.ru 392015 105 e1.ru и cars.mail.ru/sale 40 2015 99 e1.ru и am.ru 41 2015 799 auto.ru и drom.ru 42 2015 288 auto.ru и irr.ru/cars 43 2015 162 auto.ru и avtomarket.ru 44 2015 195 auto.ru и cars.mail.ru/sale 45 2015 224 auto.ru и am.ru 46 2015 277 drom.ru и irr.ru/cars 47 2015 175 дром.ру и автомаркет.ру 48 2015 189drom.ru и cars.mail.ru/sale 49 2015 187 drom.ru и am.ru 50 2015 73 irr.ru/cars и avtomarket.ru 51 2015 94 irr.ru/cars и cars.mail.ru/sale 52 2015 102 irr.ru/cars и am. ru 53 2015 48 avtomarket.ru и cars.mail.ru/sale 54 2015 72 avtomarket.ru и am.ru 55 2015 73 cars.mail.ru/sale и am.ru
Я использую ax = result.plot(width=0.5, kind='barh', stacked=True)
и я хочу получить что-то вроде этого графика.
Как мне это сделать?
Мне нужно, чтобы 2014 и 2015 годы были на одной волне для другой пары сайтов.
И вместо процентов мне нужно среднее значение столбца a
- python
- csv
- pandas
- matplotlib
Как уже сказал @user308827, я бы также использовал seaborn для этого бита:
импортировать панд как pd импортировать matplotlib.pyplot как plt импортировать Seaborn как sns pd.set_option('display.expand_frame_repr', False) cols = ['ID', 'адрес', 'используемый_в'] df = pd.read_csv(r'D:\data\gDrive\data\.stack.overflow\data\avito_trend.csv.gz', parse_dates=['used_at'], usecols=cols) df.sort_values(['ID','used_at','address'], inplace=True) df['предыдущий_адрес'] = df['адрес']. shift() df['time_diff'] = df['used_at'] - df['used_at'].shift() df = df[df['адрес'] != df['предыдущий_адрес']] df = df[df['time_diff'] <= pd.Timedelta('10min')] tmp = df[['ID','адрес','предыдущий_адрес']] \ .groupby(['адрес','предыдущий_адрес', df.used_at.dt.year]) \ .считать() \ .reset_index() # удалить `df` из памяти дель дф tmp['visit_from'] = tmp['предыдущий_адрес'] + ' -> ' + tmp['адрес'] # оставить только "интересные" столбцы tmp = tmp[['visit_from','used_at','ID']] tmp.columns = ['visit_from','год','посещения'] # сохранить временный сгруппированный файл CSV #fn = r'D:\data\gDrive\data\.stack.overflow\data\avito_grp.csv' #tmp.to_csv(fn, index=False) # показать все #df = температура # показывать только те сайты, число посещений которых >= 100 (за оба года) df = tmp[tmp.groupby('visit_from')['посещения'].transform('sum') >= 100].reset_index() # подготовить отсортированный индекс idx = df.groupby('visit_from')['посещения'].transform('sum').sort_values(возрастание=False). index # индекс "применить" df = df.reindex(idx) # добавить столбец "всего" (сумма посещений за все годы) #df['total'] = df.groupby('visit_from')['посещения'].transform('sum') ################################################## # # Построение SeaBorn # sns.set (стиль = "темная сетка") sns.set_color_codes("пастель") f, топор = plt.subplots (figsize = (16, 12)) ax = sns.barplot(x='посещения', y='visit_from', оттенок='год', данные=df, насыщенность=0,8) plt.xlabel('Посещения') # добавляем аннотации [ax.text (p.get_width() + 3, p.get_y() + p.get_height(), интервал (p.get_width()), размер шрифта = 8) для p в ax.patches] plt.show()
PS самое интересное для вас начинается с SeaBorn прорисовка
комментарий
22
Попробуйте Seaborn
From https://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.barplot.html
импортируйте Seaborn как sns sns.set_style("белая сетка") советы = sns.