Расчет формулы на основе нескольких столбцов в Pandas Dataframe, но без создания нескольких промежуточных столбцов - PullRequest
0 голосов
/ 29 мая 2018

Я пытался вычислить формулу «Истинного диапазона» на основе информационного кадра Pandas, содержащего историю цен тикера акций.

Это формула:

TR = max [(high - low ), abs(high − close prev), abs ⁡(low − close prev)] 

У меня есть максимум,низкий и закрытый как столбцы в кадре данных.

Когда я пытаюсь действовать подобным образом, я получаю ошибку неверного идентификатора символа, которая не очень помогает.Я перепробовал много изменений и комбинаций в следующем выражении, но безуспешно.

df['TR']=((df['high']-df['low']), (df['high'] - df['adjclose'].shift(1)).abs(),(df['low'] - df['adjclose'].shift(1))).max(axis=1)

Я знаю, что этого можно достичь с помощью трех отдельных промежуточных столбцов и взятия их максимум.Но я хочу избежать того же и сделать это напрямую.

Есть ли выход?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Это может быть сделано:

df['TR']=list(map(max,zip((df['high']-df['low']), (df['high'] - df['adjclose'].shift(1)).abs(),(df['low'] - df['adjclose'].shift(1)))))
0 голосов
/ 29 мая 2018

Использование concat с max:

df['TR'] = pd.concat([(df['high'] - df['low']), 
                      (df['high'] - df['adjclose'].shift(1)).abs(),
                      (df['low']  - df['adjclose'].shift(1))], axis=1).max(axis=1)

Образец :

df = pd.DataFrame({'high':[4,5,4,5,5,4],
                   'low':[7,8,9,4,2,3],
                   'adjclose':[1,3,5,7,1,0]})

print (df)
   adjclose  high  low
0         1     4    7
1         3     5    8
2         5     4    9
3         7     5    4
4         1     5    2
5         0     4    3

df['TR'] = pd.concat([(df['high']-df['low']), 
                      (df['high'] - df['adjclose'].shift(1)).abs(),
                      (df['low'] - df['adjclose'].shift(1))], axis=1).max(axis=1)

print (df)
  adjclose  high  low   TR
0         1     4    7 -3.0
1         3     5    8  7.0
2         5     4    9  6.0
3         7     5    4  1.0
4         1     5    2  3.0
5         0     4    3  3.0

Деталь :

print (pd.concat([(df['high']-df['low']), 
                      (df['high'] - df['adjclose'].shift(1)).abs(),
                      (df['low'] - df['adjclose'].shift(1))], axis=1))
   0    1    2
0 -3  NaN  NaN
1 -3  4.0  7.0
2 -5  1.0  6.0
3  1  0.0 -1.0
4  3  2.0 -5.0
5  1  3.0  2.0

Numpy решение отличается, потому что максимум NaN в строке снова NaN:

df['TR1'] = np.max(np.c_[(df['high']-df['low']), 
                        (df['high'] - df['adjclose'].shift(1)).abs(),
                        (df['low'] - df['adjclose'].shift(1))], axis=1)

print (df)
   adjclose  high  low  TR1
0         1     4    7  NaN
1         3     5    8  7.0
2         5     4    9  6.0
3         7     5    4  1.0
4         1     5    2  3.0
5         0     4    3  3.0

print (np.c_[(df['high']-df['low']), 
                        (df['high'] - df['adjclose'].shift(1)).abs(),
                        (df['low'] - df['adjclose'].shift(1))])

[[-3. nan nan]
 [-3.  4.  7.]
 [-5.  1.  6.]
 [ 1.  0. -1.]
 [ 3.  2. -5.]
 [ 1.  3.  2.]] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...