【问题标题】:Extracting time series for best performing agents in a pandas DataFrame为 pandas DataFrame 中的最佳代理提取时间序列
【发布时间】:2015-05-11 20:58:02
【问题描述】:

如果这个问题是基本的,我深表歉意,但我已经浏览了文档,但我无法弄清楚处理这个问题的简单规范方法是什么,尽管这可能是因为我对 pandas 很陌生。

我有一个 DataFrame df 代表一系列系统的scores 的时间序列数据(其中时间由steps 测量),由超参数paramAparamB 参数化。

数据的合成样本如下:

| paramA | paramB | score | step |
----------------------------------
|   A    |    c   |   .8  |  10  |
|   B    |    e   |   .2  |  10  |
|   A    |    f   |   .1  |  40  |
|   C    |    c   |   .9  |  10  |
|   B    |    e   |   .3  |  20  |
|   B    |    c   |   .3  |  10  |
|   A    |    c   |   .7  |  20  |
|   C    |    f   |   .4  |  60  |
|  ...   |   ...  |  ...  |  ... |

我想做以下事情:

1。查找得分最高的模型

对于每个模型(即数据集中每对可能的超参数),找到得分最高的行。我目前正在这样做:

df.groupby([df.paramA, df.paramB]).score.max()

2。提取得分最高者的时间序列

我现在想要获取我在上一步中获得最大值的顶级 k 模型的时间序列。

显然我可以在上一步中手动查找得分最高的模型,使用k 单独的查询获取k 数据帧,但这感觉很慢而且不优雅。我假设有一种更聪明的方法可以做到这一点。

再次,如果这很简单,我们深表歉意,但任何以聪明的方式解决这个问题的帮助,而不是我目前想到的蛮力方式,将不胜感激。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    回答问题一,首先创建一组唯一的模型,使用每个模型的参数集初始化一个空字典,然后用最高分的索引填充字典:

    pairs = pd.Series(zip(df.paramA, df.paramB)).unique()
    models = {(A, B): None for A, B in pairs}
    for A, B in pairs:
        models[(A, B)] = df.loc[((df.paramA == A) & (df.paramB == B)), 'score'].idxmax()
    
    >>> models
    {('A', 'c'): 0,
     ('A', 'f'): 2,
     ('B', 'c'): 5,
     ('B', 'e'): 4,
     ('C', 'c'): 3,
     ('C', 'f'): 7}
    

    要获得得分最高的k 模型:

    k = 5  # Top number of models to return
    m = [(v, k_) for k_, v in models.iteritems()]
    m.sort(reverse=True)
    top_models = [model[1] for model in m[:k]]
    >>> top_models
    [('C', 'f'), ('B', 'c'), ('B', 'e'), ('C', 'c'), ('A', 'f')]
    

    【讨论】:

    • 感谢您的帮助和评论。我已经删除了绘图问题,但问题的其他两个部分是相互关联的,因此单独处理它们可能不起作用。
    猜你喜欢
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2020-04-26
    • 2015-05-13
    • 2014-07-01
    • 2021-07-31
    相关资源
    最近更新 更多