1

This is going be my first question here a stack overflow. I've searched through the forum and found one question which is the exact issue that i am unable to find a solution to. There has been no answer to it though. I've reproduced it here. Any help would be appreciated.

What is pandas syntax for lookup based on existing columns + row values?

Here is a summary of what's already been done

  1. Create a pandas df1 with two columns: 'Date' and 'Price' - done

  2. I add two new columns: 'rollmax' and 'rollmin', where the 'rollmax' is an 8 days rolling maximum and 'rollmin' is a rolling minimum. - done

  3. Now I need to create another column 'rollmax_date' that would get populated through a look up rule:

For the row n, go to the column 'Price' and parse through the values for the last 8 days and find the maximum, then get the corresponding Date and put this value in the column 'rollingmax_date'.

The same logic for the 'rollingmin_date', but instead of rolling maximum date, we look for the rolling minimum date.

I did the first two and tried the third one, but I'm getting wrong results.

The code below gives me only dates where on the same row df["Price"] is the same as df['rollmax'], but it doesn't bring all the corresponding dates from 'Date' to 'rollmax_date'

df['rollmax_date'] = df.loc[(df["High"] == df.rollmax), 'Date']

The image as in the Q is below:

Image

EDIT:

Here are additional inputs as requested.

For some reason I am unable to paste a copy of the data frame here. It is a typical data frame of a stock. I have columns as 'Date', 'Open', 'High', 'Close'. The Rollmax and Rollmin have been calculated as above. Now, I need to fill the date of Rollmax and Rollmin in the columns 'Rollmax_date' and 'Rollmin_date'

Here's the DataFrame added. This is formatted poorly. Unable to paste this as a table

As seen here, the first rollmax is 11872, which occurs on 04th Jan 2011. I am trying to achieve getting this value into the column 'Rollmax_date'

df = quandl.get(stock,start_date = start, end_date = end)
df['Date']=df.index
df['rollmax'] = df['High'].rolling(period_up).max().shift(-period_up)
df['rollmin'] = df['Low'].rolling(period_down).min().shift(-period_down)

where period_up & period_down = -8 (the '-' is to lookup data in the future to the current date of the particular row)

                Open      High       Low     Close  Shares Traded  \
Date                                                                
2011-01-03  11882.10  11912.15  11826.95  11855.75      8895927.0   
2011-01-04  11868.40  11872.80  11545.55  11564.05     16041214.0   
2011-01-05  11545.75  11545.75  11265.55  11305.45     19689201.0   
2011-01-06  11350.70  11377.10  11164.75  11186.80     19559984.0   
2011-01-07  11146.45  11258.50  11007.90  11053.35     25192954.0   
2011-01-10  11024.50  11072.70  10671.60  10700.65     21584988.0   
2011-01-11  10734.20  10951.20  10620.80  10833.55     22297958.0   
2011-01-12  10906.40  11161.15  10728.45  11128.15     24855243.0   
2011-01-13  11125.95  11127.95  10676.50  10716.65     18520804.0   
2011-01-14  10746.80  10907.30  10387.90  10432.90     19299172.0   

            Turnover (Rs. Cr)  Date   rollmax   rollmin  
Date                                                         
2011-01-03          909.29  2011-01-03   11872.80     10373.8  
2011-01-04          1949.98  2011-01-04   11545.75     10373.8  
2011-01-05          1988.86  2011-01-05   11377.10     10373.8  
2011-01-06          2114.13  2011-01-06   11258.50     10373.8  
2011-01-07          2746.05  2011-01-07   11161.15     10373.8  
2011-01-10          2389.16  2011-01-10   11177.85     10373.8  
2011-01-11          2407.41  2011-01-11   11256.95     10373.8  
2011-01-12          2703.24  2011-01-12   11256.95     10373.8  
2011-01-13          1939.18  2011-01-13   11256.95     10373.8  
2011-01-14          2054.64  2011-01-14   11256.95     10373.8  
cs95
  • 330,695
  • 80
  • 606
  • 657
  • 2
    It would be helpful if you could post the original Date/Price columns (or at least the first 10-20 rows), along with the code you tried to get it to this state. It would seem like you could use `df.lookup`, but I'll reserve any more comments until we can see your data. – cs95 Oct 22 '17 at 11:27
  • Done, added inputs. Unable to paste the dataframe though. – Sashank Chittipeddi Oct 22 '17 at 11:49
  • 1
    The data is paramount to understanding and helping debug... – cs95 Oct 22 '17 at 11:51
  • @SashankChittipeddi pasting output of `print(df.head(10))` in the question – Bharath Oct 22 '17 at 11:53
  • I would strongly invite you to read through [How to make good reproducible pandas examples](https://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples). – ImportanceOfBeingErnest Oct 22 '17 at 11:58
  • @Bharathshetty I did do that, only marginally better. Is there a better way of doing this? Also went through the guide on reproducible examples and that didn't help much. I pasted that data frame though. Also added all code used to arrive at this point. Hope that helps. – Sashank Chittipeddi Oct 22 '17 at 12:24
  • There is no price column here – Bharath Oct 22 '17 at 12:27
  • The earlier Q was referenced to a similar unanswered Question. I made edits. Hope it makes sense now – Sashank Chittipeddi Oct 22 '17 at 12:31
  • @cᴏʟᴅsᴘᴇᴇᴅ Hope all the required info is in the Q – Sashank Chittipeddi Oct 22 '17 at 13:32

0 Answers0