Skip to content

Commit

Permalink
update vectorfeature graphing
Browse files Browse the repository at this point in the history
  • Loading branch information
BryonLewis committed Feb 13, 2025
1 parent e1e873f commit df10de6
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 19 deletions.
31 changes: 25 additions & 6 deletions client/src/components/TabularData/TableSummary.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script lang="ts">
import {
Ref, defineComponent, onMounted, ref, computed,
Ref, computed, defineComponent, onMounted, ref,
} from 'vue';
import { TableSummary, VectorFeatureTableGraph } from '../../types';
import UVdatApi from '../../api/UVDATApi';
Expand Down Expand Up @@ -87,13 +87,29 @@ export default defineComponent({
};
const availableColumns = computed(() => {
const baseColumns = selectedTableType ? summaryData?.tables[selectedTableType]?.columns : [];
if (baseColumns.length) {
const baseColumns = selectedTableType.value && summaryData.value?.tables[selectedTableType.value]?.columns
? summaryData.value?.tables[selectedTableType.value]?.columns : [];
const mappedColumns = baseColumns.map((item) => {
const summary = selectedTableType.value && summaryData.value?.tables[selectedTableType.value].summary[item];
let subtitle = '';
if (summary && summary.description) {
subtitle = summary.description;
} else if (summary && summary.type === 'number') {
subtitle = `${summary.min} to ${summary.max}`;
} else if (summary && summary.type === 'string') {
subtitle = `${summary.value_count} unique values`;
}
return {
title: item,
subtitle,
};
});
if (mappedColumns.length) {
const takenVals = [selectedXColumn.value, selectedYColumn.value, selectedIndexerColumn].filter((item) => item !== null);
return baseColumns.filter((item) => !takenVals.includes(item))
return mappedColumns.filter((item) => !takenVals.includes(item.title));
}
return baseColumns;
})
return mappedColumns;
});
const editGraph = (index: number) => {
const graph = graphs.value[index];
Expand Down Expand Up @@ -209,16 +225,19 @@ export default defineComponent({
<v-select
v-model="selectedXColumn"
:items="availableColumns"
:item-props="true"
label="Select X Axis"
/>
<v-select
v-model="selectedYColumn"
:items="availableColumns"
:item-props="true"
label="Select Y Axis"
/>
<v-select
v-model="selectedIndexerColumn"
:items="availableColumns"
:item-props="true"
label="Select Indexer Column"
/>
<v-btn :disabled="!selectedTableType || !selectedXColumn || !selectedYColumn" color="primary" @click="addSaveGraph">
Expand Down
2 changes: 1 addition & 1 deletion client/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,7 @@ interface TableInfo {

type ColumnSummary =
| NumberColumnSummary
| StringColumnSummary
| StringColumnSummary;

interface NumberColumnSummary {
type: 'number';
Expand Down
2 changes: 1 addition & 1 deletion scripts/nwis/getStats.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ def generate_summary(df, param_desc, rows):
summary[header] = {'type': None, 'values': set(), 'value_count': 0}
parameter_cd = param_desc.get(header, None)
if parameter_cd:
summary[header]["description"] = parameter_cd,
summary[header]["description"] = parameter_cd[0] if isinstance(parameter_cd, tuple) else parameter_cd
for value in df[header].unique():
if isinstance(value, bool):
summary[header]['type'] = 'bool'
Expand Down
28 changes: 17 additions & 11 deletions uvdat/core/rest/vector_feature_table_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,8 @@ def table_summary(self, request, *args, **kwargs):
# Ensure all tables of the same type have consistent columns
if len(type_columns_map[table_type]) == 0:
type_columns_map[table_type] = set(table.columns)
elif type_columns_map[table_type] != set(table.columns):
raise ValidationError(
f'Table Columns do not match for all tables: {type_columns_map[table_type]} vs {set(table.columns)}'
)
for column in table.columns:
type_columns_map[table_type].add(column)

table_count_map[table_type] += 1

Expand Down Expand Up @@ -133,7 +131,7 @@ def table_summary(self, request, *args, **kwargs):
][column].get('value_count', 0) + stats.get('value_count', 0)

if stats.get('description', None):
column_summaries[table_type][column]['desciption'] = stats.get('description', 'Unknown')
column_summaries[table_type][column]['description'] = stats.get('description', 'Unknown')
# Construct the response
output = {'vectorFeatureCount': feature_count, 'tables': {}}
for table_type in type_columns_map:
Expand All @@ -146,12 +144,19 @@ def table_summary(self, request, *args, **kwargs):

return Response(output, status=status.HTTP_200_OK)

def get_graphs(table_type, vector_ids, x_axis, y_axis, indexer='vectorFeatureId'):
def get_graphs(self, table_type, vector_ids, x_axis, y_axis, indexer='vectorFeatureId'):
tables = VectorFeatureTableData.objects.filter(
type=table_type, vector_feature__in=vector_ids
)
table_data = {'tableName': table.name, 'graphs': {}}
if tables.count() == 0:
return {'error': f'No tables found for the given vector features {table_type} - {vector_ids}'}
table_data = {'tableName': tables.first().name, 'graphs': {}}
for table in tables:
if y_axis not in table.columns or x_axis not in table.columns:
logger.warning(
f'Columns {x_axis} and {y_axis} not found in table {table.name} with id: {table.pk}'
)
continue
x_axis_index = table.columns.index(x_axis)
y_axis_index = table.columns.index(y_axis)
vector_feature_id = table.vector_feature.pk
Expand All @@ -163,13 +168,14 @@ def get_graphs(table_type, vector_ids, x_axis, y_axis, indexer='vectorFeatureId'
'indexer': index_val,
'vectorFeatureId': vector_feature_id,
'data' : []
}
}
rows = VectorFeatureRowData.objects.filter(vector_feature_table=table)
for row in rows:
row_data = row.row_data
x_val = row_data[x_axis_index]
y_val = row_data[y_axis_index]
table_data['graphs'][vector_feature_id]['data'].append([x_val, y_val])
if y_val is not None:
table_data['graphs'][vector_feature_id]['data'].append([x_val, y_val])
return table_data


Expand All @@ -184,7 +190,7 @@ def feature_graph(self, request, *args, **kwargs):
if not table_type:
return Response({'error': 'tableType is required'}, status=status.HTTP_400_BAD_REQUEST)

graphs = self.get_graphs([vector_feature], x_axis, y_axis, indexer)
graphs = self.get_graphs(table_type, [vector_feature], x_axis, y_axis, indexer)
return Response(graphs, status=status.HTTP_200_OK)

@action(detail=False, methods=['get'], url_path='map-layer-feature-graph')
Expand Down Expand Up @@ -212,7 +218,7 @@ def map_layer_feature_graph(self, request, *args, **kwargs):
if not table_type:
return Response({'error': 'tableType is required'}, status=status.HTTP_400_BAD_REQUEST)

graphs = self.get_graphs(vector_features, x_axis, y_axis, indexer)
graphs = self.get_graphs(table_type, vector_features, x_axis, y_axis, indexer)
return Response(graphs, status=status.HTTP_200_OK)

@action(detail=False, methods=['post'], url_path='generate-layer')
Expand Down

0 comments on commit df10de6

Please sign in to comment.