Calculating formula based on multiple columns in Pandas Dataframe - but without creating many intermediate columns
Become part of the top 3% of the developers by applying to Toptal https://topt.al/25cXVn
--
Music by Eric Matyas
https://www.soundimage.org
Track title: Techno Intrigue Looping
--
Chapters
00:00 Question
01:08 Accepted answer (Score 3)
02:32 Answer 2 (Score 1)
02:46 Thank you
--
Full question
https://stackoverflow.com/questions/5059...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #pandas #numpy
#avk47
--
Music by Eric Matyas
https://www.soundimage.org
Track title: Techno Intrigue Looping
--
Chapters
00:00 Question
01:08 Accepted answer (Score 3)
02:32 Answer 2 (Score 1)
02:46 Thank you
--
Full question
https://stackoverflow.com/questions/5059...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #pandas #numpy
#avk47
ACCEPTED ANSWER
Score 3
Use concat with 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)
Sample:
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
Detail:
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 solution is different, because max of NaN in row is again 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.]]
ANSWER 2
Score 1
It can be done by :
df['TR']=list(map(max,zip((df['high']-df['low']), (df['high'] - df['adjclose'].shift(1)).abs(),(df['low'] - df['adjclose'].shift(1)))))