繁体   English   中英

将 API output 从 Python 字典转换为 Dataframe

[英]Converting an API output from a Python Dictionary to a Dataframe

我已经使用以下代码提取了一些关于您在 15 分钟内可以从一组特定坐标行进多远的数据: https://github.com/traveltime-dev/traveltime-python-sdk

 departure_search1 = {
    'id': "public transport from Trafalgar Square",
    'departure_time':  datetime.utcnow().isoformat(),
    'travel_time': 900,
    'coords': {'lat': 51.507609, 'lng': -0.128315},
    'transportation': {'type': "public_transport"}
}

out = ttpy.time_map(departure_searches=[departure_search1])

这会产生一些混乱的 output,我正在尝试将其转换为 dataframe。

{'results': [{'search_id': 'public transport from Trafalgar Square',
   'shapes': [{'shell': [{'lat': 51.51242588613939,
       'lng': -0.1439717545810651},
      {'lat': 51.51152707131364, 'lng': -0.14253203703525447},
      {'lat': 51.507931812010625, 'lng': -0.14253203703525447},
      {'lat': 51.50703299718487, 'lng': -0.1439717545810651},
      {'lat': 51.506134182359126, 'lng': -0.1439717545810651},
      {'lat': 51.505684774946246, 'lng': -0.14325189580815978},
      {'lat': 51.505684774946246, 'lng': -0.14181217826234913},
      {'lat': 51.50523536753337, 'lng': -0.1410923194894438},
      {'lat': 51.50164010823036, 'lng': -0.1410923194894438},
      {'lat': 51.50119070081748, 'lng': -0.14037246071653847},
      {'lat': 51.50119070081748, 'lng': -0.13605330807910654},
      {'lat': 51.499393071165976, 'lng': -0.13317387298748523},
      {'lat': 51.499393071165976, 'lng': -0.13029443789586392},
      {'lat': 51.4989436637531, 'lng': -0.1295745791229586},
      {'lat': 51.4971460341016, 'lng': -0.1295745791229586},
      {'lat': 51.496247219275844, 'lng': -0.12813486157714796},
      {'lat': 51.49534840445009, 'lng': -0.12813486157714796},
      {'lat': 51.49400018221146, 'lng': -0.12597528525843196},
      {'lat': 51.49444958962434, 'lng': -0.1250754617923003},
      {'lat': 51.49478664518399, 'lng': -0.12453556771262132},
      {'lat': 51.49534840445009, 'lng': -0.123815708939716},
      {'lat': 51.496247219275844, 'lng': -0.12363574424648965},
      {'lat': 51.50523536753337, 'lng': -0.12219602670067901},
      {'lat': 51.51006649722179, 'lng': -0.11589726243775741},
      {'lat': 51.510628256487884, 'lng': -0.11499743897162576},
      {'lat': 51.51242588613939, 'lng': -0.11517740366485209},
      {'lat': 51.51377410837802, 'lng': -0.11733697998356807},
      {'lat': 51.51377410837802, 'lng': -0.12021641507518938},
      {'lat': 51.51557173802953, 'lng': -0.12309585016681067},
      {'lat': 51.51557173802953, 'lng': -0.12453556771262132},
      {'lat': 51.5160211454424, 'lng': -0.12525542648552665},
      {'lat': 51.516919960268154, 'lng': -0.12525542648552665},
      {'lat': 51.517369367681034, 'lng': -0.12597528525843196},
      {'lat': 51.517369367681034, 'lng': -0.12741500280424262},
      {'lat': 51.51826818250679, 'lng': -0.12885472035005327},
      {'lat': 51.51826818250679, 'lng': -0.13029443789586392},
      {'lat': 51.51916699733254, 'lng': -0.13173415544167458},
      {'lat': 51.51871758991966, 'lng': -0.1324540142145799},
      {'lat': 51.516919960268154, 'lng': -0.1324540142145799},
      {'lat': 51.51647055285528, 'lng': -0.13317387298748523},
      {'lat': 51.51647055285528, 'lng': -0.13461359053329588},
      {'lat': 51.514672923203776, 'lng': -0.13749302562491716},
      {'lat': 51.514672923203776, 'lng': -0.14037246071653847},
      {'lat': 51.51557173802953, 'lng': -0.14181217826234913},
      {'lat': 51.51557173802953, 'lng': -0.14325189580815978},
      {'lat': 51.51512233061665, 'lng': -0.1439717545810651},
      {'lat': 51.514223515790896, 'lng': -0.1439717545810651},
      {'lat': 51.51332470096514, 'lng': -0.14253203703525447},
      {'lat': 51.51242588613939, 'lng': -0.1439717545810651}],
     'holes': []},
    {'shell': [{'lat': 51.50433655270762, 'lng': -0.11967652099551038},
      {'lat': 51.50074129340461, 'lng': -0.11967652099551038},
      {'lat': 51.50029188599173, 'lng': -0.11877669752937872},
      {'lat': 51.499393071165976, 'lng': -0.11445754489194676},
      {'lat': 51.499842478578856, 'lng': -0.11373768611904143},
      {'lat': 51.502538923056115, 'lng': -0.11805683875647338},
      {'lat': 51.50388714529474, 'lng': -0.11589726243775741},
      {'lat': 51.50388714529474, 'lng': -0.11445754489194676},
      {'lat': 51.50433655270762, 'lng': -0.11373768611904143},
      {'lat': 51.50703299718487, 'lng': -0.11373768611904143},
      {'lat': 51.50748240459775, 'lng': -0.11445754489194676},
      {'lat': 51.50759475645097, 'lng': -0.11589726243775741},
      {'lat': 51.506134182359126, 'lng': -0.11823680344969972},
      {'lat': 51.50433655270762, 'lng': -0.11967652099551038}],
     'holes': []}],
   'properties': {}}]}

