darabos commited on
Commit
121b6ff
·
1 Parent(s): badb998

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"].copy()
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 = graph.dfs["edges"].drop_duplicates(["source", "target"])
 
 
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, None) if label_by else None,
407
- "value": getattr(n, color_nodes_by, None)
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, None)
419
  if color_edges_by
420
  else None,
421
  }
@@ -427,17 +429,18 @@ def visualize_graph(
427
  return v
428
 
429
 
430
- def collect(df: pd.DataFrame):
 
 
431
  if isinstance(df, pl.LazyFrame):
432
  df = df.collect()
433
  if isinstance(df, pl.DataFrame):
434
- return [[d[c] for c in df.columns] for d in df.to_dicts()]
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.values.tolist()
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": collect(df)[:limit],
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
  },