ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Discussion (Misc queries) (https://www.excelbanter.com/excel-discussion-misc-queries/)
-   -   Calculate rolling average using last 30 values greater than 0. (https://www.excelbanter.com/excel-discussion-misc-queries/227220-calculate-rolling-average-using-last-30-values-greater-than-0-a.html)

Duke Joel

Calculate rolling average using last 30 values greater than 0.
 
I have two columns of data, production in tons and emissions in lbs for each
calendar day, no missing data, but can have values=0 (no production).
What I what to do is calculate a 30-day rolling average of emission
lbs/production tons using the last 30 production values that are greater than
zero.
For simplicity, in example below, assume I am looking for a 5-day rolling
average
A B C D
Date Production Emissions 5-day average
(tons) (lbs) (lb/ton)
1/1/09 10,000 2,000 n/a
1/2/09 5,000 1,000 n/a
1/3/09 5,000 1,000 n/a
1/4/09 5,000 1,000 n/a
1/5/09 5,000 1,000 0.200 (=6,000 lbs/30,000 tons)
1/6/09 8,000 1,000 0.179 (=5,000 lbs/28,000 tons)
1/7/09 0 0 0.179 (=5,000
lbs/28,000 tons)
1/8/09 0 0 0.179 (=5,000
lbs/28,000 tons)
1/8/09 9,000 3,000 0.219 (=7,000 lbs/32,000 tons)

Thanks in advance!

Mike H

Calculate rolling average using last 30 values greater than 0.
 
Hi,

I'm assuming your data start in row 2, Put this in D2 and array enter (See
below) drag down and it will produce a #NUM! error until you get to D6, from
then on it will calculate the last 5 rows in col c/last 5 in col B

=(SUM(INDEX($C$2:C2,LARGE(ROW($C$2:C2)*($C$2:C2<0 ),5)):C2))/SUM(INDEX($B$2:B2,LARGE(ROW($B$2:B2)*($B$2:B2<0), 5)):B2)

This is an array formula which must be entered with CTRL+Shift+Enter and NOT
'just enter. If you do it correctly then Excel will put curly brackets around
'the formula{}. You can't type these yourself. If you Edit the ranges
'then you must re-enter as An array

Mike

"Duke Joel" wrote:

I have two columns of data, production in tons and emissions in lbs for each
calendar day, no missing data, but can have values=0 (no production).
What I what to do is calculate a 30-day rolling average of emission
lbs/production tons using the last 30 production values that are greater than
zero.
For simplicity, in example below, assume I am looking for a 5-day rolling
average
A B C D
Date Production Emissions 5-day average
(tons) (lbs) (lb/ton)
1/1/09 10,000 2,000 n/a
1/2/09 5,000 1,000 n/a
1/3/09 5,000 1,000 n/a
1/4/09 5,000 1,000 n/a
1/5/09 5,000 1,000 0.200 (=6,000 lbs/30,000 tons)
1/6/09 8,000 1,000 0.179 (=5,000 lbs/28,000 tons)
1/7/09 0 0 0.179 (=5,000
lbs/28,000 tons)
1/8/09 0 0 0.179 (=5,000
lbs/28,000 tons)
1/8/09 9,000 3,000 0.219 (=7,000 lbs/32,000 tons)

Thanks in advance!


Duke Joel[_2_]

Calculate rolling average using last 30 values greater than 0.
 
Your post fixed the problem of properly handling zeros, however one quirk
came up. The calculation only got the rolling average of the last 4 days for
some reason. I changed the two 5's in your formula to 6's and now it is
properly calculating a 5-day average.

Sample data using 5's:
Date Production Emissions Emis Rate 5-day avg
1/1/2009 5,500 2,200 #NUM!
1/2/2009 5,900 2,500 #NUM!
1/3/2009 5,800 2,300 #NUM!
1/4/2009 6,100 1,600 #NUM! should be
1/5/2009 5,100 1,900 0.362 0.370
1/6/2009 6,200 1,800 0.328 0.347
1/7/2009 5,900 1,700 0.300 0.320

Sample data using 6's:
Date Production Emissions Emis Rate 5-day avg
1/1/2009 5,500 2,200 #NUM!
1/2/2009 5,900 2,500 #NUM!
1/3/2009 5,800 2,300 #NUM!
1/4/2009 6,100 1,600 #NUM!
1/5/2009 5,100 1,900 #NUM!
1/6/2009 6,200 1,800 0.347
1/7/2009 5,900 1,700 0.320


"Mike H" wrote:

Hi,

I'm assuming your data start in row 2, Put this in D2 and array enter (See
below) drag down and it will produce a #NUM! error until you get to D6, from
then on it will calculate the last 5 rows in col c/last 5 in col B

