Автоматизация поиска на Python

Язык программирования Python все больше находит свое применение в научных расчетах рачётах и анализе данных.

Среди причин популярности языка является его лаконичность и удобство чтения кода, который, учитывая его синтаксис и рекомендации по написанию кода pep8, просто не может оказаться плохо читаемым.

Воспроизведение приводимых ниже экспериментов предполагает установленный Python интерпретатор (код протестирован на Python 3.5.2), с установленным пакетом Pandas. Дополнительно, для фильтрации данных по сложным географическим областям, предполагается, что в системе установлены пакеты: pyshp (для чтения shape файлов), shapely (для определения принадлежности точки полигону), geopy (для вычисления расстояний на геоиде/сфере Земли).

Для пользователей Windows рекомендуется установить дистрибутив Anaconda, который включает Pandas, а также большое число других пакетов для организации вычислений.

Выполняемый код в приводимом документе содержится в блоках, имеющих вид In[xxx]; его можно выполнить с использованием интерпретатора Python, либо интерактивном режиме, либо предварительно сохранив в файл Python скрипта -- текстовой файл с расширением .py.

Данный документ создан при помощи Jupyter, он входит в последние дистрибутивы Anaconda.

Простые запросы

Импортируем пакет Pandas. Данный пакет содержит большое количество полезных функций для выполнения операций загрузки и предварительной обработки данных, имеющих различную структуру.

In [1]:
import pandas as pd

Определим переменную HERBARIUM_SEARCH_URL, которая будет указывать на URL, по которому следует посылать поисковые запросы к электронному гербарному каталогу.

In [2]:
HERBARIUM_SEARCH_URL = 'http://botsad.ru/hitem/json/'

Название переменной намерено выбрано интуитивно понятным, можно было бы ограничиться и более простым названием, например, URL. Тем не менее, крайне рекомендуется давать понятные и лаконичные названия переменным, особенно, если описываемая программой вычислительная процедура состоит из большого числа действий/присвоений/вычислений.

Формирование поисковых запросов допускается как по шифрованному HTTPS протоколу, так и без шифрования HTTP. В случае использования HTTPS, это следует указать в переменной HERBARIUM_SEARCH_URL, т.е. заменить "http://" на "https://".

