Velocity Reviews > AN ENROLMENT PROJECTION PROBLEM

# AN ENROLMENT PROJECTION PROBLEM

Guest
Posts: n/a

 06-29-2003
I would appreciate advice on how best to formulate the following
problem in Python. I have originally posted the problem to the J
Programming forum and received a one-line formulation ((#s)
(|.s)&(+/@:*)\ I)! I was wondering what the equivalent Python
formulation would be.

The Problem:

The enrolment E(n) of an institution at the beginning of year n is the
sum of the intake for year n, I(n), and the survivors from the intakes
of previous r years. Thus, if s(1) is the 1-year intake survival rate,
s(2) is the 2-year survival rate, etc, we have:

E(n)= I(n)+I(n-1)*s(1)+ I(n-2)*s(2)+...+I(n-r)*s(r)
E(n+1)= I(n+1)+I(n)*s(1)+I(n-1)*s(2)+... +I(n-r-1)*s(r)
..
..
..
E(n+k)= I(n+k)+I(n+k-1)*s(1)+I(n+k-2)*s(2)+...+I(n+k-r)*s(r)

Given:
(a) the actual intakes for the current and previous r years, I(n),
I(n-1),I(n-2),..,I(n-r), and the planned intakes for the next n+k
years: I(n+1), I(n+2),..., I(n+k), we have the intake vector I =
(I(n-r), I(n-r-1),...,I(n),I(n+1),..., I(n+k)); and
(b) the survival rate vector, s = (1,s(1), s(2),...,s(r))
Find:
The k*1 enrolment projection column vector, E =
(E(n+1),E(n+2),...,E(n+k)) in terms of a k*(r+1) matrix P (derived
from
I) and the (r+1)*1 column vector, s.

I = P*s

Is there a compact Python representation of the relevant matrix P
where:

P = [I(n+1) I(n) I(n-1).. . I(n-r)
I(n+2) I(n+1) I(n)... I(n-r-1)
.
.
I(n+k) I(n+k-1) I(n+k-2)... I(n+k-r)]

Alternatively, a non-matrix formulation of the problem would be
acceptable. Thanks in advance for any suggestions on how to proceeed.

Guest
Posts: n/a

 06-29-2003
Donald 'Paddy' McCarthy <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)> ...
> Ajith Prasad wrote:
> > I would appreciate advice on how best to formulate the following
> > problem in Python. I have originally posted the problem to the J
> > Programming forum and received a one-line formulation ((#s)
> > (|.s)&(+/@:*)\ I)! I was wondering what the equivalent Python
> > formulation would be.

>
> Wow! that one line formulation is dense.
> Why do you *want* a compact answer?
> I'm curious, if you put it down, do you have problems undestanding the
> above program in a weeks time?
> Or in a days time?
>
>
>
> >
> > The Problem:
> >
> > The enrolment E(n) of an institution at the beginning of year n is the
> > sum of the intake for year n, I(n), and the survivors from the intakes
> > of previous r years. Thus, if s(1) is the 1-year intake survival rate,
> > s(2) is the 2-year survival rate, etc, we have:
> >
> > E(n)= I(n)+I(n-1)*s(1)+ I(n-2)*s(2)+...+I(n-r)*s(r)
> > E(n+1)= I(n+1)+I(n)*s(1)+I(n-1)*s(2)+... +I(n-r-1)*s(r)
> > .
> > .
> > .
> > E(n+k)= I(n+k)+I(n+k-1)*s(1)+I(n+k-2)*s(2)+...+I(n+k-r)*s(r)
> >
> > Given:
> > (a) the actual intakes for the current and previous r years, I(n),
> > I(n-1),I(n-2),..,I(n-r), and the planned intakes for the next n+k
> > years: I(n+1), I(n+2),..., I(n+k), we have the intake vector I =
> > (I(n-r), I(n-r-1),...,I(n),I(n+1),..., I(n+k)); and
> > (b) the survival rate vector, s = (1,s(1), s(2),...,s(r))
> > Find:
> > The k*1 enrolment projection column vector, E =
> > (E(n+1),E(n+2),...,E(n+k)) in terms of a k*(r+1) matrix P (derived
> > from
> > I) and the (r+1)*1 column vector, s.
> >
> > I = P*s
> >
> > Is there a compact Python representation of the relevant matrix P
> > where:
> >
> > P = [I(n+1) I(n) I(n-1).. . I(n-r)
> > I(n+2) I(n+1) I(n)... I(n-r-1)
> > .
> > .
> > I(n+k) I(n+k-1) I(n+k-2)... I(n+k-r)]
> >
> > Alternatively, a non-matrix formulation of the problem would be
> > acceptable. Thanks in advance for any suggestions on how to proceeed.

I do not require an equally compact Python formulation - any solution
that works will do. The J solution works but I do not why! It was
formulated by a J expert and if one is very competent in J, I suppose
one could follow the logic. In Python, I look forward to a readable
and comprehensible solution. Thanks.

Steven Taschuk
Guest
Posts: n/a

 06-30-2003
> I would appreciate advice on how best to formulate the following
> problem in Python. [...]

If you really want to bring out the linear algebra guns, I'm sure
Numeric has everything you need. But for a problem this simple,
I'd just write

def enrollment(year, intake, survivalrate):
return sum([intake[year-i]*rate
for i, rate in enumerate(survivalrate)])

That's for Python 2.3. In 2.2 you could write

def enrollment(year, intake, survivalrate):
sum = 0
for i in range(len(survivalrate)):
sum = sum + intake[year-i]*survivalrate[i]
return sum

In either case, using it might look something like this:

# survivalrate[n] is proportion of students who survive n years.
survivalrate = [1, 0.5, 0.25, 0.1]

# intake[n] is the number of students intook in year n.
actualintake = {
1993: 980, 1994: 1019, 1995: 1038, 1996: 1046, 1997: 1043,
1998: 970, 1999: 954, 2000: 980, 2001: 952, 2002: 1047,
}
plannedintake = {2003: 1000, 2004: 1000, 2005: 1100, 2006: 1200}

intake = actualintake.copy()
intake.update(plannedintake)

print enrollment(2004, intake, survivalrate)

Note that the intake vectors are dicts, not lists; I do this so I
can avoid index-twiddling. I find the code to be easier to read
and write this way.

--
Steven Taschuk http://www.velocityreviews.com/forums/(E-Mail Removed)
Every public frenzy produces legislation purporting to address it.
(Kinsley's Law)

Guest
Posts: n/a

 06-30-2003
Steven Taschuk <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)>...
> Quoth Ajith Prasad:
> > I would appreciate advice on how best to formulate the following
> > problem in Python. [...]

>
> If you really want to bring out the linear algebra guns, I'm sure
> Numeric has everything you need. But for a problem this simple,
> I'd just write
>
> def enrollment(year, intake, survivalrate):
> return sum([intake[year-i]*rate
> for i, rate in enumerate(survivalrate)])
>
> That's for Python 2.3. In 2.2 you could write
>
> def enrollment(year, intake, survivalrate):
> sum = 0
> for i in range(len(survivalrate)):
> sum = sum + intake[year-i]*survivalrate[i]
> return sum
>
> In either case, using it might look something like this:
>
> # survivalrate[n] is proportion of students who survive n years.
> survivalrate = [1, 0.5, 0.25, 0.1]
>
> # intake[n] is the number of students intook in year n.
> actualintake = {
> 1993: 980, 1994: 1019, 1995: 1038, 1996: 1046, 1997: 1043,
> 1998: 970, 1999: 954, 2000: 980, 2001: 952, 2002: 1047,
> }
> plannedintake = {2003: 1000, 2004: 1000, 2005: 1100, 2006: 1200}
>
> intake = actualintake.copy()
> intake.update(plannedintake)
>
> print enrollment(2004, intake, survivalrate)
>
> Note that the intake vectors are dicts, not lists; I do this so I
> can avoid index-twiddling. I find the code to be easier to read
> and write this way.

Thank you very much. This does what I require.