Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > AN ENROLMENT PROJECTION PROBLEM

Reply
Thread Tools

AN ENROLMENT PROJECTION PROBLEM

 
 
Ajith Prasad
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.
 
Reply With Quote
 
 
 
 
Ajith Prasad
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?
>
> Cheers, Pad.
>
>
> >
> > 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.
 
Reply With Quote
 
 
 
 
Steven Taschuk
Guest
Posts: n/a
 
      06-30-2003
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.

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

 
Reply With Quote
 
Ajith Prasad
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.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
multidimensional scaling and locality preserving projection paolo.marocco@fastwebnet.it Java 0 12-04-2005 12:19 PM
<projection> tag issues with J2SE 1.5 soup_or_power@yahoo.com Java 1 11-03-2005 06:54 AM
Projection digital vs. slides? Tim Fisher Digital Photography 17 05-27-2004 02:02 AM
Projection: 8MP vs. slides? Tim Fisher Digital Photography 11 05-23-2004 04:14 PM
Projection TV's & Burn Ins SSeaW Computer Support 1 11-10-2003 12:51 PM



Advertisments