AN ENROLMENT PROJECTION PROBLEM

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Ajith Prasad

    AN ENROLMENT PROJECTION PROBLEM

    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)
  • Ajith Prasad

    #2
    Re: AN ENROLMENT PROJECTION PROBLEM

    Donald 'Paddy' McCarthy <paddy3118@blue yonder.co.ukNOT thisBIT> wrote in message news:<3EFF0B14. 4090307@blueyon der.co.ukNOTthi sBIT>...[color=blue]
    > Ajith Prasad wrote:[color=green]
    > > 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.[/color]
    >
    > 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.
    >
    >[color=green]
    > >
    > > 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.[/color][/color]
    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.

    Comment

    • Steven Taschuk

      #3
      Re: AN ENROLMENT PROJECTION PROBLEM

      Quoth Ajith Prasad:[color=blue]
      > I would appreciate advice on how best to formulate the following
      > problem in Python. [...][/color]

      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(survi valrate)])

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

      def enrollment(year , intake, survivalrate):
      sum = 0
      for i in range(len(survi valrate)):
      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.co py()
      intake.update(p lannedintake)

      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 staschuk@telusp lanet.net
      Every public frenzy produces legislation purporting to address it.
      (Kinsley's Law)

      Comment

      • Ajith Prasad

        #4
        Re: AN ENROLMENT PROJECTION PROBLEM

        Steven Taschuk <staschuk@telus planet.net> wrote in message news:<mailman.1 056982548.13922 .python-list@python.org >...[color=blue]
        > Quoth Ajith Prasad:[color=green]
        > > I would appreciate advice on how best to formulate the following
        > > problem in Python. [...][/color]
        >
        > 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(survi valrate)])
        >
        > That's for Python 2.3. In 2.2 you could write
        >
        > def enrollment(year , intake, survivalrate):
        > sum = 0
        > for i in range(len(survi valrate)):
        > 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.co py()
        > intake.update(p lannedintake)
        >
        > 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.[/color]

        Thank you very much. This does what I require.

        Comment

        Working...