我想在我的DataFrame中返回每周平均表现最好的10个变量。大约需要2年的数据
我正在使用Python来解决这个问题,但最终还是希望在SQL中做到这一点。
我已经能够生成返回最近一周前10名的代码,但希望获得每周的结果
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
但是,我想要一个列表,该列表返回直到我的数据最早出现为止的每周前十名
答案 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)
这应该给您想要的结果。