Python 如何将evalmetrics C3.ai新冠病毒-19 API的结果转换为熊猫数据框以便于分析?

Python 如何将evalmetrics C3.ai新冠病毒-19 API的结果转换为熊猫数据框以便于分析?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在使用C3.ai的API分析统一的新冠病毒-19数据。为了生成跨新冠病毒爆发地点的确诊病例和死亡的时间序列,我成功地调用了evalMetricsAPI,但收到的响应是JSON 如何最好地将其转换为python中的pandas数据帧,以便能够轻松地对这些数据执行分析 下面是我用来成功调用evalMetricsAPI的代码: import json, requests locations_to_evaluate = ["China","Italy"] expressions_to_evaluat

我正在使用C3.ai的API分析统一的新冠病毒-19数据。为了生成跨新冠病毒爆发地点的确诊病例和死亡的时间序列,我成功地调用了
evalMetrics
API,但收到的响应是
JSON

如何最好地将其转换为python中的pandas数据帧,以便能够轻松地对这些数据执行分析

下面是我用来成功调用
evalMetrics
API的代码:

import json, requests
locations_to_evaluate = ["China","Italy"]
expressions_to_evaluate = ["JHU_ConfirmedCases","JHU_ConfirmedDeaths"]
url = "https://api.c3.ai/covid/api/1/outbreaklocation/evalmetrics/"
request_data = {
    "spec": {
        "ids": locations_to_evaluate,
        "expressions": expressions_to_evaluate,
        "start": "2020-02-01",
        "end": "2020-03-01",
        "interval": "DAY"
    }
}
headers = {
    "Accept": "application/json",
    "Content-Type": "application/json"
}
response = requests.post(url=url, json=request_data, headers=headers)
eval_metrics_result = json.loads(response.text)

我想将
eval\u metrics\u result
转换为数据帧。是否有一个通用函数可用于将任何
eval\u metrics\u result
转换为熊猫数据帧?

一种方法如下:

import pandas as pd
def convert_evalMetrics_to_Pandas(eval_metrics_result):
    evaluate_ids = list(eval_metrics_result["result"].keys())
    evaluate_metrics = list(eval_metrics_result["result"][evaluate_ids[0]].keys())
    timestamps = eval_metrics_result["result"][evaluate_ids[0]][evaluate_metrics[0]]["dates"]
    df = pd.DataFrame(
        columns = ["Evaluate_ID"]+evaluate_metrics,
        index = ["{}#{}".format(evaluate_id,timestamp) for evaluate_id in evaluate_ids for timestamp in timestamps]
    )
    df["Evaluate_ID"] = df.index.str.split("#").str[0]
    for evaluate_id in evaluate_ids:
        for evaluate_metric in evaluate_metrics:
            df[evaluate_metric].loc[df["Evaluate_ID"]==evaluate_id] = eval_metrics_result["result"][evaluate_id][evaluate_metric]["data"]
    df.drop("Evaluate_ID", axis=1, inplace=True)
    return df
注意,在这种情况下,数据帧的索引将采用以下格式:
id\timestamp

对于相同的时间戳,一个
id
的时间戳将在数据帧索引移动到下一个
id
之前进行排序。

以下是存储/获取数据帧的两种其他方法:

  • 宽格式,带求值id、表达式、日期数组、数据数组
  • 长格式-基本上与Suraj相同,但相反,evaluate_id和expression存储在各自的列中。这有助于df很好地与groupby配合 你可以用。它是python的一个简单的c3 covid19数据湖连接包装器

    安装

    pip install c3covid19
    

    不过,这是一个简单的熊猫转换。它可以很好地处理字典列表,但难以处理更嵌套的结构。您可能应该转换为格式正确的文件

    相反,请使用以下方法获取词典:

    output_df=cnx.request(
        data_type='outbreaklocation', 
        parameters=request_data, 
        api='evalmetrics',
        output_type='objs'
    )
    
    然后按照Suraj或Jac在其中一个更有针对性的时间序列答案中列出的说明进行操作

    pip install c3covid19
    
    from c3covid19 import c3api
    
    cnx=c3api()
    
    locations_to_evaluate = ["China","Italy"]
    expressions_to_evaluate = ["JHU_ConfirmedCases","JHU_ConfirmedDeaths"]
    request_data = {
        "spec": {
            "ids": locations_to_evaluate,
            "expressions": expressions_to_evaluate,
            "start": "2020-02-01",
            "end": "2020-03-01",
            "interval": "DAY"
        }
    }
    
    output_df=cnx.request(
        data_type='outbreaklocation', 
        parameters=request_data, 
        api='evalmetrics', 
        output_type='pd'
    )
    
    output_df=cnx.request(
        data_type='outbreaklocation', 
        parameters=request_data, 
        api='evalmetrics',
        output_type='objs'
    )