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