chore: Deprecates viz.py (#23934)

This commit is contained in:
Michael S. Molina
2023-05-04 15:38:21 -03:00
committed by GitHub
parent 3dc4de4216
commit b7689fbe53

View File

@@ -131,6 +131,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
cache_type = "df"
enforce_numerical_metrics = True
@deprecated(deprecated_in="3.0")
def __init__(
self,
datasource: "BaseDatasource",
@@ -170,9 +171,11 @@ class BaseViz: # pylint: disable=too-many-public-methods
self.rejected_filters: List[Dict[str, str]] = []
@property
@deprecated(deprecated_in="3.0")
def force_cached(self) -> bool:
return self._force_cached
@deprecated(deprecated_in="3.0")
def process_metrics(self) -> None:
# metrics in Viz is order sensitive, so metric_dict should be
# OrderedDict
@@ -191,6 +194,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
self.metric_labels = list(self.metric_dict.keys())
@staticmethod
@deprecated(deprecated_in="3.0")
def handle_js_int_overflow(
data: Dict[str, List[Dict[str, Any]]]
) -> Dict[str, List[Dict[str, Any]]]:
@@ -203,6 +207,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
record[k] = str(v)
return data
@deprecated(deprecated_in="3.0")
def run_extra_queries(self) -> None:
"""Lifecycle method to use when more than one query is needed
@@ -225,6 +230,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
the underlying query(ies).
"""
@deprecated(deprecated_in="3.0")
def apply_rolling(self, df: pd.DataFrame) -> pd.DataFrame:
rolling_type = self.form_data.get("rolling_type")
rolling_periods = int(self.form_data.get("rolling_periods") or 0)
@@ -252,6 +258,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
)
return df
@deprecated(deprecated_in="3.0")
def get_samples(self) -> Dict[str, Any]:
query_obj = self.query_obj()
query_obj.update(
@@ -273,6 +280,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
"coltypes": payload.get("coltypes"),
}
@deprecated(deprecated_in="3.0")
def get_df(self, query_obj: Optional[QueryObjectDict] = None) -> pd.DataFrame:
"""Returns a pandas dataframe based on the query object"""
if not query_obj:
@@ -322,6 +330,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
df.replace([np.inf, -np.inf], np.nan, inplace=True)
return df
@deprecated(deprecated_in="3.0")
def df_metrics_to_num(self, df: pd.DataFrame) -> None:
"""Converting metrics to numeric when pandas.read_sql cannot"""
metrics = self.metric_labels
@@ -329,12 +338,14 @@ class BaseViz: # pylint: disable=too-many-public-methods
if dtype.type == np.object_ and col in metrics:
df[col] = pd.to_numeric(df[col], errors="coerce")
@deprecated(deprecated_in="3.0")
def process_query_filters(self) -> None:
utils.convert_legacy_filters_into_adhoc(self.form_data)
merge_extra_filters(self.form_data)
utils.split_adhoc_filters_into_base_filters(self.form_data)
@staticmethod
@deprecated(deprecated_in="3.0")
def dedup_columns(*columns_args: Optional[List[Column]]) -> List[Column]:
# dedup groupby and columns while preserving order
labels: List[str] = []
@@ -346,6 +357,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
deduped_columns.append(column)
return deduped_columns
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict: # pylint: disable=too-many-locals
"""Building a query object"""
self.process_query_filters()
@@ -428,6 +440,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
}
@property
@deprecated(deprecated_in="3.0")
def cache_timeout(self) -> int:
if self.form_data.get("cache_timeout") is not None:
return int(self.form_data["cache_timeout"])
@@ -442,11 +455,13 @@ class BaseViz: # pylint: disable=too-many-public-methods
return config["DATA_CACHE_CONFIG"]["CACHE_DEFAULT_TIMEOUT"]
return config["CACHE_DEFAULT_TIMEOUT"]
@deprecated(deprecated_in="3.0")
def get_json(self) -> str:
return json.dumps(
self.get_payload(), default=utils.json_int_dttm_ser, ignore_nan=True
)
@deprecated(deprecated_in="3.0")
def cache_key(self, query_obj: QueryObjectDict, **extra: Any) -> str:
"""
The cache key is made out of the key/values in `query_obj`, plus any
@@ -475,6 +490,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
json_data = self.json_dumps(cache_dict, sort_keys=True)
return md5_sha_from_str(json_data)
@deprecated(deprecated_in="3.0")
def get_payload(self, query_obj: Optional[QueryObjectDict] = None) -> VizPayload:
"""Returns a payload of metadata and data"""
@@ -515,6 +531,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
payload["colnames"] = list(df.columns)
return payload
@deprecated(deprecated_in="3.0")
def get_df_payload( # pylint: disable=too-many-statements
self, query_obj: Optional[QueryObjectDict] = None, **kwargs: Any
) -> Dict[str, Any]:
@@ -639,6 +656,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
}
@staticmethod
@deprecated(deprecated_in="3.0")
def json_dumps(query_obj: Any, sort_keys: bool = False) -> str:
return json.dumps(
query_obj,
@@ -648,6 +666,7 @@ class BaseViz: # pylint: disable=too-many-public-methods
)
@staticmethod
@deprecated(deprecated_in="3.0")
def has_error(payload: VizPayload) -> bool:
return (
payload.get("status") == QueryStatus.FAILED
@@ -655,10 +674,12 @@ class BaseViz: # pylint: disable=too-many-public-methods
or bool(payload.get("errors"))
)
@deprecated(deprecated_in="3.0")
def payload_json_and_has_error(self, payload: VizPayload) -> Tuple[str, bool]:
return self.json_dumps(payload), self.has_error(payload)
@property
@deprecated(deprecated_in="3.0")
def data(self) -> Dict[str, Any]:
"""This is the data object serialized to the js layer"""
content = {
@@ -669,18 +690,22 @@ class BaseViz: # pylint: disable=too-many-public-methods
}
return content
@deprecated(deprecated_in="3.0")
def get_csv(self) -> Optional[str]:
df = self.get_df_payload()["df"] # leverage caching logic
include_index = not isinstance(df.index, pd.RangeIndex)
return csv.df_to_escaped_csv(df, index=include_index, **config["CSV_EXPORT"])
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData: # pylint: disable=no-self-use
return df.to_dict(orient="records")
@property
@deprecated(deprecated_in="3.0")
def json_data(self) -> str:
return json.dumps(self.data)
@deprecated(deprecated_in="3.0")
def raise_for_access(self) -> None:
"""
Raise an exception if the user cannot access the resource.
@@ -701,6 +726,7 @@ class TableViz(BaseViz):
is_timeseries = False
enforce_numerical_metrics = False
@deprecated(deprecated_in="3.0")
def process_metrics(self) -> None:
"""Process form data and store parsed column configs.
1. Determine query mode based on form_data params.
@@ -756,6 +782,7 @@ class TableViz(BaseViz):
self.percent_columns = percent_columns
self.is_timeseries = self.should_be_timeseries()
@deprecated(deprecated_in="3.0")
def should_be_timeseries(self) -> bool:
# TODO handle datasource-type-specific code in datasource
conditions_met = (
@@ -771,6 +798,7 @@ class TableViz(BaseViz):
)
return bool(self.form_data.get("include_time"))
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
if self.query_mode == QueryMode.RAW:
@@ -801,6 +829,7 @@ class TableViz(BaseViz):
]
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
"""
Transform the query result to the table representation.
@@ -833,6 +862,7 @@ class TableViz(BaseViz):
)
@staticmethod
@deprecated(deprecated_in="3.0")
def json_dumps(query_obj: Any, sort_keys: bool = False) -> str:
return json.dumps(
query_obj,
@@ -851,6 +881,7 @@ class TimeTableViz(BaseViz):
credits = 'a <a href="https://github.com/airbnb/superset">Superset</a> original'
is_timeseries = True
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
@@ -868,6 +899,7 @@ class TimeTableViz(BaseViz):
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -897,6 +929,7 @@ class PivotTableViz(BaseViz):
is_timeseries = False
enforce_numerical_metrics = False
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
groupby = self.form_data.get("groupby")
@@ -938,6 +971,7 @@ class PivotTableViz(BaseViz):
return query_obj
@staticmethod
@deprecated(deprecated_in="3.0")
def get_aggfunc(
metric: str, df: pd.DataFrame, form_data: Dict[str, Any]
) -> Union[str, Callable[[Any], Any]]:
@@ -950,6 +984,7 @@ class PivotTableViz(BaseViz):
return aggfunc if aggfunc in ("min", "max") else "max"
@staticmethod
@deprecated(deprecated_in="3.0")
def _format_datetime(value: Union[pd.Timestamp, datetime, date, str]) -> str:
"""
Format a timestamp in such a way that the viz will be able to apply
@@ -974,6 +1009,7 @@ class PivotTableViz(BaseViz):
# fallback in case something incompatible is returned
return cast(str, value)
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -1038,6 +1074,7 @@ class TreemapViz(BaseViz):
credits = '<a href="https://d3js.org">d3.js</a>'
is_timeseries = False
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
sort_by = self.form_data.get("timeseries_limit_metric")
@@ -1051,6 +1088,7 @@ class TreemapViz(BaseViz):
]
return query_obj
@deprecated(deprecated_in="3.0")
def _nest(self, metric: str, df: pd.DataFrame) -> List[Dict[str, Any]]:
nlevels = df.index.nlevels
if nlevels == 1:
@@ -1062,6 +1100,7 @@ class TreemapViz(BaseViz):
]
return result
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -1083,6 +1122,7 @@ class CalHeatmapViz(BaseViz):
credits = "<a href=https://github.com/wa0x6e/cal-heatmap>cal-heatmap</a>"
is_timeseries = True
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData: # pylint: disable=too-many-locals
if df.empty:
return None
@@ -1136,6 +1176,7 @@ class CalHeatmapViz(BaseViz):
"range": range_,
}
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
query_obj["metrics"] = self.form_data.get("metrics")
@@ -1173,6 +1214,7 @@ class BubbleViz(NVD3Viz):
verbose_name = _("Bubble Chart")
is_timeseries = False
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
query_obj["groupby"] = [self.form_data.get("entity")]
@@ -1197,6 +1239,7 @@ class BubbleViz(NVD3Viz):
raise QueryObjectValidationError(_("Pick a metric for x, y and size"))
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -1224,6 +1267,7 @@ class BulletViz(NVD3Viz):
verbose_name = _("Bullet Chart")
is_timeseries = False
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
form_data = self.form_data
query_obj = super().query_obj()
@@ -1236,6 +1280,7 @@ class BulletViz(NVD3Viz):
raise QueryObjectValidationError(_("Pick a metric to display"))
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -1255,6 +1300,7 @@ class BigNumberViz(BaseViz):
credits = 'a <a href="https://github.com/airbnb/superset">Superset</a> original'
is_timeseries = True
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
metric = self.form_data.get("metric")
@@ -1264,6 +1310,7 @@ class BigNumberViz(BaseViz):
self.form_data["metric"] = metric
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -1289,6 +1336,7 @@ class BigNumberTotalViz(BaseViz):
credits = 'a <a href="https://github.com/airbnb/superset">Superset</a> original'
is_timeseries = False
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
metric = self.form_data.get("metric")
@@ -1312,6 +1360,7 @@ class NVD3TimeSeriesViz(NVD3Viz):
is_timeseries = True
pivot_fill_value: Optional[int] = None
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
sort_by = self.form_data.get(
@@ -1325,6 +1374,7 @@ class NVD3TimeSeriesViz(NVD3Viz):
query_obj["orderby"] = [(sort_by, is_asc)]
return query_obj
@deprecated(deprecated_in="3.0")
def to_series( # pylint: disable=too-many-branches
self, df: pd.DataFrame, classed: str = "", title_suffix: str = ""
) -> List[Dict[str, Any]]:
@@ -1386,6 +1436,7 @@ class NVD3TimeSeriesViz(NVD3Viz):
chart_data.append(data)
return chart_data
@deprecated(deprecated_in="3.0")
def process_data(self, df: pd.DataFrame, aggregate: bool = False) -> VizData:
if self.form_data.get("granularity") == "all":
raise QueryObjectValidationError(
@@ -1429,6 +1480,7 @@ class NVD3TimeSeriesViz(NVD3Viz):
return df
@deprecated(deprecated_in="3.0")
def run_extra_queries(self) -> None:
time_compare = self.form_data.get("time_compare") or []
# backwards compatibility
@@ -1463,6 +1515,7 @@ class NVD3TimeSeriesViz(NVD3Viz):
df2 = self.process_data(df2)
self._extra_chart_data.append((label, df2))
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
comparison_type = self.form_data.get("comparison_type") or "values"
df = self.process_data(df)
@@ -1521,9 +1574,11 @@ class MultiLineViz(NVD3Viz):
is_timeseries = True
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
return {}
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
# pylint: disable=import-outside-toplevel,too-many-locals
multiline_fd = self.form_data
@@ -1599,6 +1654,7 @@ class NVD3DualLineViz(NVD3Viz):
sort_series = False
is_timeseries = True
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
m1 = self.form_data.get("metric")
@@ -1614,6 +1670,7 @@ class NVD3DualLineViz(NVD3Viz):
query_obj["metrics"] = [m1, m2]
return query_obj
@deprecated(deprecated_in="3.0")
def to_series(self, df: pd.DataFrame, classed: str = "") -> List[Dict[str, Any]]:
cols = []
for col in df.columns:
@@ -1646,6 +1703,7 @@ class NVD3DualLineViz(NVD3Viz):
)
return chart_data
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -1680,11 +1738,13 @@ class NVD3TimePivotViz(NVD3TimeSeriesViz):
sort_series = True
verbose_name = _("Time Series - Period Pivot")
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
query_obj["metrics"] = [self.form_data.get("metric")]
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -1745,6 +1805,7 @@ class HistogramViz(BaseViz):
verbose_name = _("Histogram")
is_timeseries = False
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
"""Returns the query object for this visualization"""
query_obj = super().query_obj()
@@ -1762,6 +1823,7 @@ class HistogramViz(BaseViz):
query_obj["metrics"] = None
return query_obj
@deprecated(deprecated_in="3.0")
def labelify(self, keys: Union[List[str], str], column: str) -> str:
if isinstance(keys, str):
keys = [keys]
@@ -1772,6 +1834,7 @@ class HistogramViz(BaseViz):
labels = [column] + labels
return "__".join(labels)
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
"""Returns the chart data"""
if df.empty:
@@ -1803,6 +1866,7 @@ class DistributionBarViz(BaseViz):
verbose_name = _("Distribution - Bar Chart")
is_timeseries = False
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
if len(query_obj["groupby"]) < len(self.form_data.get("groupby") or []) + len(
@@ -1833,6 +1897,7 @@ class DistributionBarViz(BaseViz):
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData: # pylint: disable=too-many-locals
if df.empty:
return None
@@ -1894,6 +1959,7 @@ class SunburstViz(BaseViz):
'@<a href="https://bl.ocks.org/kerryrodden/7090426">bl.ocks.org</a>'
)
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -1918,6 +1984,7 @@ class SunburstViz(BaseViz):
df = df[cols]
return df.to_numpy().tolist()
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
query_obj["metrics"] = [self.form_data["metric"]]
@@ -1938,6 +2005,7 @@ class SankeyViz(BaseViz):
is_timeseries = False
credits = '<a href="https://www.npmjs.com/package/d3-sankey">d3-sankey on npm</a>'
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
if len(query_obj["groupby"]) != 2:
@@ -1949,6 +2017,7 @@ class SankeyViz(BaseViz):
query_obj["orderby"] = [(query_obj["metrics"][0], False)]
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -1970,10 +2039,12 @@ class SankeyViz(BaseViz):
for row in recs:
hierarchy[row["source"]].add(row["target"])
@deprecated(deprecated_in="3.0")
def find_cycle(graph: Dict[str, Set[str]]) -> Optional[Tuple[str, str]]:
"""Whether there's a cycle in a directed graph"""
path = set()
@deprecated(deprecated_in="3.0")
def visit(vertex: str) -> Optional[Tuple[str, str]]:
path.add(vertex)
for neighbour in graph.get(vertex, ()):
@@ -2008,6 +2079,7 @@ class ChordViz(BaseViz):
credits = '<a href="https://github.com/d3/d3-chord">Bostock</a>'
is_timeseries = False
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
query_obj["groupby"] = [
@@ -2019,6 +2091,7 @@ class ChordViz(BaseViz):
query_obj["orderby"] = [(query_obj["metrics"][0], False)]
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -2047,6 +2120,7 @@ class CountryMapViz(BaseViz):
is_timeseries = False
credits = "From bl.ocks.org By john-guerra"
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
metric = self.form_data.get("metric")
@@ -2061,6 +2135,7 @@ class CountryMapViz(BaseViz):
query_obj["groupby"] = [entity]
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -2082,6 +2157,7 @@ class WorldMapViz(BaseViz):
is_timeseries = False
credits = 'datamaps on <a href="https://www.npmjs.com/package/datamaps">npm</a>'
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
query_obj["groupby"] = [self.form_data["entity"]]
@@ -2089,6 +2165,7 @@ class WorldMapViz(BaseViz):
query_obj["orderby"] = [(query_obj["metrics"][0], False)]
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -2135,7 +2212,6 @@ class WorldMapViz(BaseViz):
return data
@deprecated(deprecated_in="3.0")
class FilterBoxViz(BaseViz):
"""A multi filter, multi-choice filter box to make dashboards interactive"""
@@ -2148,9 +2224,11 @@ class FilterBoxViz(BaseViz):
cache_type = "get_data"
filter_row_limit = 1000
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
return {}
@deprecated(deprecated_in="3.0")
def run_extra_queries(self) -> None:
query_obj = super().query_obj()
filters = self.form_data.get("filter_configs") or []
@@ -2175,6 +2253,7 @@ class FilterBoxViz(BaseViz):
df = self.get_df_payload(query_obj=query_obj).get("df")
self.dataframes[col] = df
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
filters = self.form_data.get("filter_configs") or []
data = {}
@@ -2201,6 +2280,7 @@ class FilterBoxViz(BaseViz):
data[col] = []
return data
@deprecated(deprecated_in="3.0")
def get_query_context_factory(self) -> QueryContextFactory:
if self.query_context_factory is None:
# pylint: disable=import-outside-toplevel
@@ -2226,6 +2306,7 @@ class ParallelCoordinatesViz(BaseViz):
)
is_timeseries = False
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
query_obj["groupby"] = [self.form_data.get("series")]
@@ -2240,6 +2321,7 @@ class ParallelCoordinatesViz(BaseViz):
]
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
return df.to_dict(orient="records")
@@ -2256,6 +2338,7 @@ class HeatmapViz(BaseViz):
"bl.ocks.org</a>"
)
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
query_obj["metrics"] = [self.form_data.get("metric")]
@@ -2269,6 +2352,7 @@ class HeatmapViz(BaseViz):
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -2326,6 +2410,7 @@ class MapboxViz(BaseViz):
is_timeseries = False
credits = "<a href=https://www.mapbox.com/mapbox-gl-js/api/>Mapbox GL JS</a>"
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
label_col = self.form_data.get("mapbox_label")
@@ -2393,6 +2478,7 @@ class MapboxViz(BaseViz):
)
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -2473,9 +2559,11 @@ class DeckGLMultiLayer(BaseViz):
is_timeseries = False
credits = '<a href="https://uber.github.io/deck.gl/">deck.gl</a>'
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
return {}
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
# Late imports to avoid circular import issues
# pylint: disable=import-outside-toplevel
@@ -2498,14 +2586,17 @@ class BaseDeckGLViz(BaseViz):
credits = '<a href="https://uber.github.io/deck.gl/">deck.gl</a>'
spatial_control_keys: List[str] = []
@deprecated(deprecated_in="3.0")
def get_metrics(self) -> List[str]:
# pylint: disable=attribute-defined-outside-init
self.metric = self.form_data.get("size")
return [self.metric] if self.metric else []
@deprecated(deprecated_in="3.0")
def process_spatial_query_obj(self, key: str, group_by: List[str]) -> None:
group_by.extend(self.get_spatial_columns(key))
@deprecated(deprecated_in="3.0")
def get_spatial_columns(self, key: str) -> List[str]:
spatial = self.form_data.get(key)
if spatial is None:
@@ -2522,6 +2613,7 @@ class BaseDeckGLViz(BaseViz):
return []
@staticmethod
@deprecated(deprecated_in="3.0")
def parse_coordinates(latlog: Any) -> Optional[Tuple[float, float]]:
if not latlog:
return None
@@ -2534,14 +2626,17 @@ class BaseDeckGLViz(BaseViz):
) from ex
@staticmethod
@deprecated(deprecated_in="3.0")
def reverse_geohash_decode(geohash_code: str) -> Tuple[str, str]:
lat, lng = geohash.decode(geohash_code)
return (lng, lat)
@staticmethod
@deprecated(deprecated_in="3.0")
def reverse_latlong(df: pd.DataFrame, key: str) -> None:
df[key] = [tuple(reversed(o)) for o in df[key] if isinstance(o, (list, tuple))]
@deprecated(deprecated_in="3.0")
def process_spatial_data_obj(self, key: str, df: pd.DataFrame) -> pd.DataFrame:
spatial = self.form_data.get(key)
if spatial is None:
@@ -2574,6 +2669,7 @@ class BaseDeckGLViz(BaseViz):
)
return df
@deprecated(deprecated_in="3.0")
def add_null_filters(self) -> None:
spatial_columns = set()
for key in self.spatial_control_keys:
@@ -2593,6 +2689,7 @@ class BaseDeckGLViz(BaseViz):
)
self.form_data["adhoc_filters"].append(filter_)
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
# add NULL filters
if self.form_data.get("filter_nulls", True):
@@ -2627,10 +2724,12 @@ class BaseDeckGLViz(BaseViz):
query_obj["columns"] = group_by
return query_obj
@deprecated(deprecated_in="3.0")
def get_js_columns(self, data: Dict[str, Any]) -> Dict[str, Any]:
cols = self.form_data.get("js_columns") or []
return {col: data.get(col) for col in cols}
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -2653,6 +2752,7 @@ class BaseDeckGLViz(BaseViz):
"metricLabels": self.metric_labels,
}
@deprecated(deprecated_in="3.0")
def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]:
raise NotImplementedError()
@@ -2666,6 +2766,7 @@ class DeckScatterViz(BaseDeckGLViz):
spatial_control_keys = ["spatial"]
is_timeseries = True
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
# pylint: disable=attribute-defined-outside-init
self.is_timeseries = bool(
@@ -2677,6 +2778,7 @@ class DeckScatterViz(BaseDeckGLViz):
}
return super().query_obj()
@deprecated(deprecated_in="3.0")
def get_metrics(self) -> List[str]:
# pylint: disable=attribute-defined-outside-init
self.metric = None
@@ -2685,6 +2787,7 @@ class DeckScatterViz(BaseDeckGLViz):
return [self.metric]
return []
@deprecated(deprecated_in="3.0")
def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]:
return {
"metric": data.get(self.metric_label) if self.metric_label else None,
@@ -2698,6 +2801,7 @@ class DeckScatterViz(BaseDeckGLViz):
DTTM_ALIAS: data.get(DTTM_ALIAS),
}
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
# pylint: disable=attribute-defined-outside-init
self.metric_label = utils.get_metric_name(self.metric) if self.metric else None
@@ -2718,12 +2822,14 @@ class DeckScreengrid(BaseDeckGLViz):
spatial_control_keys = ["spatial"]
is_timeseries = True
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
self.is_timeseries = bool(
self.form_data.get("time_grain_sqla") or self.form_data.get("granularity")
)
return super().query_obj()
@deprecated(deprecated_in="3.0")
def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]:
return {
"position": data.get("spatial"),
@@ -2731,6 +2837,7 @@ class DeckScreengrid(BaseDeckGLViz):
"__timestamp": data.get(DTTM_ALIAS) or data.get("__time"),
}
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
self.metric_label = ( # pylint: disable=attribute-defined-outside-init
utils.get_metric_name(self.metric) if self.metric else None
@@ -2746,12 +2853,14 @@ class DeckGrid(BaseDeckGLViz):
verbose_name = _("Deck.gl - 3D Grid")
spatial_control_keys = ["spatial"]
@deprecated(deprecated_in="3.0")
def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]:
return {
"position": data.get("spatial"),
"weight": (data.get(self.metric_label) if self.metric_label else None) or 1,
}
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
self.metric_label = ( # pylint: disable=attribute-defined-outside-init
utils.get_metric_name(self.metric) if self.metric else None
@@ -2759,6 +2868,7 @@ class DeckGrid(BaseDeckGLViz):
return super().get_data(df)
@deprecated(deprecated_in="3.0")
def geohash_to_json(geohash_code: str) -> List[List[float]]:
bbox = geohash.bbox(geohash_code)
return [
@@ -2784,6 +2894,7 @@ class DeckPathViz(BaseDeckGLViz):
"geohash": geohash_to_json,
}
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
# pylint: disable=attribute-defined-outside-init
self.is_timeseries = bool(
@@ -2800,6 +2911,7 @@ class DeckPathViz(BaseDeckGLViz):
query_obj["columns"].append(line_col)
return query_obj
@deprecated(deprecated_in="3.0")
def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]:
line_type = self.form_data["line_type"]
deser = self.deser_map[line_type]
@@ -2813,6 +2925,7 @@ class DeckPathViz(BaseDeckGLViz):
data["__timestamp"] = data.get(DTTM_ALIAS) or data.get("__time")
return data
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
self.metric_label = ( # pylint: disable=attribute-defined-outside-init
utils.get_metric_name(self.metric) if self.metric else None
@@ -2828,6 +2941,7 @@ class DeckPolygon(DeckPathViz):
deck_viz_key = "polygon"
verbose_name = _("Deck.gl - Polygon")
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
# pylint: disable=attribute-defined-outside-init
self.elevation = self.form_data.get("point_radius_fixed") or {
@@ -2836,12 +2950,14 @@ class DeckPolygon(DeckPathViz):
}
return super().query_obj()
@deprecated(deprecated_in="3.0")
def get_metrics(self) -> List[str]:
metrics = [self.form_data.get("metric")]
if self.elevation.get("type") == "metric":
metrics.append(self.elevation.get("value"))
return [metric for metric in metrics if metric]
@deprecated(deprecated_in="3.0")
def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]:
super().get_properties(data)
elevation = self.form_data["point_radius_fixed"]["value"]
@@ -2862,12 +2978,14 @@ class DeckHex(BaseDeckGLViz):
verbose_name = _("Deck.gl - 3D HEX")
spatial_control_keys = ["spatial"]
@deprecated(deprecated_in="3.0")
def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]:
return {
"position": data.get("spatial"),
"weight": (data.get(self.metric_label) if self.metric_label else None) or 1,
}
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
self.metric_label = ( # pylint: disable=attribute-defined-outside-init
utils.get_metric_name(self.metric) if self.metric else None
@@ -2882,6 +3000,7 @@ class DeckGeoJson(BaseDeckGLViz):
viz_type = "deck_geojson"
verbose_name = _("Deck.gl - GeoJSON")
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
query_obj["columns"] += [self.form_data.get("geojson")]
@@ -2889,6 +3008,7 @@ class DeckGeoJson(BaseDeckGLViz):
query_obj["groupby"] = []
return query_obj
@deprecated(deprecated_in="3.0")
def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]:
geojson = data[get_column_name(self.form_data["geojson"])]
return json.loads(geojson)
@@ -2903,12 +3023,14 @@ class DeckArc(BaseDeckGLViz):
spatial_control_keys = ["start_spatial", "end_spatial"]
is_timeseries = True
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
self.is_timeseries = bool(
self.form_data.get("time_grain_sqla") or self.form_data.get("granularity")
)
return super().query_obj()
@deprecated(deprecated_in="3.0")
def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]:
dim = self.form_data.get("dimension")
return {
@@ -2918,12 +3040,13 @@ class DeckArc(BaseDeckGLViz):
DTTM_ALIAS: data.get(DTTM_ALIAS),
}
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
return {
"features": super().get_data(df)["features"], # type: ignore
"features": super().get_data(df)["features"],
"mapboxApiKey": config["MAPBOX_API_KEY"],
}
@@ -2937,6 +3060,7 @@ class EventFlowViz(BaseViz):
credits = 'from <a href="https://github.com/williaster/data-ui">@data-ui</a>'
is_timeseries = True
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query = super().query_obj()
form_data = self.form_data
@@ -2956,6 +3080,7 @@ class EventFlowViz(BaseViz):
return query
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
return df.to_dict(orient="records")
@@ -2969,6 +3094,7 @@ class PairedTTestViz(BaseViz):
sort_series = False
is_timeseries = True
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
sort_by = self.form_data.get("timeseries_limit_metric")
@@ -2982,6 +3108,7 @@ class PairedTTestViz(BaseViz):
]
return query_obj
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
"""
Transform received data frame into an object of the form:
@@ -3040,13 +3167,14 @@ class RoseViz(NVD3TimeSeriesViz):
sort_series = False
is_timeseries = True
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
data = super().get_data(df)
result: Dict[str, List[Dict[str, str]]] = {}
for datum in data: # type: ignore
for datum in data:
key = datum["key"]
for val in datum["values"]:
timestamp = val["x"].value
@@ -3073,6 +3201,7 @@ class PartitionViz(NVD3TimeSeriesViz):
viz_type = "partition"
verbose_name = _("Partition Diagram")
@deprecated(deprecated_in="3.0")
def query_obj(self) -> QueryObjectDict:
query_obj = super().query_obj()
time_op = self.form_data.get("time_series_option", "not_time")
@@ -3081,6 +3210,7 @@ class PartitionViz(NVD3TimeSeriesViz):
return query_obj
@staticmethod
@deprecated(deprecated_in="3.0")
def levels_for(
time_op: str, groups: List[str], df: pd.DataFrame
) -> Dict[int, pd.Series]:
@@ -3098,6 +3228,7 @@ class PartitionViz(NVD3TimeSeriesViz):
return levels
@staticmethod
@deprecated(deprecated_in="3.0")
def levels_for_diff(
time_op: str, groups: List[str], df: pd.DataFrame
) -> Dict[int, pd.DataFrame]:
@@ -3134,6 +3265,7 @@ class PartitionViz(NVD3TimeSeriesViz):
)
return levels
@deprecated(deprecated_in="3.0")
def levels_for_time(
self, groups: List[str], df: pd.DataFrame
) -> Dict[int, VizData]:
@@ -3145,6 +3277,7 @@ class PartitionViz(NVD3TimeSeriesViz):
self.form_data["groupby"] = groups
return procs
@deprecated(deprecated_in="3.0")
def nest_values(
self,
levels: Dict[int, pd.DataFrame],
@@ -3189,6 +3322,7 @@ class PartitionViz(NVD3TimeSeriesViz):
for i in dim_level.index
]
@deprecated(deprecated_in="3.0")
def nest_procs(
self,
procs: Dict[int, pd.DataFrame],
@@ -3223,6 +3357,7 @@ class PartitionViz(NVD3TimeSeriesViz):
for i in procs[level][dims].columns
]
@deprecated(deprecated_in="3.0")
def get_data(self, df: pd.DataFrame) -> VizData:
if df.empty:
return None
@@ -3244,6 +3379,7 @@ class PartitionViz(NVD3TimeSeriesViz):
return self.nest_values(levels)
@deprecated(deprecated_in="3.0")
def get_subclasses(cls: Type[BaseViz]) -> Set[Type[BaseViz]]:
return set(cls.__subclasses__()).union(
[sc for c in cls.__subclasses__() for sc in get_subclasses(c)]