首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将evalmetrics C3.ai新冠肺炎接口的结果转换为pandas数据帧以便于分析?

如何将evalmetrics C3.ai新冠肺炎接口的结果转换为pandas数据帧以便于分析?
EN

Stack Overflow用户
提问于 2020-04-14 07:58:18
回答 3查看 183关注 0票数 2

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

如何最好地将其转换为python中的pandas dataframe,以便轻松地对此数据执行分析?

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

代码语言:javascript
运行
复制
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_metrics_result转换为pandas数据帧。有没有一个泛型函数可以用来将任何eval_metrics_result转换成pandas数据帧?

EN

回答 3

Stack Overflow用户

发布于 2020-04-14 08:05:54

完成此操作的一种方法如下:

代码语言:javascript
运行
复制
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之前进行排序。

票数 0
EN

Stack Overflow用户

发布于 2020-04-16 14:31:36

这里有另外两种存储/抓取数据帧的方法:

使用evaluate_id、表达式、日期数组、数据数组的

  1. Wide format。

代码语言:javascript
运行
复制
import pandas as pd

# get as a wide df with evaluate_id, expression, dates array, data array
evaluate_ids = list(eval_metrics_result['result'].keys())
expressions  = list(eval_metrics_result['result'][evaluate_ids[0]].keys())
formatted_list = [{'evaluate_id':evaluate_id,
                  'expression':expression, 
                  'dates': pd.to_datetime(eval_metrics_result['result'][evaluate_id][expression]['dates']),
                  'data': eval_metrics_result['result'][evaluate_id][expression]['data']} 
                                          for evaluate_id in evaluate_ids for expression in expressions]
wide_df = pd.DataFrame(formatted_list)

expression

  • Long format -基本上与Suraj的相同,但evaluate_id和expression存储在各自的列中。这有助于df很好地处理groupby。

代码语言:javascript
运行
复制
# convert from wide to long format
wide_df['dates-data'] = wide_df.apply(lambda row: zip(row['dates'], row['data']), axis = 1)
wide_df.drop(columns = ['dates', 'data'])

def wide2long(df, list_col):
    a = pd.DataFrame(df[list_col].tolist()).stack().reset_index(level = 1, drop = True).rename(list_col)
    return df.drop(list_col, axis = 1).join(a).reset_index(drop = True)[df.columns]

long_df              = wide2long(wide_df, 'dates-data')
long_df['date']      = long_df['dates-data'].apply(lambda date_data: date_data[0])
long_df['data']      = long_df['dates-data'].apply(lambda date_data: date_data[1])
long_df.drop(columns = ['dates-data'], inplace = True)
票数 0
EN

Stack Overflow用户

发布于 2020-04-17 08:01:53

您可以在docs here中使用c3covid19。它是一个简单的python的c3 covid19数据湖连接包装器。

安装

代码语言:javascript
运行
复制
pip install c3covid19

代码语言:javascript
运行
复制
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'
)

不过,这只是一次简单的熊猫转换。它在处理字典列表时效果很好,但在更嵌套的结构上却有些困难。您可能应该转换为格式正确的pandas df。

取而代之的是,使用以下代码获取字典:

代码语言:javascript
运行
复制
output_df=cnx.request(
    data_type='outbreaklocation', 
    parameters=request_data, 
    api='evalmetrics',
    output_type='objs'
)

然后按照Suraj或Jac的一个更有针对性的时间序列答案中列出的方向进行操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61198666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档