Re: time based moving average (and other newbie mathematica questions)
- To: mathgroup at smc.vnet.net
- Subject: [mg92739] Re: time based moving average (and other newbie mathematica questions)
- From: Peter Pein <petsie at dordos.net>
- Date: Sun, 12 Oct 2008 04:30:43 -0400 (EDT)
- References: <gcn496$751$1@smc.vnet.net>
My first solution was very slow for a larger dataset. The best, I can get for now is the function "ima" below. It has not got the fearure to select the index for which the time-average will be built :-( In[1]:= data = Sort[({#1, Sqrt[#1] + Sin[Pi*#1]} & ) /@ RandomReal[{0, 100}, {1000}]]; In[2]:= IntervalMovingAverage[dat_List, width_, index_: 1] := If[index =!= 1, Sort, Identity][ Mean /@ Function[pos, Select[dat, pos[[index]] <= #1[[index]] <= pos[[index]] + width & ]] /@ dat] In[3]:= ima[dat_, width_] := Mean /@ Block[{lst = dat, k}, Reap[While[Length[lst] > 0, Sow[Take[lst, k = 1; While[k <= Length[lst] && lst[[k, 1]] - lst[[1, 1]] <= width, k++]; k - 1]]; lst = Rest[lst]]][[2, 1]]] In[4]:= (tst = (Timing[#1[data, 5]] & ) /@ {IntervalMovingAverage, ima})[[All, 1]] Out[4]= {5.736359, 0.32802100000000056} In[5]:= SameQ[tst[[All, 2]]] Out[5]= True Peter falcon schrieb: > Hi, > I see that Mathematica provides a couple of moving average functions. > As far as I can tell, they are based on the number of elements in an > array. Is there a function for doing moving average based on time? > In other words, if I pass in intra-day data containing prices, times > (up to a millisecond) and some other fields, can I get Mathematica to > to give me a 5 minute moving average rather than moving average of the > last 100 trades? Obviously this five minute window may contain any > number of elements. > > Secondly, along the same idea, I have a file with a large number of > stocks. They are all mixed in (the file is in chronological order). > Is there an sql type 'group by' command that lets me see moving > averages for each stock? > > Third, if I'm able to get moving average for each stock in the list, > can I plot all of them in one command (I guess this technique is > called "small multiples" in charting vernacular). Obviously I will > only have 20 or 30 stocks. > > Thanks >