Автоматизация поиска на 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: 536 entries, 0 to 535
Data columns (total 42 columns):
index                       536 non-null int64
acronym                     536 non-null object
additionals                 536 non-null object
altitude                    536 non-null object
branch                      536 non-null object
collection_finished         536 non-null object
collection_started          536 non-null object
collectors                  536 non-null object
country                     536 non-null object
country_id                  534 non-null float64
created                     536 non-null object
details                     536 non-null object
dethistory                  536 non-null object
devstage                    536 non-null object
district                    536 non-null object
family                      536 non-null object
family_authorship           536 non-null object
fieldid                     536 non-null object
genus                       536 non-null object
genus_authorship            536 non-null object
gpsbased                    536 non-null bool
id                          536 non-null int64
identification_finished     536 non-null object
identification_started      536 non-null object
identifiers                 536 non-null object
images                      536 non-null object
infraspecific_authorship    536 non-null object
infraspecific_epithet       536 non-null object
infraspecific_rank          536 non-null object
itemcode                    536 non-null object
latitude                    536 non-null float64
longitude                   536 non-null float64
note                        536 non-null object
region                      536 non-null object
short_note                  536 non-null object
significance                536 non-null object
species_authorship          536 non-null object
species_epithet             536 non-null object
species_fullname            536 non-null object
species_id                  536 non-null int64
species_status              536 non-null object
updated                     536 non-null object
dtypes: bool(1), float64(3), int64(3), object(35)
memory usage: 172.3+ KB
In [22]:
df_combined.shape
Out[22]:
(536, 42)

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

