Поиск по блогу

вторник, 23 июня 2015 г.

Выбираем (в Pandas) инструменты для экспресс-анализа истории поисковых запросов

Хорошо было бы иметь методику анализа поисковых запросов, над ней еще предстоит поразмышлять, а здесь я попробовал не расчитывать, а сразу строить нормировки (на графиках процессов), диаграммы рассеяния и коэффициенты корреляции. Получилась вот такая последовтельность:
Копипастим таблицу "История запрсов" Yandex-Direct в ячейку ipython notebook,
Чистим и редактируем содержание ячейки (кириллица, копипастим разделители)
Считываем содержание в DataFrame (Pandas) .read_csv(StringIO(posobie_c),sep=" ", ...)
Заменяем элементы в подстроках и конвертируем строки в числа .str.replace(',','.').astype('float')
Для удаления части подстроки используем регулярные выражения .str.replace(r'.+ - ','')
Или просто разбиваем строку на подстроки и оставляем подстроку f.Period.str.split(' ').str[2]
Назначаем индекс .set_index('Period') (понадобится ось X для диаграмм)`
Строим две зависимости на одной диаграмме f.set_index('Period').nabs2.plot(secondary_y=True, style='g')
Строим диаграммы рассеяния (scatterplot)
Рассчитываем коэффициенты корреляции

In [3]:
import os
import pandas as pd
import numpy as np
from cStringIO import StringIO
In [8]:
%matplotlib inline

Переменные posobie_c и btruda_c= определены в приложении в конце поста.

In [27]:
f = pd.read_csv(StringIO(posobie_c),sep=" ", header=0, warn_bad_lines=False, error_bad_lines=False)
In [28]:
f.info(verbose=True, buf=None, max_cols=None, memory_usage=True, null_counts=True)
<class 'pandas.core.frame.DataFrame'>
Int64Index: 23 entries, 0 to 22
Data columns (total 3 columns):
Period    23 non-null object
nabs      23 non-null int64
nrel      23 non-null object
dtypes: int64(1), object(2)
memory usage: 552.0+ bytes
In [43]:
print(f.nrel.str.replace(',','.').astype('float'))
0     0.000008
1     0.000008
2     0.000008
3     0.000008
4     0.000009
5     0.000009
6     0.000008
7     0.000009
8     0.000009
9     0.000009
10    0.000009
11    0.000008
12    0.000007
13    0.000006
14    0.000008
15    0.000009
16    0.000010
17    0.000010
18    0.000009
19    0.000013
20    0.000012
21    0.000012
22    0.000010
Name: nrel, dtype: float64

Как поменять формат вывода серии на печать? Сразу не вспомню. Перепроисвоим столбец и проверим первое значение.

In [45]:
f.nrel = f.nrel.str.replace(',','.').astype('float')
In [46]:
f.nrel[0]
Out[46]:
8.1562660000000005e-06

Все, как и должно быть. Вспомним еще одну команду проверки

In [47]:
f.dtypes
Out[47]:
Period     object
nabs        int64
nrel      float64
dtype: object
In [51]:
f.set_index('Period')
Out[51]:
nabs nrel
Period
01.06.2013 - 30.06.2013 35178 0.000008
01.07.2013 - 31.07.2013 35047 0.000008
01.08.2013 - 31.08.2013 36811 0.000008
01.09.2013 - 30.09.2013 41856 0.000008
01.10.2013 - 31.10.2013 52928 0.000009
01.11.2013 - 30.11.2013 54755 0.000009
01.12.2013 - 31.12.2013 50836 0.000008
01.01.2014 - 31.01.2014 63841 0.000009
01.02.2014 - 28.02.2014 56324 0.000009
01.03.2014 - 31.03.2014 60949 0.000009
01.04.2014 - 30.04.2014 58188 0.000009
01.05.2014 - 31.05.2014 48093 0.000008
01.07.2014 - 31.07.2014 33497 0.000007
01.08.2014 - 31.08.2014 35399 0.000006
01.09.2014 - 30.09.2014 46690 0.000008
01.10.2014 - 31.10.2014 61267 0.000009
01.11.2014 - 30.11.2014 62117 0.000010
01.12.2014 - 31.12.2014 72365 0.000010
01.01.2015 - 31.01.2015 59457 0.000009
01.02.2015 - 28.02.2015 78941 0.000013
01.03.2015 - 31.03.2015 84880 0.000012
01.04.2015 - 30.04.2015 79680 0.000012
01.05.2015 - 31.05.2015 61639 0.000010
In [94]:
f.set_index('Period').nabs.plot()
Out[94]:
<matplotlib.axes.AxesSubplot at 0xbd5d6ec>
In [95]:
f.plot(x='Period', y='nabs', rot=90)
Out[95]:
<matplotlib.axes.AxesSubplot at 0xbf1cc6c>
In [88]:
f.Period.str.replace(r'.+ - ','').head()
Out[88]:
0    30.06.2013
1    31.07.2013
2    31.08.2013
3    30.09.2013
4    31.10.2013
Name: Period, dtype: object
In [90]:
f.Period.str.split(' ').str[2].head()
Out[90]:
0    30.06.2013
1    31.07.2013
2    31.08.2013
3    30.09.2013
4    31.10.2013
Name: Period, dtype: object
In [91]:
f.Period = f.Period.str.split(' ').str[2]
In [55]:
f.plot(kind='scatter', x='nrel', y='nabs')
In [ ]:
 
In [62]:
f2 = pd.read_csv(StringIO(btruda_c),sep=" ", header=0, warn_bad_lines=False, error_bad_lines=False)
In [67]:
f['nabs2'] = f2.nabs
In [68]:
f.tail()
Out[68]:
Period nabs nrel nabs2
18 01.01.2015 - 31.01.2015 59457 0.000009 248715
19 01.02.2015 - 28.02.2015 78941 0.000013 242319
20 01.03.2015 - 31.03.2015 84880 0.000012 357839
21 01.04.2015 - 30.04.2015 79680 0.000012 377665
22 01.05.2015 - 31.05.2015 61639 0.000010 332101
In [69]:
f.plot(kind='scatter', x='nabs2', y='nabs')
Out[69]:
<matplotlib.axes.AxesSubplot at 0xb9ba44c>
In [ ]:
 
In [97]:
f.set_index('Period').nabs.plot(rot=90)
f.set_index('Period').nabs2.plot(secondary_y=True, style='g')
Out[97]:
<matplotlib.axes.Axes at 0xb149594c>
In [76]:
f.corr()
Out[76]:
nabs nrel nabs2
nabs 1.000000 0.911199 0.843164
nrel 0.911199 1.000000 0.719764
nabs2 0.843164 0.719764 1.000000
In [78]:
f.nabs.corr(f.nabs2)
Out[78]:
0.84316391602833718

Приложения (история запросов в поиске Яндекс "пособие бо безработице", "биржа труда")

In [26]:
posobie_c="""
Period nabs nrel
01.06.2013 - 30.06.2013 35178 0,000008156266
01.07.2013 - 31.07.2013 35047 0,000007969618
01.08.2013 - 31.08.2013 36811 0,000008005167
01.09.2013 - 30.09.2013 41856 0,000008064712
01.10.2013 - 31.10.2013 52928 0,000008757891
01.11.2013 - 30.11.2013 54755 0,000009379925
01.12.2013 - 31.12.2013 50836 0,000008467636
01.01.2014 - 31.01.2014 63841 0,000009261577
01.02.2014 - 28.02.2014 56324 0,000009269357
01.03.2014 - 31.03.2014 60949 0,000008659490
01.04.2014 - 30.04.2014 58188 0,000009122421
01.05.2014 - 31.05.2014 48093 0,000007926751
01.07.2014 - 31.07.2014 33497 0,000006679964
01.08.2014 - 31.08.2014 35399 0,000006342492
01.09.2014 - 30.09.2014 46690 0,000007564709
01.10.2014 - 31.10.2014 61267 0,000008948300
01.11.2014 - 30.11.2014 62117 0,000009565381
01.12.2014 - 31.12.2014 72365 0,000010408853
01.01.2015 - 31.01.2015 59457 0,000008672886
01.02.2015 - 28.02.2015 78941 0,000013038985
01.03.2015 - 31.03.2015 84880 0,000012175793
01.04.2015 - 30.04.2015 79680 0,000011531621
01.05.2015 - 31.05.2015 61639 0,000009679184
"""
In [61]:
btruda_c="""
Period nabs nrel
01.06.2013 - 30.06.2013 140799 0,000032645237
01.07.2013 - 31.07.2013 159550 0,000036281352
01.08.2013 - 31.08.2013 153368 0,000033352436
01.09.2013 - 30.09.2013 180925 0,000034860187
01.10.2013 - 31.10.2013 200007 0,000033094761
01.11.2013 - 30.11.2013 190015 0,000032550934
01.12.2013 - 31.12.2013 157296 0,000026200433
01.01.2014 - 31.01.2014 252579 0,000036642279
01.02.2014 - 28.02.2014 246445 0,000040557963
01.03.2014 - 31.03.2014 244505 0,000034738693
01.04.2014 - 30.04.2014 210792 0,000033046905
01.05.2014 - 31.05.2014 176971 0,000029168592
01.06.2014 - 30.06.2014 185315 0,000033568622
01.07.2014 - 31.07.2014 178733 0,000035642892
01.08.2014 - 31.08.2014 194308 0,000034814459
01.09.2014 - 30.09.2014 225552 0,000036543913
01.10.2014 - 31.10.2014 263038 0,000038417795
01.11.2014 - 30.11.2014 259051 0,000039891198
01.12.2014 - 31.12.2014 248715 0,000035774725
01.01.2015 - 31.01.2015 242319 0,000035346637
01.02.2015 - 28.02.2015 357839 0,000059105628
01.03.2015 - 31.03.2015 377665 0,000054174964
01.04.2015 - 30.04.2015 332101 0,000048063039
01.05.2015 - 31.05.2015 254062 0,000039895403
"""


Посты чуть ниже также могут вас заинтересовать

1 комментарий: