SlideShare a Scribd company logo
1 of 51
Download to read offline
Руслан Гроховецкий
руководитель группы справочных сервисов
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

What's hot

PG Day'14 Russia, Модуль anyarray, Федор Сигаев
PG Day'14 Russia, Модуль anyarray, Федор СигаевPG Day'14 Russia, Модуль anyarray, Федор Сигаев
PG Day'14 Russia, Модуль anyarray, Федор Сигаевpgdayrussia
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркингаAndrey Akinshin
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 

What's hot (13)

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

Similar to Про Python и вычисления.

Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)Bitworks Software
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
презентация
презентацияпрезентация
презентацияLIANA180
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности PythonPyNSK
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Roman Brovko
 
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...Iosif Itkin
 
Лекция 1: Амортизационный анализ (Amortized analysis)
Лекция 1: Амортизационный анализ (Amortized analysis)Лекция 1: Амортизационный анализ (Amortized analysis)
Лекция 1: Амортизационный анализ (Amortized analysis)Mikhail Kurnosov
 
алгебра 7кл алимов решебник_2002 1-801
алгебра 7кл алимов решебник_2002  1-801алгебра 7кл алимов решебник_2002  1-801
алгебра 7кл алимов решебник_2002 1-801narvel666
 
гдз по алгебре 7 класс алимов ш. а. и др
гдз по алгебре 7 класс алимов ш. а. и дргдз по алгебре 7 класс алимов ш. а. и др
гдз по алгебре 7 класс алимов ш. а. и дрYou DZ
 
Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Mikhail Kurnosov
 
алгоритмизация
алгоритмизацияалгоритмизация
алгоритмизацияisva69
 
Tugas 1 Matematika Terapan (S2)
Tugas 1 Matematika Terapan (S2)Tugas 1 Matematika Terapan (S2)
Tugas 1 Matematika Terapan (S2)Rahmawaty Er
 
повторение 7кл. алгебра
повторение 7кл. алгебраповторение 7кл. алгебра
повторение 7кл. алгебраLyudmila Yefremova
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliaminComputer Science Club
 
lab1 math computational
lab1 math computationallab1 math computational
lab1 math computationaldinhtruonglam1
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and ClojureVasil Remeniuk
 
4. Многомерные массивы и массивы массивов в C#
4. Многомерные массивы и массивы массивов в C#4. Многомерные массивы и массивы массивов в C#
4. Многомерные массивы и массивы массивов в C#Olga Maksimenkova
 

Similar to Про Python и вычисления. (20)

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

More from Optima-PROMO

Презентация "От сердца к сердцу".
Презентация "От сердца к сердцу".Презентация "От сердца к сердцу".
Презентация "От сердца к сердцу".Optima-PROMO
 
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...Optima-PROMO
 
Ассесорное руководство: Факторы оценки качества поиска от Google
Ассесорное руководство: Факторы оценки качества поиска от GoogleАссесорное руководство: Факторы оценки качества поиска от Google
Ассесорное руководство: Факторы оценки качества поиска от GoogleOptima-PROMO
 
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...Optima-PROMO
 
Что из себя представляет новая технология формирования выдачи в Поиске для са...
Что из себя представляет новая технология формирования выдачи в Поиске для са...Что из себя представляет новая технология формирования выдачи в Поиске для са...
Что из себя представляет новая технология формирования выдачи в Поиске для са...Optima-PROMO
 
Как модуль geoQuery упрощает работу с API Яндекс.Карт.
Как модуль geoQuery упрощает работу с API Яндекс.Карт.Как модуль geoQuery упрощает работу с API Яндекс.Карт.
Как модуль geoQuery упрощает работу с API Яндекс.Карт.Optima-PROMO
 
Как использовать информацию из твиттера для улучшения поиска.
Как использовать информацию из твиттера для улучшения поиска.Как использовать информацию из твиттера для улучшения поиска.
Как использовать информацию из твиттера для улучшения поиска.Optima-PROMO
 
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...Optima-PROMO
 
Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Optima-PROMO
 
Как максимально повысить продажи с сайта в 2013 году?
Как максимально повысить продажи с сайта в 2013 году?Как максимально повысить продажи с сайта в 2013 году?
Как максимально повысить продажи с сайта в 2013 году?Optima-PROMO
 
