SlideShare a Scribd company logo
Руслан Гроховецкий
руководитель группы справочных сервисов
Python
и вычисления
(в Яндекс.Погоде)
Я.Субботник в Екатеринбурге, 06.07.13
Анализ данных
в Яндекс.Погоде
Что вычисляем
3
Яндекс не занимается
гидрометеорологической
деятельностью
4 Станция делает наблюдения раз в 3 часа
5 Прогноз есть на каждый час
6 Погодные данные на основе прогноза
7
Когда вместо устаревшего
наблюдения показывать
прогноз?
8 Станция делает наблюдения раз в 3 часа
9
Как сильно меняется
температура со временем?
NumPy + SciPy + matplotlib
ipython --pylab
Как вычисляем
11
Python — не числодробилка
• Cкриптовая природа;
• простой и элегантный синтаксис;
• высокоуровневые структуры данных;
• интерактивность IPython;
• нет числодробительной силы (.
Нужно добавить числодробительной силы!
А где ее взять?
12
NumPy
• Это расширение СPython
• Поддержка больших массивов и матриц
• Операции над массивами, индексация
• Математические функции, алгоритмы
• Заменяет собой MATLAB
• Много дополняющих пакетов
– SciPy+SciKits, Matplotlib, PyTables, Pandas, StatsModels, Sympy...
• Использует LAPACK (числодроб. сила!)
– Который использует BLAS/ATLAS, написанный на С и Fortran
13
Pylab
• Matplotlib — 2D графики
• NumPy
• IPython
$ ipython --pylab
Welcome to pylab, a matplotlib-based Python environment
For more information, type 'help(pylab)'.
14
Данные
• 12173 города
• ≥20000 станций (метеостанции и аэропорты)
• ≈200 млн. накопленных наблюдений
15
Есть данные наблюдений на метеостанциях, выгруженные из архивной БД.
# timestamp; Temperature
1360270800; 18
1360269000; 18
1360267200; 18
1360265400; 18
1360263600; 18
1360261800; 19
1360260000; 19
1360258200; 19
1360256400; 19
1360254600; 19
1360252800; 19
1360251000; 19
1360249200; 20
1360247400; 20
1360245600; 20
1360243800; 20
...
Наблюдения за температурой
16
>>> data = loadtxt('sheremetjevo.csv', delimiter=';', dtype=int32)
>>> data
array([[1334043000, 2],
[1334044800, 2],
[1334046600, 3],
...,
[1372793400, 19],
[1372795200, 18],
[1372797000, 17]], dtype=int32)
Берем в руки pylab
17
>>> data = loadtxt('sheremetjevo.csv', delimiter=';', dtype=int32)
>>> data
array([[1334043000, 2],
[1334044800, 2],
[1334046600, 3],
...,
[1372793400, 19],
[1372795200, 18],
[1372797000, 17]], dtype=int32)
>>> data.shape
(21022, 2)
Берем в руки pylab
18
>>> data = loadtxt('sheremetjevo.csv', delimiter=';', dtype=int32)
>>> data
array([[1334043000, 2],
[1334044800, 2],
[1334046600, 3],
...,
[1372793400, 19],
[1372795200, 18],
[1372797000, 17]], dtype=int32)
>>> data.shape
(21022, 2)
>>> times, temps = data[:, 0], data[:, 1]
Берем в руки pylab
19
>>> data = loadtxt('sheremetjevo.csv', delimiter=';', dtype=int32)
>>> data
array([[1334043000, 2],
[1334044800, 2],
[1334046600, 3],
...,
[1372793400, 19],
[1372795200, 18],
[1372797000, 17]], dtype=int32)
>>> data.shape
(21022, 2)
>>> times, temps = data[:, 0], data[:, 1]
>>> temps.max(), temps.min()
(32, -26)
Берем в руки pylab
20
>>> data = loadtxt('sheremetjevo.csv', delimiter=';', dtype=int32)
>>> data
array([[1334043000, 2],
[1334044800, 2],
[1334046600, 3],
...,
[1372793400, 19],
[1372795200, 18],
[1372797000, 17]], dtype=int32)
>>> data.shape
(21022, 2)
>>> times, temps = data[:, 0], data[:, 1]
>>> temps.max(), temps.min()
(32, -26)
>>> plot(times, temps)
Берем в руки pylab
21 >>> plot(times, temps)
22
Векторизация
• Одна операция — много данных
• Нет циклов на Python-е
# python without numpy
>>> [temps[i+1] – temps[i]
for i in xrange(len(temps)-1)]
Разность температур соседних наблюдений
# numpy
>>> temps[1:] - temps[:-1]
23
Векторизация
• Одна операция — много данных
• Нет циклов на Python-е
# python without numpy
>>> [temps[i+1] – temps[i]
for i in xrange(len(temps)-1)]
Разность температур соседних наблюдений
# numpy
>>> temps[1:] - temps[:-1]
>>> diff(temps) # то же самое
24
>>> temp_diff = absolute(diff(temps))
>>> temp_diff.max()
8.0
>>> plot(times[1:], temp_diff)
Разности температур между замерами
25 >>> plot(times[1:], temp_diff)
26 plot(times[:-1], temp_diff)
27 plot(times[:-1], temp_diff)
28
>>> histogram(temp_diff, bins=range(0,9))
(array([13044, 7028, 795, 118, 21, 5, 6, 4]),
Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8]))
>>> hist, scale = _
>>> hist(temp_diff, bins=range(0,9))
Строим гистограмму
29
hist(temp_diff, bins=range(0,9))
Частота ΔT=Ti
в соседних по времени наблюдениях, по интерв. Ti
∈{0..8°},
30
Но нужно получить 8 таких гистограмм,
соответствующих интервалам
в 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5 и 4.0 часа.
31
# кумулятивная сумма абс. разностей температур
>>> cum_temp = temp_diff_ip.cumsum()
>>> plot(time_range[1:], cum_temp)
Кумулятивная сумма по ΔT
32 plot(time_range[1:], cum_temp)
33
>>> cum_temp[1:-7] - cum_temp[:-8] # сдвиг 1
array([1, 0, 0, ..., 0, 2, 0])
>>> cum_temp[8:] - cum_temp[:-8] # сдвиг 8
array([1, 1, 1, ..., 5, 6, 5])
Дельты T в разных интервалах t
34
>>> cum_temp[1:-7] - cum_temp[:-8] # сдвиг 1
array([1, 0, 0, ..., 0, 2, 0])
>>> cum_temp[8:] - cum_temp[:-8] # сдвиг 8
array([1, 1, 1, ..., 5, 6, 5])
>>> temp_diffs = array([
cum_temp[i:(-8+i) or None] - cum_temp[:-8]
for i in range(1,9)])
>>> temp_diffs
array([[1, 0, 0, ..., 0, 2, 0],
[1, 0, 0, ..., 2, 2, 1],
[1, 0, 0, ..., 2, 3, 2],
...,
[1, 0, 0, ..., 4, 5, 3],
[1, 0, 1, ..., 5, 5, 4],
[1, 1, 1, ..., 5, 6, 5]])
Дельты T в разных интервалах t
35
>>> histogram(temp_diffs[0], bins=range(11))
(array([13643, 6997, 750, 104, 18, 3, 5, 2, 0, 0]),
Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
>>> histogram(temp_diffs[1], bins=range(11))
(array([9434, 7722, 3323, 804, 161, 42, 18, 8, 8, 2]),
Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
>>> histograms = array([histogram(d, bins=range(11))[0]
for d in temp_diffs])
Гистограммы для каждого интервала T
36
>>> row_sums = histograms.sum(axis=1)
>>> row_sums
array([21522, 21512, 21492, 21440, 21319, 21065, 20607, 20006])
>>> histograms = histograms.astype(float64)
# broadcasting
>>> histograms / row_sums
ValueError: operands could not be broadcast together with shapes
(8,7) (8)
>>> histograms / row_sums[:, None] # добавляем второе измерение
array([[ 0.6, 0.3, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0.4, 0.4, 0.2, 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0.3, 0.3, 0.2, 0.1, 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0.3, 0.3, 0.2, 0.1, 0.1, 0. , 0. , 0. , 0. , 0. ],
[ 0.2, 0.3, 0.2, 0.1, 0.1, 0.1, 0. , 0. , 0. , 0. ],
[ 0.2, 0.2, 0.2, 0.2, 0.1, 0.1, 0. , 0. , 0. , 0. ],
[ 0.1, 0.2, 0.2, 0.2, 0.1, 0.1, 0.1, 0. , 0. , 0. ],
[ 0.1, 0.2, 0.2, 0.2, 0.1, 0.1, 0.1, 0.1, 0. , 0. ]])
Нормируем гистограммы
37
>>> histograms / row_sums[:, None] * 100 # векторизация!
array([[ 63.4, 32.5, 3.5, 0.5, 0.1, 0. , 0. , 0. , 0. , 0. ],
[ 43.8, 35.9, 15.4, 3.7, 0.7, 0.2, 0.1, 0. , 0. , 0. ],
[ 32.5, 32.9, 20. , 9.6, 3.5, 1. , 0.3, 0.2, 0.1, 0.1],
[ 25.1, 29. , 20.7, 13.2, 7. , 3.1, 1.1, 0.4, 0.2, 0.2],
[ 20. , 25.5, 20. , 14.7, 9.7, 5.6, 2.5, 1.1, 0.5, 0.4],
[ 16.3, 22.6, 18.6, 15. , 11.3, 7.6, 4.4, 2.3, 1.1, 0.7],
[ 13.4, 20.3, 17.1, 15. , 11.5, 9.5, 6. , 3.6, 2.1, 1.6],
[ 11.2, 18.4, 15.8, 14.1, 12. , 9.9, 7.7, 4.9, 3.1, 2.9]])
>>> histogram_percents = _
Нормируем гистограммы
38
>>> histograms / row_sums[:, None] * 100 # векторизация!
array([[ 63.4, 32.5, 3.5, 0.5, 0.1, 0. , 0. , 0. , 0. , 0. ],
[ 43.8, 35.9, 15.4, 3.7, 0.7, 0.2, 0.1, 0. , 0. , 0. ],
[ 32.5, 32.9, 20. , 9.6, 3.5, 1. , 0.3, 0.2, 0.1, 0.1],
[ 25.1, 29. , 20.7, 13.2, 7. , 3.1, 1.1, 0.4, 0.2, 0.2],
[ 20. , 25.5, 20. , 14.7, 9.7, 5.6, 2.5, 1.1, 0.5, 0.4],
[ 16.3, 22.6, 18.6, 15. , 11.3, 7.6, 4.4, 2.3, 1.1, 0.7],
[ 13.4, 20.3, 17.1, 15. , 11.5, 9.5, 6. , 3.6, 2.1, 1.6],
[ 11.2, 18.4, 15.8, 14.1, 12. , 9.9, 7.7, 4.9, 3.1, 2.9]])
>>> histogram_percents = _
>>> histogram_percents.sum(axis=1)
Array([ 100., 100., 100., 100., 100., 100., 100., 100.])
Нормируем гистограммы
39
>>> histograms / row_sums[:, None] * 100 # векторизация!
array([[ 63.4, 32.5, 3.5, 0.5, 0.1, 0. , 0. , 0. , 0. , 0. ],
[ 43.8, 35.9, 15.4, 3.7, 0.7, 0.2, 0.1, 0. , 0. , 0. ],
[ 32.5, 32.9, 20. , 9.6, 3.5, 1. , 0.3, 0.2, 0.1, 0.1],
[ 25.1, 29. , 20.7, 13.2, 7. , 3.1, 1.1, 0.4, 0.2, 0.2],
[ 20. , 25.5, 20. , 14.7, 9.7, 5.6, 2.5, 1.1, 0.5, 0.4],
[ 16.3, 22.6, 18.6, 15. , 11.3, 7.6, 4.4, 2.3, 1.1, 0.7],
[ 13.4, 20.3, 17.1, 15. , 11.5, 9.5, 6. , 3.6, 2.1, 1.6],
[ 11.2, 18.4, 15.8, 14.1, 12. , 9.9, 7.7, 4.9, 3.1, 2.9]])
>>> histogram_percents = _
>>> histogram_percents.sum(axis=1)
Array([ 100., 100., 100., 100., 100., 100., 100., 100.])
>>> imshow(histogram_percents, interpolation="nearest")
Нормируем гистограммы
40
imshow(histogram_percents, interpolation="nearest")
Частота попадания ΔT в интервалы 0..10°, по вр. интервалам
41
>>> imshow(histogram_percents, interpolation="nearest")
>>> ylabel(u'dt (30-минутные интервалы)')
>>> xlabel(u'dT (градусы)')
>>> colorbar()
Наводим красоту
42
imshow(histogram_percents, interpolation="nearest")
Частота попадания ΔT в интервалы 0..10°, по вр. интервалам
43
>>> histogram_percents.cumsum(axis=1)
# ΔT<=0 <=1 <=2 <=3 <=4 <=5 <=6 <=7 <=8 --
array([[63.4, 95.9, 99.4, 99.9,100. ,100. ,100. ,100. ,100. , 100.],
[43.8, 79.7, 95.2, 98.9, 99.6, 99.8, 99.9,100. ,100. , 100.],
[32.5, 65.3, 85.3, 94.9, 98.5, 99.5, 99.7, 99.9, 99.9, 100.],
[25.1, 54.1, 74.9, 88.1, 95.1, 98.2, 99.3, 99.7, 99.8, 100.],
[20. , 45.5, 65.5, 80.2, 89.9, 95.5, 98.1, 99.2, 99.6, 100.],
[16.3, 38.8, 57.5, 72.5, 83.8, 91.5, 95.9, 98.2, 99.3, 100.],
[13.4, 33.7, 50.7, 65.7, 77.2, 86.7, 92.7, 96.3, 98.4, 100.],
[11.2, 29.5, 45.3, 59.5, 71.5, 81.3, 89.1, 94. , 97.1, 100.]])
Кумулятивная гистограмма
44
# отзеркалить, просуммировать кумулятивно, отзеркалить
>>> histogram_percents[:, ::-1].cumsum(axis=1)[:, ::-1]
Array([
#ΔT≥0 ≥1 ≥2 ≥3 ≥4 ≥5 ≥6 ≥7 ≥8 ≥9°
[100., 36.6, 4.1, 0.6, 0.1, 0. , 0. , 0. , 0. , 0. ], # 0.5ч
[100., 56.2, 20.3, 4.8, 1.1, 0.4, 0.2, 0.1, 0. , 0. ], # 1.0ч
[100., 67.5, 34.7, 14.7, 5.1, 1.5, 0.5, 0.3, 0.1, 0.1], # 1.5ч
[100., 74.9, 45.9, 25.1, 11.9, 4.9, 1.8, 0.7, 0.3, 0.2], # 2.0ч
[100., 80. , 54.5, 34.5, 19.8, 10.1, 4.5, 1.9, 0.8, 0.4], # 2.5ч
[100., 83.7, 61.2, 42.5, 27.5, 16.2, 8.5, 4.1, 1.8, 0.7], # 3.0ч
[100., 86.6, 66.3, 49.3, 34.3, 22.8, 13.3, 7.3, 3.7, 1.6], # 3.5ч
[100., 88.8, 70.5, 54.7, 40.5, 28.5, 18.7, 10.9, 6. , 2.9] # 4.0ч
])
>>> histogram_cum = _
>>> savetxt('histogram_cum.txt', histogram_cum)
Кумулятивная гистограмма
45
imshow(histogram_cum, interpolation="nearest")
Частота того, что Δt
T ≤ Ti
, Ti
∈{0..10°}, Δt
∈{0.5..4.0ч}
46
imshow(histogram_cum)
Частота того, что Δt
T ≤ Ti
, Ti
∈{0..10°}, Δt
∈{0.5..4.0ч}
47
Чем больше времени
проходит, тем сильнее
“размывается” температура
48
# Через какое время T изменится на 2° и более,
# с вероятностью 50%?
#ΔT≥0 ≥1 ≥2 ≥3 ≥4 ≥5 ≥6 ≥7 ≥8 ≥9°
[100., 36.6, 4.1, 0.6, 0.1, 0. , 0. , 0. , 0. , 0. ], # 0.5ч
[100., 56.2, 20.3, 4.8, 1.1, 0.4, 0.2, 0.1, 0. , 0. ], # 1.0ч
[100., 67.5, 34.7, 14.7, 5.1, 1.5, 0.5, 0.3, 0.1, 0.1], # 1.5ч
[100., 74.9, 45.9, 25.1, 11.9, 4.9, 1.8, 0.7, 0.3, 0.2], # 2.0ч
[100., 80. , 54.5, 34.5, 19.8, 10.1, 4.5, 1.9, 0.8, 0.4], # 2.5ч
[100., 83.7, 61.2, 42.5, 27.5, 16.2, 8.5, 4.1, 1.8, 0.7], # 3.0ч
[100., 86.6, 66.3, 49.3, 34.3, 22.8, 13.3, 7.3, 3.7, 1.6], # 3.5ч
[100., 88.8, 70.5, 54.7, 40.5, 28.5, 18.7, 10.9, 6. , 2.9] # 4.0ч
Где ответ?
49
После Δt=2.5ч температура
меняется на 2°C и более,
с вероятностью 50%
50
Ссылки
• numpy.org
• matplotlib.org
• habrahabr.ru/search/?q=numpy
• scipy.org
• conference.scipy.org/scipy2013/
• github.com/fonnesbeck/statistical-analysis-python-tutorial
Руслан Гроховецкий
Руководитель группы
справочных сервисов
ruguevara@yandex-team.ru
Спасибо

More Related Content

PPTX
E. Ostheimer, V. G. Labunets, D. E. Komarov, T. S. Fedorova and V. V. Ganzha ...
PPTX
V. G. Labunets, F. S. Myasnikov, E. Ostheimer - Families of Heron Digital Fil...
PPT
PDF
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
PDF
Лекция 5: Бинарные деревья поиска
PDF
Лекция 5: Словари. Бинарные деревья поиска
PPTX
User Defined Materials in LS-DYNA
PDF
Лекция 5. Бинарные деревья поиска
E. Ostheimer, V. G. Labunets, D. E. Komarov, T. S. Fedorova and V. V. Ganzha ...
V. G. Labunets, F. S. Myasnikov, E. Ostheimer - Families of Heron Digital Fil...
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Лекция 5: Бинарные деревья поиска
Лекция 5: Словари. Бинарные деревья поиска
User Defined Materials in LS-DYNA
Лекция 5. Бинарные деревья поиска

What's hot (13)

PDF
PG Day'14 Russia, Модуль anyarray, Федор Сигаев
ODP
Charming python sc2-8
PDF
8 встреча — Язык программирования Python (В. Ананьев)
PDF
Лекция 3. АВЛ-деревья (AVL trees)
PPT
dvfu sns spline 2
PDF
Векторизация кода (семинар 3)
PDF
Лекция 7. Стандарт OpenMP (подолжение)
PDF
PDF
South migration
PDF
Сложности микробенчмаркинга
PDF
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
PG Day'14 Russia, Модуль anyarray, Федор Сигаев
Charming python sc2-8
8 встреча — Язык программирования Python (В. Ананьев)
Лекция 3. АВЛ-деревья (AVL trees)
dvfu sns spline 2
Векторизация кода (семинар 3)
Лекция 7. Стандарт OpenMP (подолжение)
South migration
Сложности микробенчмаркинга
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Ad

Viewers also liked (20)

PPT
ошибки аналитика
PPTX
управление проектами
PDF
Into into UX for business
PPTX
архитектура ис
PPT
Pareto principle
PDF
Dead by use case #1
PDF
Dead by use case #2
PPTX
Управление ожиданиями заинтересованных лиц
PPTX
Введение в анализ требований
PDF
HPC vs Big Data (Russian version)
PDF
Alternative magazine 10
PDF
решения по построению сетей передачи данных фнс полигон 2015
PDF
Роман Постников — «Мегафон» — ICBDA 2015
PPTX
Александр Мигаловский — ГНИВЦ ФНС России — ICBDA 2015
PDF
Михаил Кечинов — REES46 — ICBDA 2015
PDF
Данные - Основа Digital революции
PDF
Кирилл Чистов — Data-Centric Alliance — ICBDA 2015
PDF
Роман Постников «Большие данные»
PPTX
Анатолий Левенчук — Техинвест — ICBDA2016
ошибки аналитика
управление проектами
Into into UX for business
архитектура ис
Pareto principle
Dead by use case #1
Dead by use case #2
Управление ожиданиями заинтересованных лиц
Введение в анализ требований
HPC vs Big Data (Russian version)
Alternative magazine 10
решения по построению сетей передачи данных фнс полигон 2015
Роман Постников — «Мегафон» — ICBDA 2015
Александр Мигаловский — ГНИВЦ ФНС России — ICBDA 2015
Михаил Кечинов — REES46 — ICBDA 2015
Данные - Основа Digital революции
Кирилл Чистов — Data-Centric Alliance — ICBDA 2015
Роман Постников «Большие данные»
Анатолий Левенчук — Техинвест — ICBDA2016
Ad

Similar to Руслан Гроховецкий — Python и вычисления (20)

PDF
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
PPT
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
PPTX
презентация
PDF
Оптимизация производительности Python
PDF
Лекция 5. Встроенные коллекции и модуль collections.
PDF
PDF
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...
PDF
Лекция 1: Амортизационный анализ (Amortized analysis)
PDF
гдз по алгебре 7 класс алимов ш. а. и др
PDF
алгебра 7кл алимов решебник_2002 1-801
PDF
Лекция 1. Амортизационный анализ (Amortized analysis)
PPT
алгоритмизация
DOCX
Tugas 1 Matematika Terapan (S2)
PPT
повторение 7кл. алгебра
PDF
Sergii Tsypanov "Performance 1001 Tips"
PPTX
Массыви в Python. Основы использование массива
PPT
20100927 28 reqformalization-kuliamin
PDF
lab1 math computational
PPTX
DSLs in Lisp and Clojure
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
презентация
Оптимизация производительности Python
Лекция 5. Встроенные коллекции и модуль collections.
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...
Лекция 1: Амортизационный анализ (Amortized analysis)
гдз по алгебре 7 класс алимов ш. а. и др
алгебра 7кл алимов решебник_2002 1-801
Лекция 1. Амортизационный анализ (Amortized analysis)
алгоритмизация
Tugas 1 Matematika Terapan (S2)
повторение 7кл. алгебра
Sergii Tsypanov "Performance 1001 Tips"
Массыви в Python. Основы использование массива
20100927 28 reqformalization-kuliamin
lab1 math computational
DSLs in Lisp and Clojure

More from Yandex (20)

PDF
Предсказание оттока игроков из World of Tanks
PDF
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
PDF
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
PDF
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
PDF
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
PDF
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
PDF
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
PDF
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
PDF
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
PDF
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
PDF
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
PDF
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
PDF
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
PDF
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
PDF
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
PDF
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
PDF
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
PDF
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
PDF
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
PDF
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Предсказание оттока игроков из World of Tanks
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...

Руслан Гроховецкий — Python и вычисления

  • 1. Руслан Гроховецкий руководитель группы справочных сервисов Python и вычисления (в Яндекс.Погоде) Я.Субботник в Екатеринбурге, 06.07.13
  • 4. 4 Станция делает наблюдения раз в 3 часа
  • 5. 5 Прогноз есть на каждый час
  • 6. 6 Погодные данные на основе прогноза
  • 8. 8 Станция делает наблюдения раз в 3 часа
  • 10. NumPy + SciPy + matplotlib ipython --pylab Как вычисляем
  • 11. 11 Python — не числодробилка • Cкриптовая природа; • простой и элегантный синтаксис; • высокоуровневые структуры данных; • интерактивность IPython; • нет числодробительной силы (. Нужно добавить числодробительной силы! А где ее взять?
  • 12. 12 NumPy • Это расширение СPython • Поддержка больших массивов и матриц • Операции над массивами, индексация • Математические функции, алгоритмы • Заменяет собой MATLAB • Много дополняющих пакетов – SciPy+SciKits, Matplotlib, PyTables, Pandas, StatsModels, Sympy... • Использует LAPACK (числодроб. сила!) – Который использует BLAS/ATLAS, написанный на С и Fortran
  • 13. 13 Pylab • Matplotlib — 2D графики • NumPy • IPython $ ipython --pylab Welcome to pylab, a matplotlib-based Python environment For more information, type 'help(pylab)'.
  • 14. 14 Данные • 12173 города • ≥20000 станций (метеостанции и аэропорты) • ≈200 млн. накопленных наблюдений
  • 15. 15 Есть данные наблюдений на метеостанциях, выгруженные из архивной БД. # timestamp; Temperature 1360270800; 18 1360269000; 18 1360267200; 18 1360265400; 18 1360263600; 18 1360261800; 19 1360260000; 19 1360258200; 19 1360256400; 19 1360254600; 19 1360252800; 19 1360251000; 19 1360249200; 20 1360247400; 20 1360245600; 20 1360243800; 20 ... Наблюдения за температурой
  • 16. 16 >>> data = loadtxt('sheremetjevo.csv', delimiter=';', dtype=int32) >>> data array([[1334043000, 2], [1334044800, 2], [1334046600, 3], ..., [1372793400, 19], [1372795200, 18], [1372797000, 17]], dtype=int32) Берем в руки pylab
  • 17. 17 >>> data = loadtxt('sheremetjevo.csv', delimiter=';', dtype=int32) >>> data array([[1334043000, 2], [1334044800, 2], [1334046600, 3], ..., [1372793400, 19], [1372795200, 18], [1372797000, 17]], dtype=int32) >>> data.shape (21022, 2) Берем в руки pylab
  • 18. 18 >>> data = loadtxt('sheremetjevo.csv', delimiter=';', dtype=int32) >>> data array([[1334043000, 2], [1334044800, 2], [1334046600, 3], ..., [1372793400, 19], [1372795200, 18], [1372797000, 17]], dtype=int32) >>> data.shape (21022, 2) >>> times, temps = data[:, 0], data[:, 1] Берем в руки pylab
  • 19. 19 >>> data = loadtxt('sheremetjevo.csv', delimiter=';', dtype=int32) >>> data array([[1334043000, 2], [1334044800, 2], [1334046600, 3], ..., [1372793400, 19], [1372795200, 18], [1372797000, 17]], dtype=int32) >>> data.shape (21022, 2) >>> times, temps = data[:, 0], data[:, 1] >>> temps.max(), temps.min() (32, -26) Берем в руки pylab
  • 20. 20 >>> data = loadtxt('sheremetjevo.csv', delimiter=';', dtype=int32) >>> data array([[1334043000, 2], [1334044800, 2], [1334046600, 3], ..., [1372793400, 19], [1372795200, 18], [1372797000, 17]], dtype=int32) >>> data.shape (21022, 2) >>> times, temps = data[:, 0], data[:, 1] >>> temps.max(), temps.min() (32, -26) >>> plot(times, temps) Берем в руки pylab
  • 22. 22 Векторизация • Одна операция — много данных • Нет циклов на Python-е # python without numpy >>> [temps[i+1] – temps[i] for i in xrange(len(temps)-1)] Разность температур соседних наблюдений # numpy >>> temps[1:] - temps[:-1]
  • 23. 23 Векторизация • Одна операция — много данных • Нет циклов на Python-е # python without numpy >>> [temps[i+1] – temps[i] for i in xrange(len(temps)-1)] Разность температур соседних наблюдений # numpy >>> temps[1:] - temps[:-1] >>> diff(temps) # то же самое
  • 24. 24 >>> temp_diff = absolute(diff(temps)) >>> temp_diff.max() 8.0 >>> plot(times[1:], temp_diff) Разности температур между замерами
  • 28. 28 >>> histogram(temp_diff, bins=range(0,9)) (array([13044, 7028, 795, 118, 21, 5, 6, 4]), Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8])) >>> hist, scale = _ >>> hist(temp_diff, bins=range(0,9)) Строим гистограмму
  • 29. 29 hist(temp_diff, bins=range(0,9)) Частота ΔT=Ti в соседних по времени наблюдениях, по интерв. Ti ∈{0..8°},
  • 30. 30 Но нужно получить 8 таких гистограмм, соответствующих интервалам в 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5 и 4.0 часа.
  • 31. 31 # кумулятивная сумма абс. разностей температур >>> cum_temp = temp_diff_ip.cumsum() >>> plot(time_range[1:], cum_temp) Кумулятивная сумма по ΔT
  • 33. 33 >>> cum_temp[1:-7] - cum_temp[:-8] # сдвиг 1 array([1, 0, 0, ..., 0, 2, 0]) >>> cum_temp[8:] - cum_temp[:-8] # сдвиг 8 array([1, 1, 1, ..., 5, 6, 5]) Дельты T в разных интервалах t
  • 34. 34 >>> cum_temp[1:-7] - cum_temp[:-8] # сдвиг 1 array([1, 0, 0, ..., 0, 2, 0]) >>> cum_temp[8:] - cum_temp[:-8] # сдвиг 8 array([1, 1, 1, ..., 5, 6, 5]) >>> temp_diffs = array([ cum_temp[i:(-8+i) or None] - cum_temp[:-8] for i in range(1,9)]) >>> temp_diffs array([[1, 0, 0, ..., 0, 2, 0], [1, 0, 0, ..., 2, 2, 1], [1, 0, 0, ..., 2, 3, 2], ..., [1, 0, 0, ..., 4, 5, 3], [1, 0, 1, ..., 5, 5, 4], [1, 1, 1, ..., 5, 6, 5]]) Дельты T в разных интервалах t
  • 35. 35 >>> histogram(temp_diffs[0], bins=range(11)) (array([13643, 6997, 750, 104, 18, 3, 5, 2, 0, 0]), Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])) >>> histogram(temp_diffs[1], bins=range(11)) (array([9434, 7722, 3323, 804, 161, 42, 18, 8, 8, 2]), Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])) >>> histograms = array([histogram(d, bins=range(11))[0] for d in temp_diffs]) Гистограммы для каждого интервала T
  • 36. 36 >>> row_sums = histograms.sum(axis=1) >>> row_sums array([21522, 21512, 21492, 21440, 21319, 21065, 20607, 20006]) >>> histograms = histograms.astype(float64) # broadcasting >>> histograms / row_sums ValueError: operands could not be broadcast together with shapes (8,7) (8) >>> histograms / row_sums[:, None] # добавляем второе измерение array([[ 0.6, 0.3, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], [ 0.4, 0.4, 0.2, 0. , 0. , 0. , 0. , 0. , 0. , 0. ], [ 0.3, 0.3, 0.2, 0.1, 0. , 0. , 0. , 0. , 0. , 0. ], [ 0.3, 0.3, 0.2, 0.1, 0.1, 0. , 0. , 0. , 0. , 0. ], [ 0.2, 0.3, 0.2, 0.1, 0.1, 0.1, 0. , 0. , 0. , 0. ], [ 0.2, 0.2, 0.2, 0.2, 0.1, 0.1, 0. , 0. , 0. , 0. ], [ 0.1, 0.2, 0.2, 0.2, 0.1, 0.1, 0.1, 0. , 0. , 0. ], [ 0.1, 0.2, 0.2, 0.2, 0.1, 0.1, 0.1, 0.1, 0. , 0. ]]) Нормируем гистограммы
  • 37. 37 >>> histograms / row_sums[:, None] * 100 # векторизация! array([[ 63.4, 32.5, 3.5, 0.5, 0.1, 0. , 0. , 0. , 0. , 0. ], [ 43.8, 35.9, 15.4, 3.7, 0.7, 0.2, 0.1, 0. , 0. , 0. ], [ 32.5, 32.9, 20. , 9.6, 3.5, 1. , 0.3, 0.2, 0.1, 0.1], [ 25.1, 29. , 20.7, 13.2, 7. , 3.1, 1.1, 0.4, 0.2, 0.2], [ 20. , 25.5, 20. , 14.7, 9.7, 5.6, 2.5, 1.1, 0.5, 0.4], [ 16.3, 22.6, 18.6, 15. , 11.3, 7.6, 4.4, 2.3, 1.1, 0.7], [ 13.4, 20.3, 17.1, 15. , 11.5, 9.5, 6. , 3.6, 2.1, 1.6], [ 11.2, 18.4, 15.8, 14.1, 12. , 9.9, 7.7, 4.9, 3.1, 2.9]]) >>> histogram_percents = _ Нормируем гистограммы
  • 38. 38 >>> histograms / row_sums[:, None] * 100 # векторизация! array([[ 63.4, 32.5, 3.5, 0.5, 0.1, 0. , 0. , 0. , 0. , 0. ], [ 43.8, 35.9, 15.4, 3.7, 0.7, 0.2, 0.1, 0. , 0. , 0. ], [ 32.5, 32.9, 20. , 9.6, 3.5, 1. , 0.3, 0.2, 0.1, 0.1], [ 25.1, 29. , 20.7, 13.2, 7. , 3.1, 1.1, 0.4, 0.2, 0.2], [ 20. , 25.5, 20. , 14.7, 9.7, 5.6, 2.5, 1.1, 0.5, 0.4], [ 16.3, 22.6, 18.6, 15. , 11.3, 7.6, 4.4, 2.3, 1.1, 0.7], [ 13.4, 20.3, 17.1, 15. , 11.5, 9.5, 6. , 3.6, 2.1, 1.6], [ 11.2, 18.4, 15.8, 14.1, 12. , 9.9, 7.7, 4.9, 3.1, 2.9]]) >>> histogram_percents = _ >>> histogram_percents.sum(axis=1) Array([ 100., 100., 100., 100., 100., 100., 100., 100.]) Нормируем гистограммы
  • 39. 39 >>> histograms / row_sums[:, None] * 100 # векторизация! array([[ 63.4, 32.5, 3.5, 0.5, 0.1, 0. , 0. , 0. , 0. , 0. ], [ 43.8, 35.9, 15.4, 3.7, 0.7, 0.2, 0.1, 0. , 0. , 0. ], [ 32.5, 32.9, 20. , 9.6, 3.5, 1. , 0.3, 0.2, 0.1, 0.1], [ 25.1, 29. , 20.7, 13.2, 7. , 3.1, 1.1, 0.4, 0.2, 0.2], [ 20. , 25.5, 20. , 14.7, 9.7, 5.6, 2.5, 1.1, 0.5, 0.4], [ 16.3, 22.6, 18.6, 15. , 11.3, 7.6, 4.4, 2.3, 1.1, 0.7], [ 13.4, 20.3, 17.1, 15. , 11.5, 9.5, 6. , 3.6, 2.1, 1.6], [ 11.2, 18.4, 15.8, 14.1, 12. , 9.9, 7.7, 4.9, 3.1, 2.9]]) >>> histogram_percents = _ >>> histogram_percents.sum(axis=1) Array([ 100., 100., 100., 100., 100., 100., 100., 100.]) >>> imshow(histogram_percents, interpolation="nearest") Нормируем гистограммы
  • 40. 40 imshow(histogram_percents, interpolation="nearest") Частота попадания ΔT в интервалы 0..10°, по вр. интервалам
  • 41. 41 >>> imshow(histogram_percents, interpolation="nearest") >>> ylabel(u'dt (30-минутные интервалы)') >>> xlabel(u'dT (градусы)') >>> colorbar() Наводим красоту
  • 42. 42 imshow(histogram_percents, interpolation="nearest") Частота попадания ΔT в интервалы 0..10°, по вр. интервалам
  • 43. 43 >>> histogram_percents.cumsum(axis=1) # ΔT<=0 <=1 <=2 <=3 <=4 <=5 <=6 <=7 <=8 -- array([[63.4, 95.9, 99.4, 99.9,100. ,100. ,100. ,100. ,100. , 100.], [43.8, 79.7, 95.2, 98.9, 99.6, 99.8, 99.9,100. ,100. , 100.], [32.5, 65.3, 85.3, 94.9, 98.5, 99.5, 99.7, 99.9, 99.9, 100.], [25.1, 54.1, 74.9, 88.1, 95.1, 98.2, 99.3, 99.7, 99.8, 100.], [20. , 45.5, 65.5, 80.2, 89.9, 95.5, 98.1, 99.2, 99.6, 100.], [16.3, 38.8, 57.5, 72.5, 83.8, 91.5, 95.9, 98.2, 99.3, 100.], [13.4, 33.7, 50.7, 65.7, 77.2, 86.7, 92.7, 96.3, 98.4, 100.], [11.2, 29.5, 45.3, 59.5, 71.5, 81.3, 89.1, 94. , 97.1, 100.]]) Кумулятивная гистограмма
  • 44. 44 # отзеркалить, просуммировать кумулятивно, отзеркалить >>> histogram_percents[:, ::-1].cumsum(axis=1)[:, ::-1] Array([ #ΔT≥0 ≥1 ≥2 ≥3 ≥4 ≥5 ≥6 ≥7 ≥8 ≥9° [100., 36.6, 4.1, 0.6, 0.1, 0. , 0. , 0. , 0. , 0. ], # 0.5ч [100., 56.2, 20.3, 4.8, 1.1, 0.4, 0.2, 0.1, 0. , 0. ], # 1.0ч [100., 67.5, 34.7, 14.7, 5.1, 1.5, 0.5, 0.3, 0.1, 0.1], # 1.5ч [100., 74.9, 45.9, 25.1, 11.9, 4.9, 1.8, 0.7, 0.3, 0.2], # 2.0ч [100., 80. , 54.5, 34.5, 19.8, 10.1, 4.5, 1.9, 0.8, 0.4], # 2.5ч [100., 83.7, 61.2, 42.5, 27.5, 16.2, 8.5, 4.1, 1.8, 0.7], # 3.0ч [100., 86.6, 66.3, 49.3, 34.3, 22.8, 13.3, 7.3, 3.7, 1.6], # 3.5ч [100., 88.8, 70.5, 54.7, 40.5, 28.5, 18.7, 10.9, 6. , 2.9] # 4.0ч ]) >>> histogram_cum = _ >>> savetxt('histogram_cum.txt', histogram_cum) Кумулятивная гистограмма
  • 45. 45 imshow(histogram_cum, interpolation="nearest") Частота того, что Δt T ≤ Ti , Ti ∈{0..10°}, Δt ∈{0.5..4.0ч}
  • 46. 46 imshow(histogram_cum) Частота того, что Δt T ≤ Ti , Ti ∈{0..10°}, Δt ∈{0.5..4.0ч}
  • 47. 47 Чем больше времени проходит, тем сильнее “размывается” температура
  • 48. 48 # Через какое время T изменится на 2° и более, # с вероятностью 50%? #ΔT≥0 ≥1 ≥2 ≥3 ≥4 ≥5 ≥6 ≥7 ≥8 ≥9° [100., 36.6, 4.1, 0.6, 0.1, 0. , 0. , 0. , 0. , 0. ], # 0.5ч [100., 56.2, 20.3, 4.8, 1.1, 0.4, 0.2, 0.1, 0. , 0. ], # 1.0ч [100., 67.5, 34.7, 14.7, 5.1, 1.5, 0.5, 0.3, 0.1, 0.1], # 1.5ч [100., 74.9, 45.9, 25.1, 11.9, 4.9, 1.8, 0.7, 0.3, 0.2], # 2.0ч [100., 80. , 54.5, 34.5, 19.8, 10.1, 4.5, 1.9, 0.8, 0.4], # 2.5ч [100., 83.7, 61.2, 42.5, 27.5, 16.2, 8.5, 4.1, 1.8, 0.7], # 3.0ч [100., 86.6, 66.3, 49.3, 34.3, 22.8, 13.3, 7.3, 3.7, 1.6], # 3.5ч [100., 88.8, 70.5, 54.7, 40.5, 28.5, 18.7, 10.9, 6. , 2.9] # 4.0ч Где ответ?
  • 49. 49 После Δt=2.5ч температура меняется на 2°C и более, с вероятностью 50%
  • 50. 50 Ссылки • numpy.org • matplotlib.org • habrahabr.ru/search/?q=numpy • scipy.org • conference.scipy.org/scipy2013/ • github.com/fonnesbeck/statistical-analysis-python-tutorial