我希望它看起来像这样:

在此处输入图像描述

我以前在这里回答过类似的问题: Converting API output from a dictionary to a dataframe (Python) ,但我不能完全适应这个 output。

我试过的代码如下:

df_list = []
for res in out['results']:
    search_id = res['search_id']
    for loc in res['shapes']:
        temp_df = {}
        temp_df['search_id'] = res['search_id']
        temp_df['lat'] = loc["shell"][0]    
        temp_df['lng'] = loc["shell"][1]  
        
        df_list.append(temp_df)
df = pd.DataFrame(df_list)

但是它没有为纬度和经度生成单独的列,而是将第一组完整的坐标放入“lat”列,将第二组完整的坐标放入“lng”列,如下所示:

在此处输入图像描述

总体目标是将这些坐标集保存为如上所述的 dataframe,以便我可以将其带入 Tableau 和 plot 您可以在从特拉法加广场 15 分钟内到达的区域

所以我认为这与我的索引有关? 但我无法解决。 将不胜感激任何建议:)

谢谢

免责声明:我是 TravelTime 的开发者

shell 由许多点组成,要获得单个点的坐标,您必须将 go 更深一层:

    temp_df['lat'] = loc["shell"][0]['lat']
    temp_df['lng'] = loc["shell"][0]['lng']

要将所有点放入 dataframe,您必须遍历 shell 的所有元素。

但是,我不确定这是获得所需内容的最佳方式。

我看到 Tableau 能够导入 GeoJSON 文件。 如果将Accept header 设置为application/geo+json ,TravelTime API 可以返回 GeoJSON。

目前,在 Python 中取回 GeoJSON 的最简单方法是构造并发送 POST 请求。 这是您可以做到的一种方法:

from datetime import datetime

import requests
import json

url = "https://api.traveltimeapp.com/v4/time-map"

payload = json.dumps({
    "departure_searches": [
        {
            "id": "public transport from Trafalgar Square",
            "coords": {"lat": 51.507609, "lng": -0.128315},
            "transportation": {"type": "public_transport"},
            "departure_time": datetime.utcnow().isoformat(),
            "travel_time": 900
        }
    ]
})

headers = {
    'Host': 'api.traveltimeapp.com',
    'Content-Type': 'application/json',
    'Accept': 'application/geo+json',
    'X-Application-Id': '<YOUR_APP_ID>',
    'X-Api-Key': '<YOUR_API_KEY>'
}

response = requests.request("POST", url, headers=headers, data=payload)

with open("shape.geojson", "w") as text_file:
    text_file.write(response.text)

然后,您可以将shape.geojson文件直接导入 Tableau。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM