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

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

DC прогнозирует, что в 2025 году мировые данные вырастут до 175 зеттабайт… Если вы попытаетесь загрузить 175 зеттабайт при средней текущей скорости интернет-соединения, на загрузку у вас уйдет 1,8 миллиарда лет.

- Бернар Марр, 2019 г.

Это много данных. Так почему же люди до сих пор используют те же CSV-файлы авиакомпаний или статистику футболистов? Я сам попадал в эту ловушку при случае, и я думаю, что это происходит в основном по двум причинам: лень и фамильярность. Лень, потому что мы знаем, как легко использовать предварительно очищенные CSV. Знакомство, потому что мы знаем, как получить доступ к данным и приступить к работе над нашими проектами, а не возиться с распаковкой и импортом менее знакомых типов данных.

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

Данные файла WAV (простой)
Данные файла JPEG (средний)
Данные кода APK (расширенный)

(ЛЕГКО) Разблокировка данных звуковых файлов WAV

Многие новички в области науки о данных и обработки сигналов считают, что открытие и анализ звуковых данных - сложный и продвинутый процесс. Хотя кое-что из теории, лежащей в основе обработки сигналов, может быть немного продвинуто, на самом деле открытие и работа со звуковыми файлами удивительно легко благодаря пакету SciPy io.wavefile.

Звуковой файл формы волны, или .Wav, является распространенным файлом для хранения битового аудиопотока для ПК. Если вы работаете с обработкой сигналов или аудио- и звуковой техникой, вы будете регулярно сталкиваться и должны выполнять различные преобразования в файлах .wav.

Работать с .Wav файлами легко и быстро. Просто выберите звуковой файл, который вам интересен. Я решил использовать Benjamin Tissot’s Actionable, рок-песню без лицензионных отчислений. Давайте импортируем файл os.wavfile и откроем песню:

import numpy as np # for data transformation
import matplotlib.pyplot as plt # for visualizing the data
import scipy.io.wavfile as wavfile # for opening the data
Fs, aud = wavfile.read('Actionable-BenjaminTissot.wav')

В этом случае «Fs» или частота дискретизации - это количество аудиосэмплов, переносимых в секунду, а «aud» - это фактическое аудио как звуковое давление. Большинство современных звуковых файлов имеют два аудиоканала, левый и правый для стереозвука, давайте сосредоточимся только на одном канале и посмотрим, что мы можем узнать об аудиофайле:

aud = aud[:,0] #Pick just the left channel
print("Sample rate: "+str(Fs))
print("Duration: " + str(aud.shape[0]/Fs) +" seconds")
[1] Sample rate: 44100
[2] Duration: 122.80163265306122 seconds 
#Duration is just total samples over sampling rate

Как мы видим, частота дискретизации составляет 44100 Гц или 44,1 кГц, что является стандартом для большинства высококачественных аудиофайлов. Разделив общее количество сэмплов на частоту дискретизации, мы получим длину песни, которая составляет примерно две минуты. Давайте визуализируем первые 1,5 секунды этого аудиофайла:

first = aud[:int(Fs*1.5)] #Snip just the first 1.5 seconds
plt.plot(first)
plt.ylabel("Sound Pressure (Pa)")
plt.xlabel("Sample Count")
plt.title("Original Audio (1.5s)");

Как вы можете видеть выше, аудиофайлы содержат огромное количество разнообразных данных. В этой двухминутной песне только 5 415 552 точки данных, поэтому мы решили визуализировать только первые 1,5 секунды песни.

С этими обширными данными можно делать удивительное множество вещей. Лично мне было интересно увидеть некоторые различия в волновых паттернах между жанрами музыки. Снова воспользовавшись сайтом бесплатной музыки Benjamin Tissot, я взял образцы его другой музыки и начал строить планы:

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

  • Freesound.org: звуковой форум и база данных с разнообразной творческой музыкой и звуками.
  • MixKit.co: веб-сайт стоковой музыки.
  • Podcast.co: Сайт с бесплатными музыкальными подкастами, включающими образцы подкастов.

Это всего лишь несколько примеров некоторых веб-сайтов. Интернет изобилует большими объемами аудиоданных, которые только и ждут, чтобы их проанализировали и применили. Благодаря io.wavfile SciPy процесс распаковки и импорта этих данных в python прост и легок.

(СРЕДНИЙ) Преобразование изображений JPEG в данные

Возможно, вы уже знаете, что можете работать с данными изображений в Python, но как вы это делаете? PIL or Pillow - это библиотека изображений на языке Python, которая делает работу с данными изображений интуитивно понятной и простой.

В качестве примера я выбрал изображение карбида кремния, сделанное Геологической службой США от Unsplash. Это большое изображение, поэтому я собираюсь начать с уменьшения изображения до 1/8 его исходного размера:

