That works beautifully!  Thank you!

On Tuesday, January 8, 2013 12:08:41 PM UTC-5, asgallant wrote:
>
> The "calc" parameter expects a function, and you are giving it the return 
> value of a function.  So when you have "calc: getAvail(4,6)", it is 
> equivalent to having "calc: 0.6".  Looking at your set up, it seems that 
> what you want is this:
>
> calc: function (dt, row) {
>     return getAvail(dt.getValue(row, 4), dt.getValue(row, 6));
> }
>
> On Tuesday, January 8, 2013 11:42:27 AM UTC-5, Michelle Stewart wrote:
>>
>> I got that solved.  I just forgot the new.  It was something to the 
>> effect of "Cannot call setColumns on undefined".
>>
>> I do need help however on figuring out why it seems the values being used 
>> for the calculations are the column numbers instead of the column values.
>>
>> var view = new google.visualization.DataView(non_grouped);
>> /* Non_grouped Columns
>> 0 - Date, 1 - Shift, 2-Press, 3- Mold,
>> 4 - Downtime, 5 - Scheduled, 6 - Uptime, 
>> 7 - Target, 8- Scrapped, 9- Made
>> */
>> view.setColumns([0,1,2,3,
>> {calc: getAvail(4,6), type: 'number'},
>> {calc: getPerf(9,7,6), type: 'number'},
>> {calc: getQual(9, 8), type: 'number'},
>> {calc: getOEE(4,7,6,9,8), type: 'number'}]);
>> /*  View Columns
>> 0 - Date, , 1 - Shift, 2 - Press, 3 - Mold
>> 4 - Availability, 5 - Performance, 6 -  Quality, 7 - OEE
>> */
>> showThis = new google.visualization.data.group(view, [0],
>> [{column: 4, aggregation: google.visualization.data.avg, type: 'number'},
>> {column: 5, aggregation: google.visualization.data.avg, type: 'number'},
>> {column: 6, aggregation: google.visualization.data.avg, type: 'number'},
>> {column: 7, aggregation: google.visualization.data.avg, type: 'number'}]);
>>      var chart = new 
>> google.visualization.LineChart(document.getElementById('chart-oee'));
>>      chart.draw(showThis, options);
>>     $(curTab).show();
>> }
>> });
>> }
>> function getAvail(d,u){
>> return u/(u+d);
>> }
>> function getPerf(p,t,u){
>> return (p*t)/u;
>> }
>> function getQual(p, s){
>> return (p-s)/p;
>> }
>> function getOEE(d,t,u,p,s){
>> var avail = getAvail(d,u);
>> var perf = getPerf(p,t,u);
>> var qual = getQual(p,s);
>> return avail*perf*qual;
>> }
>>
>> On Tuesday, January 8, 2013 11:35:44 AM UTC-5, asgallant wrote:
>>>
>>> What is the exact error being thrown here?
>>>
>>> On Tuesday, January 8, 2013 11:28:50 AM UTC-5, Michelle Stewart wrote:
>>>>
>>>> I am doing something very similar so I was using this code, but 
>>>> apparently I am missing something obvious because my view isn't working.
>>>>
>>>> I am using arrayToDataTable because of the data I have, but 
>>>> <code>
>>>> var non_grouped = google.visualization.arrayToDataTable(oeeChartsData);
>>>> var view = google.visualization.DataView(non_grouped);
>>>> /* Non_grouped Columns
>>>> 0 - Date, 1 - Shift, 2-AAA, 3- BBB
>>>> 4 - Downtime, 5 - Scheduled, 6 - Uptime, 
>>>> 7 - Target, 8- Scrapped, 9- Made
>>>> */
>>>> view.setColumns([0,1,2,3,
>>>> {calc: getAvail(4,6), type: 'number'},
>>>> {calc: getPerf(9,7,6), type: 'number'},
>>>> {calc: getQual(9, 8), type: 'number'},
>>>> {calc: getOEE(4,7,6,9,8), type: 'number'}]);
>>>> </code>
>>>> errors on the setColumns line because the view never got created!  All 
>>>> my functions work, any ideas what could be wrong?
>>>> non_grouped is a dataTable just fine.  
>>>>
>>>> Thanks in advance,
>>>> Michelle
>>>>
>>>> On Wednesday, June 29, 2011 3:43:15 AM UTC-4, Viz Kid wrote:
>>>>>
>>>>>
>>>>> Hi
>>>>>
>>>>> I stated that this can be done using a DataView, but I did not say 
>>>>> that it would be as clean as you would like, especially satisfying your 
>>>>> request to use the general existing weighted average function as is. If 
>>>>> the 
>>>>> WeightedAverage function is indeed what you wrote (I did not see any 
>>>>> normalization there so I wasn't sure), you can indeed get the desired 
>>>>> outcome using first a DataView to create the weighted columns [2,5,6,7] 
>>>>> (by 
>>>>> multiplying their value by the weight) and then applying the group call 
>>>>> as 
>>>>> you did it where replacing the WeightedAverage with the sum function.
>>>>>
>>>>> I agree that it would be more natural to have the syntax as you wrote 
>>>>> it available for this use case but currently it simply does not exist.
>>>>>
>>>>> Here is a snippet of the code:
>>>>>
>>>>> view = new google.visualization.DataView(table);
>>>>> view.setColumns([
>>>>>   0,
>>>>>   1,
>>>>>   {calc: weightedColumn(2, 4), type: 'number'}, 
>>>>>   3,
>>>>>   4,
>>>>>   {calc: weightedColumn(5, 4), type: 'number'}, 
>>>>>   {calc: weightedColumn(6, 4), type: 'number'}, 
>>>>>   {calc: weightedColumn(7, 4), type: 'number'}]);
>>>>>
>>>>> bySector = new google.visualization.data.group(view, [1],
>>>>>  [ {column:0, aggregation:AllSameOrMany, type:'string'}
>>>>>   ,{column:2, aggregation:google.visualization.data.sum,type:'number'}
>>>>>   ,{column:3, aggregation:google.visualization.data.sum,type:'number'}
>>>>>   ,{column:4, aggregation:google.visualization.data.sum,type:'number'}
>>>>>   ,{column:5, aggregation:google.visualization.data.sum,type:'number'}
>>>>>   ,{column:6, aggregation:google.visualization.data.sum,type:'number'}
>>>>>   ,{column:7, aggregation:google.visualization.data.sum,type:'number'}
>>>>>  ]
>>>>> );
>>>>>
>>>>> function weightedColumn(dataColumnIndex, wightsColumnIndex) {
>>>>>   return function(dataTable, rowNum) {
>>>>>     return dataTable.getValue(rowNum, dataColumnIndex) 
>>>>> * dataTable.getValue(rowNum, weightsColumnIndex);
>>>>>   }
>>>>> }
>>>>>
>>>>> Best,
>>>>>   Viz Kid
>>>>>
>>>>> On Wed, Jun 29, 2011 at 5:04 AM, NA <[email protected]> wrote:
>>>>>
>>>>>> VIz Kid, can you post that example?
>>>>>>
>>>>>> On Jun 24, 9:58 pm, NA <[email protected]> wrote:
>>>>>> > So can you present an example using DataView?  I can't see a
>>>>>> > straightforward way to do this, but I'll give you the benefit of the
>>>>>> > doubt.  Show me how you'd do the following:
>>>>>> >
>>>>>> > table has these columns:
>>>>>> >
>>>>>> > 0      1      2      3       4      5   6   7
>>>>>> > id, sector, price, shares, weight, f1, f2, f3
>>>>>> >
>>>>>> > I want to aggregate this by sector.  The aggregation functions for
>>>>>> > price, f1, f2, and f3 is a weighted average.  The aggregation for
>>>>>> > shares and weight is a sum.  The aggregation for id and sector is to
>>>>>> > return the string "Many" if there are multiple values in that 
>>>>>> column,
>>>>>> > or if all the entries are the same return that value.
>>>>>> >
>>>>>> > Such aggregation functions might look like:
>>>>>> >
>>>>>> > function WeightedAverage(q,w) {
>>>>>> >   var wsum = 0;
>>>>>> >   for (i=0;i<w.length;i++) {wsum+= w[i]*q[i];}
>>>>>> >   return wsum;
>>>>>> >
>>>>>> > }
>>>>>> >
>>>>>> > function AllSameOrMany(c) {
>>>>>> >   var r = c[0];
>>>>>> >   for (var i=0;i<c.length;i++) {if (r !=c[i]){return 'Many';}};
>>>>>> >   return r;
>>>>>> >
>>>>>> > }
>>>>>> >
>>>>>> > Note that the WeightedAverage function is a general function that
>>>>>> > doesn't require the weight to always be in column 4. It also doesn't
>>>>>> > know what Tables are.  It's used in many places; its existence
>>>>>> > predates the google visualization API.  This is important for
>>>>>> > reusability, maintainability, and interoperability across many
>>>>>> > libraries.
>>>>>> >
>>>>>> > What I'd like to do is;
>>>>>> >
>>>>>> > bySector = new google.visualization.data.group(table,[1],
>>>>>> >  [ {column:0, aggregation:AllSameOrMany, type:'string'}
>>>>>> >   ,{column:[2,4],aggregation:WeightedAverage,type:'number'}
>>>>>> >   ,{column:3, 
>>>>>> aggregation:google.visualization.data.sum,type:'number'}
>>>>>> >   ,{column:4, 
>>>>>> aggregation:google.visualization.data.sum,type:'number'}
>>>>>> >   ,{column:[5,4], aggregation:WeightedAverage,type:'number'}
>>>>>> >   ,{column:[6,4], aggregation:WeightedAverage,type:'number'}
>>>>>> >   ,{column:[7,4], aggregation:WeightedAverage,type:'number'}
>>>>>> >   ]
>>>>>> >   );
>>>>>> >
>>>>>> > Since this syntax doesn't exist, can you show me how to do this with
>>>>>> > google.visualization.data.group or with DataViews, without having to
>>>>>> > create special versions of my aggregation functions?
>>>>>> >
>>>>>> > In my case, I used currying to wrap functions like WeightedAverage 
>>>>>> in
>>>>>> > a way to accommodate the grouping and DataView APIs.
>>>>>> >
>>>>>> > But I'd like to learn a cleaner way of doing this.
>>>>>> >
>>>>>> > thanks,
>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "Google Visualization API" group.
>>>>>> To post to this group, send email to [email protected]
>>>>>> .
>>>>>> To unsubscribe from this group, send email to 
>>>>>> [email protected].
>>>>>> For more options, visit this group at 
>>>>>> http://groups.google.com/group/google-visualization-api?hl=en.
>>>>>>
>>>>>>
>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Google Visualization API" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-visualization-api/-/q4AJTX5NROcJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-visualization-api?hl=en.

Reply via email to