Серия учебных пособий по статистике Python

Введение в Python № 3: подключение API государственных данных с помощью шаблона Factory

Источник данных политиков из API публичных правительственных данных для повышения точности распределения

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

В этом уроке мы делаем в основном два шага

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

Список всех руководств можно найти здесь.

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

Построение графиков

Но давайте начнем с первой довольно простой задачи - создания двух диаграмм для наших таблиц.

Мы создаем гистограмму, а также круговую диаграмму. За основу берем нашу плотную таблицу CH-tw-party-list.

Код прост:

  • На гистограмме мы визуализируем общее количество друзей в группе.
  • На круговой диаграмме мы объединяем учетные записи Twitter для каждой стороны.

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

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

Фабрика API государственных данных

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

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

Одна из наиболее важных форм открытых данных - это открытые правительственные данные (OGD), которые представляют собой форму открытых данных, создаваемых правящими правительственными учреждениями. Важность открытых правительственных данных объясняется тем, что они являются частью повседневной жизни граждан, вплоть до самых рутинных / рутинных задач, которые, казалось бы, далеки от правительства.

Хорошей отправной точкой для получения обзора API государственных данных является каталог programmableweb, в котором перечислено более 2000 различных API.

Категории государственных API можно найти здесь:

Https://www.programmableweb.com/category/government/apis?category=20094

Два примера правительственных API:

API данных правительства США: https://www.data.gov/developers/apis

Или API швейцарского правительства парламента Швейцарии: http://ws-old.parlament.ch/:

Мы будем использовать API швейцарского парламента для извлечения личных данных членов парламента (в основном, распределения партий), чтобы повысить точность нашего алгоритма сопоставления Twitter.

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

Швейцарский парламентский API возвращает около 25 записей за один запрос. К последней записи запроса будет прикреплен атрибут, который сообщает вам, доступны ли дополнительные данные (hasMorePages = true).

Если установлено значение «true», вы можете получить следующую страницу, добавив параметр запроса: pageNumber = 2 и т. Д.

Вы найдете такую ​​информацию об API обычно в его пользовательской документации, например, Swiss Parliament API имеет некоторые параметры для управления форматом вывода, языком и т. Д.

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

Улучшение кода - диаграмма UML

Для общего представления правительственного API требуется серьезная разработка и усовершенствование нашей программы. Диаграмма классов UML нашей расширенной программы выглядит следующим образом (пусть вас не смущает сложность, все детали будут объяснены позже в этой статье).

Краткое описание того, что мы сделали до сих пор:

  • Во втором туториале мы создали класс GovernmentSocialMediaAnalyzer, который может получать релевантные данные учетной записи политического деятеля страны в Twitter. Мы использовали подход, основанный на конфигурации, на основе YAML, чтобы абстрагировать данные для конкретной страны в файл конфигурации.
  • Было определено несколько методов, которые позволили нам создавать фреймы данных панды, а также графически отображать конкретные таблицы и диаграммы.

Теперь мы представим три новых класса govAPIFactory, govAPI (абстрактный класс) и govAPI_CH, которые построят обобщенный подход для подключения любого типа правительственные API.

Шаблон проектирования программного обеспечения играет важную роль в разработке программного обеспечения, как описано в Википедии:

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

В нашем проекте мы будем использовать шаблон фабричного метода для обобщения возможности подключения к правительственному API, что объясняется в Википедии следующим образом:

В программировании на основе классов шаблон фабричного метода - это шаблон создания, который использует фабричные методы для решения проблемы создания объектов без необходимости указывать точный класс объекта, который будет создан. Это делается путем создания объектов путем вызова фабричного метода - либо указанного в интерфейсе и реализуемого дочерними классами, либо реализованного в базовом классе и необязательно переопределенного производными классами, а не путем вызова конструктора.

Наш дизайн будет основан на стратегии, чтобы определить

  • базовый класс (родительский - GovAPI), который является абстрактным и
  • производный класс (дочерний - GovAPI_CH), который будет иметь реализацию для конкретной страны (например, для Швейцарии).
  • в будущем мы можем ввести дополнительные классы, например, для Соединенного Королевства мы создадим класс реализации: GovAPI_UK

Абстрактный базовый класс «GovAPI»

govAPI - это абстрактный класс, содержащий несколько абстрактных методов. Абстрактный метод - это метод, который объявлен, но не содержит реализации.

В Python абстрактный класс является производным (или унаследованным) от класса ABC и будет иметь от одного до нескольких методов, отмеченных @abstractmethod.

Таким образом, абстрактный класс предоставляет вам план сборки для любого класса реализации, который наследуется от него, в нашем классе govAPI_CH.

