Как добавить больше метрик на карту страны в Apache-superset?
Я использую country_map
в apache-superset для целей визуализации. При увеличении полигона информация из столбцов появляется внутри многоугольника, например:
Для отображения доступна только одна доступная метрика:
Код для обновления метрики находится по этому пути:
надмножество / активы / SRC / Визуализация /CountryMap/CountryMap.js
Код:
const updateMetrics = function (region) {
if (region.length > 0) {
resultText.text(format(region[0].metric));
}
};
Метрики определены в controls.jsx:
/superset/static/assets/src/explore/controls.jsx
const metrics = {
type: 'MetricsControl',
multi: true,
label: t('Metrics'),
validators: [v.nonEmpty],
default: (c) => {
const metric = mainMetric(c.savedMetrics);
return metric ? [metric] : null;
},
mapStateToProps: (state) => {
const datasource = state.datasource;
return {
columns: datasource ? datasource.columns : [],
savedMetrics: datasource ? datasource.metrics : [],
datasourceType: datasource && datasource.type,
};
},
description: t('One or many metrics to display'),
};
const metric = {
...metrics,
multi: false,
label: t('Metric'),
default: props => mainMetric(props.savedMetrics),
};
Карта страны использует metric
, который не позволяет выбирать несколько метрик, код найден здесь:
надмножеством / активы / SRC / ПОЗНАВАЙ /controlPanels/CountryMap.js
controlPanelSections: [
{
label: t('Query'),
expanded: true,
controlSetRows: [
['entity'],
['metric'],
['adhoc_filters'],
],
},
{
label: t('Options'),
expanded: true,
controlSetRows: [
['select_country', 'number_format'],
['linear_color_scheme'],
],
},
],
Изменение кода в CountryMap.js и viz.py из metric
в metrics
приводит к следующей ошибке:
Traceback (most recent call last):
File "/Documents/superset/superset/superset/viz.py", line 410, in get_df_payload
df = self.get_df(query_obj)
File "/Documents/superset/superset/superset/viz.py", line 213, in get_df
self.results = self.datasource.query(query_obj)
File "/Documents/superset/superset/superset/connectors/sqla/models.py", line 797, in query
sql = self.get_query_str(query_obj)
File "/Documents/superset/superset/superset/connectors/sqla/models.py", line 471, in get_query_str
qry = self.get_sqla_query(**query_obj)
File "/Documents/superset/superset/superset/connectors/sqla/models.py", line 585, in get_sqla_query
elif m in metrics_dict:
TypeError: unhashable type: 'list'
Как добавить больше метрик для отображения внутри многоугольника?
0 ответов
Непосредственная причина ошибки TypeError: unhashable type: 'list'
ваша модификация файла "viz.py":
self.form_data['metric']]
вself.form_data['metrics']]
, вquery_obj(self)
метод.
Как вы можете видеть в исходном коде здесь, форма данных metrics
это list
объект, который содержит metric
, где metric
вероятно, строка или другой хешируемый объект. На языке питона list
объект не может быть хэш Потому что вы заменяете хеш-объект (metric
) с небрежным (metrics
), unhashable type
ошибка тогда поднята.
Правильный способ изменить CoutryMapViz.query_obj()
принять metrics
запрос можно найти в другом Viz
классы. Раздел кода здесь является очень хорошим примером:
class CalHeatmapViz(BaseViz):
"""Calendar heatmap."""
...
def query_obj(self):
d = super(CalHeatmapViz, self).query_obj()
fd = self.form_data
d['metrics'] = fd.get('metrics')
return d
Наконец, CoutryMapViz.query_obj()
Метод должен выглядеть так:
class CountryMapViz(BaseViz):
...
def query_obj(self):
qry = super(CountryMapViz, self).query_obj()
qry['metrics'] = fd.get('metrics')
qry['groupby'] = [self.form_data['entity']]
return qry