我有一个数据框,其中包含一篮子100只股票的每小时收益。我目前计算的一件事是每小时每只股票的平均回报,然后采用该数字的滚动MA。因此,在进行滚动平均之前,我将每一行相加并除以100。可以说df例如:
Time Stock 1 Stock 2 Stock 3 Stock 4 ... Stock 100
09:00 0.25 0.14 0.07 0.31 0.12
10:00 0.05 0.01 -0.03 0.18 0.09
11:00 -0.11 -0.17 0.01 -0.04 -0.13
12:00 -0.22 -0.31 -0.19 -0.34 -0.16
13:00 0.02 0.05 0.09 0.11 0.08
所以我要计算每一行的平均值将是:
df['Average'] = (df.sum(axis=1)/100)
所以我没有问题,但是现在我要尝试的事情是,将每行的5个最高和最低表现股票丢弃,然后对该行求和,然后除以90。
如果它只是一列,我只是对其进行排序,然后切成薄片,以除去顶部和底部的5。但是,鉴于我正在对行进行这些计算,因此我不知道是否可以使用相同的原理。
任何帮助将不胜感激。
答案 0 :(得分:2)
首先按numpy.sort
对每行的值进行排序,选择所有不包括前5名和后5 mean
行的所有列:
np.random.seed(2019)
df = pd.DataFrame(np.random.randint(10, size=(5, 12)))
print (df)
0 1 2 3 4 5 6 7 8 9 10 11
0 8 2 5 8 6 8 0 0 7 8 5 3
1 0 2 5 7 8 5 4 0 1 6 0 2
2 6 6 3 1 3 5 0 2 6 1 8 2
3 9 8 3 7 7 7 0 3 4 8 1 0
4 6 1 8 2 3 0 9 2 9 8 5 5
print (np.sort(df.values, axis=1))
[[0 0 2 3 5 5 6 7 8 8 8 8]
[0 0 0 1 2 2 4 5 5 6 7 8]
[0 1 1 2 2 3 3 5 6 6 6 8]
[0 0 1 3 3 4 7 7 7 8 8 9]
[0 1 2 2 3 5 5 6 8 8 9 9]]
print (np.sort(df.values, axis=1)[:, 5:-5])
[[5 6]
[2 4]
[3 3]
[4 7]
[5 5]]
df['average'] = np.mean(np.sort(df.values, axis=1)[:, 5:-5], axis=1)
print (df)
0 1 2 3 4 5 ... 7 8 9 10 11 average
0 8 2 5 8 6 8 ... 0 7 8 5 3 5.5
1 0 2 5 7 8 5 ... 0 1 6 0 2 3.0
2 6 6 3 1 3 5 ... 2 6 1 8 2 3.0
3 9 8 3 7 7 7 ... 3 4 8 1 0 5.5
4 6 1 8 2 3 0 ... 2 9 8 5 5 5.0
[5 rows x 13 columns]
答案 1 :(得分:1)
解决此问题的一种方法是使用argmax
中的Numpy
函数,并用np.NaN
迭代替换前5个最大值。在以下代码中,我生成了一个与您相似的案例:
import numpy as np
stock = {}
for i in range(100):
stock['Stock_' + str(i)] = np.random.rand(10)
df = pd.DataFrame.from_dict(stock)
for row in df.values:
for i in range(5):
row[np.argmax(row)] = np.NaN