Голованов Дмитрий - тренды поискового продвижения сайтов 2012
Голованов Дмитрий - тренды поискового продвижения сайтов 2012Голованов Дмитрий - тренды поискового продвижения сайтов 2012
Голованов Дмитрий - тренды поискового продвижения сайтов 2012Optima-PROMO
 
Асессоры Яндекса
Асессоры ЯндексаАсессоры Яндекса
Асессоры ЯндексаOptima-PROMO
 
Презентация про тренды в SEO в продвижении сайтов
Презентация про тренды в SEO в продвижении сайтовПрезентация про тренды в SEO в продвижении сайтов
Презентация про тренды в SEO в продвижении сайтовOptima-PROMO
 
презентация про тренды в Seo
презентация про тренды в Seoпрезентация про тренды в Seo
презентация про тренды в SeoOptima-PROMO
 
Презентация компании "Optima-Promo"
Презентация компании "Optima-Promo"Презентация компании "Optima-Promo"
Презентация компании "Optima-Promo"Optima-PROMO
 
12 мая index.art голованов д.о 1.3
12 мая index.art голованов д.о 1.312 мая index.art голованов д.о 1.3
12 мая index.art голованов д.о 1.3Optima-PROMO
 

More from Optima-PROMO (16)

Презентация "От сердца к сердцу".
Презентация "От сердца к сердцу".Презентация "От сердца к сердцу".
Презентация "От сердца к сердцу".
 
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...
SEO 2014: Отмена ссылочного ранжирования в Яндексе в 2014 году – миф или реал...
 
Ассесорное руководство: Факторы оценки качества поиска от Google
Ассесорное руководство: Факторы оценки качества поиска от GoogleАссесорное руководство: Факторы оценки качества поиска от Google
Ассесорное руководство: Факторы оценки качества поиска от Google
 
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
Как повышать продажи с сайта за счет комплекснового поискового продвижения са...
 
Что из себя представляет новая технология формирования выдачи в Поиске для са...
Что из себя представляет новая технология формирования выдачи в Поиске для са...Что из себя представляет новая технология формирования выдачи в Поиске для са...
Что из себя представляет новая технология формирования выдачи в Поиске для са...
 
Как модуль geoQuery упрощает работу с API Яндекс.Карт.
Как модуль geoQuery упрощает работу с API Яндекс.Карт.Как модуль geoQuery упрощает работу с API Яндекс.Карт.
Как модуль geoQuery упрощает работу с API Яндекс.Карт.
 
Как использовать информацию из твиттера для улучшения поиска.
Как использовать информацию из твиттера для улучшения поиска.Как использовать информацию из твиттера для улучшения поиска.
Как использовать информацию из твиттера для улучшения поиска.
 
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...
Чем отличаются интеракции в разных поисковых системах и как создать свой "ост...
 
Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)
 
Как максимально повысить продажи с сайта в 2013 году?
Как максимально повысить продажи с сайта в 2013 году?Как максимально повысить продажи с сайта в 2013 году?
Как максимально повысить продажи с сайта в 2013 году?
 
Голованов Дмитрий - тренды поискового продвижения сайтов 2012
Голованов Дмитрий - тренды поискового продвижения сайтов 2012Голованов Дмитрий - тренды поискового продвижения сайтов 2012
Голованов Дмитрий - тренды поискового продвижения сайтов 2012
 
Асессоры Яндекса
Асессоры ЯндексаАсессоры Яндекса
Асессоры Яндекса
 
Презентация про тренды в SEO в продвижении сайтов
Презентация про тренды в SEO в продвижении сайтовПрезентация про тренды в SEO в продвижении сайтов
Презентация про тренды в SEO в продвижении сайтов
 
презентация про тренды в Seo
презентация про тренды в Seoпрезентация про тренды в Seo
презентация про тренды в Seo
 
Презентация компании "Optima-Promo"
Презентация компании "Optima-Promo"Презентация компании "Optima-Promo"
Презентация компании "Optima-Promo"
 
12 мая index.art голованов д.о 1.3
12 мая index.art голованов д.о 1.312 мая index.art голованов д.о 1.3
12 мая index.art голованов д.о 1.3
 

Про 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