SODA API Filtering

Я пытаюсь отфильтровать открытую базу данных ny gov с помощью SODA API. Я следую документам о том, как фильтровать, но он возвращает пустой фрейм данных.

# noinspection PyUnresolvedReferences
import numpy as np
# noinspection PyUnresolvedReferences
import pandas as pd
# noinspection PyUnresolvedReferences
from sodapy import Socrata


clientNYgov = Socrata('data.ny.gov', None)

Здесь я пытаюсь найти результаты только в Нью-Йорке.

databaseM = clientNYgov.get('yg7h-zjbf.csv?business_city=NEW+YORK')

dfDatabaseM = pd.DataFrame.from_records(databaseM)

dfDatabaseM.to_csv('Manhattan Agents.csv')
print(dfDatabaseM)

Но вот пустой вывод:

0                   1   ...              9             10
0  business_address_1  business_address_2  ...  license_number  license_type

[1 rows x 11 columns]

Process finished with exit code 0

Пожалуйста, дайте мне знать, если есть проблема с тем, как я фильтрую, не совсем уверен, что здесь происходит не так. Большое спасибо заранее!

2 ответа

Socrata использует конечную точку json для экспорта файлов через API. Он находится в верхнем правом углу набора данных при выборе API. Для этого решения я использую только запросы на получение данных. Модуль Soda удобен в использовании, но работает так же, как запрос.

import pandas as pd
import requests

data=requests.get('http://data.ny.gov/resource/yg7h-zjbf.json?$limit=50000&business_city=NEW YORK').json()
df=pd.DataFrame.from_records(data)
df

Есть два подхода к этому с помощью фильтров.

Способ 1

Это можно сделать с помощью Socrata()передавая фильтры с помощью SQL в query ключевое слово в get() метод экземпляра Socrataклиент. Вам понадобится токен приложения . Если вы не используете токен, ваши запросы будут регулироваться . Чтобы избежать удушения, зарегистрируйте учетную запись socrata и создайте свой токен приложения.

      query = f"""SELECT * WHERE business_city="NEW YORK" LIMIT 50000"""
client = Socrata("data.ny.gov", <YOUR-APP-TOKEN-HERE>)
results = client.get("yg7h-zjbf", query=query)
df_socrata = pd.DataFrame.from_records(results)

Способ 2

Использование конечной точки JSON (то же, что и ответ @Joseph Gattuso )

      data = requests.get(
    "http://data.ny.gov/resource/yg7h-zjbf.json?$limit=50000&business_city=NEW YORK"
).json()
df = pd.DataFrame.from_records(data)

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

      assert df_socrata.equals(df)
Другие вопросы по тегам