如何在python中找到每周排名前十的表现值?

时间:2019-05-16 15:37:16

标签: python pandas numpy group-by

我想在我的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

但是,我想要一个列表,该列表返回直到我的数据最早出现为止的每周前十名

1 个答案:

答案 0 :(得分:0)

抬头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)

这应该给您想要的结果。