from PIL import Image
import numpy as np
im = Image.open("usgs-Silicon_Carbide.jpg")#Open the image
#calculate new dimentions
(width, height) = (im.width // 8, im.height // 8)
#Use the resize function to reproject the image
im_resized = im.resize((width, height))
im_resized

Теперь, когда размер изображения изменен, мы можем выполнять различные преобразования и изменения по желанию. Вот пример преобразования изображения в черно-белое:

img_bw = im_resized.convert("1")
img_bw

Хотя он не идеален, обычно он лучше работает с исходным изображением, чем с измененным. Это отличный пример использования подушки для преобразования изображения. Однако, используя объект изображения, созданный Pillow, мы можем преобразовать изображение в массив NumPy:

ar = np.array(im)
ar.shape
[1] (3648, 5472, 3)

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



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

  • Unispalsh.com: бесплатный репозиторий изображений, который поддерживает встроенный поиск изображений Medium.
  • Flickr.com: репозиторий изображений с некоторыми бесплатными и некоторыми платными опциями.

Данные APK-кода

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

Данные кода бывают разных форм в соответствии с языком и типом программирования, используемым для их сборки. Недавно я работал с обнаружением вредоносных программ и изучал парсинг кода Smali из файлов Android .apk. Файл apk - это пакет приложения Android, тип файла, который поддерживает все приложения в Google Play Store. Проблема с этим файлом в том, что он не предназначен для чтения человеком из-за файлов .dex, из которых он состоит. Именно здесь на помощь приходит код Smali. Код Smali - это удобочитаемая версия файлов .apk Android, которая очень похожа на Java с некоторыми другими особенностями.

Чтобы использовать файлы APK, нам нужно сначала собрать их и преобразовать в Smali. Идеальное место для поиска файлов APK - это apkpure.com, веб-сайт, который включает файлы apk практически для всех приложений в Google Play Store.



Выбрав akp, вам нужно преобразовать его в код Smali. Я лично рекомендую Apktool, программу для распаковки apk, которую легко установить и использовать в выбранном вами приложении. Для загрузки / установки Apktool используйте следующее руководство:



После того, как вы конвертируете apk в код Smali, мы действительно можем приступить к синтаксическому анализу и исследованию этих данных.

Синтаксис Smali очень похож на Java, однако есть некоторые нюансы и отличия. Если вы заинтересованы в использовании такого рода данных кода для проекта, я рекомендую ознакомиться с Руководством по синтаксису Smali.

В качестве примера я выбрал API звуковой платы для распаковки и анализа. Вот пример метода кода Smali из приложения:

# virtual methods
.method public abstract extraCallback(Ljava/lang/String;Landroid/os/Bundle;)V
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Landroid/os/RemoteException;
        }
    .end annotation
.end method

Приложение дека состоит из примерно 43 000 методов в 5800 файлах Smali. Очевидно, что в этой области доступно огромное количество данных, учитывая, что это всего лишь простое приложение для деки.

Итак, что мы можем сделать теперь, когда у нас есть все данные Smali?

Основной проблемой для Google Play Store является рост числа вредоносных приложений, скрывающихся среди легитимных приложений. Одним из возможных решений этой проблемы является обнаружение вредоносных программ с помощью теории графов путем анализа и сбора данных о методах, присутствующих в файлах Smali. Я настоятельно рекомендую прочитать эту отличительную статью, если вы хотите узнать больше: HinDroid: интеллектуальная система обнаружения вредоносных программ для Android, основанная на структурированной гетерогенной информационной сети

Если вы заинтересованы в APK-файлах для обнаружения вредоносных программ или по другой причине, вот несколько шагов, чтобы открыть и объединить ваши файлы Smali. Во-первых, давайте получим путь ко всем распакованным из APK-файла smali-файлам:

import os
list_smali = []
for root, dirs, files in os.walk("PATH TO APP", topdown=False):
    for name in files:
        if name[-6:] == ".smali":
            list_smali.append(str(os.path.join(root, name)))

Для своего проекта я обнаружил, что лучший способ - объединить файлы в виде строки:

concat = ""
for file in list_smali:
    f = open(file, "r")
    holder = str(f.read())
    concat = concat + "/n" + holder

Как только файлы объединены в одну строку, мы можем разделить строку и проанализировать определенные элементы кода. В данном случае я выбрал разделение строкой «.end method»:

sp_c = concat.split(".end method")
len(sp_c)
[6] 43030 #Number of methods in the app

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

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

Последние мысли

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

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

Источники и ключевые ссылки:

Скачайте бесплатный онлайн-загрузчик APK. (нет данных). Получено 23 октября 2020 г. с сайта https://apkpure.com/.

Сколько данных в мире? (нет данных). Получено 23 октября 2020 г. с сайта https://www.bernardmarr.com/default.asp?contentID=1846.

Лим, Б. (нет данных). Анализируем smali-код. Получено 23 октября 2020 г. с сайта https://limbenjamin.com/articles/analysing-smali-code.html.

Промежуточное ПО. (нет данных). Получено 23 октября 2020 г. с сайта https://scipy.github.io/old-wiki/pages/Projects.html.

Подушка¶. (нет данных). Получено 23 октября 2020 г. с сайта https://pillow.readthedocs.io/en/stable/.

РОЯЛТИ БЕСПЛАТНАЯ МУЗЫКА от BENSOUND. (нет данных). Получено 23 октября 2020 г. с https://www.bensound.com/.

Сулейман. (2020, 19 марта). Некоторые интересные приемы в Python Pillow. Получено 23 октября 2020 г. с сайта https://medium.com/analytics-vidhya/some-interesting-tricks-in-python-pillow-8fe5acce6084.

Unsplash. (нет данных). Красивые бесплатные изображения и картинки. Получено 23 октября 2020 г. с сайта https://unsplash.com/.

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