Удаление самых высоких и самых низких значений в строке данных pandas - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть датафрейм, содержащий почасовую прибыль для корзины из 100 акций.Одна вещь, которую я рассчитываю в настоящее время, - это средняя доходность на акцию за каждый час, а затем скользящая скользящая средняя этой цифрыПоэтому я суммирую каждую строку и делю на 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. Однако, учитывая, что я делаю эти вычисления для строк, я не знаю, могу ли я использовать тот же принцип.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Первые значения сортировки по строкам по numpy.sort, выберите все столбцы без первого и последнего 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]
0 голосов
/ 10 февраля 2019

Один из способов решить эту проблему - использовать функцию argmax из Numpy и итеративно заменить 5 лучших максимальных значений подряд на np.NaN.В следующем коде я сгенерировал случай, похожий на ваш:

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
...