Python для обеспечения географических исследований Лекция 6

advertisement
Python для обеспечения
географических исследований
Лекция 6
Сегодня на повестке дня:
Обзор библиотек для статистики, пространственного
анализа и создания карт
2
Кратко посмотрим на:
Numpy, SciPy
matplotib
pysal
cartopy
rtree
statsmodels
geographiclib
pyshp
pyproj
vincent
3
NumPy
http://numpy.scipy.org/
Пакет Numpy включает модули для эффективной работы с
многомерными массивами, матрицами, функции для
генерации псевдослучайных чисел, функции, реализующие
алгоритмы линейной алгебры, преобразование Фурье,
возможности интеграции программ на языках С и Фортран.
4
В основном NumPy используется как инструмент работы со сложными массивами
Он позволяет создавать собственный тип массивов numpy.array, для которого
предоставляет большое количество функций. Также работа с такими массивами
в значительной степени оптимизирована и существенно быстрее обычных списков
Самое основное:
- Применение функций к массиву поэлементно
- Матричная алгебра
- Линейная алгебра
- Статистика
- Работа с полиномами
-…
5
Примеры функций:
numpy.sign(a) - возвращает -1 если a < 0, 0 если a == 0, 1 если a > 0;
numpy.degrees(a) - конвертирует a из радиан в градусы;
numpy.radians(a) - конвертирует a из градусов в радианы;
numpy.cos(a), numpy.sin(a), numpy.tan(a) - возвращает косинус, синус, тангенс a. a в
радианах;
numpy.cosh(a), numpy.sinh(a), numpy.tanh(a) - возвращает гиперболические косинус, синус,
тангенс a. a в радианах;
numpy.arccos(a), numpy.arcsin(a), numpy.arctan(a) - возвращает арккосинус, арксинус,
арктангенс a в радианах. Для арккосинуса в диапазоне [0, nump.pi], для арксинуса [numpy.pi/2, numpy.pi/2], для арктангенса [-numpy.pi/2, numpy.pi/2];
numpy.arccosh(a), numpy.arcsinh(a), numpy.arctanh(a) - возвращает гиперболические
косинус, синус, тангенс a. a в радианах;
numpy.exp(a) - возвращает основание натурального логарифма (число e) в степени a;
6
numpy.log1p(a) - возвращает натуральный логарифм a + 1;
numpy.sqrt(a) - возвращает положительный квадратный корень a;
numpy.square(a) - возвращает квадрат a.
numpy.fix(a, out = None) - отбрасывает дробную часть a;
numpy.ceil(a, out = None) - округляет a до меньшего из целых больших или равных a;
numpy.log(a), numpy.log10(a), numpy.log2(a) - возвращает натуральный логарифм a,
логарифм a по основанию 10, логарифм a по основанию 2;
7
Модуль numpy.linalg:
Работа с векторами
Работа с матрицами (определители, обращение матриц, перемножение и т.п.)
Решение систем линейных уравнений
Декомпозиция
Причем вызывается всё просто:
numpy.linalg.solve(a,b)
8
Статистика:
Корреляция, кросс-корреляция, ковариация
corrcoef(x[, y, rowvar, bias, ddof])
correlate(a, v[, mode, old_behavior])
cov(m[, y, rowvar, bias, ddof])
Базовая статистика по массиву
median(a[, axis, out, overwrite_input, keepdims])
average(a[, axis, weights, returned])
mean(a[, axis, dtype, out, keepdims])
std(a[, axis, dtype, out, ddof, keepdims])
…
9
Использование
>>> a = numpy.array([[1, 2], [3, 4]])
>>> numpy.std(a)
1.1180339887498949
3 * x0 + x1 = 9 и x0 + 2 * x1 = 8:
>>> a = np.array([[3,1], [1,2]])
>>> b = np.array([9,8])
>>> x = np.linalg.solve(a, b)
>>> x
array([ 2., 3.])
10
SciPy
http://www.scipy.org/
Расширяет NumPy. Содержит модули для оптимизации, интегрирования,
специальных функций, обработки сигналов, обработки изображений,
генетических алгоритмов, решения обыкновенных дифференциальных
уравнений и других задач, обычно решаемых в науке и при инженерной
разработке.
11
constants: Физические константы и
коэффициенты пересчёта (с версии 0.7.0[2])
cluster: Векторное квантование
fftpack: Дискретные алгоритмы
преобразования Фурье
integrate: Инструменты для интегрирования
interpolate: Инструменты для интерполяции
io: Ввод-вывод данных
lib: Врапперы Python для внешних
библиотек
linalg: Линейная алгебра
misc: Разные утилиты
optimize: Средства оптимизации
signal: Обработка сигналов
sparse: Поддержка разреженных матриц
special: Специальные функции
stats: Статистические функции
weave: Позволяет включение кода C/C++
внутри кода Python
12
MatPlotLib
http://matplotlib.org/
Мощная библиотека для построения 2D и 3D графиков, диаграмм и т.д.
Обычный сценарий: генерируем с помощью Scipy/Numpy какие-то значения
и визуализируем их в matplotlib
13
import math
import matplotlib
def func (x):
if x == 0:
return 1.0
return math.sin (x) / x
# Интервал изменения переменной по оси X
xmin = -20.0
xmax = 20.0
# Шаг между точками
dx = 0.01
# !!! Создадим список координат по оси X на отрезке [-xmin; xmax], включая концы
xlist = matplotlib.frange (xmin, xmax, dx)
# Вычислим значение функции в заданных точках
ylist = [func (x) for x in xlist]
# !!! Нарисуем одномерный график
matplotlib.plot (xlist, ylist)
# !!! Покажем окно с нарисованным графиком
matplotlib.show()
14
15
Если вызывать функцию plot() несколько раз
подряд, то на график будут добавляться
новые кривые.
ylist1 = [func (x) for x in xlist]
ylist2 = [func (x * 0.2) for x in xlist]
# !!! Нарисуем одномерные графики
matplotlib.plot (xlist, ylist1)
matplotlib.plot (xlist, ylist2)
16
import numpy as np
import matplotlib.pyplot as plt
x1 = np.linspace(0.0, 5.0)
x2 = np.linspace(0.0, 2.0)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
y2 = np.cos(2 * np.pi * x2)plt.subplot(2, 1, 1)
plt.plot(x1, y1, 'yo-')plt.title('A tale of 2
subplots')
plt.ylabel('Damped oscillation‘)
plt.subplot(2, 1, 2)
plt.plot(x2, y2, 'r.-')
plt.xlabel('time (s)')
plt.ylabel('Undamped')
plt.show()
17
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
# example data
mu = 100
# mean of distribution
sigma = 15 # standard deviation of distribution
x = mu + sigma * np.random.randn(10000)
num_bins = 50
# the histogram of the data
n, bins, patches = plt.hist(x, num_bins, normed=1,
facecolor='green', alpha=0.5)
# add a 'best fit'
liney = mlab.normpdf(bins, mu, sigma)
plt.plot(bins, y, 'r--')
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title(r'Histogram of IQ: $\mu=100$, $\sigma=15$')
ylabelplt.subplots_adjust(left=0.15)
plt.show()
18
19
20
from matplotlib import *
n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
scatter(X,Y)
show()
21
22
Подробно настраивается вся стилизация, цвета, расположение, подписи и др.
23
Всё, что строит matplotlib, визуализируется автоматически с инструментами обзора и
кнопками «сохранить как» и т.д.
Кроме того, любые графики можно сразу генерировать в изображения или .pdf
программно, что удобно при обработке больших наборов данных
24
PySAL (Python spatial analysis library)
http://www.pysal.org/
Библиотека средств пространственного анализа
25
Data I/O: read and write shapefiles
Shapefile visualization
Spatial Weights
Core functionality of PySAL
ESDA & spatial autocorrelation
Specific modules: region, spreg, spatial_dynamics and inequality
contrib module
Обработка геометрий, пространственная статистика и т.д.
В основном реализованы различные геостатистические вещи вроде методов
Маркова и др.
26
Cartopy
http://scitools.org.uk/cartopy/docs/latest/index.html
Отрисовка пространственных данных (карт), пространственный анализ
Много внимания уделено картографическим преобразованиям
27
Визуализация shape-файлов
Пересчет проекций
28
Создание своих shape-файлов, пообъектная обработка, разнообразная визуализация
http://scitools.org.uk/cartopy/docs/latest/examples/hurricane_katrina.html
29
Обработка растров.
Теневая отмывка ЦМР
30
Различные векторные наложения
31
Получение данных с веб-сервисов (растровые подложки)
32
statsmodels
http://statsmodels.sourceforge.net/
Огромное количество статистических модулей
33
Linear regression models
Generalized linear models
Discrete choice models
Robust linear models
Many models and functions for time series analysis
Nonparametric estimators
A collection of datasets for examples
A wide range of statistical tests
Input-output tools for producing tables in a number of formats (Text, LaTex, HTML)
and for reading Stata files into NumPy and Pandas.
Plotting functions
Extensive unit tests to ensure correctness of results
Many more models and extensions in development
34
Авторегрессия
35
Vincent
http://vincent.readthedocs.org/
Мощное средство визуализации json-данных в виде графиков и карт.
world_topo = r'world-countries.topo.json'
geo_data = [{'name': 'countries',
'url': world_topo,
'feature': 'world-countries'}]
vis = vincent.Map(geo_data=geo_data,
scale=200)
36
geo_data = [{'name': 'counties',
'url': county_topo,
'feature': 'us_counties.geo'}]
vis = vincent.Map(data=merged,
geo_data=geo_data, scale=1100,
projection='albersUsa',
data_bind='Employed_2011',
data_key='FIPS',
map_key={'counties': 'properties.FIPS'})
vis.marks[0].properties.enter.stroke_opacity =
ValueRef(value=0.5)
vis.to_json('vega.json')
37
vis.rebind(column='Unemployment_rate_2011', brew='YlGnBu')
vis.to_json('vega.json')
38
39
GDAL
https://pypi.python.org/pypi/GDAL/
Вообще GDAL это могучий набор средств для управления растровыми и векторными
наборами геоданных.
С помощью него читаются и записываются данные почти что во всех ГИС,
производятся многие операции обработки.
Если вам нужно читать/писать геоданные, получать информацию о них – скорее
всего вам нужен GDAL.
40
import osgeo.gdal as gdal
gdalData = gdal.Open( "/home/test/input.tiff", GA_ReadOnly )
print "Driver short name", gdalData.GetDriver().ShortName
print "Driver long name", gdalData.GetDriver().LongName
print "Raster size", gdalData.RasterXSize, "x", gdalData.RasterYSize
print "Number of bands", gdalData.RasterCount
print "Projection", gdalData.GetProjection()
print "Geo transform", gdalData.GetGeoTransform()
#Чтение растра
raster = gdalData.ReadAsArray()
#Чтение канала
gdalBand = gdalData.GetRasterBand( 1 ) band_1 =
gdalBand.ReadAsArray()
#Чтение блока
line = gdalBand.ReadAsArray( xoffeset, yoffset, xsize, ysize )
41
Любое изображение можно прочитать как массив (это ведь матрица пикселей).
Затем средствами обработки массивов numpy можно делать с этими массивами
что угодно
42
43
GeoPy
https://geopy.readthedocs.org/en/1.10.0/
Геокодирование
PyShp
https://code.google.com/p/pyshp/
Ещё одна библиотека для работы с shape-файлами
44
nodebox opengl
http://www.cityinabottle.org/nodebox/
Мощный инструмент для создания 2D-визуализаций
rtree
https://pypi.python.org/pypi/Rtree/
Поиск и индексация пространственных данных
45
Из Python можно использовать весь неинтерактивный потенциал QuantumGIS,
а также мощные статистические языки, например R.
http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/intro.html
http://gis-lab.info/qa/qgis-standalone.html
http://rpy.sourceforge.net/
46
Спасибо за внимание!
e.kazakov@spbu.ru
ekazakov.info/students
47
Download