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.