簡體   English   中英

Python API 調用:JSON 至 Z251D2BBFE9A3B95E5691CEBAZ30DC6784

[英]Python API Call: JSON to Pandas DF

我正在從公共 API 中提取數據,並將響應 JSON 文件轉換為 Pandas ZC699575A5E8AFD11FBZBA2。 我已經編寫了提取數據的代碼並獲得了成功的 JSON 響應。 我遇到的問題是解析文件並將數據轉換為 dataframe。 每當我運行我的 for 循環時,我都會得到一個 dataframe ,當它應該返回大約 2500 行和 6 列時,它會返回 1 行。 我在下面復制並粘貼了我的代碼:

注意事項:我已經用“api_key”注釋掉了我的 api 密鑰。 我是 python 的新手,所以我知道我的代碼格式可能不是最佳實踐。 我願意接受改變。 這是我要求的 API 的鏈接: https://developer.va.gov/explore/facilities/docs/facilities?version=current

facilities_data = pd.DataFrame(columns=['geometry_type', 'geometry_coordinates', 'id', 'facility_name', 'facility_type','facility_classification'])


# function that will make the api call and sort through the json data
def get_facilities_data(facilities_data):
    # Make API Call
    res = requests.get('https://sandboxapi.va.gov/services/va_facilities/v0/facilities/all',headers={'apikey': 'api_key'})
    data = json.loads(res.content.decode('utf-8'))
    time.sleep(1)

    for facility in data['features']:
        geometry_type = data['features'][0]['geometry']['type']
        geometry_coordinates = data['features'][0]['geometry']['coordinates']
        facility_id = data['features'][0]['properties']['id']
        facility_name = data['features'][0]['properties']['name']
        facility_type = data['features'][0]['properties']['facility_type']
        facility_classification = data['features'][0]['properties']['classification']

    # Save data into pandas dataframe
    facilities_data = facilities_data.append(
        {'geometry_type': geometry_type, 'geometry_coordinates': geometry_coordinates,
         'facility_id': facility_id, 'facility_name': facility_name, 'facility_type': facility_type,
         'facility_classification': facility_classification}, ignore_index=True)
    return facilities_data


facilities_data = get_facilities_data(facilities_data)
print(facilities_data)```


如前所述,您應該

  1. 循環facility而不是data['features'][0]
  2. append內循環

這將為您提供您想要的結果。

    facilities_data = pd.DataFrame(columns=['geometry_type', 'geometry_coordinates', 'id', 'facility_name', 'facility_type','facility_classification'])

    def get_facilities_data(facilities_data):
        # Make API Call
        res = requests.get("https://sandbox-api.va.gov/services/va_facilities/v0/facilities/all",
                     headers={"apikey": "1rbY6VeHjmGnAXSGA7M7Ek2cUBiuNA3a"})
        data = json.loads(res.content.decode('utf-8'))
        time.sleep(1)

        for facility in data['features']:
            geometry_type = facility['geometry']['type']
            geometry_coordinates = facility['geometry']['coordinates']
            facility_id = facility['properties']['id']
            facility_name = facility['properties']['name']
            facility_type = facility['properties']['facility_type']
            facility_classification = facility['properties']['classification']

            # Save data into pandas dataframe
            facilities_data = facilities_data.append(
            {'geometry_type': geometry_type, 'geometry_coordinates': geometry_coordinates,
             'facility_id': facility_id, 'facility_name': facility_name, 'facility_type': facility_type,
             'facility_classification': facility_classification}, ignore_index=True)
        return facilities_data


    facilities_data = get_facilities_data(facilities_data)
    print(facilities_data.head())

還有一些我們可以改進的地方;

  • json()可以直接在請求上調用 output
  • 不需要time.sleep()
  • 不鼓勵在每次迭代時附加到DataFrame 我們可以用另一種方式收集數據,然后創建DataFrame

實施這些改進會導致;

def get_facilities_data():
    data = requests.get("https://sandbox-api.va.gov/services/va_facilities/v0/facilities/all",
                     headers={"apikey": "REDACTED"}).json()

    facilities_data = []
    for facility in data["features"]:
        facility_data = (facility["geometry"]["type"],
                         facility["geometry"]["coordinates"],
                         facility["properties"]["id"],
                         facility["properties"]["name"],
                         facility["properties"]["facility_type"],
                         facility["properties"]["classification"])
        facilities_data.append(facility_data)

    facilities_df = pd.DataFrame(data=facilities_data,
                                 columns=["geometry_type", "geometry_coords", "id", "name", "type", "classification"])
    return facilities_df

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM