我想返回 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 名,直到我的数据的最早日期
最佳答案
注意 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)
这应该会给你你想要的结果。
关于python - 如何在Python中找到每周表现最好的10个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56172140/