【问题标题】:How to find the top 10 performing values of each week in python?如何在python中找到每周前10名的表现值?
【发布时间】:2019-10-03 22:38:42
【问题描述】:

我想在我的 DataFrame 中返回每周表现最好的 10 个(按平均计算)变量。大约是 2 年的数据

我正在使用 Python 来解决这个问题,但最终也想用 SQL 来解决。

我已经能够生成返回最近一周前 10 名的代码,但希望每周都有结果

  • 创建创建日期时间范围的 df
range_max = rtbinds['pricedate'].max()
range_min = range_max - datetime.timedelta(days=7)

sliced_df = rtbinds[(rtbinds['pricedate'] >= range_min) 
                    & (rtbinds['pricedate'] <= range_max)]
  • 按“影子”分组
sliced_df.groupby(['pricedate','cons_name']).aggregate(np.mean)
         .sort_values('shadow').head(10)
  • 返回第一周的数据。
    pricedate   cons_name       shadow
    2019-04-26  TEMP71_24753    -643.691
    2019-04-27  TMP175_24736    -508.062
    2019-04-25  TMP109_22593    -383.263
    2019-04-23  TEMP48_24759    -376.967
    2019-04-29  TEMP71_24753    -356.476
                TMP175_24736    -327.230
                TMP273_23483    -303.234
    2019-04-27  TEMP71_24753    -294.377
    2019-04-28  TMP175_24736    -272.603
                TMP109_22593    -270.887

但是,我想要一个返回每周前 10 名的列表,直到我的数据的最早日期

【问题讨论】:

  • 请您提供rtbinds 的示例并检查我是否正确编辑了脚本?
  • 您好,抱歉 rtbinds 是带有 cols [priceate, cons_name, shadow] 的数据框的名称
  • 你想要每天或每周的阴影平均值吗?你现在每天都有。
  • 我想要一周内平均排名前 10 位的“cons_name”

标签: python pandas numpy group-by


【解决方案1】:

注意pd.sort_values 默认按升序排序,所以当您使用head(10) 时,如果我们考虑实数的自然排序,它实际上是最差的 10 个。

现在解决您的问题,这里有一个解决方案

首先我们需要创建一些列来标识一年中的第几周(rtbins 被重命名为 df):

df['year'] = df['pricedate'].apply(lambda x: x.year)
df['week'] = df['pricedate'].apply(lambda x: x.isocalendar()[1])

然后我们将数据按['year', 'week', 'cons_name']分组:

df2 = df.groupby(['year', 'week', 'cons_name'], as_index=False).aggregate(np.mean)

您现在应该获得一个数据框,其中对于每个(年、周)您只有一条带有平均阴影的 cons_name 记录。

然后我们将每个(年、周)抽取前 10 名

def udf(df):
    return df.sort_values('shadow').head(10)

df2.groupby(['year', 'week'], as_index=False).apply(udf)

这应该会给你想要的结果。

【讨论】:

  • 感谢伊斯梅尔!这行得通。而较高的负值意味着 i 是一个较高的 preformer
  • Ismail,对此进行了一些更改。我实际上需要新的数据框来获得最近 7 天的前 10 个值。那么,从 2019 年 5 月 17 日开始的过去一周的前 10 名,以及从 2019 年 5 月 16 日开始的过去一周的前 10 名,你可以帮忙吗?
  • 输入日期并返回上周前 10 名的函数是否适合您?如果是,那么我建议您创建一个函数:def top10_from_past_week(df, date): 并在函数内部过滤您的 df,就像您在初始帖子中使用 sliced_df 一样,并返回一个 df 或前 10 个 cons_name 的列表(日期 - 7 天 - -> 日期)。如果您确实需要一个数据框,其中每行都有一个日期和从那一天起过去 7 天的 top10,则可以使用循环和上一个函数手动完成。让我知道你真正需要什么,我会试试看。
  • 嗨,Ismail,我认为您输入日期并返回该周前 10 名的两个函数可以工作,而一个实际创建新数据框的函数也可以工作。我的 Python 有点生锈了,所以我需要额外的轻推!感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多