Re: Map conditional sums by date
- To: mathgroup at smc.vnet.net
- Subject: [mg99886] Re: Map conditional sums by date
- From: "Charles L. Snyder" <clsnyder at gmail.com>
- Date: Mon, 18 May 2009 02:32:16 -0400 (EDT)
- References: <200905160920.FAA26816@smc.vnet.net> <gunegb$g1i$1@smc.vnet.net>
On May 16, 5:25 pm, Leonid Shifrin <lsh... at gmail.com> wrote: > Hi Charles, > > the following will do what you want and more, since the first setting of > each slider is "All", which allows you to total over the full range of it= ems > this slider is responsible for (day, month or year), and thus you can dec= ide > if you want AND or OR logic for each item, and therefore be as specific o= r > as general as you wish. > > Clear[getUI]; > getUI[data_] := > Module[{months, monthSelect, yearSelect, daySelect, totalize, years, > days}, > months = {All, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", > "Aug", "Sep", "Oct", "Nov", "Dec"}; > years = Prepend[Union@data[[All, 1, 1]], All]; > With[{part = #2}, #1[arg_] := > Select[#, #[[1, part]] == arg &] &] & @@@ > Transpose[{{yearSelect, monthSelect, daySelect}, {1, 2, 3}}]; > daySelect[0] = yearSelect[All] = monthSelect[0] = # &; > totalize = Total[#[[All, 3]]] &; > days = Prepend[Range[31], All]; > Manipulate[ > Grid[{{"Year", "Month", "Day", "Amount"}, {years[[j]], > months[[i]], days[[k]], > totalize@ > yearSelect[years[[j]]]@ > monthSelect[i - 1]@daySelect[k - 1]@data}}, > Frame -> All], {{i, 1, "Month"}, 1, 13, 1}, {{j, 1, "Year"}, 1= , > Length[years], 1}, {{k, 1, "Day"}, 1, Length[days], 1}, > Alignment -> Center]]; > > Usage: > > getUI[mydata], > > with <mydata> from your e-mail. Note that I made explicit use of your > specific format and therefore you have to maintain it for this to work. > The main idea of this implementation is that 3 selector functions > monthSelect, yearSelect, daySelect select the corresponding records > and pass the resulting structure to the next selector function in the cha= in. > If any of them receives the <All> parameter, it simply stays idle and pas= ses > the entire data to the next selector function. > > It shouldn't be hard to attach a barchart-generating code to this if need= ed. > > Hope this helps. > > Regards, > Leonid > > On Sat, May 16, 2009 at 2:20 AM, Charles L. Snyder <clsny... at gmail.com>wr= ote: > > > Hi > > > I want to (ultimately) use Manipulate to provide date selections > > (year, months, days) to create a BarChart. I am able to get the > > results from my data in a kludgy way. The data is in the form {{yr, > > mo, day, h,min,sec}, code, amount}, as seen below: > > > mydata={{2009, 2, 5, 0, 0, 0}, 54161, 3.27`}, {{2006, 8, 23, 0, 0, > > 0}, 54163, 3}, {{2007, 12, 5, 0, 0, 0}, 43280, 17.25`}, {{2009, 2, > > 5, > > 0, 0, 0}, 54161, 3.27`}} > > > I want to conditionally total the amounts (3rd column), by yr OR by > > month OR by day; which I can do with : > > > Select[mydata, #[[1, 2]] == 7 &] > > (* would give me all the rows in which July (7th mo) is the month, for > > example*) > > OR > > Select[mydata, #[[1, 1]] == 2008 &] > > (* would give me all the rows in which 2008 is the year *) > > > I can sum the amounts with: > > Total[#[[3]] & /@ %] > > > I need basic help with putting these into a function, but ultimately I > > want to be able to select yr or mo or day of week via Manipulate and > > get the total.... > > > My failed attempts: > > > (* parameters are yrmoday -> 1 is year, 2 is mo, 3 is day, and x is > > the specific year or month or day*) > > > sumbydate[x_, yrmoday_] := > > If[#[[1, yrmoday]] == x, myresult += #[[3]], myresult += 0] = & /@ > > mydata; myresult > > > OR > > > (* this would be sum by month, if it worked...) > > > sumbydate[x_, yrmoday_] := If[#[[1, yrmoday]] == x, res += #[[3= ]], res > > += 0] & /@ temp; Map[ > > sumrvubydate2[#] &, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}] > > > Thanks! Both of these solutions work perfectly. Thanks again. cls
- References:
- Map conditional sums by date
- From: "Charles L. Snyder" <clsnyder@gmail.com>
- Map conditional sums by date