根据日期取前10%数值的平均值



我有一个由日期列和分数列组成的数据帧。因此,每天都有很多价值观。所以我需要得到每天前10%数值的平均值。简单地说,我需要输出作为一天的列和当天前10%值的平均值。

这是一个示例数据集屏幕截图

`{'Date': 
[
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1)],
'value': [     
3.35,
1.85,
1.3,
1.85,
1.85,
1.17,
1.17,
2.8,
1.43,
2.54,
1.22,
2.54,
1.17,
1.17,
2.71,
5.98,
1.39,
1.48,
16.46,
1.43,
8.39,
33.99,
2.54,
11.8,
2.13,
2.24,
2.92,
1.35,
1.54,
2.52]}`

应该很简单-

*假设您使用的是Pandas,这是一个名为df的Pandas数据帧,列为datevalue

创建一个演示数据帧并导入所需的包,您可能会将表作为数据帧导入

import pandas as pd
import math
import statistics
df = pd.DataFrame({'date': ['2021-04-01','2021-04-01','2021-04-01','2021-04-01','2021-04-01','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02'],
'value': [12,32,12,23,12,14,15,54,43,64,21,15]})
#If you need to save results as a DataFrame later on
res = pd.DataFrame(columns = ['date','top_10p_mean'])
  1. 根据日期筛选

基本上获取不同日期的列表,并对其进行迭代以获得列表中的值

for date in df['date'].unique():
temp = list(df['value'][df['date'] == date])
  1. 按值对过滤集进行排序

按相反顺序对列表进行排序,使最高值位于顶部,或者您可以省略reverse=True部分,使值保持原样

temp.sort(reverse=True)
  1. 取前10%值的平均值

这将计算列表前10%中的项目数(索引四舍五入到下一个整数(,取这些值并计算平均值

初学者功能的进一步解释-

第一个";round_up_to_next_integer(total_number_of_items(in_list(*10%(">

然后"give_me_mean_of(list_items[from_index_0:the_number_I_got_from_the_percentage_calculation](">

avg = statistics.mean(temp[0:math.ceil(len(temp)*0.1)])
  1. 打印或保存在新的DataFrame中

打印结果并将其附加到先前创建的空DataFrame

print('Mean value on ' + str(date) + ' = ' + str(avg))
res = res.append({'date': date, 'top_10p_mean': avg}, ignore_index=True)

所以总的来说,它应该像这样工作——

import pandas as pd
import math
import statistics
df = pd.DataFrame({'date': ['2021-04-01','2021-04-01','2021-04-01','2021-04-01','2021-04-01','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02'],
'value': [12,32,12,23,12,14,15,54,43,64,21,15]})
df
Out[]:
date  value
0   2021-04-01     12
1   2021-04-01     32
2   2021-04-01     12
3   2021-04-01     23
4   2021-04-01     12
5   2021-04-02     14
6   2021-04-02     15
7   2021-04-02     54
8   2021-04-02     43
9   2021-04-02     64
10  2021-04-02     21
11  2021-04-02     15
res = pd.DataFrame(columns = ['date','top_10p_mean'])
for date in df['date'].unique():
temp = list(df['value'][df['date'] == date])
temp.sort(reverse=True)
print(temp)                                            #Just to show what it looks like
avg = statistics.mean(temp[0:math.ceil(len(temp)*0.1)])
print('nMean value on ' + str(date) + ' = ' + str(avg) + 'n')
res = res.append({'date': date, 'top_10p_mean': avg}, ignore_index=True)
Out[]:
[32, 23, 12, 12, 12]
Mean value on 2021-04-01 = 32
[64, 54, 43, 21, 15, 15, 14]
Mean value on 2021-04-02 = 64
res
Out[]: 
date top_10p_mean
0  2021-04-01           32
1  2021-04-02           64

df.nmaximum就是您想要的。首先通过运行(df是您的数据帧(来确定有多少值对应于10%:

highest10p = 0.1*len(df)

然后可以使用在value列中选择10个最大值

df.nlargest(highest10p, 'value')

因此,如果你想要平均值,你可以使用.mean()函数:

df.nlargest(highest10p, 'value').mean()

最新更新