Зададим поисковые параметры и их значения в виде списка: (полный перечень поисковых параметров можно посмотреть по ссылке

In [3]:
search_parameters = (('collectedby', 'Крестов'),
                     ('identifiedby', 'Крестов'),
                     ('colstart', '2016-01-01'),
                     ('colend', '2016-12-30')
                    )

Импортируем необходимые библиотеки для выполнения HTTP-запроса к серверу. В зависимости от используемой версии Python импортирование выполняется по разному. И хотя Python 2.x в скором будущем официально перестанет поддерживаться, ниже дается фрагмент кода (импорт необходимых в дальнейшем библиотек), подходящий как для Python 2.x, так и Python 3.x:

In [4]:
try:
    # Python 3.x
    from urllib.parse import quote
    from urllib.request import urlopen
except ImportError:
    # Python 2.x
    from urllib import quote
    from urllib import urlopen

Создадим текущий поисковый url, используя значения поисковых параметров search_parameters:

In [5]:
search_request_url = HERBARIUM_SEARCH_URL + '?' + '&'.join(map(lambda x: x[0] + '=' + quote(x[1].strip()), search_parameters))

Поскольку в соответствии со спецификацией URI не должен содержать не ASCII-символы, каковыми в частности являются буквы русского алфавита, участвующие в поисковом запросе, здесь используется вспомогательная функция quote, которая берет на себя операцию кодирования таких символов.

В случе несложных запросов, поисковый URI можно записать одной строкой и не вводить вспомогательную структуру search_parameters. Однако, схема с использованием search_parameters более общая, позволяет структурировать поисковые запросы, создавав предварительно их массив, например:

list_of_search_pars = [search_parameters1, search_parameters2, search_parameters3,]

Вот так выглядит поисковый url (search_request_url).

In [6]:
search_request_url
Out[6]:
'http://botsad.ru/hitem/json/?collectedby=%D0%9A%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2&identifiedby=%D0%9A%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2&colstart=2016-01-01&colend=2016-12-30'
In [7]:
import json
server_response = urlopen(search_request_url)
data = json.loads(server_response.read().decode('utf-8'))
server_response.close()

Теперь переменная data представляeт собой Python-словарь с полями, определенными в документе, описывающим спецификацию json-ответа сервера на поисковый запрос.

Прежде чем начать работать с полученными данными, важно проверить, прошла ли загрузка данных без ошибок и предупреждений. Для этого следует посмотреть значения полей errors и warnings структуры data. В случае успешно выполненного запроса, поля должны быть пустыми.

In [8]:
data['errors'], data['warnings']
Out[8]:
([], [])

Следует отметить, что наличие предупреждений warnings, не является критичным; более того, при некоторых видах поисковых запросов, наличие warnings неизбежно; Таким образом, обработку данных следует продолжать и при не пустом значении поля warnings.

Тем не менее, полностью игнорировать warnings не следует; данный параметр может содержать полезную информацию о результатах поиска и\или корректности поискового запроса.

Данный запрос был выполнен без ошибок и предупреждений (по крайней мере, по состоянию на 19 июня 2017 г), теперь можно работать с данными средствами Python, Pandas и т.п.

In [9]:
print("Количество записей, удовлетворящих Вашему поисковому запросу равно:", len(data['data']))
Количество записей, удовлетворящих Вашему поисковому запросу равно: 173

Для большего удобстав работы с данными, рекомендуется преобразовать их в DataFrame-объект из пакета Pandas. Для этого, достаточно подать на вход конструктора DataFrame словарь data['data']:

In [10]:
search_df = pd.DataFrame(data['data'])

Общую информацию о созданном DataFrame-объекте можно получить используя методы .info() или .describe():

In [11]:
search_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 173 entries, 0 to 172
Data columns (total 41 columns):
acronym                     173 non-null object
additionals                 173 non-null object
altitude                    173 non-null object
branch                      173 non-null object
collection_finished         173 non-null object
collection_started          173 non-null object
collectors                  173 non-null object
country                     173 non-null object
country_id                  173 non-null int64
created                     173 non-null object
details                     173 non-null object
dethistory                  173 non-null object
devstage                    173 non-null object
district                    173 non-null object
family                      173 non-null object
family_authorship           173 non-null object
fieldid                     173 non-null object
genus                       173 non-null object
genus_authorship            173 non-null object
gpsbased                    173 non-null bool
id                          173 non-null int64
identification_finished     173 non-null object
identification_started      173 non-null object
identifiers                 173 non-null object
images                      173 non-null object
infraspecific_authorship    173 non-null object
infraspecific_epithet       173 non-null object
infraspecific_rank          173 non-null object
itemcode                    173 non-null object
latitude                    173 non-null float64
longitude                   173 non-null float64
note                        173 non-null object
region                      173 non-null object
short_note                  173 non-null object
significance                173 non-null object
species_authorship          173 non-null object
species_epithet             173 non-null object
species_fullname            173 non-null object
species_id                  173 non-null int64
species_status              173 non-null object
updated                     173 non-null object
dtypes: bool(1), float64(2), int64(3), object(35)
memory usage: 54.3+ KB

Так выглядит сокращенный вариант таблицы гербарных данных:

In [12]:
search_df
Out[12]:
acronym additionals altitude branch collection_finished collection_started collectors country country_id created ... note region short_note significance species_authorship species_epithet species_fullname species_id species_status updated
0 VBGI [] 2016-07-31 2016-07-31 Крестов П.В. Russia 162 2016-12-20 ... Хабаровский край L. compactum Rheum compactum L. 463887 From plantlist 2017-06-13
1 VBGI [] 2016-07-30 2016-07-30 Крестов П.В. Russia 162 2016-12-20 ... Хабаровский край (Pall.) Regel pumila Pinus pumila (Pall.) Regel 430118 From plantlist 2017-06-13
2 VBGI [] 2016-07-30 2016-07-30 Крестов П.В. Russia 162 2016-12-20 ... молодое дерево 8 м высотой Хабаровский край Siebold & Zucc. koraiensis Pinus koraiensis Siebold & Zucc. 430060 From plantlist 2017-06-13
3 VBGI [] 551 2016-08-10 2016-08-10 Крестов П.В. Russia 162 2016-12-20 ... дерево высотой 14 м Хабаровский край (Trautv. ex Maxim.) Maxim. nephrolepis Abies nephrolepis (Trautv. ex Maxim.) Maxim. 429823 From plantlist 2017-06-13
4 VBGI [] 1000 2016-08-11 2016-08-11 Корзников К.А., Крестов П.В. Russia 162 2016-12-20 ... Хабаровский край (L.) R.Br. repens Goodyera repens (L.) R.Br. 397192 From plantlist 2017-06-13
5 VBGI [] 1687 2016-08-11 2016-08-11 Крестов П.В. Russia 162 2016-12-20 ... Хабаровский край Willd. ex Schult. & Schult.f. splendens Allium splendens Willd. ex Schult. & Schult.f. 18583 From plantlist 2017-06-13
6 VBGI [] 1687 2016-08-11 2016-08-11 Крестов П.В. Russia 162 2016-12-20 ... Хабаровский край (Franch. & Sav.) Jacobsen rosea Rhodiola rosea (Franch. & Sav.) Jacobsen 190849 From plantlist 2017-06-13
7 VBGI [] 2016-08-13 2016-08-13 Крестов П.В. Russia 162 2016-12-22 ... Хабаровский край (Fisch. & C.A. Mey. ex Turcz.) Hiroë seseloides Seseli seseloides (Fisch. & C.A. Mey. ex Turcz... 588165 From plantlist 2017-06-13
8 VBGI [] 543 2016-08-13 2016-08-13 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (L.) R.Br. repens Goodyera repens (L.) R.Br. 397192 From plantlist 2017-06-13
9 VBGI [] 543 2016-08-13 2016-08-13 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (L.) House secunda Orthilia secunda (L.) House 223419 From plantlist 2017-06-13
10 VBGI [] 1478 2016-08-08 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (L.) Nied. alpina Arctous alpina (L.) Nied. 220205 From plantlist 2017-06-13
11 VBGI [] 2016-08-10 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край Trautv. & C.A.Mey. gigantea Corydalis gigantea Trautv. & C.A.Mey. 422189 From plantlist 2017-06-13
12 VBGI [] 551 2016-08-10 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край Fisch. & C.A. Mey. davurica Smilacina davurica Fisch. & C.A. Mey. 58614 From plantlist 2017-06-13
13 VBGI [] 1000 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край A.Gray uniflora Moneses uniflora A.Gray 223313 Approved 2017-06-13
14 VBGI [] 1650 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край L. farinosa Primula farinosa L. 479002 From plantlist 2017-06-13
15 VBGI [] 1650 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край L. palustris Parnassia palustris L. 115798 From plantlist 2017-06-13
16 VBGI [] 1687 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край Maxim. redowskianum Rhododendron redowskianum Maxim. 224959 From plantlist 2017-06-13
17 VBGI [] 1422 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край DC. erianthum Geranium erianthum DC. 242710 From plantlist 2017-06-13
18 VBGI [] 1430 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (Biehler) Fisch. gmelinii Adenophora gmelinii (Biehler) Fisch. 101301 From plantlist 2017-06-13
19 VBGI [] 2016-08-13 2016-08-13 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край Michx. scirpoides Equisetum scirpoides Michx. 219648 From plantlist 2017-06-13
20 VBGI [] 2016-08-13 2016-08-13 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край Lam. punctata Campanula punctata Lam. 101961 From plantlist 2017-06-13
21 VBGI [] 2016-08-13 2016-08-13 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край Kom. ussuriensis Carex ussuriensis Kom. 199952 From plantlist 2017-06-13
22 VBGI [] 2016-08-13 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (L.) Fenzl lateriflora Moehringia lateriflora (L.) Fenzl 110809 Approved 2017-06-13
23 VBGI [] 2016-08-13 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (Maxim.) Pax sylvatica Pseudostellaria sylvatica (Maxim.) Pax 111296 Approved 2017-06-13
24 VBGI [] 2016-08-13 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край Nakai neoserrata Saussurea neoserrata Nakai 169440 From plantlist 2017-06-13
25 VBGI [] 543 2016-08-13 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край Sw. pallescens Luzula pallescens Sw. 265836 From plantlist 2017-06-13
26 VBGI [] 1200 2016-07-30 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край Trautv. & C.A. Mey. ukurunduense Acer ukurunduense Trautv. & C.A. Mey. 588172 From plantlist 2017-06-13
27 VBGI [] 1200 2016-07-30 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (Kom.) L.H.Bailey suavis Weigela suavis (Kom.) L.H.Bailey 107629 From plantlist 2017-06-13
28 VBGI [] 1200 2016-07-30 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (Fisch. ex Trevir.) Pimenov terebinthacea Kitagawia terebinthacea (Fisch. ex Trevir.) Pi... 588202 From plantlist 2017-06-13
29 VBGI [] 1000 2016-07-30 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (Fisch. ex Besser) DC. lagocephala Artemisia lagocephala (Fisch. ex Besser) DC. 125884 From plantlist 2017-06-13
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
143 VBGI [] 1200 2016-07-30 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Trautv. & C.A. Mey. ukurunduense Acer ukurunduense Trautv. & C.A. Mey. 588172 From plantlist 2017-06-13
144 VBGI [] 1500 2016-08-08 Крестов П.В. Russia 162 2017-02-15 ... узколистная форма Хабаровский край Regel & Tiling ajanensis Tilingia ajanensis Regel & Tiling 34270 From plantlist 2017-06-13
145 VBGI [] 1200 2016-07-30 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край (Fisch. ex Trevir.) Pimenov terebinthacea Kitagawia terebinthacea (Fisch. ex Trevir.) Pi... 588202 From plantlist 2017-06-13
146 VBGI [] 2016-08-10 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край (F.Schmidt) Benth. ex Maxim. maximowiczii Angelica maximowiczii (F.Schmidt) Benth. ex Ma... 28096 From plantlist 2017-06-13
147 VBGI [] 2016-08-10 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край (F.Schmidt) Benth. ex Maxim. maximowiczii Angelica maximowiczii (F.Schmidt) Benth. ex Ma... 28096 From plantlist 2017-06-13
148 VBGI [] 2016-08-09 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Miq. keiskei Convallaria keiskei Miq. 56562 From plantlist 2017-06-13
149 VBGI [] 1500 2016-08-02 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Trautv. & C.A.Mey. middendorffii Hemerocallis middendorffii Trautv. & C.A.Mey. 585041 From plantlist 2017-06-13
150 VBGI [] 1500 2016-08-02 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Trautv. & C.A.Mey. middendorffii Hemerocallis middendorffii Trautv. & C.A.Mey. 585041 From plantlist 2017-06-13
151 VBGI [] 2016-07-31 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край M.Bieb. verticillata Paris verticillata M.Bieb. 350346 From plantlist 2017-06-13
152 VBGI [] 1378 2016-08-08 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край (Trautv. & C.A.Mey.) Takeda & Miyake anticleoides Veratrum anticleoides (Trautv. & C.A.Mey.) Tak... 350453 From plantlist 2017-06-13
153 VBGI [] 1687 2016-08-11 2016-08-11 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Willd. ex Schult. & Schult.f. splendens Allium splendens Willd. ex Schult. & Schult.f. 18583 From plantlist 2017-06-13
154 VBGI [] 551 2016-08-10 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Fisch. & C.A. Mey. davurica Smilacina davurica Fisch. & C.A. Mey. 58614 From plantlist 2017-06-13
155 VBGI [] 2016-08-10 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Trautv. & C.A.Mey. gigantea Corydalis gigantea Trautv. & C.A.Mey. 422189 From plantlist 2017-06-13
156 VBGI [] 2016-07-31 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Turcz. schelichowii Astragalus schelichowii Turcz. 291178 From plantlist 2017-06-13
157 VBGI [] 550 2016-07-31 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край (Rupr.) Regel maximowiczii Lonicera maximowiczii (Rupr.) Regel 106030 From plantlist 2017-06-13
158 VBGI [] 550 2016-07-30 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край L. racemosa Sambucus racemosa L. 9060 From plantlist 2017-06-13
159 VBGI [] 2016-08-02 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край (Gorodkov) V.I.Krecz. rigidioides Carex rigidioides (Gorodkov) V.I.Krecz. 199502 From plantlist 2017-06-13
160 VBGI [] 551 2016-08-10 2016-08-10 Крестов П.В. Russia 162 2017-02-15 ... дерево высотой 14 м Хабаровский край (Trautv. ex Maxim.) Maxim. nephrolepis Abies nephrolepis (Trautv. ex Maxim.) Maxim. 429823 From plantlist 2017-06-13
161 VBGI [] 2016-08-10 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край (Trevir.) Griseb. latifolia Cinna latifolia (Trevir.) Griseb. 446416 From plantlist 2017-06-13
162 VBGI [] 2016-08-10 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край A.P. Khokhr. sudetica Rhizomatopteris sudetica A.P. Khokhr. 204221 From plantlist 2017-06-13
163 VBGI [] 2016-08-10 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край A.P. Khokhr. sudetica Rhizomatopteris sudetica A.P. Khokhr. 204221 From plantlist 2017-06-13
164 VBGI [] 700 2016-08-09 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край Tzvelev amurensis Leptorumohra amurensis Tzvelev 215409 From plantlist 2017-06-13
165 VBGI [] 700 2016-08-09 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край (Maxim.) Ching spinulosa Pseudocystopteris spinulosa (Maxim.) Ching 588188 From plantlist 2017-06-13
166 VBGI [] 700 2016-08-09 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край (Maxim.) Ching spinulosa Pseudocystopteris spinulosa (Maxim.) Ching 588188 From plantlist 2017-06-13
167 VBGI [] 700 2016-08-09 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край (L.) Kuhn aquilinum Pteridium aquilinum (L.) Kuhn 205696 From plantlist 2017-06-13
168 VBGI [] 2016-07-31 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край (L.) Schott fragrans Dryopteris fragrans (L.) Schott 212858 From plantlist 2017-06-13
169 VBGI [] 1300 2016-07-30 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край Regel & Tiling ajanensis Tilingia ajanensis Regel & Tiling 34270 From plantlist 2017-06-13
170 VBGI [] 2016-08-10 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край Dewey disperma Carex disperma Dewey 198160 From plantlist 2017-06-13
171 VBGI [] 600 2016-08-13 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край L. sylvaticum Equisetum sylvaticum L. 219650 From plantlist 2017-06-13
172 VBGI [] 600 2016-08-13 Крестов П.В. Russia 162 2017-02-16 ... Хабаровский край L. sylvaticum Equisetum sylvaticum L. 219650 From plantlist 2017-06-13

173 rows × 41 columns

DataFrame объект позволяет легко выполнять дополнительную фильтрацию данных, например:

Отфильтруем полученную таблицу, оставив только те записи, в которых определена высота:

In [13]:
altitude_only = search_df[search_df.altitude != ''].copy()
In [14]:
altitude_only.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 123 entries, 3 to 172
Data columns (total 41 columns):
acronym                     123 non-null object
additionals                 123 non-null object
altitude                    123 non-null object
branch                      123 non-null object
collection_finished         123 non-null object
collection_started          123 non-null object
collectors                  123 non-null object
country                     123 non-null object
country_id                  123 non-null int64
created                     123 non-null object
details                     123 non-null object
dethistory                  123 non-null object
devstage                    123 non-null object
district                    123 non-null object
family                      123 non-null object
family_authorship           123 non-null object
fieldid                     123 non-null object
genus                       123 non-null object
genus_authorship            123 non-null object
gpsbased                    123 non-null bool
id                          123 non-null int64
identification_finished     123 non-null object
identification_started      123 non-null object
identifiers                 123 non-null object
images                      123 non-null object
infraspecific_authorship    123 non-null object
infraspecific_epithet       123 non-null object
infraspecific_rank          123 non-null object
itemcode                    123 non-null object
latitude                    123 non-null float64
longitude                   123 non-null float64
note                        123 non-null object
region                      123 non-null object
short_note                  123 non-null object
significance                123 non-null object
species_authorship          123 non-null object
species_epithet             123 non-null object
species_fullname            123 non-null object
species_id                  123 non-null int64
species_status              123 non-null object
updated                     123 non-null object
dtypes: bool(1), float64(2), int64(3), object(35)
memory usage: 39.5+ KB

Как оказалось, таких записей оказалось 123.

Найдем их среднюю высоту сбора:

In [15]:
print('Средняя высота сбора данных составляет {} м над уровнем моря'.format(altitude_only.altitude.astype(float).mean()))
Средняя высота сбора данных составляет 1065.0325203252032 м над уровнем моря

Для рассчёта средней высоты было использовано преобразование данных из строкового формата в числовой (с плавающей точкой). Это было сделано при помощи метода .astype; важно отметить, что такой подход может использоваться не всегда, например, в случае интервально заданных высот, таких как "750-800", следует применять более тонкие методы преобразования данных в числовой формат.

Добавим еще условия фильтрации: найдем данные, у которых определены высоты, большие километра, и которые были собраны в августе 2016 года.

Для этого используем созданный DataFrame altitude_only, предварительно преобразовав его колонки collection_started и altitude к типам, описывающим даты и числа соответственно.

In [16]:
altitude_only.altitude = altitude_only.altitude.astype(float)
altitude_only.collection_started = pd.to_datetime(altitude_only.collection_started)
In [17]:
deadline = pd.to_datetime('2016-08-01')
In [18]:
altitude_only[(altitude_only.altitude > 1000) & (altitude_only.collection_started>deadline)]
Out[18]:
acronym additionals altitude branch collection_finished collection_started collectors country country_id created ... note region short_note significance species_authorship species_epithet species_fullname species_id species_status updated
5 VBGI [] 1687.0 2016-08-11 2016-08-11 Крестов П.В. Russia 162 2016-12-20 ... Хабаровский край Willd. ex Schult. & Schult.f. splendens Allium splendens Willd. ex Schult. & Schult.f. 18583 From plantlist 2017-06-13
6 VBGI [] 1687.0 2016-08-11 2016-08-11 Крестов П.В. Russia 162 2016-12-20 ... Хабаровский край (Franch. & Sav.) Jacobsen rosea Rhodiola rosea (Franch. & Sav.) Jacobsen 190849 From plantlist 2017-06-13
10 VBGI [] 1478.0 2016-08-08 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (L.) Nied. alpina Arctous alpina (L.) Nied. 220205 From plantlist 2017-06-13
14 VBGI [] 1650.0 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край L. farinosa Primula farinosa L. 479002 From plantlist 2017-06-13
15 VBGI [] 1650.0 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край L. palustris Parnassia palustris L. 115798 From plantlist 2017-06-13
16 VBGI [] 1687.0 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край Maxim. redowskianum Rhododendron redowskianum Maxim. 224959 From plantlist 2017-06-13
17 VBGI [] 1422.0 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край DC. erianthum Geranium erianthum DC. 242710 From plantlist 2017-06-13
18 VBGI [] 1430.0 2016-08-11 Крестов П.В. Russia 162 2016-12-30 ... Хабаровский край (Biehler) Fisch. gmelinii Adenophora gmelinii (Biehler) Fisch. 101301 From plantlist 2017-06-13
46 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-01-03 ... Хабаровский край Regel & Tiling ajanensis Tilingia ajanensis Regel & Tiling 34270 From plantlist 2017-06-13
47 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-01-03 ... узколистная форма Хабаровский край Regel & Tiling ajanensis Tilingia ajanensis Regel & Tiling 34270 From plantlist 2017-06-13
48 VBGI [] 1378.0 2016-08-08 Крестов П.В. Russia 162 2017-01-03 ... Хабаровский край Zdor. & Schapoval woroschilowii Aster woroschilowii Zdor. & Schapoval 127224 From plantlist 2017-06-13
49 VBGI [] 1378.0 2016-08-08 Крестов П.В. Russia 162 2017-01-03 ... Хабаровский край (Trautv. & C.A.Mey.) Takeda & Miyake anticleoides Veratrum anticleoides (Trautv. & C.A.Mey.) Tak... 350453 From plantlist 2017-06-13
50 VBGI [] 1378.0 2016-08-08 Крестов П.В. Russia 162 2017-01-03 ... Хабаровский край Fisch. ex DC. radiata Scorzonera radiata Fisch. ex DC. 170104 From plantlist 2017-06-13
51 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-01-03 ... Хабаровский край Fisch. ex DC. radiata Scorzonera radiata Fisch. ex DC. 170104 From plantlist 2017-06-13
52 VBGI [] 1472.0 2016-08-08 Крестов П.В. Russia 162 2017-01-03 ... Хабаровский край Trautv. & C.A. Mey. middendorffii Betula middendorffii Trautv. & C.A. Mey. 588182 From plantlist 2017-06-13
53 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-01-03 ... Хабаровский край L. uliginosum Vaccinium uliginosum L. 226563 From plantlist 2017-06-13
54 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-01-03 ... Хабаровский край Fisch. ex Herder spiraeifolia Solidago spiraeifolia Fisch. ex Herder 174602 From plantlist 2017-06-13
70 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край (L.) Asch. & Graebn. canadense Chamaepericlymenum canadense (L.) Asch. & Graebn. 588184 From plantlist 2017-06-13
72 VBGI [] 1439.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край Fisch. ex DC. radiata Scorzonera radiata Fisch. ex DC. 170104 From plantlist 2017-06-13
73 VBGI [] 1439.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край (Trautv. & C.A.Mey.) Takeda & Miyake anticleoides Veratrum anticleoides (Trautv. & C.A.Mey.) Tak... 350453 From plantlist 2017-06-13
74 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край Fisch. ex Herder spiraeifolia Solidago spiraeifolia Fisch. ex Herder 174602 From plantlist 2017-06-13
75 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край Trautv. & C.A.Mey. middendorffii Hemerocallis middendorffii Trautv. & C.A.Mey. 585041 From plantlist 2017-06-13
76 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край Trautv. & C.A. Mey. middendorffii Betula middendorffii Trautv. & C.A. Mey. 588182 From plantlist 2017-06-13
77 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край Burgsd. sibirica Juniperus sibirica Burgsd. 588185 From plantlist 2017-06-13
78 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край (Trautv. & C.A.Mey.) Takeda & Miyake anticleoides Veratrum anticleoides (Trautv. & C.A.Mey.) Tak... 350453 From plantlist 2017-06-13
79 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край Zdor. & Schapoval woroschilowii Aster woroschilowii Zdor. & Schapoval 127224 From plantlist 2017-06-13
80 VBGI [] 1493.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край Fisch. ex DC. radiata Scorzonera radiata Fisch. ex DC. 170104 From plantlist 2017-06-13
81 VBGI [] 1493.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край Kom. tomentosa Saussurea tomentosa Kom. 169678 From plantlist 2017-06-13
82 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край (L.) Nied. alpina Arctous alpina (L.) Nied. 220205 From plantlist 2017-06-13
83 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край Maxim. redowskianum Rhododendron redowskianum Maxim. 224959 From plantlist 2017-06-13
84 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край (Pall.) D.Don ericoides Cassiope ericoides (Pall.) D.Don 220479 Approved 2017-06-13
85 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край (Sw.) Roem. & Schult. alpina Hierochloe alpina (Sw.) Roem. & Schult. 450128 From plantlist 2017-06-13
86 VBGI [] 1478.0 2016-08-08 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край (L.) Bab. caerulea Phyllodoce caerulea (L.) Bab. 223519 Approved 2017-06-13
87 VBGI [] 1478.0 2016-08-08 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край (Sw.) Roem. & Schult. alpina Hierochloe alpina (Sw.) Roem. & Schult. 450128 From plantlist 2017-06-13
88 VBGI [] 1472.0 2016-08-08 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край L. globularis Carex globularis L. 198400 From plantlist 2017-06-13
89 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край Kom. tomentosa Saussurea tomentosa Kom. 169678 From plantlist 2017-06-13
127 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-01-08 ... Хабаровский край DC. sibirica Ligularia sibirica DC. 159894 From plantlist 2017-06-13
131 VBGI [] 1687.0 2016-08-11 2016-08-11 Крестов П.В. Russia 162 2017-02-14 ... Хабаровский край (Franch. & Sav.) Jacobsen rosea Rhodiola rosea (Franch. & Sav.) Jacobsen 190849 From plantlist 2017-06-13
133 VBGI [] 1687.0 2016-08-11 Крестов П.В. Russia 162 2017-02-14 ... Хабаровский край Maxim. redowskianum Rhododendron redowskianum Maxim. 224959 From plantlist 2017-06-13
134 VBGI [] 1687.0 2016-08-11 Крестов П.В. Russia 162 2017-02-14 ... Хабаровский край Maxim. redowskianum Rhododendron redowskianum Maxim. 224959 From plantlist 2017-06-13
135 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-02-14 ... Хабаровский край DC. sibirica Ligularia sibirica DC. 159894 From plantlist 2017-06-13
136 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-02-14 ... Хабаровский край DC. sibirica Ligularia sibirica DC. 159894 From plantlist 2017-06-13
137 VBGI [] 1493.0 2016-08-02 Крестов П.В. Russia 162 2017-02-14 ... Хабаровский край Kom. tomentosa Saussurea tomentosa Kom. 169678 From plantlist 2017-06-13
138 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-02-14 ... Хабаровский край Kom. tomentosa Saussurea tomentosa Kom. 169678 From plantlist 2017-06-13
141 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-02-14 ... Хабаровский край Zdor. & Schapoval woroschilowii Aster woroschilowii Zdor. & Schapoval 127224 From plantlist 2017-06-13
144 VBGI [] 1500.0 2016-08-08 Крестов П.В. Russia 162 2017-02-15 ... узколистная форма Хабаровский край Regel & Tiling ajanensis Tilingia ajanensis Regel & Tiling 34270 From plantlist 2017-06-13
149 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Trautv. & C.A.Mey. middendorffii Hemerocallis middendorffii Trautv. & C.A.Mey. 585041 From plantlist 2017-06-13
150 VBGI [] 1500.0 2016-08-02 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Trautv. & C.A.Mey. middendorffii Hemerocallis middendorffii Trautv. & C.A.Mey. 585041 From plantlist 2017-06-13
152 VBGI [] 1378.0 2016-08-08 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край (Trautv. & C.A.Mey.) Takeda & Miyake anticleoides Veratrum anticleoides (Trautv. & C.A.Mey.) Tak... 350453 From plantlist 2017-06-13
153 VBGI [] 1687.0 2016-08-11 2016-08-11 Крестов П.В. Russia 162 2017-02-15 ... Хабаровский край Willd. ex Schult. & Schult.f. splendens Allium splendens Willd. ex Schult. & Schult.f. 18583 From plantlist 2017-06-13

50 rows × 41 columns

Сложные запросы

В текущей редакции HTTP API (см. Описание) электронного гербария не поддерживает запросы типа "ИЛИ", т.е. путем задания поискового URI невозможно задать, например, такой запрос: Найти все образцы, у которых дата сбора была либо весной, либо осенью 2016 года. Однако, такие запросы легко выполнить разбив их на несколько последовательных запросов с последующей склейкой результатов средствами пакета Pandas (проблема, связанная с "большими данными" в этом случе не возникнет, поскольку вряд ли приходится ожидать, что объем базы данных будет превышать, например, 10М записей).

Приведем пример формирования 'ИЛИ' запроса с последующей склейкой результатов. Для этого рассмотрим пару посковых запросов search_query1 и search_query2, и скомбинируем их, чтобы получить результаты, удовлетворяющие либо первому, либо второму запросу (т.е. search_query1 OR search_query2):

In [19]:
search_query1 = (('collectedby', 'Крестов'),
                 ('identifiedby', 'Крестов') 
                 )
search_query2 = (('collectedby', 'Баркалов'),
                 ('identifiedby', 'Пименова')
                 )
In [20]:
from functools import reduce # `reduce` was moved into functools in Python3

# Make search queries consequently...
datastore = []
for sp in [search_query1, search_query2]:
    search_request_url = HERBARIUM_SEARCH_URL + '?' + '&'.join(map(lambda x: x[0] + '=' + quote(x[1].strip()), sp))
    server_response = urlopen(search_request_url)
    data = json.loads(server_response.read().decode('utf-8'))
    data = pd.DataFrame(data['data'])
    datastore.append(data)
    server_response.close()

# Combine the result using Pandas:
df_combined = pd.concat(datastore).drop_duplicates('id').reset_index()
In [21]:
df_combined.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 533 entries, 0 to 532
Data columns (total 42 columns):
index                       533 non-null int64
acronym                     533 non-null object
additionals                 533 non-null object
altitude                    533 non-null object
branch                      533 non-null object
collection_finished         533 non-null object
collection_started          533 non-null object
collectors                  533 non-null object
country                     533 non-null object
country_id                  531 non-null float64
created                     533 non-null object
details                     533 non-null object
dethistory                  533 non-null object
devstage                    533 non-null object
district                    533 non-null object
family                      533 non-null object
family_authorship           533 non-null object
fieldid                     533 non-null object
genus                       533 non-null object
genus_authorship            533 non-null object
gpsbased                    533 non-null bool
id                          533 non-null int64
identification_finished     533 non-null object
identification_started      533 non-null object
identifiers                 533 non-null object
images                      533 non-null object
infraspecific_authorship    533 non-null object
infraspecific_epithet       533 non-null object
infraspecific_rank          533 non-null object
itemcode                    533 non-null object
latitude                    533 non-null float64
longitude                   533 non-null float64
note                        533 non-null object
region                      533 non-null object
short_note                  533 non-null object
significance                533 non-null object
species_authorship          533 non-null object
species_epithet             533 non-null object
species_fullname            533 non-null object
species_id                  533 non-null int64
species_status              533 non-null object
updated                     533 non-null object
dtypes: bool(1), float64(3), int64(3), object(35)
memory usage: 171.3+ KB
In [22]:
df_combined.shape
Out[22]:
(533, 42)

Исходные размерности запросов:

In [23]:
datastore[0].shape, datastore[1].shape
Out[23]:
((179, 41), (356, 41))

Поиск в полигональных областях

При формировании запросов о месте сбора можно только указывать прямоугольные области, в которых выполняется поиск. Это связано прежде всего с тем, что система управления базой данных, работающая на сервере, не поддерживает географических запросов. Тем не менее, поиск по области достаточно просто эмулировать средствами языка программировния Python, с помощью какого-либо пакета для обработки географических данных.

Рассмотрим задачу сравнения растительности о. Сахалин и 200-км области вокруг г. Петропавловск-Камчатский. Для этого будем работать с shp-файлами, представляющими контура данных территорий. Для работы с shp-файлами в Python потребуется установить пакет pyshp, а также нам будет удобен пакет shapely -- для работы с географически распределенными данными.

Если предположить, что в текущем каталоге, где запускается скрипт Python, находится папка с shаpe-файлами, то чтение данных из таких файлов будет выглядеть следующим образом:

In [24]:
import shapefile
import numpy as np # Note: numpy is a part of Pandas pack: you can access numpy via pandas.np or pd.np

sakhalin_shp = shapefile.Reader("shapefiles/sakhalin.shp")

Преобразуем данные из прочитанного файла в numpy массив координат точек контура. Это необходимо для удобства визуализации с помощью пакета matplotlib.

In [25]:
contour_sakhalin = np.array(sakhalin_shp.shapes()[0].points)

Удостоверимся, что загруженный контур действительно представляет собой о. Сахалин:

In [26]:
from pylab import *
plot(contour_sakhalin[:,0], contour_sakhalin[:,1])
gca().set_aspect('equal')
title('Sakhalin Island')
show()

Контур представлен 835 точками.

In [27]:
contour_sakhalin.shape
Out[27]:
(835, 2)

Ограничивающий область прямоугольник легко может быть найден из спецификации shape-файла:

In [28]:
sakhalin_shp.bbox
Out[28]:
[141.63803100585938, 45.88860321044922, 144.75164794921875, 54.424713134765625]

В соответствии с формой поисковых запросов, создадим запрос к базе данных

In [29]:
query_sakhalin_bbox = tuple(zip(['lonl', 'latl', 'lonu', 'latu'], map(str, sakhalin_shp.bbox)))
print(query_sakhalin_bbox)
(('lonl', '141.63803100585938'), ('latl', '45.88860321044922'), ('lonu', '144.75164794921875'), ('latu', '54.424713134765625'))
In [30]:
within_sakhalin_request_url = HERBARIUM_SEARCH_URL + '?' + '&'.join(map(lambda x: x[0] + '=' + quote(x[1].strip()), query_sakhalin_bbox))
In [31]:
within_sakhalin_request_url
Out[31]:
'http://botsad.ru/hitem/json/?lonl=141.63803100585938&latl=45.88860321044922&lonu=144.75164794921875&latu=54.424713134765625'

Получение данных:

In [32]:
server_response = urlopen(within_sakhalin_request_url)
sakhalin_data_in_bbox = pd.DataFrame(json.loads(server_response.read().decode('utf-8'))['data'])

Импортирование модуля shapely для тонкой проверки принадлежности точек контуру о. Сахалин

In [33]:
from shapely.geometry import Polygon, Point
closed_sakhalin_contour = np.vstack([contour_sakhalin, contour_sakhalin[-1]])
sakhalin_poly = Polygon(closed_sakhalin_contour)
In [34]:
sakhalin_filtered = sakhalin_data_in_bbox[[sakhalin_poly.contains(Point(x,y)) for x,y in zip(sakhalin_data_in_bbox.longitude, sakhalin_data_in_bbox.latitude)]]
In [35]:
sakhalin_filtered
Out[35]:
acronym additionals altitude branch collection_finished collection_started collectors country country_id created ... note region short_note significance species_authorship species_epithet species_fullname species_id species_status updated
0 VBGI [] 792 2016-10-01 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. F.Schmidt ssiori Prunus ssiori F.Schmidt 506834 From plantlist 2017-06-13
1 VBGI [] 1042 2016-10-01 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. Nakai axillare Vaccinium axillare Nakai 225901 From plantlist 2017-06-13
2 VBGI [] 792 2016-10-01 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. F.Schmidt rugosa Ilex rugosa F.Schmidt 44334 From plantlist 2017-06-13
3 VBGI [] 1042 2016-10-01 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. (Koidz.) H.Ohba nipponica Cerasus nipponica (Koidz.) H.Ohba 499916 From plantlist 2017-06-13
4 VBGI [] 1042 2016-10-01 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. (Cham. & Schltdl.) M.Roem. sambucifolia Sorbus sambucifolia (Cham. & Schltdl.) M.Roem. 518523 From plantlist 2017-06-13
5 VBGI [] 1042 2016-10-01 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. A.Gray smallii Vaccinium smallii A.Gray 226494 From plantlist 2017-06-13
6 VBGI [] 792 2016-10-01 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. Jancz. latifolium Ribes latifolium Jancz. 251865 From plantlist 2017-06-13
7 VBGI [] 1042 2016-10-01 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. Hult‚n beauverdiana Spiraea beauverdiana Hult‚n 518694 From plantlist 2017-06-13
8 VBGI [] 192 2016-09-29 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. Cham. ermanii Betula ermanii Cham. 68288 From plantlist 2017-06-13
9 VBGI [] 192 2016-09-29 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. Cham. ermanii Betula ermanii Cham. 68288 From plantlist 2017-06-13
10 VBGI [] 26 2016-09-30 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. Blume crispula Quercus crispula Blume 588219 Recently added 2017-06-13
11 VBGI [] 26 2016-09-30 Пименова Е.А. Russia 162 2017-01-16 ... Сахалинская обл. Blume crispula Quercus crispula Blume 588219 Recently added 2017-06-13
12 VBGI [] 250 2016-09-29 Пименова Е.А. Russia 162 2017-02-09 ... одиночное крупное дерево Сахалинская обл., L. regia Juglans regia L. 265223 From plantlist 2017-06-13
13 VBGI [] 250 2016-09-29 Пименова Е.А. Russia 162 2017-02-09 ... одиночное крупное дерево Сахалинская обл., L. regia Juglans regia L. 265223 From plantlist 2017-06-13
14 VBGI [] 170 2016-06-09 2016-06-09 Корзников К.А. Russia 162 2017-02-10 ... Сахалинская область / Sakhalin Oblast (L.) Scop. odoratum Galium odoratum (L.) Scop. 523442 From plantlist 2017-06-13
15 VBGI [] 120 2016-06-21 2016-06-21 Корзников К.А. Russia 162 2017-02-10 ... Сахалинская область Rupr. macroptera Euonymus macroptera Rupr. 588266 Approved 2017-06-13
16 VBGI [] 160 2016-06-16 2016-06-16 Корзников К.А. Russia 162 2017-02-10 ... Сахалинская область (F.Schmidt) Maxim. sachalinensis Euonymus sachalinensis (F.Schmidt) Maxim. 114805 From plantlist 2017-06-13
18 VBGI [] 50 2015-06-28 2015-06-28 Корзников К.А. Russia 162 2017-02-10 ... Сахалинская область / Sakhalin Oblast (L.) Schott fragrans Dryopteris fragrans (L.) Schott 212858 From plantlist 2017-06-13
19 VBGI [] 380 2015-08-13 2015-08-13 Корзников К.А., Попова К.Б. Russia 162 2017-02-10 ... Сахалинская область / Sakhalin Oblast (Kunze) C. Presl tripteron Polystichum tripteron (Kunze) C. Presl 216977 From plantlist 2017-06-13
20 VBGI [] 40 2016-07-16 2016-07-16 Корзников К.А. Russia 162 2017-02-10 ... Сахалинская область / Sakhalin Oblast H. Lév. fauriei Cardamine fauriei H. Lév. 588274 Recently added 2017-06-13
21 VBGI [] 40 2016-07-16 2016-07-16 Корзников К.А. Russia 162 2017-02-10 ... Сахалинская область / Sakhalin Oblast H. Lév. fauriei Cardamine fauriei H. Lév. 588274 Recently added 2017-06-13
22 VBGI [] 40 2016-07-16 2016-07-16 Корзников К.А. Russia 162 2017-02-10 ... Сахалинская область / Sakhalin Oblast H. Lév. fauriei Cardamine fauriei H. Lév. 588274 Recently added 2017-06-13
23 VBGI [] 70 2015-06-27 2015-06-27 Корзников К.А. Russia 162 2017-02-10 ... Сахалинская область / Sakhalin Oblast (L.) DC. amplexifolius Streptopus amplexifolius (L.) DC. 330252 From plantlist 2017-06-13
24 VBGI [] 140 2015-07-12 2015-07-12 Корзников К.А. Russia 162 2017-02-10 ... Сахалинская область / Sakhalin Oblast (Thunb.) Makino cordatum Cardiocrinum cordatum (Thunb.) Makino 329621 From plantlist 2017-06-13
25 VBGI [] 15 2015-06-26 2015-06-26 Корзников К.А. Russia 162 2017-02-10 ... Сахалинская область / Sakhalin Oblast (L.) Ker Gawl. camschatcensis Fritillaria camschatcensis (L.) Ker Gawl. 329686 From plantlist 2017-06-13
27 VBGI [] 30 2015-06-28 2015-06-28 Корзников К.А. Russia 162 2017-02-12 ... Сахалинская область / Sakhalin Oblast (L.) Sw. lunaria Botrychium lunaria (L.) Sw. 381813 From plantlist 2017-06-13
28 VBGI [] 150 2016-06-21 2016-06-21 Корзников К.А. Russia 162 2017-02-12 ... Сахалинская область / Sakhalin Oblast (F. Schmidt) Sarg. sachalinense Phellodendron sachalinense (F. Schmidt) Sarg. 537480 From plantlist 2017-06-13
29 VBGI [] 60 2016-07-17 2016-07-17 Корзников К.А. Russia 162 2017-02-12 ... Сахалинская область / Sakhalin Oblast (F. Schmidt) Sarg. sachalinense Phellodendron sachalinense (F. Schmidt) Sarg. 537480 From plantlist 2017-06-13
30 VBGI [] 60 2016-07-17 2016-07-17 Корзников К.А. Russia 162 2017-02-12 ... Сахалинская область / Sakhalin Oblast (F. Schmidt) Sarg. sachalinense Phellodendron sachalinense (F. Schmidt) Sarg. 537480 From plantlist 2017-06-13
31 VBGI [] 70 2016-09-17 2016-09-17 Корзников К.А. Russia 162 2017-02-12 ... Сахалинская область / Sakhalin Oblast Nakai repens Skimmia repens Nakai 537822 From plantlist 2017-06-13
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
512 VBGI [] 2012-07-09 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast (Michx.) Watt connectilis Phegopteris connectilis (Michx.) Watt 569429 From plantlist 2017-10-10
513 VBGI [] 2014-07-04 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast (Michx.) Watt connectilis Phegopteris connectilis (Michx.) Watt 569429 From plantlist 2017-10-10
514 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast (L.) Newman dryopteris Gymnocarpium dryopteris (L.) Newman 204208 From plantlist 2017-10-10
515 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast (L.) Newman dryopteris Gymnocarpium dryopteris (L.) Newman 204208 From plantlist 2017-10-10
516 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast (L.) Newman dryopteris Gymnocarpium dryopteris (L.) Newman 204208 From plantlist 2017-10-10
517 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast (L.) Newman dryopteris Gymnocarpium dryopteris (L.) Newman 204208 From plantlist 2017-10-10
518 VBGI [] 2014-07-04 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область (L.) Newman dryopteris Gymnocarpium dryopteris (L.) Newman 204208 From plantlist 2017-10-10
519 VBGI [] 2008-07-29 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast (L.) Newman dryopteris Gymnocarpium dryopteris (L.) Newman 204208 From plantlist 2017-10-10
520 VBGI [] 2008-07-29 Храпко О.В., Царенко Н.А. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast (L.) Newman dryopteris Gymnocarpium dryopteris (L.) Newman 204208 From plantlist 2017-10-10
521 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast Tzvelev amurensis Leptorumohra amurensis Tzvelev 215409 From plantlist 2017-10-10
522 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast Tzvelev amurensis Leptorumohra amurensis Tzvelev 215409 From plantlist 2017-10-10
523 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast Tzvelev amurensis Leptorumohra amurensis Tzvelev 215409 From plantlist 2017-10-10
524 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast Tzvelev amurensis Leptorumohra amurensis Tzvelev 215409 From plantlist 2017-10-10
525 VBGI [] 2014-07-04 Храпко О.В. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast Tzvelev amurensis Leptorumohra amurensis Tzvelev 215409 From plantlist 2017-10-10
526 VBGI [] 1964-09-16 Кривенко Н.А. Russia 162 2017-10-10 ... Сахалинская область / Sakhalin Oblast Tzvelev amurensis Leptorumohra amurensis Tzvelev 215409 From plantlist 2017-10-10
527 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-11 ... Сахалинская область / Sakhalin Oblast Kom. sichotensis Dryopteris sichotensis Kom. 213603 From plantlist 2017-10-11
528 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-11 ... Сахалинская область / Sakhalin Oblast Kom. sichotensis Dryopteris sichotensis Kom. 213603 From plantlist 2017-10-11
529 VBGI [] 2008-06-14 Царенко Н.А. Russia 162 2017-10-12 ... Сахалинская область / Sakhalin Oblast (C. Presl) Fraser-Jenk. & Jermy expansa Dryopteris expansa (C. Presl) Fraser-Jenk. & J... 212819 From plantlist 2017-10-12
530 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-12 ... Сахалинская область / Sakhalin Oblast (C. Presl) Fraser-Jenk. & Jermy expansa Dryopteris expansa (C. Presl) Fraser-Jenk. & J... 212819 From plantlist 2017-10-12
531 VBGI [] 2008-07-25 Храпко О.В. Russia 162 2017-10-12 ... Сахалинская область / Sakhalin Oblast (L.) Kuhn aquilinum Pteridium aquilinum (L.) Kuhn 205696 From plantlist 2017-10-12
532 VBGI [] 2014-07-04 Храпко О.В. Russia 162 2017-10-13 ... Сахалинская область / Sakhalin Oblast (L.) Roth filix-femina Athyrium filix-femina (L.) Roth 61481 From plantlist 2017-10-13
533 VBGI [] 2008-07-15 Храпко О.В., Царенко Н.А. Russia 162 2017-10-13 ... Сахалинская область / Sakhalin Oblast Rupr. sinense Athyrium sinense Rupr. 61829 From plantlist 2017-10-13
534 VBGI [] 2008-07-15 Храпко О.В., Царенко Н.А. Russia 162 2017-10-13 ... Сахалинская область Rupr. sinense Athyrium sinense Rupr. 61829 From plantlist 2017-10-13
535 VBGI [] 1995-07-10 Дудкин Р.В., Тесленко В.В. Russia 162 2017-10-13 ... Сахалинская область / Sakhalin Oblast (L.) Schott fragrans Dryopteris fragrans (L.) Schott 212858 From plantlist 2017-10-13
536 VBGI [] 2012-07-09 Храпко О.В. Russia 162 2017-10-16 ... Сахалинская область / Sakhalin Oblast (Fern.) Tagawa asiaticum Osmundastrum asiaticum (Fern.) Tagawa 591052 Approved 2017-10-16
537 VBGI [] 2017-07-04 Храпко О.В. Russia 162 2017-10-16 ... Сахалинская область / Sakhalin Oblast (Fern.) Tagawa asiaticum Osmundastrum asiaticum (Fern.) Tagawa 591052 Approved 2017-10-16
538 VBGI [] 2008-07-12 Храпко О.В., Царенко Н.А., Богачева А.В. Russia 162 2017-10-16 ... Сахалинская область / Sakhalin Oblast (Fern.) Tagawa asiaticum Osmundastrum asiaticum (Fern.) Tagawa 591052 Approved 2017-10-16
541 SAKH [] 52-112 Herbarium of Vascular Plants 1994-06-10 А. Таран Russia 162 2017-10-18 ... Сахалинская область / Sakhalin Oblast Ching chinensis Huperzia chinensis Ching 336147 From plantlist 2017-10-18
542 SAKH [] 52-112 Herbarium of Vascular Plants А. Таран Russia 162 2017-10-18 ... Сахалинская область / Sakhalin Oblast L. annotinum Lycopodium annotinum L. 336427 From plantlist 2017-10-18
545 VBGI [] 382 1995-07-11 Дудкин Р.В., Тесленко В.В. Russia 162 2017-10-19 ... Сахалинская область / Sakhalin Oblast Huds. viride Asplenium viride Huds. 60611 From plantlist 2017-10-19

525 rows × 41 columns

In [36]:
sakhalin_data_in_bbox.shape
Out[36]:
(546, 41)

Найдем ID точек, которые принадлежат прямоугольным границам о. Сахалин, но "не принадлежат" контору острова по результатам более тонкой фильтрации.

In [37]:
set(sakhalin_data_in_bbox.id.values) - set(sakhalin_filtered.id.values)
Out[37]:
{1403,
 1412,
 1432,
 1434,
 1438,
 1439,
 1529,
 10015,
 10016,
 10373,
 19819,
 19820,
 19823,
 19912,
 20830,
 20832,
 30563,
 31010,
 31032,
 31079,
 31080}

Исследуя реальные положения перечисленных точек, например, с ID=1412 (см. страницу http://botsad.ru/hitem/1412) обнаружим, что отфильтрованные точки -- это прибрежные точки, которые либо в силу погрешностей контура shape-файла, либо в силу ошибок позиционирования гербарного сбора, выходят за определенный в shape-файле контур о. Сахалин. Тем не менее, задача решена правильно: точки не принадлежащие текущему контуру о. Сахалин отброшены.

Таким оразом, результирующий массив данных представлен переменной sakhalin_filtered.

Получим данные о гербарных сборах вблизи г. Петропавловск-Камчатский.

Для выделения объектов, принадлежащих 200-км области вокруг города, определим прямоугольную область, заведомо включающую данную окрестность. Такой прямоугольной областью может быть, например, kamchatka_bbox:

In [38]:
kamchatka_bbox = [151.1, 47.8, 172.0, 58.3]
petropavlovsk_coords = (53.145992, 158.683548)

Для вычисления расстояний нам потребуется дополнительный пакет geopy. В остальном, формирование поискового url повторяет случай для о. Сахалин.

In [39]:
from geopy.distance import vincenty
query_kamchatka_bbox = tuple(zip(['lonl', 'latl', 'lonu', 'latu'], map(str, kamchatka_bbox)))
near_petropavlovsk_kamchatsky_url = HERBARIUM_SEARCH_URL + '?' + '&'.join(map(lambda x: x[0] + '=' + quote(x[1].strip()), query_kamchatka_bbox))
server_response = urlopen(near_petropavlovsk_kamchatsky_url)
petropavlovsk_data_in_bbox = pd.DataFrame(json.loads(server_response.read().decode('utf-8'))['data'])
petropavlovsk_data_in_bbox.shape
Out[39]:
(261, 41)
In [40]:
petropavlovsk_filtered = petropavlovsk_data_in_bbox[[vincenty((lat, lon), petropavlovsk_coords).km < 200.0 for lat,lon in zip(petropavlovsk_data_in_bbox.latitude, petropavlovsk_data_in_bbox.longitude)]]
In [41]:
petropavlovsk_filtered.shape
Out[41]:
(129, 41)

Данные о гербарных сборах в пределах 200-км зоны вокруг г. П.-Камчасткий получены. Теперь можно проводить сравнительный анализ.

In [42]:
print('Количество уникальных родов в 200 км окрестности г. П.-Камчатский:', len(petropavlovsk_filtered.genus.unique()))
Количество уникальных родов в 200 км окрестности г. П.-Камчатский: 61
In [43]:
print('Количество уникальных видов в 200 км окрестности г. П.-Камчатский:', len(petropavlovsk_filtered.species_id.unique()))
Количество уникальных видов в 200 км окрестности г. П.-Камчатский: 71
In [44]:
print('Количество уникальных видов на о. Сахалин:', len(sakhalin_filtered.species_id.unique()))
Количество уникальных видов на о. Сахалин: 205
In [45]:
print('Количество уникальных родов на о. Сахалин:', len(sakhalin_filtered.genus.unique()))
Количество уникальных родов на о. Сахалин: 134

Посчитаем частоты встречаемости видов в сборах:

In [46]:
from collections import Counter

Частоты встречаемости родов около г. П.-Камчатский

In [47]:
petr_freq = petropavlovsk_filtered.genus.value_counts() / len(petropavlovsk_filtered)
petr_freq
Out[47]:
Riccardia          0.069767
Aneura             0.069767
Dryopteris         0.054264
Moerckia           0.054264
Peltolepis         0.046512
Conocephalum       0.038760
Gymnocarpium       0.031008
Pellia             0.031008
Calycularia        0.031008
Preissia           0.023256
Phegopteris        0.023256
Marchantia         0.023256
Sauteria           0.023256
Polystichum        0.023256
Calamagrostis      0.023256
Stellaria          0.015504
Cystopteris        0.015504
Euphrasia          0.015504
Salix              0.015504
Oreopteris         0.015504
Cryptogramma       0.015504
Blasia             0.015504
Agrostis           0.015504
Athyrium           0.015504
Draba              0.015504
Sagina             0.007752
Erigeron           0.007752
Botrychium         0.007752
Papaver            0.007752
Saxifraga          0.007752
                     ...   
Arnica             0.007752
Ermania            0.007752
Saussurea          0.007752
Huperzia           0.007752
Nardia             0.007752
Cardamine          0.007752
Abies              0.007752
Myrica             0.007752
Anaphalis          0.007752
Cardaminopsis      0.007752
Trientalis         0.007752
Parnassia          0.007752
Trollius           0.007752
Rubus              0.007752
Eriophorum         0.007752
Ranunculus         0.007752
Metasolenostoma    0.007752
Tephroseris        0.007752
Gentianella        0.007752
Mannia             0.007752
Dryas              0.007752
Hieracium          0.007752
Myosotis           0.007752
Equisetum          0.007752
Douglasia          0.007752
Chamaedaphne       0.007752
Fritillaria        0.007752
Urtica             0.007752
Oxytropis          0.007752
Cassiope           0.007752
Name: genus, dtype: float64

Частоты встречаемости родов на о. Сахалин

In [48]:
sakh_freq = sakhalin_filtered.genus.value_counts() / len(sakhalin_filtered)
sakh_freq
Out[48]:
Porella              0.074286
Riccardia            0.041905
Conocephalum         0.040000
Dryopteris           0.026667
Jungermannia         0.026667
Lophozia             0.024762
Gymnocarpium         0.024762
Scapania             0.024762
Preissia             0.024762
Peltolepis           0.022857
Asarum               0.022857
Leptorumohra         0.020952
Marchantia           0.020952
Mesoptychia          0.020952
Calypogeia           0.019048
Cephalozia           0.019048
Frullania            0.017143
Blepharostoma        0.017143
Phegopteris          0.015238
Sauteria             0.015238
Mylia                0.015238
Sphenolobus          0.013333
Lejeunea             0.013333
Pellia               0.011429
Orthocaulis          0.011429
Woodsia              0.011429
Leiocolea            0.011429
Diplophyllum         0.009524
Reboulia             0.009524
Macrodiplophyllum    0.009524
                       ...   
Artemisia            0.001905
Protolophozia        0.001905
Astragalus           0.001905
Thuidiaceae          0.001905
Calycularia          0.001905
Solenostoma          0.001905
Tetraplodon          0.001905
Arisaema             0.001905
Galium               0.001905
Primula              0.001905
Rubus                0.001905
Trautvetteria        0.001905
Pteridium            0.001905
Potentilla           0.001905
Chosenia             0.001905
Spiraea              0.001905
Androsace            0.001905
Larix                0.001905
Matteuccia           0.001905
Asplenium            0.001905
Cardiocrinum         0.001905
Streptopus           0.001905
Sanguisorba          0.001905
Hierochloe           0.001905
Vitis                0.001905
Botrychium           0.001905
Tetralophozia        0.001905
Cerasus              0.001905
Gymnomitrion         0.001905
Corydalis            0.001905
Name: genus, dtype: float64

Информационные меры неопределенности (биоразнообразие по К. Шеннону):

In [49]:
shannon_sakh = - sum(np.log2(sakh_freq.values) * sakh_freq.values)
shannon_sakh
Out[49]:
6.3029615356384312
In [50]:
shannon_petr = - sum(np.log2(petr_freq.values) * petr_freq.values)
shannon_petr
Out[50]:
5.4917671048301289

Вычислим относительные значения мер (от их максимального теоретического значения в каждом случае):

In [51]:
shannon_sakh_relative = shannon_sakh / np.log2(len(sakh_freq))
shannon_sakh_relative
Out[51]:
0.8920014120611599
In [52]:
shannon_petr_relative = shannon_petr / np.log2(len(petr_freq))
shannon_petr_relative
Out[52]:
0.92598386882647821

Как ни странно, относительное разнообразие сборов несколько выше в окр. г. П.-Камчатский, хотя эти различия могут отражать лишь специфику данных, занесенных в базу на текущий момент времени.

In [53]:
import datetime
print("Дата выполнения кода документа: ", datetime.datetime.now())
Дата выполнения кода документа:  2017-10-19 11:46:43.842121