Лекция Стивена Вольфрама

ВНИМАНИЕ!!!

БЛОГ ПЕРЕЕХАЛ НА НОВЫЙ АДРЕС https://blog.wolframmathematica.ru

Онлайн машина вычисления знаний Wolfram|Alpha ®

Онлайн машина вычисления знаний Wolfram|Alpha ®

суббота, 25 мая 2013 г.

Работа с Web API в Mathematica
Rabota_s_Web_API_v_Mathematica_Large.png
Работа с Web API в Mathematica
Общее количество использованных в посте встроенных функций или символов: 140

Список имен используемых встроенных функций и символов в порядке их появления в коде:
CompoundExpression (;) | Set (=) | Function (&) | Short | Slot (#) | URLFetch | Rule (->, ->) | List ({...}) | SetDelayed (:=) | Pattern (:) | Blank (_) | String ("...") | BlankNullSequence (___) | StringJoin (<>) | StringSplit | Alternatives (|) | Part ([[…]]) | Plus (+) | ToExpression | ToString | Row | Span (;;) | StringTake | Map (/@) | DeleteCases | StringReplace | Transpose | Sort | Tally | All | Greater (>) | Panel | Pane | Rotate | BarChart | ChartLabels | Placed | Style | Bold | Axis | Times (*, ×) | Degree | ColorFunction | ColorData | ImageSize | AspectRatio | Power (^) | GridLines | None | Range | GridLinesStyle | Dashed | PlotRangePadding | PlotRange | Automatic | Ticks | Pi (π) | BarSpacing | Scrollbars | False | True | Cases | RuleDelayed (:>, :->) | Condition (/;) | Quiet | Check | If | Equal (==) | Import | Not (!, ¬) | MatchQ | ReplaceAll (/.) | Image | PopupWindow | TableForm | WindowSize | ImageDimensions | Show | ParametricPlot | Cos | Sin | Length | PlotStyle | Thick | RGBColor | Graphics | Table | Inset | Background | Black | Axes | StringCases | StringExpression (~~) | BlankSequence (__) | Floor (⌊...⌋) | Apply (@@) | Join | Partition | Flatten | And (&&, ∧) | NumericQ | FileNameJoin | NotebookDirectory | FileExistsQ | Get (<<) | Dynamic | ProgressIndicator | Pause | $Failed | DumpSave | Real | Complement | CountryData | Lighter | Gray | EdgeForm | GrayLevel | Thickness | Increment (++) | Mod | AbsolutePointSize | Point | Reverse | SphericalPlot3D | PlotPoints | Mesh | TextureCoordinateFunction | Texture | Specularity | White | Lighting | Boxed | ViewVertical | ViewPoint | Graphics3D | Darker | Tube | BoxRatios | ViewCenter | ViewAngle
Web API является весьма полезной вещью, позволяющей, чаще всего в формате JSON, получать информацию по запросам определенного типа от сайтов, скажем ВКонтакте или Google Maps. Само собой, эту информацию можно затем обрабатывать в самых разных направлениях, скажем выявляя закономерности в наборе данных или строя инфографику, которая может помочь проиллюстрировать факты.
В данном посте я опишу основные идеи взаимодействия с Web API в системе Mathematica на нескольких примерах, связанных со страницей сообщества Русскоязычной поддержки Wolfram Mathematica в ВКонтакте.
Первые шаги
Для работы с API ВКонтакте часто нужно иметь так называемый маркер доступа, или access_token. Для того, чтобы получить его вам потребуется создать новое Standalone-приложение, сделать это можно перейдя по ссылке:
Rabota_s_Web_API_v_Mathematica_1.gif
После того, как новое приложение создано, потребуется привязать его к некоторой группе (опционально), и загрузить аватар и т. п.
Главное на данном этапе то, что вы получаете ID приложения, которое потребуется позже.
Rabota_s_Web_API_v_Mathematica_2.gif
После того, как этот шаг проделан, потебуется в вашем браузере перейти по ссылке, которая устроена следующим образом:
Rabota_s_Web_API_v_Mathematica_3.gif
Rabota_s_Web_API_v_Mathematica_4.gif
После того, как вы перешли по этой ссылке и прошли авторизацию, вы получите в строке вашего браузера ссылку, которая будет иметь примерно следующий вид:
Rabota_s_Web_API_v_Mathematica_5.gif
Самый важный фрагмент полученной ссылки это и есть маркер доступа – access_token. Остальные параметры: 86400 – время работы маркера доступа (1 сутки); 775360 – ID человека ВКонтакте, для которого работает маркер доступа.
После получения маркера доступа можно приступить к работе с API с помощью функции URLFetch.
Простейшее взаимодействие с API Вконтакте
Взаимодействие с API достаточно просто. Оно осуществляется через функцию URLFetch. Синтаксис имеет следующий вид:
Rabota_s_Web_API_v_Mathematica_6.png
Как видно, для работы с API потребуется знать названия существующих методов и их параметров. Узнать их можно на официальной странице “Описание методов API” сайта.
В качестве первого примера получим ID всех участников сообщества Русскоязычной поддержки Wolfram Mathematica. Для этой цели служит метод groups.getMembers, у него есть параметр gid соответствующий ID сообщества или его названию.
Для работы здесь и далее потребуется значение маркера доступа, присвоим переменной с соответствующим именем его значение (в целях безопасности полученный мной access_token я не приведу):
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Теперь найдем ID участников сообщества (здесь и далее для соответсвующих промежуточных результатов будет применяться функция Short, показывающая только часть очень длинного однотипного результата):
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_7.gif
Для укорочения дальнейшего кода, создадим функцию WMVkAPI, которая упростит обращение к API ВКонтакте:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_8.gif
Первое использование API
Теперь немного поработаем с API.
Для начала, получим ID всех участников сообщества в виде строки и присвоим соответствующей переменной ее значение (в целом, это было сделано ранее):
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_9.gif
Выцепим ID первых 400 участников, для этого нам потребуется функция StringSplit, которая разделяет строку на несколько строк в тех местах, которые соответствуют некоторому шаблону.
Для начала разделим строку в месте, где встречаются квадратные скобки (они ограничивают список ID страниц пользователей):
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_10.gif
Выделим необходимую нам информацию:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_11.gif
Теперь разделим строку в местах, где встречаются запятые:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_12.gif
Мы получили список ID, правда это не числа, а строки. Преобразовывать строки в числа нам сейчас не нужно, однако, если это потребуется, осуществить это можно например так:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_13.gif
Для первого примера возьмем первые 400 ID и преобразуем их в тот же самый формат, который был — строка из чисел, разделенных запятыми:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_14.gif
С помощью метода users.get (имеющего параметр uids — список ID страниц пользователей) получим строку, содержащую имена пользователей с заданными ID:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_15.gif
Аналогично показанному ранее, выделим имена пользователей вместе с ID:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_16.gif
Теперь можно, например, провести анализ имен первых 400 участников из списка:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_17.gif
Получим фото пользователей, находящихся в нашем списке, чей ID больше, скажем, 100 000 000:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_18.gif
Найдем ссылки на аватары пользователей с заданными выше ID с помощью метода users.get и параметров uids и fields:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_19.gif
Выцепим ссылки на аватары пользователей и импортируем их:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_20.gif
Выделим только пользователей с загруженными ими аватарами:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_21.gif
Создадим интерактивный коллаж:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_22.gif
После нажатия на любой из аватаров, вы увидите его увеличенное изображение с именем участника сообщества:
Rabota_s_Web_API_v_Mathematica_23.gif
Решение сложной задачи через API
Теперь решим более сложную задачу — отобразим на карте все города, в которых живут участники сообщества.
Для начала установим текущие количество участников сообщества:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_24.gif
Теперь импортируем ID всех участников сообщества. Так как API ВКонтакте выдает не более 1000 ID за раз, то придется импортировать информацию о ID кусками, для этого служит параметр offset метода groups.getMembers:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_25.gif
Из полученных строк с ID выцепим все имеющиеся ID:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_26.gif
Разобьем этот список на подсписки, содержащие не более 400 ID (это снова связан с ограничениями на работу API ВКонтакте), после чего преобразуем их к стандартному формату (ID разделенные запятыми в строке):
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_27.gif
С помощью метода users.get подгрузим информацию о городах и странах в которых проживают участники сообщества, для этого нам потребуется параметр fields. Также структурируем информацию, подсчитав количество участников, живущих в разных городах и странах.
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_28.gif
К сожалению, ВКонтакте не выдает название города и страны сразу. Оно зашифровано номером. Нам же потребуются привычные названия, их можно получить применив методы places.getCountryById и places.getCityById у которых есть параметр cids — список ID городов (стран):
получение строки, содержащей названия стран:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_29.gif
получение списка, содержащего названия стран из полученной выше строки:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_30.gif
получение строки, содержащей названия городов:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_31.gif
получение списка, содержащего названия городов из полученной выше строки (причем каждое название представлено в виде правила замены ID города на его название)
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_32.gif
подстановка полученных выше правил замены в список ID городов
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_33.gif
выцепление всех городов, которые имеют название (не все ID имеют свое название)
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_34.gif
Так как API ВКонтакте выдает название города на русском языке, это означает, что у нас нет возможности использовать напрямую функцию CityData, с помощью которой можно получать напрямую различную информацию о городах на основе курируемых данных Wolfram Research. Поэтому придется обратиться к API Google Maps, чтобы по названию на русском языке получить координаты соответствующего города, для того, чтобы потом использовать их. Для этого создадим специальную функцию cityInformation (она запоминает свои значения для того, чтобы не проводить их повторно), которая обращается к API Google Maps, выдавая на выходе широту и долготу точки (города):
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Теперь найдем координаты всех городов, при этом после окончания расчета сформируем дамп-файл, в который поместим все значения функции cityInformation (код устроен так, что если дамп файл уже есть, то он будет подгружен автоматически и после перезаписан, в том случае если добавились новые определения, если файл дампа Mathematica не существует — то он будет сформирован).
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_35.gif
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_36.gif
Сформируем список, содержащий списки вида:
{название города, его координаты, количество участников}
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_37.gif
Отобразим на карте города и страны в которых живут участники сообщества:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_38.gif
Увеличим фрагмент карты, соответствующей Европейской части России:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_39.gif
После того, как мы создали карту, ее можно преобразовать в глобус:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_40.gif
Или в иную инфографику: скажем, превратить плоскую карту в трехмерную и отметить на ней столбиками количество человек, проживающих в том или ином городе.
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Rabota_s_Web_API_v_Mathematica_41.gif

Блог принадлежит “Русскоязычной поддержке Wolfram Mathematica
При любом использовании материалов блога, ссылка на блог обязательна.
SpikeyСоздано с помощью Wolfram Mathematica 9

Комментариев нет:

Отправить комментарий