将 API 输出从 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])
这会产生一些混乱的输出,我正在尝试将其转换为数据帧。
{'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': {}}]}
我希望它看起来像这样:
我以前在这里回答过类似的问题:
,但我不能完全适应这个输出。
我试过的代码如下:
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”列如下所示:
总体目标是将这些坐标集保存为如上所述的数据框,以便我可以将其带入 Tableau 并绘制您可以在 15 分钟内从特拉法加广场旅行的区域
所以我认为这与我的索引有关?但我无法解决。将不胜感激任何建议:)
谢谢
免责声明:我是 TravelTime 的开发人员
一个shell由许多点组成,要获得单个点的坐标,您必须更深入一层:
temp_df['lat'] = loc["shell"][0]['lat']
temp_df['lng'] = loc["shell"][0]['lng']
要将所有点放入数据框中,您必须遍历 shell.
的所有元素
但是,我不确定这是获得所需内容的最佳方式。
我看到 Tableau 可以导入 GeoJSON 文件。如果将 Accept
header 设置为 application/geo+json
,TravelTime API 可以 return 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。
我已经使用以下代码提取了一些关于您在 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])
这会产生一些混乱的输出,我正在尝试将其转换为数据帧。
{'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': {}}]}
我希望它看起来像这样:
我以前在这里回答过类似的问题:
我试过的代码如下:
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”列如下所示:
总体目标是将这些坐标集保存为如上所述的数据框,以便我可以将其带入 Tableau 并绘制您可以在 15 分钟内从特拉法加广场旅行的区域
所以我认为这与我的索引有关?但我无法解决。将不胜感激任何建议:)
谢谢
免责声明:我是 TravelTime 的开发人员
一个shell由许多点组成,要获得单个点的坐标,您必须更深入一层:
temp_df['lat'] = loc["shell"][0]['lat']
temp_df['lng'] = loc["shell"][0]['lng']
要将所有点放入数据框中,您必须遍历 shell.
的所有元素但是,我不确定这是获得所需内容的最佳方式。
我看到 Tableau 可以导入 GeoJSON 文件。如果将 Accept
header 设置为 application/geo+json
,TravelTime API 可以 return 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。