Exemplo n.º 1
0
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)"},
            )
Exemplo n.º 2
0
def test_wordcloud():
    import dtale.views as views

    df = pd.DataFrame(dict(a=[1, 2, 3], b=[4, 5, 6], c=[7, 8, 9]))
    with app.test_client() as c:
        df, _ = views.format_data(df)
        build_data_inst({c.port: df})
        inputs = {
            "chart_type": "wordcloud",
            "x": "a",
            "y": ["b"],
            "z": None,
            "group": None,
            "agg": None,
            "window": None,
            "rolling_comp": None,
        }
        chart_inputs = {
            "cpg": False,
            "cpy": False,
            "barmode": "group",
            "barsort": None
        }
        extended_aggregation = [
            dict(col="b", agg="mean"),
            dict(col="b", agg="sum")
        ]
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert (resp_data["chart-content"]["children"]["props"]["children"][1]
                ["type"] == "Wordcloud")
Exemplo n.º 3
0
def test_bar_and_popup(unittest):
    import dtale.views as views

    df = pd.DataFrame(
        dict(a=[1, 2, 3], b=[4, 5, 6], c=[7, 8, 9], d=[10, 11, 12]))
    with app.test_client() as c:
        df, _ = views.format_data(df)
        build_data_inst({c.port: df})
        global_state.set_dtypes(c.port, views.build_dtypes_state(df))
        inputs = {
            "chart_type": "bar",
            "x": "a",
            "y": ["b", "c"],
            "z": None,
            "group": None,
            "agg": None,
            "window": None,
            "rolling_comp": None,
        }
        chart_inputs = {
            "cpg": False,
            "cpy": True,
            "barmode": "group",
            "barsort": None
        }
        extended_aggregation = [
            dict(col="b", agg="sum"),
            dict(col="c", agg="mean")
        ]
        params = build_chart_params(
            c.port,
            inputs,
            chart_inputs,
            dict(type="multi", data={}),
            extended_aggregation=extended_aggregation,
        )
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert len(resp_data["chart-content"]["children"][0]["props"]
                   ["children"]) == 2

        chart_inputs["cpy"] = False
        params = build_chart_params(
            c.port,
            inputs,
            chart_inputs,
            dict(type="multi", data={}),
            extended_aggregation=extended_aggregation,
        )
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        links_div = resp_data["chart-content"]["children"]["props"][
            "children"][0]["props"]["children"]
        url = links_div[0]["props"]["children"][0]["props"]["href"]
        assert url.startswith("/dtale/charts/{}?".format(c.port))
        url_params = dict(get_url_parser()(url.split("?")[-1]))
        unittest.assertEqual(
            url_params,
            {
                "chart_type":
                "bar",
                "x":
                "a",
                "barmode":
                "group",
                "cpg":
                "false",
                "cpy":
                "false",
                "y":
                '["b", "c"]',
                "extended_aggregation":
                '[{"agg": "sum", "col": "b"}, {"agg": "mean", "col": "c"}]',
            },
        )
        unittest.assertEqual(
            resp_data["chart-content"]["children"]["props"]["children"][1]
            ["props"]["figure"]["layout"],
            {
                "barmode": "group",
                "legend": {
                    "orientation": "h"
                },
                "title": {
                    "text": "Sum of b, Mean of c by a"
                },
                "xaxis": {
                    "tickformat": ".0f",
                    "title": {
                        "text": "a"
                    }
                },
                "yaxis": {
                    "tickformat": ".0f",
                    "title": {
                        "text": "Sum of b"
                    }
                },
                "yaxis2": {
                    "anchor": "x",
                    "overlaying": "y",
                    "side": "right",
                    "tickformat": ".0f",
                    "title": {
                        "text": "Mean of c"
                    },
                },
            },
        )

        response = c.get(url)
        assert response.status_code == 200
        [pathname_val, search_val] = url.split("?")
        response = c.post(
            "/dtale/charts/_dash-update-component",
            json={
                "output":
                "popup-content.children",
                "changedPropIds": ["url.modified_timestamp"],
                "inputs": [
                    {
                        "id": "url",
                        "property": "pathname",
                        "value": pathname_val
                    },
                    {
                        "id": "url",
                        "property": "search",
                        "value": "?{}".format(search_val),
                    },
                ],
            },
        )
        assert response.status_code == 200

        inputs["y"] = ["b"]
        inputs["agg"] = "sum"
        chart_inputs["animate_by"] = "c"
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert ("frames" in resp_data["chart-content"]["children"]["props"]
                ["children"][1]["props"]["figure"])

        inputs["y"] = ["b"]
        inputs["agg"] = "raw"
        inputs["group"] = ["d"]
        chart_inputs["animate_by"] = "c"
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert ("frames" in resp_data["chart-content"]["children"]["props"]
                ["children"][1]["props"]["figure"])

        inputs["y"] = ["b", "c"]
        inputs["group"] = None
        chart_inputs["animate_by"] = None
        chart_inputs["barmode"] = "group"
        chart_inputs["barsort"] = "b|sum"
        inputs["agg"] = None
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        unittest.assertEqual(
            resp_data["chart-content"]["children"]["props"]["children"][1]
            ["props"]["figure"]["layout"],
            {
                "barmode": "group",
                "legend": {
                    "orientation": "h"
                },
                "title": {
                    "text": "Sum of b, Mean of c by a"
                },
                "xaxis": {
                    "tickmode": "array",
                    "ticktext": [1, 2, 3],
                    "tickvals": [0, 1, 2],
                    "tickformat": ".0f",
                    "title": {
                        "text": "a"
                    },
                },
                "yaxis": {
                    "tickformat": ".0f",
                    "title": {
                        "text": "Sum of b, Mean of c"
                    },
                },
            },
        )

        inputs["y"] = ["b"]
        inputs["group"] = ["c"]
        chart_inputs["cpg"] = True
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert len(resp_data["chart-content"]["children"]) == 2

        chart_inputs["top_bars"] = 5
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert len(resp_data["chart-content"]["children"]) == 2

        chart_inputs["top_bars"] = None
        params["inputs"][-1]["value"] = 1
        params["state"][-3]["value"] = False
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        assert response.get_json()["response"]["load-clicks"]["data"] == 1

        params["state"][-2]["value"] = 1
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        assert response.status_code == 204
Exemplo n.º 4
0
def test_pie(unittest):
    import dtale.views as views

    df = pd.DataFrame(
        dict(a=[1, 2, 3, 4, 5, 6],
             b=[7, 8, 9, 10, 11, 12],
             c=[13, 14, 15, 16, 17, 18]))
    with app.test_client() as c:
        df, _ = views.format_data(df)
        build_data_inst({c.port: df})
        inputs = {
            "chart_type": "pie",
            "x": "a",
            "y": ["b"],
            "z": None,
            "group": ["c"],
            "agg": None,
            "window": None,
            "rolling_comp": None,
        }
        extended_aggregation = [
            dict(col="b", agg="sum"),
            dict(col="b", agg="mean")
        ]
        chart_inputs = {"cpg": True, "barmode": "group", "barsort": "b"}
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert len(resp_data["chart-content"]["children"]) == 6
        chart = resp_data["chart-content"]["children"][0]
        chart = chart["props"]["children"][0]["props"]["children"]["props"][
            "children"][1]
        unittest.assertEqual(
            chart["props"]["figure"]["layout"],
            {
                "legend": {
                    "orientation": "h"
                },
                "title": {
                    "text": "(c: 13) - Sum of b by a"
                },
            },
        )
        unittest.assertEqual(
            list(map(lambda d: d["name"], chart["props"]["figure"]["data"])),
            ["Sum of b"],
        )
        chart = resp_data["chart-content"]["children"][0]
        chart = chart["props"]["children"][1]["props"]["children"]["props"][
            "children"][1]
        unittest.assertEqual(
            chart["props"]["figure"]["layout"],
            {
                "legend": {
                    "orientation": "h"
                },
                "title": {
                    "text": "(c: 13) - Mean of b by a"
                },
            },
        )
        unittest.assertEqual(
            list(map(lambda d: d["name"], chart["props"]["figure"]["data"])),
            ["Mean of b"],
        )

        inputs["group"] = None
        chart_inputs["cpg"] = False
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert resp_data["chart-content"]["children"][0]["type"] == "Div"

    df = pd.DataFrame(dict(a=[1, 2, 3], b=[4, 5, -6]))
    with app.test_client() as c:
        df, _ = views.format_data(df)
        build_data_inst({c.port: df})
        inputs = {
            "chart_type": "pie",
            "x": "a",
            "y": ["b"],
            "z": None,
            "group": None,
            "agg": None,
            "window": None,
            "rolling_comp": None,
        }
        chart_inputs = {
            "cpg": False,
            "cpy": False,
            "barmode": "group",
            "barsort": "b"
        }
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        [error, chart] = resp_data["chart-content"]["children"][0]["props"][
            "children"][0]["props"]["children"]["props"]["children"]
        assert (error["props"]["children"]["props"]["children"][2]["props"]
                ["children"]["props"]["children"] == "3 (-6)")
        chart = chart["props"]["children"]["props"]["children"][1]["props"][
            "figure"]
        unittest.assertEqual(
            chart["layout"],
            {
                "legend": {
                    "orientation": "h"
                },
                "title": {
                    "text": "Sum of b by a"
                }
            },
        )
