Spaces:
Running
Running
Take care to convert display values to be JSON-serializable.
Browse files
lynxkite-graph-analytics/src/lynxkite_graph_analytics/lynxkite_ops.py
CHANGED
@@ -340,7 +340,7 @@ def visualize_graph(
|
|
340 |
label_by: ops.NodeAttribute = None,
|
341 |
color_edges_by: ops.EdgeAttribute = None,
|
342 |
):
|
343 |
-
nodes = graph.dfs["nodes"]
|
344 |
if color_nodes_by:
|
345 |
nodes["color"] = _map_color(nodes[color_nodes_by])
|
346 |
for cols in ["x y", "long lat"]:
|
@@ -370,7 +370,9 @@ def visualize_graph(
|
|
370 |
)
|
371 |
curveness = 0.3
|
372 |
nodes = nodes.to_records()
|
373 |
-
edges =
|
|
|
|
|
374 |
if color_edges_by:
|
375 |
edges["color"] = _map_color(edges[color_edges_by])
|
376 |
edges = edges.to_records()
|
@@ -403,8 +405,8 @@ def visualize_graph(
|
|
403 |
"symbolSize": 50 / len(nodes) ** 0.5,
|
404 |
"itemStyle": {"color": n.color} if color_nodes_by else {},
|
405 |
"label": {"show": label_by is not None},
|
406 |
-
"name": getattr(n, label_by,
|
407 |
-
"value": getattr(n, color_nodes_by,
|
408 |
if color_nodes_by
|
409 |
else None,
|
410 |
}
|
@@ -415,7 +417,7 @@ def visualize_graph(
|
|
415 |
"source": str(r.source),
|
416 |
"target": str(r.target),
|
417 |
"lineStyle": {"color": r.color} if color_edges_by else {},
|
418 |
-
"value": getattr(r, color_edges_by,
|
419 |
if color_edges_by
|
420 |
else None,
|
421 |
}
|
@@ -427,17 +429,18 @@ def visualize_graph(
|
|
427 |
return v
|
428 |
|
429 |
|
430 |
-
def
|
|
|
|
|
431 |
if isinstance(df, pl.LazyFrame):
|
432 |
df = df.collect()
|
433 |
if isinstance(df, pl.DataFrame):
|
434 |
-
|
435 |
# Convert non-numeric columns to strings.
|
436 |
-
df = df.copy()
|
437 |
for c in df.columns:
|
438 |
if not pd.api.types.is_numeric_dtype(df[c]):
|
439 |
df[c] = df[c].astype(str)
|
440 |
-
return df
|
441 |
|
442 |
|
443 |
@op("View tables", view="table_view")
|
@@ -446,7 +449,7 @@ def view_tables(bundle: Bundle, *, limit: int = 100):
|
|
446 |
"dataframes": {
|
447 |
name: {
|
448 |
"columns": [str(c) for c in df.columns],
|
449 |
-
"data":
|
450 |
}
|
451 |
for name, df in bundle.dfs.items()
|
452 |
},
|
|
|
340 |
label_by: ops.NodeAttribute = None,
|
341 |
color_edges_by: ops.EdgeAttribute = None,
|
342 |
):
|
343 |
+
nodes = df_for_frontend(graph.dfs["nodes"], 10_000)
|
344 |
if color_nodes_by:
|
345 |
nodes["color"] = _map_color(nodes[color_nodes_by])
|
346 |
for cols in ["x y", "long lat"]:
|
|
|
370 |
)
|
371 |
curveness = 0.3
|
372 |
nodes = nodes.to_records()
|
373 |
+
edges = df_for_frontend(
|
374 |
+
graph.dfs["edges"].drop_duplicates(["source", "target"]), 10_000
|
375 |
+
)
|
376 |
if color_edges_by:
|
377 |
edges["color"] = _map_color(edges[color_edges_by])
|
378 |
edges = edges.to_records()
|
|
|
405 |
"symbolSize": 50 / len(nodes) ** 0.5,
|
406 |
"itemStyle": {"color": n.color} if color_nodes_by else {},
|
407 |
"label": {"show": label_by is not None},
|
408 |
+
"name": str(getattr(n, label_by, "")) if label_by else None,
|
409 |
+
"value": str(getattr(n, color_nodes_by, ""))
|
410 |
if color_nodes_by
|
411 |
else None,
|
412 |
}
|
|
|
417 |
"source": str(r.source),
|
418 |
"target": str(r.target),
|
419 |
"lineStyle": {"color": r.color} if color_edges_by else {},
|
420 |
+
"value": str(getattr(r, color_edges_by, ""))
|
421 |
if color_edges_by
|
422 |
else None,
|
423 |
}
|
|
|
429 |
return v
|
430 |
|
431 |
|
432 |
+
def df_for_frontend(df: pd.DataFrame, limit: int) -> pd.DataFrame:
|
433 |
+
"""Returns a DataFrame with values that are safe to send to the frontend."""
|
434 |
+
df = df[:limit]
|
435 |
if isinstance(df, pl.LazyFrame):
|
436 |
df = df.collect()
|
437 |
if isinstance(df, pl.DataFrame):
|
438 |
+
df = df.to_pandas()
|
439 |
# Convert non-numeric columns to strings.
|
|
|
440 |
for c in df.columns:
|
441 |
if not pd.api.types.is_numeric_dtype(df[c]):
|
442 |
df[c] = df[c].astype(str)
|
443 |
+
return df
|
444 |
|
445 |
|
446 |
@op("View tables", view="table_view")
|
|
|
449 |
"dataframes": {
|
450 |
name: {
|
451 |
"columns": [str(c) for c in df.columns],
|
452 |
+
"data": df_for_frontend(df, limit).values.tolist(),
|
453 |
}
|
454 |
for name, df in bundle.dfs.items()
|
455 |
},
|