Re: Map and functional constructs to replace iterative
- To: mathgroup at smc.vnet.net
- Subject: [mg96873] Re: [mg96783] Map and functional constructs to replace iterative
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Thu, 26 Feb 2009 07:58:52 -0500 (EST)
- References: <200902250900.EAA15513@smc.vnet.net>
- Reply-to: drmajorbob at bigfoot.com
timeSeries = Table[k + RandomReal[{0, 1}], {k, 0, 20}] {0.120891, 1.16064, 2.50042, 3.18862, 4.02033, 5.13744, 6.37348, \ 7.86513, 8.88356, 9.46121, 10.8472, 11.8567, 12.9746, 13.3022, \ 14.606, 15.8236, 16.8817, 17.2755, 18.8514, 19.2049, 20.4023} percentChange[previous_, current_] := 100*(current - previous)/previous percentChange @@@ Partition[timeSeries, 2, 1] {860.067, 115.435, 27.5234, 26.0837, 27.7867, 24.0594, 23.404, \ 12.9487, 6.5024, 14.6494, 9.30684, 9.42813, 2.52475, 9.80145, \ 8.33611, 6.68689, 2.33276, 9.12233, 1.87529, 6.23463} or Clear[percentChange] percentChange[current_, previous_] := 100*(current - previous)/previous percentChange @@@ Partition[Reverse@timeSeries, 2, 1] {6.23463, 1.87529, 9.12233, 2.33276, 6.68689, 8.33611, 9.80145, \ 2.52475, 9.42813, 9.30684, 14.6494, 6.5024, 12.9487, 23.404, 24.0594, \ 27.7867, 26.0837, 27.5234, 115.435, 860.067} Under Help for Apply, you'll find: "f@@@expr is equivalent to Apply[f,expr,{1}]." or, if you prefer Map: Clear[percentChange] percentChange[{current_, previous_}] := 100*(current - previous)/previous percentChange /@ Partition[Reverse@timeSeries, 2, 1] {6.23463, 1.87529, 9.12233, 2.33276, 6.68689, 8.33611, 9.80145, \ 2.52475, 9.42813, 9.30684, 14.6494, 6.5024, 12.9487, 23.404, 24.0594, \ 27.7867, 26.0837, 27.5234, 115.435, 860.067} You can even use both approaches with the same function: Clear[percentChange] percentChange[current_, previous_] := percentChange@{current, previous} percentChange[{current_, previous_}] := 100*(current - previous)/previous percentChange /@ Partition[Reverse@timeSeries, 2, 1] {6.23463, 1.87529, 9.12233, 2.33276, 6.68689, 8.33611, 9.80145, \ 2.52475, 9.42813, 9.30684, 14.6494, 6.5024, 12.9487, 23.404, 24.0594, \ 27.7867, 26.0837, 27.5234, 115.435, 860.067} percentChange @@@ Partition[Reverse@timeSeries, 2, 1] {6.23463, 1.87529, 9.12233, 2.33276, 6.68689, 8.33611, 9.80145, \ 2.52475, 9.42813, 9.30684, 14.6494, 6.5024, 12.9487, 23.404, 24.0594, \ 27.7867, 26.0837, 27.5234, 115.435, 860.067} Or (faster than the others, and no need for a function): 100 (Rest@timeSeries - Most@timeSeries)/Most@timeSeries // Reverse {6.23463, 1.87529, 9.12233, 2.33276, 6.68689, 8.33611, 9.80145, \ 2.52475, 9.42813, 9.30684, 14.6494, 6.5024, 12.9487, 23.404, 24.0594, \ 27.7867, 26.0837, 27.5234, 115.435, 860.067} Bobby On Wed, 25 Feb 2009 03:00:50 -0600, Andreas <aagas at ix.netcom.com> wrote: > I have begun to replace Table, Do, While, or For, but in my thinking > with Map, Inner, Outer and other functional programming constructs as I > learn more about Mathematica. > > But, I'm stuck. I need to figure out how to use Map (or some related > approach) when a function needs both a current value and a previous > value in a time series, such as a percentage change function (or perhaps > more generally stated, when I need to refer to previous values in a > series or even previous calculations). But first a simple case: > > percentChange[currentValue_, previousValue_] := 100 * ( currentValue - > previousValue) / previousValue > > I know how to apply this iteratively, but how can I do it with Map or > some other functional construct? > > Say I have a list: timeSeries > > I thought to try something like this: > > Map[percentChange[?,?], timeSeries] > > but I don't know how what to put in for "?". > > Any help much appreciated. > > Thx. > -- DrMajorBob at longhorns.com
- References:
- Map and functional constructs to replace iterative statements
- From: Andreas <aagas@ix.netcom.com>
- Map and functional constructs to replace iterative statements