Exemplo n.º 5
0
def test_line(unittest):
    import dtale.views as views

    df = pd.DataFrame(dict(a=[1, 2, 3], b=[4, 5, 6], c=[7, 8, 9]))
    with app.test_client() as c:
        df, _ = views.format_data(df)
        build_data_inst({c.port: df})
        inputs = {
            "chart_type": "line",
            "x": "a",
            "y": ["b"],
            "z": None,
            "group": ["c"],
            "group_val": [dict(c=7)],
            "agg": None,
            "window": None,
            "rolling_comp": None,
        }
        chart_inputs = {"cpg": True, "barmode": "group", "barsort": "b"}
        extended_aggregation = [
            dict(col="b", agg="sum"),
            dict(col="c", agg="mean")
        ]
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert len(resp_data["chart-content"]["children"]) == 1
        chart = resp_data["chart-content"]["children"][0]["props"]["children"][
            1]
        unittest.assertEqual(
            chart["props"]["figure"]["layout"],
            {
                "legend": {
                    "orientation": "h"
                },
                "title": {
                    "text": "(c: 7) - Sum of b, Mean of c by a"
                },
                "xaxis": {
                    "tickformat": ".0f",
                    "title": {
                        "text": "a"
                    }
                },
                "yaxis": {
                    "tickformat": ".0f",
                    "title": {
                        "text": "Sum of b, Mean of c"
                    },
                },
            },
        )
        unittest.assertEqual(
            list(map(lambda d: d["name"], chart["props"]["figure"]["data"])),
            ["Sum of b", "Mean of c"],
        )

        inputs["group"] = None
        inputs["group_val"] = None
        chart_inputs["cpg"] = False
        params = build_chart_params(c.port, inputs, chart_inputs)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert resp_data["chart-content"]["children"]["type"] == "Div"

        chart_inputs["animate"] = True
        params = build_chart_params(c.port, inputs, chart_inputs)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert ("frames" in resp_data["chart-content"]["children"]["props"]
                ["children"][1]["props"]["figure"])

    df = pd.DataFrame([dict(sec_id=i, y=1) for i in range(15500)])
    with app.test_client() as c:
        df, _ = views.format_data(df)
        build_data_inst({c.port: df})
        inputs = {
            "chart_type": "line",
            "x": "sec_id",
            "y": ["y"],
            "z": None,
            "group": None,
            "agg": None,
            "window": None,
            "rolling_comp": None,
        }
        chart_inputs = {
            "cpg": False,
            "cpy": False,
            "barmode": "group",
            "barsort": None
        }
        extended_aggregation = [
            dict(col="y", agg="sum"),
            dict(col="y", agg="mean")
        ]
        params = build_chart_params(c.port,
                                    inputs,
                                    chart_inputs,
                                    extended_aggregation=extended_aggregation)
        response = c.post("/dtale/charts/_dash-update-component", json=params)
        resp_data = response.get_json()["response"]
        assert "chart-content" in resp_data