Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Clean Up Data Imported from a Website - Wolfram Mathematica

Упорядочивание и очистка данных, импортированных из веб-сайта

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

Бюро переписи населения США хранит данные о торговом балансе между США и Китаем. На его веб-сайте опубликованы ежемесячные данные начиная с 1985 года.

Начнем с просмотра списка компонентов данных, называемых в Mathematica элементами, которые могут быть импортированы из веб-сайта:

In[2]:=

CleanUpDataImportedFromAWebsiteRU_1.gif

Out[2]=

CleanUpDataImportedFromAWebsiteRU_2.gif

Выполним импорт элемента Data. В контексте этого примера, для подавления вывода результата использована точка с запятой (;), так как объем импортируемых данных достаточно велик. Вычисление команды Import без знака ; выведет на экран все импортируемые данные:

In[3]:=

CleanUpDataImportedFromAWebsiteRU_3.gif

Воспользуемся функцией Short для отображения лишь части данных:

In[6]:=

CleanUpDataImportedFromAWebsiteRU_4.gif

Out[6]//Short=

CleanUpDataImportedFromAWebsiteRU_5.gif

Вывод на экран большей части результатов блокирован, однако, Вы можете заметить, что интересующие нас данные находятся в списке из четырех элементов: Month, Exports, Imports и Balance. Посему, Вы можете получить все данные путем извлечения подсписков, содержащих только четыре элемента. А для того, чтобы извлечь только данные, извлечем лишь те подсписки из четырех элементов, где последний элемент имеет численное значение.

Применим функцию Cases с четырьмя символами подчеркивания в списке, чтобы извлечь списки, содержащие четыре элемента. Символ подчеркивания является образом, обозначающим любое выражение в Mathematica. Добавление выражения CleanUpDataImportedFromAWebsiteRU_6.gif к последнему символу подчеркивания обеспечивает то, что Вы получите только те списки, где четвертый и последний элемент является численным значением. Использование символа ? в качестве последнего аргумента функции Cases указывает на то, что все уровни вложенного списка tmp будут просмотрены на предмет соответствия заданному шаблону:

In[7]:=

CleanUpDataImportedFromAWebsiteRU_7.gif

Вновь применим функцию Short для отображения лишь части данных:

In[8]:=

CleanUpDataImportedFromAWebsiteRU_8.gif

Out[8]//Short=

CleanUpDataImportedFromAWebsiteRU_9.gif

Полученный результат берет свое начало в декабре 1985 и заканчивается в марте 1992. Следовательно, многие данные не были извлечены. Таблицы данных со смешанным форматированием являются распространенным источником подобных проблем.

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

In[9]:=

CleanUpDataImportedFromAWebsiteRU_10.gif

Out[9]=

CleanUpDataImportedFromAWebsiteRU_11.gif

In[10]:=

CleanUpDataImportedFromAWebsiteRU_12.gif

Out[10]=

CleanUpDataImportedFromAWebsiteRU_13.gif

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

Для начала создадим функцию, которая будет использовать StringQ для проверки: является ли аргумент строкой текста, и если это так - удалять  запятую при помощи функции StringReplace. Если аргумент не является строкой текста, он возвращается без изменений:

In[11]:=

CleanUpDataImportedFromAWebsiteRU_14.gif

Создадим еще одну функцию, которая вначале проверяет, является ли аргумент строкой текста, и, если это так, использует функцию NumberString с StringMatchQ для проверки наличия чисел в строке текста. Если аргумент не является строкой текста, функция использует NumericQ для проверки, является ли он численным. Другими словами, функция будет возвращать True (Истина) если ее аргумент содержит число, независимо от того, является ли этот аргумент строкой текста или нет:

In[12]:=

CleanUpDataImportedFromAWebsiteRU_15.gif

Далее, Вы можете использовать функцию g[x] при проверке условия (символ /; является краткой формой записи функции Condition) примененного в шаблоне:

In[63]:=

CleanUpDataImportedFromAWebsiteRU_16.gif

Рассматривая полученные данные, Вы можете заметить, что они теперь охватывают период с 1985 по 2012. Дополнительная проверка на соответствие шаблону сработала, в результате чего, все данные были извлечены. Обратите внимание, что на этом этапе запятые присутствуют, так как они удалялись только для и на время выполнения проверки условия:

In[14]:=

CleanUpDataImportedFromAWebsiteRU_17.gif

Out[14]//Short=

CleanUpDataImportedFromAWebsiteRU_18.gif

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

In[15]:=

CleanUpDataImportedFromAWebsiteRU_19.gif

Следующая функция проверит, является ли первый элемент каждого списка строкой текста, представляющей итоговую сумму за год или это строка текста, представляющая дату. Если это дата, она будет преобразована в формат даты с помощью DateList:

In[54]:=

CleanUpDataImportedFromAWebsiteRU_20.gif

Теперь возьмем приведенное выше выражение с функцией Cases и добавим к нему созданные функции как правила для замены, применяемые к каждому из четы&# 1088;ех элементов всех подсписков данных. Элементы, удовлетворяющие функции g[x], возвращают значение True (Истина) и обрабатываются функцией h[x] и, таким образом, преобразуются из строк текста в числа. К первому элементу каждого подсписка применяется функция j[x], преобразующая строку текста с датой в &# 1092;ормат даты DateList:

In[64]:=

CleanUpDataImportedFromAWebsiteRU_21.gif

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

In[50]:=

CleanUpDataImportedFromAWebsiteRU_22.gif

Out[50]//Short=

CleanUpDataImportedFromAWebsiteRU_23.gif

Следующим шагом будет применение функции DeleteCases, с шаблоном в качестве ее второго аргумента, для удаления итоговых годовых сумм из общего списка данных. В предыдущем шаге, все данные были преобразованы в числа и даты, за исключением элементов подсписков обозначающих годовую сумму, которые так и остались строками текста. Поэтому, в качестве шаблона используем список из _String (обозначает любую строку текста) и двух подчеркиваний, что соответствует любому одному или нескольким выражениям Mathematica:

In[65]:=

CleanUpDataImportedFromAWebsiteRU_24.gif

Теперь мы избавились от итоговых годовых сумм:

In[66]:=

CleanUpDataImportedFromAWebsiteRU_25.gif

Out[66]//Short=

CleanUpDataImportedFromAWebsiteRU_26.gif

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

Воспользуемся функцией Sort, чтобы исправить это:

In[67]:=

CleanUpDataImportedFromAWebsiteRU_27.gif

Теперь данные размещены в правильной хронологической последовательности:

In[59]:=

CleanUpDataImportedFromAWebsiteRU_28.gif

Out[59]//Short=

CleanUpDataImportedFromAWebsiteRU_29.gif

Наконец, мы можем приступить к построению графика данных.

Определим некоторые опции, которые улучшат внешний вид графика:

In[60]:=

CleanUpDataImportedFromAWebsiteRU_30.gif

Определим подписи для графика:

In[61]:=

CleanUpDataImportedFromAWebsiteRU_31.gif

Воспользуемся функцией DateListPlot для построения графика по данным:

In[62]:=

CleanUpDataImportedFromAWebsiteRU_32.gif

Out[62]=

CleanUpDataImportedFromAWebsiteRU_33.gif

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