Skip to content

Commit acd693a

Browse files
author
Bryan Howard
committed
Replacing graph example with updated ones.
1 parent dbc5931 commit acd693a

20 files changed

+1247
-2190
lines changed

examples/api_fetch_graph.json

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
{
2+
"nodes": [
3+
{
4+
"uuid": "data-generator",
5+
"title": "Sample Data Generator",
6+
"pos": [100, 200],
7+
"size": [280, 200],
8+
"code": "import random\nfrom typing import List, Dict\n\n@node_entry\ndef generate_sample_data(num_records: int, data_type: str) -> List[Dict]:\n data = []\n \n if data_type == \"Sales\":\n products = [\"Laptop\", \"Phone\", \"Tablet\", \"Monitor\", \"Keyboard\", \"Mouse\"]\n for i in range(num_records):\n data.append({\n \"id\": i + 1,\n \"product\": random.choice(products),\n \"quantity\": random.randint(1, 10),\n \"price\": round(random.uniform(50, 2000), 2),\n \"date\": f\"2024-{random.randint(1, 12):02d}-{random.randint(1, 28):02d}\"\n })\n elif data_type == \"Weather\":\n cities = [\"New York\", \"London\", \"Tokyo\", \"Sydney\", \"Paris\", \"Berlin\"]\n for i in range(num_records):\n data.append({\n \"id\": i + 1,\n \"city\": random.choice(cities),\n \"temperature\": round(random.uniform(-10, 40), 1),\n \"humidity\": random.randint(30, 90),\n \"date\": f\"2024-{random.randint(1, 12):02d}-{random.randint(1, 28):02d}\"\n })\n else: # Survey\n for i in range(num_records):\n data.append({\n \"id\": i + 1,\n \"age\": random.randint(18, 80),\n \"satisfaction\": random.randint(1, 10),\n \"category\": random.choice([\"A\", \"B\", \"C\"]),\n \"score\": round(random.uniform(0, 100), 1)\n })\n \n print(f\"Generated {len(data)} {data_type.lower()} records\")\n print(f\"Sample record: {data[0] if data else 'None'}\")\n return data",
9+
"gui_code": "from PySide6.QtWidgets import QLabel, QSpinBox, QComboBox, QPushButton\n\nlayout.addWidget(QLabel('Number of Records:', parent))\nwidgets['num_records'] = QSpinBox(parent)\nwidgets['num_records'].setRange(10, 1000)\nwidgets['num_records'].setValue(100)\nlayout.addWidget(widgets['num_records'])\n\nlayout.addWidget(QLabel('Data Type:', parent))\nwidgets['data_type'] = QComboBox(parent)\nwidgets['data_type'].addItems(['Sales', 'Weather', 'Survey'])\nlayout.addWidget(widgets['data_type'])\n\nwidgets['generate_btn'] = QPushButton('Generate Data', parent)\nlayout.addWidget(widgets['generate_btn'])",
10+
"gui_get_values_code": "def get_values(widgets):\n return {\n 'num_records': widgets['num_records'].value(),\n 'data_type': widgets['data_type'].currentText()\n }\n\ndef set_initial_state(widgets, state):\n widgets['num_records'].setValue(state.get('num_records', 100))\n widgets['data_type'].setCurrentText(state.get('data_type', 'Sales'))",
11+
"gui_state": {
12+
"num_records": 100,
13+
"data_type": "Sales"
14+
},
15+
"colors": {
16+
"title": "#007bff",
17+
"body": "#0056b3"
18+
}
19+
},
20+
{
21+
"uuid": "statistics-calculator",
22+
"title": "Statistics Calculator",
23+
"pos": [450, 100],
24+
"size": [300, 250],
25+
"code": "from typing import List, Dict, Tuple\nimport statistics\n\n@node_entry\ndef calculate_statistics(data: List[Dict]) -> Tuple[Dict, int, str]:\n if not data:\n return {}, 0, \"No data provided\"\n \n stats = {}\n total_records = len(data)\n \n # Get numeric columns\n numeric_cols = []\n sample_record = data[0]\n for key, value in sample_record.items():\n if isinstance(value, (int, float)) and key != 'id':\n numeric_cols.append(key)\n \n # Calculate statistics for numeric columns\n for col in numeric_cols:\n values = [record[col] for record in data if isinstance(record[col], (int, float))]\n if values:\n stats[f\"{col}_mean\"] = round(statistics.mean(values), 2)\n stats[f\"{col}_median\"] = round(statistics.median(values), 2)\n stats[f\"{col}_min\"] = min(values)\n stats[f\"{col}_max\"] = max(values)\n if len(values) > 1:\n stats[f\"{col}_stdev\"] = round(statistics.stdev(values), 2)\n \n # Get categorical columns for summary\n categorical_summary = \"\"\n for key, value in sample_record.items():\n if isinstance(value, str) and key not in ['id', 'date']:\n unique_values = set(record[key] for record in data)\n categorical_summary += f\"{key}: {len(unique_values)} unique values; \"\n \n print(\"\\n=== STATISTICAL ANALYSIS ===\")\n print(f\"Total records: {total_records}\")\n for key, value in stats.items():\n print(f\"{key}: {value}\")\n if categorical_summary:\n print(f\"Categorical data: {categorical_summary}\")\n \n return stats, total_records, categorical_summary",
26+
"gui_code": "",
27+
"gui_get_values_code": "",
28+
"gui_state": {},
29+
"colors": {
30+
"title": "#28a745",
31+
"body": "#1e7e34"
32+
}
33+
},
34+
{
35+
"uuid": "trend-analyzer",
36+
"title": "Trend Analyzer",
37+
"pos": [450, 400],
38+
"size": [300, 200],
39+
"code": "from typing import List, Dict, Tuple\nfrom collections import Counter\n\n@node_entry\ndef analyze_trends(data: List[Dict]) -> Tuple[Dict, Dict, str]:\n if not data:\n return {}, {}, \"No data to analyze\"\n \n trends = {}\n patterns = {}\n \n # Date-based trends (if date field exists)\n if 'date' in data[0]:\n monthly_counts = Counter()\n for record in data:\n if 'date' in record:\n month = record['date'][:7] # Extract YYYY-MM\n monthly_counts[month] += 1\n trends['monthly_distribution'] = dict(monthly_counts)\n \n # Categorical distributions\n for key, value in data[0].items():\n if isinstance(value, str) and key not in ['id', 'date']:\n distribution = Counter(record[key] for record in data)\n patterns[f\"{key}_distribution\"] = dict(distribution.most_common(5))\n \n # Correlation analysis for numeric fields\n numeric_fields = [k for k, v in data[0].items() \n if isinstance(v, (int, float)) and k != 'id']\n \n correlations = \"\"\n if len(numeric_fields) >= 2:\n # Simple correlation analysis\n field1, field2 = numeric_fields[0], numeric_fields[1]\n values1 = [record[field1] for record in data]\n values2 = [record[field2] for record in data]\n \n # Calculate basic correlation indicator\n avg1, avg2 = sum(values1)/len(values1), sum(values2)/len(values2)\n covariance = sum((x - avg1) * (y - avg2) for x, y in zip(values1, values2)) / len(values1)\n \n if covariance > 0:\n correlations = f\"Positive relationship between {field1} and {field2}\"\n elif covariance < 0:\n correlations = f\"Negative relationship between {field1} and {field2}\"\n else:\n correlations = f\"No clear relationship between {field1} and {field2}\"\n \n print(\"\\n=== TREND ANALYSIS ===\")\n print(f\"Trends: {trends}\")\n print(f\"Patterns: {patterns}\")\n print(f\"Correlations: {correlations}\")\n \n return trends, patterns, correlations",
40+
"gui_code": "",
41+
"gui_get_values_code": "",
42+
"gui_state": {},
43+
"colors": {
44+
"title": "#fd7e14",
45+
"body": "#e8590c"
46+
}
47+
},
48+
{
49+
"uuid": "dashboard-display",
50+
"title": "Analytics Dashboard",
51+
"pos": [850, 250],
52+
"size": [400, 350],
53+
"code": "from typing import Dict\n\n@node_entry\ndef create_dashboard(stats: Dict, record_count: int, categorical_info: str, trends: Dict, patterns: Dict, correlations: str) -> str:\n dashboard = \"\\n\" + \"=\"*50 + \"\\n\"\n dashboard += \" ANALYTICS DASHBOARD\\n\"\n dashboard += \"=\"*50 + \"\\n\\n\"\n \n # Overview section\n dashboard += f\"📊 OVERVIEW\\n\"\n dashboard += f\" Total Records: {record_count:,}\\n\\n\"\n \n # Statistics section\n if stats:\n dashboard += f\"📈 STATISTICS\\n\"\n for key, value in stats.items():\n dashboard += f\" {key.replace('_', ' ').title()}: {value}\\n\"\n dashboard += \"\\n\"\n \n # Trends section\n if trends:\n dashboard += f\"📅 TRENDS\\n\"\n for key, value in trends.items():\n dashboard += f\" {key.replace('_', ' ').title()}:\\n\"\n if isinstance(value, dict):\n for k, v in list(value.items())[:3]: # Show top 3\n dashboard += f\" {k}: {v}\\n\"\n dashboard += \"\\n\"\n \n # Patterns section\n if patterns:\n dashboard += f\"🔍 PATTERNS\\n\"\n for key, value in patterns.items():\n dashboard += f\" {key.replace('_', ' ').title()}:\\n\"\n for k, v in value.items():\n dashboard += f\" {k}: {v}\\n\"\n dashboard += \"\\n\"\n \n # Insights section\n if correlations:\n dashboard += f\"💡 INSIGHTS\\n\"\n dashboard += f\" {correlations}\\n\\n\"\n \n if categorical_info:\n dashboard += f\"📋 CATEGORICAL DATA\\n\"\n dashboard += f\" {categorical_info}\\n\\n\"\n \n dashboard += \"=\"*50\n \n print(dashboard)\n return dashboard",
54+
"gui_code": "from PySide6.QtWidgets import QLabel, QTextEdit, QPushButton\nfrom PySide6.QtCore import Qt\nfrom PySide6.QtGui import QFont\n\ntitle_label = QLabel('Analytics Dashboard', parent)\ntitle_font = QFont()\ntitle_font.setPointSize(14)\ntitle_font.setBold(True)\ntitle_label.setFont(title_font)\nlayout.addWidget(title_label)\n\nwidgets['dashboard_display'] = QTextEdit(parent)\nwidgets['dashboard_display'].setMinimumHeight(250)\nwidgets['dashboard_display'].setReadOnly(True)\nwidgets['dashboard_display'].setPlainText('Generate data and run analysis to see dashboard...')\nfont = QFont('Courier New', 9)\nwidgets['dashboard_display'].setFont(font)\nlayout.addWidget(widgets['dashboard_display'])\n\nwidgets['export_btn'] = QPushButton('Export Report', parent)\nlayout.addWidget(widgets['export_btn'])\n\nwidgets['refresh_btn'] = QPushButton('Refresh Analysis', parent)\nlayout.addWidget(widgets['refresh_btn'])",
55+
"gui_get_values_code": "def get_values(widgets):\n return {}\n\ndef set_values(widgets, outputs):\n dashboard = outputs.get('output_1', 'No dashboard data')\n widgets['dashboard_display'].setPlainText(dashboard)",
56+
"gui_state": {},
57+
"colors": {
58+
"title": "#6c757d",
59+
"body": "#545b62"
60+
}
61+
}
62+
],
63+
"connections": [
64+
{
65+
"start_node_uuid": "data-generator",
66+
"start_pin_name": "exec_out",
67+
"end_node_uuid": "statistics-calculator",
68+
"end_pin_name": "exec_in"
69+
},
70+
{
71+
"start_node_uuid": "data-generator",
72+
"start_pin_name": "output_1",
73+
"end_node_uuid": "statistics-calculator",
74+
"end_pin_name": "data"
75+
},
76+
{
77+
"start_node_uuid": "data-generator",
78+
"start_pin_name": "exec_out",
79+
"end_node_uuid": "trend-analyzer",
80+
"end_pin_name": "exec_in"
81+
},
82+
{
83+
"start_node_uuid": "data-generator",
84+
"start_pin_name": "output_1",
85+
"end_node_uuid": "trend-analyzer",
86+
"end_pin_name": "data"
87+
},
88+
{
89+
"start_node_uuid": "statistics-calculator",
90+
"start_pin_name": "exec_out",
91+
"end_node_uuid": "dashboard-display",
92+
"end_pin_name": "exec_in"
93+
},
94+
{
95+
"start_node_uuid": "trend-analyzer",
96+
"start_pin_name": "exec_out",
97+
"end_node_uuid": "dashboard-display",
98+
"end_pin_name": "exec_in"
99+
},
100+
{
101+
"start_node_uuid": "statistics-calculator",
102+
"start_pin_name": "output_1",
103+
"end_node_uuid": "dashboard-display",
104+
"end_pin_name": "stats"
105+
},
106+
{
107+
"start_node_uuid": "statistics-calculator",
108+
"start_pin_name": "output_2",
109+
"end_node_uuid": "dashboard-display",
110+
"end_pin_name": "record_count"
111+
},
112+
{
113+
"start_node_uuid": "statistics-calculator",
114+
"start_pin_name": "output_3",
115+
"end_node_uuid": "dashboard-display",
116+
"end_pin_name": "categorical_info"
117+
},
118+
{
119+
"start_node_uuid": "trend-analyzer",
120+
"start_pin_name": "output_1",
121+
"end_node_uuid": "dashboard-display",
122+
"end_pin_name": "trends"
123+
},
124+
{
125+
"start_node_uuid": "trend-analyzer",
126+
"start_pin_name": "output_2",
127+
"end_node_uuid": "dashboard-display",
128+
"end_pin_name": "patterns"
129+
},
130+
{
131+
"start_node_uuid": "trend-analyzer",
132+
"start_pin_name": "output_3",
133+
"end_node_uuid": "dashboard-display",
134+
"end_pin_name": "correlations"
135+
}
136+
],
137+
"requirements": []
138+
}

0 commit comments

Comments
 (0)