In [23]:
datastore[0].shape, datastore[1].shape
Out[23]:
((179, 41), (359, 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
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
536 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
537 VBGI [] 2008-07-25 Храпко О.В. Russia 162 2017-10-12 ... Сахалинская область / Sakhalin Oblast (L.) Kuhn aquilinum Pteridium aquilinum (L.) Kuhn 205696 From plantlist 2017-10-12
538 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
539 VBGI [] 2008-07-15 Храпко О.В., Царенко Н.А. Russia 162 2017-10-13 ... Сахалинская область / Sakhalin Oblast Rupr. sinense Athyrium sinense Rupr. 61829 From plantlist 2017-10-13
540 VBGI [] 2008-07-15 Храпко О.В., Царенко Н.А. Russia 162 2017-10-13 ... Сахалинская область Rupr. sinense Athyrium sinense Rupr. 61829 From plantlist 2017-10-13
541 VBGI [] 1995-07-10 Дудкин Р.В., Тесленко В.В. Russia 162 2017-10-13 ... Сахалинская область / Sakhalin Oblast (L.) Schott fragrans Dryopteris fragrans (L.) Schott 212858 From plantlist 2017-10-13
542 VBGI [] 2012-07-09 Храпко О.В. Russia 162 2017-10-16 ... Сахалинская область / Sakhalin Oblast (Fern.) Tagawa asiaticum Osmundastrum asiaticum (Fern.) Tagawa 591052 Approved 2017-10-16
543 VBGI [] 2017-07-04 Храпко О.В. Russia 162 2017-10-16 ... Сахалинская область / Sakhalin Oblast (Fern.) Tagawa asiaticum Osmundastrum asiaticum (Fern.) Tagawa 591052 Approved 2017-10-16
544 VBGI [] 2008-07-12 Храпко О.В., Царенко Н.А., Богачева А.В. Russia 162 2017-10-16 ... Сахалинская область / Sakhalin Oblast (Fern.) Tagawa asiaticum Osmundastrum asiaticum (Fern.) Tagawa 591052 Approved 2017-10-16
547 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
548 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
551 VBGI [] 382 1995-07-11 Дудкин Р.В., Тесленко В.В. Russia 162 2017-10-19 ... Сахалинская область / Sakhalin Oblast Huds. viride Asplenium viride Huds. 60611 From plantlist 2017-10-19
552 VBGI [] 2012-07-09 Храпко О.В. Russia 162 2017-10-19 ... Сахалинская область / Sakhalin Oblast (C. Presl) Fraser-Jenk. & Jermy expansa Dryopteris expansa (C. Presl) Fraser-Jenk. & J... 212819 From plantlist 2017-10-19
553 VBGI [] 2016-07-07 Храпко О.В. Russia 162 2017-10-19 ... Сахалинская область / Sakhalin Oblast (C. Presl) Fraser-Jenk. & Jermy expansa Dryopteris expansa (C. Presl) Fraser-Jenk. & J... 212819 From plantlist 2017-10-19
554 VBGI [] 2012-07-09 Храпко О.В. Russia 162 2017-10-19 ... Сахалинская область / Sakhalin Oblast (C. Presl) Fraser-Jenk. & Jermy expansa Dryopteris expansa (C. Presl) Fraser-Jenk. & J... 212819 From plantlist 2017-10-19
558 VBGI [] 1997-10-03 Недолужко В.А., Денисов Н.И. Russia 162 2017-10-19 ... Сахалинская область / Sakhalin Oblast Tzvelev amurensis Leptorumohra amurensis Tzvelev 215409 From plantlist 2017-10-19
560 VBGI [] 1980-06-24 Недолужко В.А. Russia 162 2017-10-20 ... Сахалинская область / Sakhalin Oblast (L.) Sw. lunaria Botrychium lunaria (L.) Sw. 381813 From plantlist 2017-10-20
561 VBGI [] 1980-06-25 Недолужко В.А. Russia 162 2017-10-20 ... Сахалинская область / Sakhalin Oblast (Rupr.) Underw. robustum Botrychium robustum (Rupr.) Underw. 381844 From plantlist 2017-10-20
562 VBGI [] 1966-07-27 Недолужко В.А., Стародубцев В.Н. Russia 162 2017-10-20 ... Сахалинская область / Sakhalin Oblast (L.) Bernh. fragilis Cystopteris fragilis (L.) Bernh. 204147 From plantlist 2017-10-20
563 VBGI [] 1991-07-22 Храпко О.В. Russia 162 2017-10-20 ... Сахалинская область / Sakhalin Oblast (L.) Newman dryopteris Gymnocarpium dryopteris (L.) Newman 204208 From plantlist 2017-10-20
564 VBGI [] 2015-07-18 Храпко О.В. Russia 162 2017-10-20 ... Сахалинская область / Sakhalin Oblast (L.) Newman dryopteris Gymnocarpium dryopteris (L.) Newman 204208 From plantlist 2017-10-20
565 VBGI [] 2006-08-14 Галанин А.В. Russia 162 2017-10-20 ... Сахалинская обл. (Spenn.) Fée braunii Polystichum braunii (Spenn.) Fée 216417 From plantlist 2017-10-20
566 VBGI [] 1966-08-24 Павлова Н.С., Панков Russia 162 2017-10-31 ... Сахалинская область / Sakhalin Oblast R. Br. acrostichoides Cryptogramma acrostichoides R. Br. 485069 From plantlist 2017-10-31
567 VBGI [] 1971-07-11 Егорова Е.М. Russia 162 2017-11-08 ... Сахалинская область / Sakhalin Oblast (Turcz. ex Kunze) Sa. Kurata sibiricum Diplazium sibiricum (Turcz. ex Kunze) Sa. Kurata 62611 From plantlist 2017-11-08
568 VBGI [] 1980-06-24 Недолужко В.А. Russia 162 2017-11-09 ... Сахалинская область / Sakhalin Oblast (S.G. Gmel.) Ångström lanceolatum Botrychium lanceolatum (S.G. Gmel.) Ångström 381807 From plantlist 2017-11-09
569 VBGI [] 1986-07-31 Недолужко В.А., Стародубцев В.Н. Russia 162 2017-11-09 ... Сахалинская область / Sakhalin Oblast (Rupr.) Underw. robustum Botrychium robustum (Rupr.) Underw. 381844 From plantlist 2017-11-09
570 VBGI [] 1987-09-11 Стеценко Н.М. Russia 162 2017-11-09 ... Сахалинская область / Sakhalin Oblast (Rupr.) Underw. robustum Botrychium robustum (Rupr.) Underw. 381844 From plantlist 2017-11-09
571 VBGI [] 1969-09-25 Алексеева Л.М. Russia 162 2017-11-09 ... Сахалинская область / Sakhalin Oblast (Rupr.) Underw. robustum Botrychium robustum (Rupr.) Underw. 381844 From plantlist 2017-11-09
572 VBGI [] 1974-08-09 Ворошилова Г.И., Гвоздева И., Карпова Е., Опри... Russia 162 2017-11-09 ... Сахалинская область / Sakhalin Oblast (Rupr.) Underw. robustum Botrychium robustum (Rupr.) Underw. 381844 From plantlist 2017-11-09
573 VBGI [] 1406 Bryophyte herbarium 2006-08-17 V.A. Bakalin Russia 162 2017-11-10 ... Central part of Sakhalin Island. Nabilsky Rang... Дальний Восток|Russian Far East Rev. by V.A. Bakalin: Ok! Jun 2016 Steph. japonica Nardia japonica Steph. 588500 Approved 2017-11-10

549 rows × 41 columns

In [36]:
sakhalin_data_in_bbox.shape
Out[36]:
(574, 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,
 31152,
 31153,
 31154,
 31161}

Исследуя реальные положения перечисленных точек, например, с 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]:
(306, 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]:
(146, 41)

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

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

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

In [46]:
from collections import Counter

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

In [47]:
petr_freq = petropavlovsk_filtered.genus.value_counts() / len(petropavlovsk_filtered)
petr_freq
Out[47]:
Aneura             0.061644
Riccardia          0.061644
Moerckia           0.047945
Dryopteris         0.047945
Botrychium         0.041096
Peltolepis         0.041096
Nardia             0.041096
Conocephalum       0.034247
Gymnocarpium       0.027397
Calycularia        0.027397
Pellia             0.027397
Preissia           0.020548
Athyrium           0.020548
Marchantia         0.020548
Polystichum        0.020548
Lunathyrium        0.020548
Phegopteris        0.020548
Cystopteris        0.020548
Calamagrostis      0.020548
Sauteria           0.020548
Stellaria          0.013699
Euphrasia          0.013699
Agrostis           0.013699
Blasia             0.013699
Cryptogramma       0.013699
Salix              0.013699
Oreopteris         0.013699
Draba              0.013699
Andromeda          0.006849
Myrica             0.006849
                     ...   
Huperzia           0.006849
Trientalis         0.006849
Tephroseris        0.006849
Dryas              0.006849
Equisetum          0.006849
Chamaedaphne       0.006849
Woodsia            0.006849
Myosotis           0.006849
Rubus              0.006849
Eriophorum         0.006849
Saussurea          0.006849
Fritillaria        0.006849
Arnica             0.006849
Metasolenostoma    0.006849
Papaver            0.006849
Mannia             0.006849
Ermania            0.006849
Cardamine          0.006849
Trollius           0.006849
Lophozia           0.006849
Cassiope           0.006849
Urtica             0.006849
Parnassia          0.006849
Anaphalis          0.006849
Ranunculus         0.006849
Hieracium          0.006849
Douglasia          0.006849
Erigeron           0.006849
Cardaminopsis      0.006849
Abies              0.006849
Name: genus, Length: 64, dtype: float64

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

In [48]:
sakh_freq = sakhalin_filtered.genus.value_counts() / len(sakhalin_filtered)
sakh_freq
Out[48]:
Porella           0.071038
Riccardia         0.040073
Conocephalum      0.038251
Dryopteris        0.030965
Gymnocarpium      0.027322
Jungermannia      0.025501
Scapania          0.023679
Lophozia          0.023679
Preissia          0.023679
Asarum            0.021858
Leptorumohra      0.021858
Peltolepis        0.021858
Nardia            0.020036
Marchantia        0.020036
Mesoptychia       0.020036
Cephalozia        0.018215
Calypogeia        0.018215
Blepharostoma     0.016393
Frullania         0.016393
Mylia             0.014572
Phegopteris       0.014572
Sauteria          0.014572
Botrychium        0.014572
Lejeunea          0.012750
Sphenolobus       0.012750
Orthocaulis       0.010929
Leiocolea         0.010929
Pellia            0.010929
Woodsia           0.010929
Diplophyllum      0.009107
                    ...   
Artemisia         0.001821
Cerasus           0.001821
Malva             0.001821
Fritillaria       0.001821
Chosenia          0.001821
Geranium          0.001821
Potentilla        0.001821
Matteuccia        0.001821
Brylkinia         0.001821
Beckmannia        0.001821
Rubus             0.001821
Gymnomitrion      0.001821
Androsace         0.001821
Sanguisorba       0.001821
Asplenium         0.001821
Tetralophozia     0.001821
Larix             0.001821
Astragalus        0.001821
Diplazium         0.001821
Streptopus        0.001821
Ilex              0.001821
Cardiocrinum      0.001821
Calycularia       0.001821
Hydrangea         0.001821
Huperzia          0.001821
Spiraea           0.001821
Arisaema          0.001821
Monotropastrum    0.001821
Corydalis         0.001821
Schistidium       0.001821
Name: genus, Length: 136, dtype: float64

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

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

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

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

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

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