=(SUM(INDEX($C$2:C2,LARGE(ROW($C$2:C2)*($C$2:C2<0 ),5)):C2))/SUM(INDEX($B$2:B2,LARGE(ROW($B$2:B2)*($B$2:B2<0), 5)):B2)

This is an array formula which must be entered with CTRL+Shift+Enter and NOT
'just enter. If you do it correctly then Excel will put curly brackets around
'the formula{}. You can't type these yourself. If you Edit the ranges
'then you must re-enter as An array

Mike

"Duke Joel" wrote:

I have two columns of data, production in tons and emissions in lbs for each
calendar day, no missing data, but can have values=0 (no production).
What I what to do is calculate a 30-day rolling average of emission
lbs/production tons using the last 30 production values that are greater than
zero.
For simplicity, in example below, assume I am looking for a 5-day rolling
average
A B C D
Date Production Emissions 5-day average
(tons) (lbs) (lb/ton)
1/1/09 10,000 2,000 n/a
1/2/09 5,000 1,000 n/a
1/3/09 5,000 1,000 n/a
1/4/09 5,000 1,000 n/a
1/5/09 5,000 1,000 0.200 (=6,000 lbs/30,000 tons)
1/6/09 8,000 1,000 0.179 (=5,000 lbs/28,000 tons)
1/7/09 0 0 0.179 (=5,000
lbs/28,000 tons)
1/8/09 0 0 0.179 (=5,000
lbs/28,000 tons)
1/8/09 9,000 3,000 0.219 (=7,000 lbs/32,000 tons)

Thanks in advance!


Duke Joel[_2_]

Calculate rolling average using last 30 values greater than 0.
 
Mike,

One revision to my original question if I may. If there are emissions, I
want to include that day's emissions and production in the calculation even
if the production is 0. In the example below, the current formula incorrectly
divides 1/3-1/7 emissions by 1/2-1/6 production. This may make this quite
complicated, if so I can manage by entering a value of "1" on days there are
emissions but no production.

Date Production Emissions 5-day avg rate
1/1/2009 5,500 2,200 #NUM!
1/2/2009 5,900 2,500 #NUM!
1/3/2009 5,800 2,300 #NUM!
1/4/2009 6,100 1,600 #NUM!
1/5/2009 5,100 1,900 #NUM! should be
1/6/2009 6,200 1,800 0.347 0.347
1/7/2009 0 1,000 0.296 0.371


"Mike H" wrote:

Hi,

I'm assuming your data start in row 2, Put this in D2 and array enter (See
below) drag down and it will produce a #NUM! error until you get to D6, from
then on it will calculate the last 5 rows in col c/last 5 in col B

=(SUM(INDEX($C$2:C2,LARGE(ROW($C$2:C2)*($C$2:C2<0 ),5)):C2))/SUM(INDEX($B$2:B2,LARGE(ROW($B$2:B2)*($B$2:B2<0), 5)):B2)

This is an array formula which must be entered with CTRL+Shift+Enter and NOT
'just enter. If you do it correctly then Excel will put curly brackets around
'the formula{}. You can't type these yourself. If you Edit the ranges
'then you must re-enter as An array

Mike

"Duke Joel" wrote:

I have two columns of data, production in tons and emissions in lbs for each
calendar day, no missing data, but can have values=0 (no production).
What I what to do is calculate a 30-day rolling average of emission
lbs/production tons using the last 30 production values that are greater than
zero.
For simplicity, in example below, assume I am looking for a 5-day rolling
average
A B C D
Date Production Emissions 5-day average
(tons) (lbs) (lb/ton)
1/1/09 10,000 2,000 n/a
1/2/09 5,000 1,000 n/a
1/3/09 5,000 1,000 n/a
1/4/09 5,000 1,000 n/a
1/5/09 5,000 1,000 0.200 (=6,000 lbs/30,000 tons)
1/6/09 8,000 1,000 0.179 (=5,000 lbs/28,000 tons)
1/7/09 0 0 0.179 (=5,000
lbs/28,000 tons)
1/8/09 0 0 0.179 (=5,000
lbs/28,000 tons)
1/8/09 9,000 3,000 0.219 (=7,000 lbs/32,000 tons)

Thanks in advance!



All times are GMT +1. The time now is 03:09 PM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com