Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Васильев Ю. - Python для data science (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
7.21 Mб
Скачать

Перемещение данных в DataFrame и из него      101

HTTP-команды реализуются как методы библиотеки (например, requests.get() используется для выполнения HTTP-запроса GET). Ниже показано, как получить удаленный доступ к excerpt.txt с помощью Requests. Замените URL-адрес GitHub-ссылкой на файл, если необходимо:

import requests

r = requests.get('http://localhost/excerpt.txt') for i, line in enumerate( r.text.split('\n')):

if line.strip():

print("Line %i: " %(i), line.strip())

Мы выполняем GET-запрос с помощью метода requests.get(), передавая URLадрес файла в качестве параметра . Метод возвращает объект Response, в атрибуте text которого содержатся полученные данные . Requests автоматически декодирует полученный контент, делая обоснованные предположения о кодировке, так что вам не придется заниматься этим самостоятельно. Как и в примере с urllib3, мы выводим только непустые строки, добавляя номер каждой строки в начале .

УПРАЖНЕНИЕ № 6: ДОСТУП К API С ПОМОЩЬЮ REQUESTS

Как и urllib3, библиотека Requests может взаимодействовать с HTTP API. Попробуйте переписать код, который отправляет GET-запрос к News API, так, чтобы в нем использовалась библиотека Requests вместо urllib3. Обратите внимание, что при использовании Requests не нужно вручную добавлять параметры запроса к URL, передаваемому в запросе. Вместо этого передавайте параметры в виде словаря строк.

Перемещение данных в DataFrame и из него

В pandas входит ряд методов чтения, каждый из которых предназначен для загрузки данных в определенном формате и/или из определенного типа источника. Эти методы позволяют преобразовать табличные данные в DataFrame одним вызовом, благодаря чему импортированный датасет сразу готов к анализу. В pandas также есть методы для преобразования данных DataFrame в другие форматы, например JSON. В этом разделе рассматриваются методы, позволяющие перемещать данные в DataFrame или из него. Мы также рассмотрим библиотеку pandas-datareader, которая полезна для загрузки данных из различных онлайнисточников и преобразования в pandas DataFrame.

102      Глава 4. Доступ к данным из файлов и API

Импортирование вложенных структур JSON

Поскольку JSON стал фактическим стандартом для обмена данными между приложениями, важно иметь возможность быстро импортировать JSON-документ и преобразовывать его в структуру данных Python. В предыдущей главе мы рассмотрели пример преобразования простой, невложенной структуры JSON в объект DataFrame с помощью функции pandas read_json(). В этом разделе вы узнаете, как выполнить подобные преобразования сложного, вложенного JSON-документа, такого как этот:

data = [{"Emp":"Jeff Russell", "POs":[{"Pono":2608,"Total":35},

{"Pono":2617,"Total":35},

{"Pono":2620,"Total":139}

]},

{"Emp":"Jane Boorman", "POs":[{"Pono":2621,"Total":95},

{"Pono":2626,"Total":218}

]

}]

Как видите, каждая запись в документе JSON начинается с простой структурной пары «ключ — значение» с ключом Emp, за которой следует вложенная структура с ключом POs. Иерархическую структуру JSON можно преобразовать в pandas DataFrame с помощью метода чтения библиотеки pandas json_normalize(), который принимает вложенную структуру и делает ее плоской, или нормализует, превращая в простую таблицу. Вот как это делается:

import json

import pandas as pd

df = pd.json_normalize( data, "POs", "Emp").set_index([ "Emp","Pono"]) print(df)

Помимо экземпляра JSON , который будет обработан json_normalize(), мы указываем POsкак вложенный массив , который необходимо сделать плоским, и Emp в качестве поля, которое будет использоваться как часть сложного индекса в итоговой таблице . В той же строке кода мы задаем два столбца в качестве индекса: Emp и Pono . Результатом будет следующий датафрейм pandas:

 

 

Total

Emp

Pono

 

Jeff Russell

2608

35

 

2617

35

Перемещение данных в DataFrame и из него      103

 

2620

139

Jane Boorman

2621

95

 

2626

218

 

 

 

ПРИМЕЧАНИЕ

Использование двухколоночного индекса упрощает агрегирование данных внутри групп. Более подробно мы рассмотрим датафреймы с многоколоночными индексами в главе 6.

Конвертирование DataFrame в JSON

На практике часто приходится выполнять обратную операцию — преобразование pandas DataFrame в JSON. Следующий код преобразует датафрейм из примера обратно в экземпляр JSON, из которого он был первоначально сгенерирован:

df = df.reset_index()

json_doc = ( df.groupby(['Emp'], as_index=True)

.apply(lambda x: x[['Pono','Total']].to_dict('records')).reset_index()

.rename(columns={0:'POs'}).to_json(orient='records'))

Начинаем с удаления двухколоночного индекса датафрейма, чтобы Emp и Pono стали обычными столбцами . Затем используем составной однострочник для преобразования DataFrame в документ JSON. Сначала применим к датафрейму операцию groupby, группируя строки по столбцу Emp . Используем groupby() в сочетании с apply() для применения лямбда-функции к каждой записи в каждой группе . Внутри лямбда-функции укажем список полей для отображения в строке вложенного массива для каждой записи Emp. Применим метод DataFrame.to_dict()с параметром records, чтобы отформатировать поля в массиве следующим образом: [{колонка:значение}, ... , {колонка:значение}], где каждый словарь — заказ, связанный с конкретным сотрудником.

На данном этапе у нас есть объект Series с индексом Emp и столбцом, содержащим массив заказов, связанных с сотрудником. Чтобы дать колонке название (в данном случае POs), необходимо преобразовать объект Series в DataFrame. Простой способ сделать это — метод reset_index() . Помимо преобразования Series в DataFrame, reset_index() изменяет Emp, так что это больше не индекс, а обычный столбец, что будет важно при преобразовании датафрейма в формат JSON. Наконец, мы явно задаем имя столбца, содержащего вложенный массив (POs), используя метод rename() , и конвертируем измененный DataFrame в JSON .

104      Глава 4. Доступ к данным из файлов и API

УПРАЖНЕНИЕ № 7:

ОБРАБОТКА СЛОЖНЫХ СТРУКТУР JSON

JSON, использованный в предыдущем разделе, имел одно поле с простой структурой (Emp) на верхнем уровне каждой записи. В реальном JSONдокументе таких полей может быть больше. В записях в примере ниже есть второе простое поле на верхнем уровне — Emp_email:

data = [{"Emp":"Jeff Russell", "Emp_email":"jeff.russell", "POs":[{"Pono":2608,"Total":35},

{"Pono":2617,"Total":35},

{"Pono":2620,"Total":139}

]},

{"Emp":"Jane Boorman", "Emp_email":"jane.boorman", "POs":[{"Pono":2621,"Total":95},

{"Pono":2626,"Total":218}

]

}]

Чтобы преобразовать эти данные в DataFrame, необходимо передать список всех полей верхнего уровня с простой структурой в третий параметр json_normalize(), как показано ниже:

df = pd.json_normalize(data, "POs", ["Emp","Emp_email"]).set_index(["Emp","Emp_email","Pono"])

Содержимое датафрейма будет таким:

 

 

 

Total

Emp

Emp_email

Pono

 

Jeff Russell

jeff.russell

2608

35

 

 

2617

35

 

 

2620

139

Jane Boorman

jane.boorman

2621

95

 

 

2626

218

 

 

 

 

Попробуйте преобразовать этот датафрейм обратно в исходный документ JSON, изменив операцию groupby, рассмотренную в предыдущем разделе.

Перемещение данных в DataFrame и из него      105

Содержимое json_doc выглядит следующим образом:

[{"Emp": "Jeff Russell",

"POs": [{"Pono": 2608, "Total": 35}, {"Pono": 2617, "Total": 35}, {"Pono": 2620, "Total": 139}

]},

{"Emp": "Jane Boorman",

"POs": [{"Pono": 2621, "Total": 95}, {"Pono": 2626, "Total": 218}

]

}]

Для удобочитаемости можно вывести документ на экран с помощью следующей команды:

print(json.dumps(json.loads(json_doc), indent=2))

Преобразование онлайн-данных в DataFrame

с помощью pandas-datareader

Некоторые сторонние библиотеки имеют совместимые с pandas методы чтения для получения доступа к данным из различных онлайн-источников, таких как Quandl1 и Stooq2. Самая популярная подобная библиотека — pandas-datareader. На момент написания книги эта библиотека включала 70 методов для загрузки данных из определенного источника и их преобразования в pandas DataFrame. Многие методы библиотеки являются обертками для финансовых API, позволяя легко получать финансовые данные в формате pandas.

Установка pandas-datareader

Запустите следующую команду для установки pandas-datareader:

$ pip install pandas-datareader

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

1 https://data.nasdaq.com

2 https://stooq.com

3 https://pandas-datareader.readthedocs.io/en/latest/remote_data.html