Какие методы должен реализовывать govAPI_CH?

Прежде всего, реализация метода load_government_members () должна позаботиться об извлечении записей данных политика из правительственного API. Каждая полученная запись, представляющая данные одного политика, должна быть передана методу add_person_record (который уже реализован базовым классом govAPI)

Теперь вопрос в том, что, черт возьми, делает метод add_person_record? Что ж, посмотрите на код ниже.

Метод просто подготавливает целевой словарь для нашей личной записи. Т.е. определенные имена атрибутов (lastName, firstName, Council и т. Д.) - это имена, которые мы хотим использовать для любого GovAPI реализация.

Это означает, что наша полученная запись в виде специальной реализации API правительства (т.е. в форме API парламента Швейцарии) должна быть преобразована с помощью набора методов получения.

Каждый из этих методов получения либо абстрактный, либо возвращает пустую строку. Разработчик унаследованного класса (GovAPI_CH) несет ответственность за обеспечение правильной реализации получателя.

Класс реализации «GovAPI_CH»

Реализации метода получения GovAPI_CH показаны ниже. Он состоит из набора методов получения, которые возвращают требуемые значения атрибутов из записи.

Давайте подробнее рассмотрим метод load_gevernment_members:

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

URL-адрес и его параметр мы поместили в наш конфигурационный YAML-файл.

govAPIUrl: "http://ws-old.parlament.ch/" 
govAPICouncillorsRes: "councillors" 
govAPIParams: 
  - format : "json"
  • 8: Первый requests.get получит все страницы обзора советников http://ws-old.parlament.ch/councillors?format=json&pageNumber=1.
  • 15: если запись данных помечена как активная, будет извлечена запись с подробностями.
  • 17. Второй запрос будет использовать id, связанный с записью, и построить URL-адрес для записи сведений. Т.е. в этом примере мы получаем запись политика с идентификатором 1358: http://ws-old.parlament.ch/councillors/1358?format=json
  • 19: Полученную подробную запись мы передаем методу addPerson, который преобразует предоставленную запись данных в целевую (с помощью реализованных нами геттеров).
  • 20. Наконец, мы проверяем атрибут hasMorePages, и в случае, если мы достигли последней записи, мы прервем цикл.

Вышеупомянутый метод будет вызываться в функции govAPI create_politican_from_govapi_table (уже реализованной родительским классом govAPI), которая преобразует список записей политик в фрейм данных Panda.

Каноническая модель

Здесь важно понимать, что структура этого фрейма данных Panda будет такой же, как у любого правительственного API, если мы реализуем конкретный класс на основе абстрактного класса govAPI. Таким образом, мы нормализовали наши данные, чтобы потом можно было работать и обрабатывать их стандартным способом.

Мы снова стремились к важному шаблону проектирования, нашей целевой структуре (или модели), известной под названием Каноническая модель. Как описывает Википедия:

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

Концептуально мы построили конвейер мини-данных. Для каждого правительственного API мы должны реализовать функцию выборки записей данных и правила преобразования (геттеры), которые будут преобразовывать данные в наши стандартизованные.

Весь шаблон визуализирован на диаграмме последовательности UML.

  • Операция «потребление» представлена ​​шагом 60
  • Операции «правила преобразования» представлены этапами 80–120.
  • Операция storeAs представлена ​​шагом 130

Важно, чтобы вы понимали ответственность различных классов. govAPI и govAPI_CH (красные точки) видимы для внешнего мира (govAPIFactory, gsma) как один экземпляр класса . Для вызывающего абонента не имеет значения, кто какой метод реализует.

govAPIFactory класс

Не хватает еще одной вещи - класса govAPIFactory, который довольно прост. В зависимости от country_code будет создан соответствующий экземпляр класса реализации и возвращен вызывающей стороне:

Как видите, у класса всего один метод класса. Т.е. GovAPIFactory не поддерживает экземпляры объектов. Фабрика состоит только один раз в программе, которая называется Singleton Pattern.

В разработке программного обеспечения одноэлементный шаблон - это шаблон проектирования программного обеспечения, который ограничивает создание экземпляра класса одним. Это полезно, когда нужен ровно один объект для координации действий в системе.

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

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

Программа lesson3.py сгенерирует таблицу в Plotly под именем CH-govapi-member-list.

На сегодня все, в следующей статье мы начнем анализ данных, объединив два источника данных.

Упражнение

Вы можете найти упражнение к руководству здесь: Ссылка

Исходный код

Исходный код можно найти здесь (каталог третьего урока): https://github.com/talfco/clb-sentiment

Дополнительная литература

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

Первоначально опубликовано на сайте dev.cloudburo.net 11 февраля 2019 г.