Karl Cheng
Karl Cheng

Reputation: 409

How to calculate daily 52-weeks high/low in pandas?

I have a simple dataframe with typical OHLC values. I want to calculate daily 52 weeks high/low (or other time range) from it and put the result into a dataframe, so that I can track the daily movement of all record high/low.

For example, if the time range is just 3-day, the 3-day high/low would be: (3-Day High: Maximum 'High' value in the last 3 days)

Out[21]: 
             Open   High    Low  Close    Volume  3-Day-High 3-Day-Low 
Date                                                       
2015-07-01  273.6  273.6  273.6  273.6         0       273.6     273.6
2015-07-02  276.0  276.0  267.0  268.6  15808300       276.0     267.0
2015-07-03  268.8  269.0  256.6  259.8  20255200       276.0     256.6
2015-07-06  261.0  261.8  223.0  235.0  53285100       276.0     223.0
2015-07-07  237.2  237.8  218.4  222.0  38001700       269.0     218.4
2015-07-08  207.0  219.4  196.0  203.4  48558100       261.8     196.0
2015-07-09  207.4  233.8  204.2  233.6  37835900       237.8     196.0
2015-07-10  235.4  244.8  233.8  239.2  23299900       244.8     196.0

Is there any simple way to do it and how? Thanks guys!

Upvotes: 3

Views: 4756

Answers (4)

user898678
user898678

Reputation: 3328

last_working_days = 252
Year_min = df[:-last_working_days].Low.min()
Year_max = df[:-last_working_days].High.max()

Upvotes: 0

Bora Savkar
Bora Savkar

Reputation: 75

You can try this:

three_days=df.index[-3:]
maxHigh=max(df['High'][three_days])
minLow=min(df['Low'][three_days])

Upvotes: 0

Srini Kancharla
Srini Kancharla

Reputation: 120

The above method has been replaced in the latest versions of the python Use this instead: Series.rolling(min_periods=1, window=252, center=False).max()

Upvotes: 4

DSM
DSM

Reputation: 353059

You can use rolling_max and rolling_min:

>>> df["3-Day-High"] = pd.rolling_max(df.High, window=3, min_periods=1)
>>> df["3-Day-Low"] = pd.rolling_min(df.Low, window=3, min_periods=1)
>>> df
             Open   High    Low  Close    Volume  3-Day-High  3-Day-Low
Date                                                                   
2015-07-01  273.6  273.6  273.6  273.6         0       273.6      273.6
2015-07-02  276.0  276.0  267.0  268.6  15808300       276.0      267.0
2015-07-03  268.8  269.0  256.6  259.8  20255200       276.0      256.6
2015-07-06  261.0  261.8  223.0  235.0  53285100       276.0      223.0
2015-07-07  237.2  237.8  218.4  222.0  38001700       269.0      218.4
2015-07-08  207.0  219.4  196.0  203.4  48558100       261.8      196.0
2015-07-09  207.4  233.8  204.2  233.6  37835900       237.8      196.0
2015-07-10  235.4  244.8  233.8  239.2  23299900       244.8      196.0

Note that in agreement with your example, this uses the last three recorded days, regardless of the size of any gap between those rows (such as between 07-03 and 07-06).

Upvotes: 5

Related Questions