def test_building_choropleth_map_w_custom_geojson(unittest): import dtale.views as views df = pd.DataFrame([ dict(id="US.MA", name="mass", pop=125), dict(id="US.WA", name="wash", pop=500), dict(id="US.CA", name="cali", pop=1000), ]) with app.test_client() as c: with ExitStack() as stack: custom_geojson_data = [] stack.enter_context( mock.patch( "dtale.dash_application.custom_geojson.CUSTOM_GEOJSON", custom_geojson_data, )) params = { "output": "..output-geojson-upload.children...geojson-dropdown.options..", "changedPropIds": ["upload-geojson.content"], "inputs": [{ "id": "upload-geojson", "property": "content", "value": build_geojson_data(), }], "state": [{ "id": "upload-geojson", "property": "filename", "value": "USA.json", }], } c.post("/dtale/charts/_dash-update-component", json=params) df, _ = views.format_data(df) stack.enter_context( mock.patch("dtale.global_state.DATA", {c.port: df})) pathname = path_builder(c.port) inputs = {"chart_type": "maps", "agg": "raw"} map_inputs = { "map_type": "choropleth", "loc_mode": "geojson-id", "geojson": "USA", "featureidkey": "HASC_1", "loc": "id", "map_val": "pop", } chart_inputs = {"colorscale": "Reds"} params = build_chart_params(pathname, inputs, chart_inputs, map_inputs=map_inputs) response = c.post("/dtale/charts/_dash-update-component", json=params) chart_markup = response.get_json( )["response"]["chart-content"]["children"]["props"]["children"][1] unittest.assertEqual( chart_markup["props"]["figure"]["layout"]["title"], {"text": "Map of pop (No Aggregation)"}, )
def test_load_drilldown_content(custom_data): import dtale.views as views with app.test_client() as c: with ExitStack() as stack: custom_data.loc[:, "Col4"] = 4 df, _ = views.format_data(custom_data) stack.enter_context( mock.patch("dtale.global_state.DATA", {c.port: df})) fig_data_outputs = ( "..drilldown-content-1.children...drilldown-x-input-1.style..") inputs = { "id": "input-data", "property": "data", "value": { "chart_type": "bar", "x": "security_id", "y": ["Col0"], "z": None, "group": None, "agg": None, "window": None, "rolling_comp": None, "animate_by": "date", }, } params = build_dash_request( fig_data_outputs, "chart-click-data-1.modified_timestamp", [ ts_builder("chart-click-data-1"), { "id": "drilldown-chart-type-1", "property": "value", "value": None, }, { "id": "drilldown-x-dropdown-1", "property": "value", "value": None, }, ], [ path_builder(c.port), inputs, { "id": "chart-input-data", "property": "data", "value": { "cpg": False, "barmode": "group", "barsort": None }, }, { "id": "yaxis-data", "property": "data", "value": {} }, { "id": "map-input-data", "property": "data", "value": {} }, { "id": "chart-click-data-1", "property": "data", "value": {} }, { "id": "drilldown-toggle", "property": "on", "value": False }, ], ) response = c.post("/dtale/charts/_dash-update-component", json=params) assert response.get_json() is None assert response.status_code == 204 params["state"][-1]["value"] = True response = c.post("/dtale/charts/_dash-update-component", json=params) assert response.get_json() is None assert response.status_code == 204 params["state"][1]["value"]["agg"] = "mean" response = c.post("/dtale/charts/_dash-update-component", json=params) assert response.get_json() is None assert response.status_code == 204 params["inputs"][-1]["value"] = "security_id" response = c.post("/dtale/charts/_dash-update-component", json=params) response = response.get_json()["response"] assert response["drilldown-content-1"]["children"] is None assert response["drilldown-x-input-1"]["style"][ "display"] == "none" params["state"][-2]["value"] = { "points": [{ "x": 100000, "y": 1.23, "customdata": pd.Timestamp(df.date.values[0]).strftime("%Y%m%d"), }] } response = c.post("/dtale/charts/_dash-update-component", json=params) exception = print_traceback(response, chart_key="drilldown-content-1", return_output=True) assert "NotImplementedError: chart type: None" in exception params["inputs"][-2]["value"] = "histogram" response = c.post("/dtale/charts/_dash-update-component", json=params) def _chart_title(resp, histogram=False): if histogram: return resp.get_json( )["response"]["drilldown-content-1"]["children"]["props"][ "figure"]["layout"]["title"]["text"] return resp.get_json()["response"]["drilldown-content-1"][ "children"]["props"]["children"][1]["props"]["figure"][ "layout"]["title"]["text"] assert _chart_title(response, True) == "Histogram of Col0 (1 data points)" params["inputs"][-2]["value"] = "bar" response = c.post("/dtale/charts/_dash-update-component", json=params) assert _chart_title( response) == "Col0 by security_id (No Aggregation)" params["inputs"][-2]["value"] = "histogram" params["state"][1]["value"]["chart_type"] = "3d_scatter" params["state"][1]["value"]["y"] = "Col4" params["state"][1]["value"]["z"] = "Col0" params["state"][-2]["value"]["points"][0]["y"] = 4 response = c.post("/dtale/charts/_dash-update-component", json=params) assert _chart_title(response, True) == "Histogram of Col0 (1 data points)" params["inputs"][-2]["value"] = "bar" response = c.post("/dtale/charts/_dash-update-component", json=params) assert _chart_title( response) == "Col0 by security_id (No Aggregation)" params["inputs"][-2]["value"] = "histogram" params["state"][1]["value"]["chart_type"] = "heatmap" date_val = pd.Timestamp( df[(df.security_id == 100000) & (df.Col4 == 4)].date.values[0]).strftime("%Y%m%d") params["state"][-2]["value"] = { "points": [{ "x": 100000, "y": 4, "z": 1, "text": "date: {}<br>security_id: 100000<br>Col4: 4<br>Col0: 1". format(date_val), "customdata": date_val, }] } response = c.post("/dtale/charts/_dash-update-component", json=params) assert _chart_title(response, True) == "Histogram of Col0 (1 data points)" params["inputs"][-2]["value"] = "bar" response = c.post("/dtale/charts/_dash-update-component", json=params) assert _chart_title( response) == "Col0 by security_id (No Aggregation)" params["inputs"][-2]["value"] = "histogram" params["state"][1]["value"]["chart_type"] = "maps" params["state"][4]["value"] = { "map_type": "choropleth", "loc": "security_id", "map_val": "Col0", } params["state"][-2]["value"]["points"][0]["location"] = 100000 params["state"][-2]["value"]["points"][0]["z"] = 1.23 response = c.post("/dtale/charts/_dash-update-component", json=params) assert _chart_title(response, True) == "Histogram of Col0 (1 data points)" params["inputs"][-2]["value"] = "bar" response = c.post("/dtale/charts/_dash-update-component", json=params) assert _chart_title( response) == "Col0 by security_id (No Aggregation)" params["inputs"][-2]["value"] = "histogram" params["state"][4]["value"] = { "map_type": "scattergeo", "lat": "security_id", "lon": "Col4", "map_val": "Col0", } params["state"][-2]["value"]["points"][0]["lat"] = 100000 params["state"][-2]["value"]["points"][0]["lon"] = 4 response = c.post("/dtale/charts/_dash-update-component", json=params) assert _chart_title(response, True) == "Histogram of Col0 (1 data points)" params["inputs"][-2]["value"] = "bar" response = c.post("/dtale/charts/_dash-update-component", json=params) assert _chart_title(response) == "Col0 by lat_lon (No Aggregation)"
def test_build_x_dropdown(): import dtale.views as views df = pd.DataFrame( dict( a=[1, 2, 3], b=[4, 5, 6], c=[7, 8, 9], d=pd.date_range("20200101", "20200103"), e=[10, 11, 12], )) with app.test_client() as c: with ExitStack() as stack: df, _ = views.format_data(df) stack.enter_context( mock.patch("dtale.global_state.DATA", {c.port: df})) fig_data_outputs = ( "..drilldown-x-dropdown-1.options...drilldown-x-dropdown-1.value.." ) inputs = { "id": "input-data", "property": "data", "value": { "chart_type": "scatter3d", "x": "a", "y": ["b"], "z": "c", "group": None, "agg": None, "window": None, "rolling_comp": None, "animate_by": "date", }, } params = build_dash_request( fig_data_outputs, "chart-1.clickData", { "id": "drilldown-modal-1", "property": "is_open", "value": False }, [ path_builder(c.port), inputs, { "id": "chart-input-data", "property": "data", "value": { "cpg": False, "barmode": "group", "barsort": None }, }, { "id": "yaxis-data", "property": "data", "value": {} }, { "id": "map-input-data", "property": "data", "value": {} }, ], ) response = c.post("/dtale/charts/_dash-update-component", json=params) assert response.get_json() is None assert response.status_code == 204 params["inputs"][0]["value"] = True response = c.post("/dtale/charts/_dash-update-component", json=params) response = response.get_json( )["response"]["drilldown-x-dropdown-1"] assert len(response["options"]) == 11 assert response["options"][0] == {"label": "a", "value": "a"} assert response["options"][-1] == {"label": "e", "value": "e"} assert response["value"] == "a" params["state"][1]["value"]["chart_type"] = "maps" params["state"][-1]["value"] = { "map_type": "choropleth", "loc": "a", "map_val": "b", } response = c.post("/dtale/charts/_dash-update-component", json=params) assert (response.get_json()["response"]["drilldown-x-dropdown-1"] ["value"] == "a") params["state"][-1]["value"] = { "map_type": "scattergeo", "lat": "a", "lon": "b", "map_val": "c", } response = c.post("/dtale/charts/_dash-update-component", json=params) assert (response.get_json()["response"]["drilldown-x-dropdown-1"] ["value"] == "lat_lon")
def test_update_click_data(): import dtale.views as views df = pd.DataFrame( dict( a=[1, 2, 3], b=[4, 5, 6], c=[7, 8, 9], e=[10, 11, 12], d=pd.date_range("20200101", "20200103"), )) with app.test_client() as c: with ExitStack() as stack: df, _ = views.format_data(df) stack.enter_context( mock.patch("dtale.global_state.DATA", {c.port: df})) fig_data_outputs = ( "..chart-click-data-1.data...drilldown-modal-header-1.children.." ) inputs = { "id": "input-data", "property": "data", "value": { "chart_type": "scatter3d", "x": "a", "y": ["b"], "z": "c", "group": None, "agg": None, "window": None, "rolling_comp": None, "animate_by": "date", }, } params = build_dash_request( fig_data_outputs, "chart-1.clickData", { "id": "chart-1", "property": "clickData", "value": None }, [ path_builder(c.port), inputs, { "id": "chart-input-data", "property": "data", "value": { "cpg": False, "barmode": "group", "barsort": None }, }, { "id": "yaxis-data", "property": "data", "value": {} }, { "id": "map-input-data", "property": "data", "value": {} }, { "id": "chart-click-data-1", "property": "data", "value": {} }, { "id": "drilldown-toggle", "property": "on", "value": False }, ], ) response = c.post("/dtale/charts/_dash-update-component", json=params) assert response.get_json() is None assert response.status_code == 204 params["state"][-1]["value"] = True response = c.post("/dtale/charts/_dash-update-component", json=params) assert response.get_json() is None assert response.status_code == 204 params["state"][1]["value"]["agg"] = "mean" response = c.post("/dtale/charts/_dash-update-component", json=params) assert response.get_json() is None assert response.status_code == 204 # Scatter 3D params["inputs"][0]["value"] = { "points": [{ "x": "x", "y": "y", "z": "z", "customdata": "customdata" }] } response = c.post("/dtale/charts/_dash-update-component", json=params) header = response.get_json( )["response"]["drilldown-modal-header-1"]["children"] assert ( header == "Drilldown for: date (customdata), a (x), b (y), Mean c (z)") # Heatmap Animation params["inputs"][0]["value"] = { "points": [{ "x": "x", "y": "y", "z": "z", "text": "date: date<br>x: x<br>y: y<br>z: z", }] } params["state"][1]["value"]["chart_type"] = "heatmap" response = c.post("/dtale/charts/_dash-update-component", json=params) header = response.get_json( )["response"]["drilldown-modal-header-1"]["children"] assert header == "Drilldown for: date (date), x (x), y (y), z (z)" # Choropleth params["inputs"][0]["value"] = { "points": [{ "location": "x", "z": "z", "customdata": "customdata" }] } params["state"][1]["value"]["chart_type"] = "maps" params["state"][4]["value"] = { "map_type": "choropleth", "loc": "b", "map_val": "c", } response = c.post("/dtale/charts/_dash-update-component", json=params) header = response.get_json( )["response"]["drilldown-modal-header-1"]["children"] assert header == "Drilldown for: date (customdata), b (x), Mean c (z)" # Scattergeo params["inputs"][0]["value"] = { "points": [{ "lat": "x", "lon": "y", "z": "z", "customdata": "customdata" }] } params["state"][1]["value"]["chart_type"] = "maps" params["state"][4]["value"] = { "map_type": "scattergeo", "lat": "b", "lon": "e", "map_val": "c", } response = c.post("/dtale/charts/_dash-update-component", json=params) header = response.get_json( )["response"]["drilldown-modal-header-1"]["children"] assert ( header == "Drilldown for: date (customdata), b (x), e (y), Mean c (z)")