acecalisto3 commited on
Commit
118329d
·
verified ·
1 Parent(s): ad13f64

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +282 -315
app.py CHANGED
@@ -1,317 +1,284 @@
1
- import streamlit as st
2
- import os
3
- import subprocess
4
- from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer
5
- import black
6
- from pylint import lint
7
- from io import StringIO
8
- # import openai # We're not using OpenAI anymore
9
- import sys
10
-
11
- # Set your Hugging Face API key here
12
- HF_API_KEY = "YOUR_HUGGING_FACE_API_KEY"
13
-
14
- PROJECT_ROOT = "projects"
15
- AGENT_DIRECTORY = "agents"
16
-
17
- # Global state to manage communication between Tool Box and Workspace Chat App
18
- if 'chat_history' not in st.session_state:
19
- st.session_state.chat_history = []
20
- if 'terminal_history' not in st.session_state:
21
- st.session_state.terminal_history = []
22
- if 'workspace_projects' not in st.session_state:
23
- st.session_state.workspace_projects = {}
24
- if 'available_agents' not in st.session_state:
25
- st.session_state.available_agents = []
26
-
27
- class AIAgent:
28
- def __init__(self, name, description, skills):
29
- self.name = name
30
- self.description = description
31
- self.skills = skills
32
-
33
- def create_agent_prompt(self):
34
- skills_str = '\n'.join([f"* {skill}" for skill in self.skills])
35
- agent_prompt = f"""
36
- As an elite expert developer, my name is {self.name}. I possess a comprehensive understanding of the following areas:
37
- {skills_str}
38
-
39
- I am confident that I can leverage my expertise to assist you in developing and deploying cutting-edge web applications. Please feel free to ask any questions or present any challenges you may encounter.
40
- """
41
- return agent_prompt
42
-
43
- def autonomous_build(self, chat_history, workspace_projects):
44
- """
45
- Autonomous build logic that continues based on the state of chat history and workspace projects.
46
- """
47
- # Example logic: Generate a summary of chat history and workspace state
48
- summary = "Chat History:\n" + "\n".join([f"User: {u}\nAgent: {a}" for u, a in chat_history])
49
- summary += "\n\nWorkspace Projects:\n" + "\n".join([f"{p}: {details}" for p, details in workspace_projects.items()])
50
-
51
- # Example: Generate the next logical step in the project
52
- next_step = "Based on the current state, the next logical step is to implement the main application logic."
53
-
54
- return summary, next_step
55
-
56
- def save_agent_to_file(agent):
57
- """Saves the agent's prompt to a file."""
58
- if not os.path.exists(AGENT_DIRECTORY):
59
- os.makedirs(AGENT_DIRECTORY)
60
- file_path = os.path.join(AGENT_DIRECTORY, f"{agent.name}.txt")
61
- with open(file_path, "w") as file:
62
- file.write(agent.create_agent_prompt())
63
- st.session_state.available_agents.append(agent.name)
64
-
65
- def load_agent_prompt(agent_name):
66
- """Loads an agent prompt from a file."""
67
- file_path = os.path.join(AGENT_DIRECTORY, f"{agent_name}.txt")
68
- if os.path.exists(file_path):
69
- with open(file_path, "r") as file:
70
- agent_prompt = file.read()
71
- return agent_prompt
72
  else:
73
- return None
74
-
75
- def create_agent_from_text(name, text):
76
- skills = text.split('\n')
77
- agent = AIAgent(name, "AI agent created from text input.", skills)
78
- save_agent_to_file(agent)
79
- return agent.create_agent_prompt()
80
-
81
- # Chat interface using a selected agent (Hugging Face version)
82
- def chat_interface_with_agent(input_text, agent_name):
83
- agent_prompt = load_agent_prompt(agent_name)
84
- if agent_prompt is None:
85
- return f"Agent {agent_name} not found."
86
-
87
- # Use a Hugging Face model for chat with the agent
88
- # Example: Using the 'google/flan-t5-xl' model
89
- generator = pipeline("text-generation", model="google/flan-t5-xl", use_auth_token=HF_API_KEY)
90
-
91
- # Combine the agent prompt with user input
92
- combined_input = f"{agent_prompt}\n\nUser: {input_text}\nAgent:"
93
-
94
- # Generate chatbot response
95
- response = generator(combined_input, max_length=150, num_return_sequences=1, do_sample=True)
96
- return response[0]['generated_text']
97
-
98
- # Terminal interface
99
- def terminal_interface(command, project_name=None):
100
- if project_name:
101
- project_path = os.path.join(PROJECT_ROOT, project_name)
102
- result = subprocess.run(command, shell=True, capture_output=True, text=True, cwd=project_path)
103
  else:
104
- result = subprocess.run(command, shell=True, capture_output=True, text=True)
105
- return result.stdout
106
-
107
- # Code editor interface
108
- def code_editor_interface(code):
109
- formatted_code = black.format_str(code, mode=black.FileMode())
110
- pylint_output = lint.Run([formatted_code], do_exit=False)
111
- pylint_output_str = StringIO()
112
- pylint_output.linter.reporter.write_messages(pylint_output_str)
113
- return formatted_code, pylint_output_str.getvalue()
114
-
115
- # Text summarization tool
116
- def summarize_text(text):
117
- summarizer = pipeline("summarization", model="facebook/bart-large-cnn", use_auth_token=HF_API_KEY)
118
- summary = summarizer(text, max_length=130, min_length=30, do_sample=False)
119
- return summary[0]['summary_text']
120
-
121
- # Sentiment analysis tool
122
- def sentiment_analysis(text):
123
- analyzer = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-3-literal", use_auth_token=HF_API_KEY)
124
- result = analyzer(text)
125
- return result[0]['label']
126
-
127
- # Text translation tool (code translation)
128
- def translate_code(code, source_language, target_language):
129
- # Placeholder for translation logic
130
- return f"Translated {source_language} code to {target_language}."
131
-
132
- # Code generation tool
133
- def generate_code(idea):
134
- # Use a Hugging Face model for code generation
135
- # Example: Using the 'Salesforce/codet5-base' model
136
- generator = pipeline("text-generation", model="Salesforce/codet5-base", use_auth_token=HF_API_KEY)
137
- response = generator(idea, max_length=150, num_return_sequences=1, do_sample=True)
138
- return response[0]['generated_text']
139
-
140
- # Workspace interface
141
- def workspace_interface(project_name):
142
- project_path = os.path.join(PROJECT_ROOT, project_name)
143
- if not os.path.exists(project_path):
144
- os.makedirs(project_path)
145
- st.session_state.workspace_projects[project_name] = {'files': []}
146
- return f"Project '{project_name}' created successfully."
147
- else:
148
- return f"Project '{project_name}' already exists."
149
-
150
- # Add code to workspace
151
- def add_code_to_workspace(project_name, code, file_name):
152
- project_path = os.path.join(PROJECT_ROOT, project_name)
153
- if not os.path.exists(project_path):
154
- return f"Project '{project_name}' does not exist."
155
-
156
- file_path = os.path.join(project_path, file_name)
157
- with open(file_path, "w") as file:
158
- file.write(code)
159
- st.session_state.workspace_projects[project_name]['files'].append(file_name)
160
- return f"Code added to '{file_name}' in project '{project_name}'."
161
-
162
- # Chat interface (Hugging Face version)
163
- def chat_interface(input_text):
164
- # Use a Hugging Face model for chat
165
- # Example: Using the 'google/flan-t5-xl' model
166
- generator = pipeline("text-generation", model="google/flan-t5-xl", use_auth_token=HF_API_KEY)
167
- response = generator(input_text, max_length=150, num_return_sequences=1, do_sample=True)
168
- return response[0]['generated_text']
169
-
170
- # Streamlit App
171
- st.title("AI Agent Creator")
172
-
173
- # Sidebar navigation
174
- st.sidebar.title("Navigation")
175
- app_mode = st.sidebar.selectbox("Choose the app mode", ["AI Agent Creator", "Tool Box", "Workspace Chat App"])
176
-
177
- if app_mode == "AI Agent Creator":
178
- # AI Agent Creator
179
- st.header("Create an AI Agent from Text")
180
-
181
- st.subheader("From Text")
182
- agent_name = st.text_input("Enter agent name:")
183
- text_input = st.text_area("Enter skills (one per line):")
184
- if st.button("Create Agent"):
185
- agent_prompt = create_agent_from_text(agent_name, text_input)
186
- st.success(f"Agent '{agent_name}' created and saved successfully.")
187
- st.session_state.available_agents.append(agent_name)
188
-
189
- elif app_mode == "Tool Box":
190
- # Tool Box
191
- st.header("AI-Powered Tools")
192
-
193
- # Chat Interface
194
- st.subheader("Chat with CodeCraft")
195
- chat_input = st.text_area("Enter your message:")
196
- if st.button("Send"):
197
- chat_response = chat_interface(chat_input)
198
- st.session_state.chat_history.append((chat_input, chat_response))
199
- st.write(f"CodeCraft: {chat_response}")
200
-
201
- # Terminal Interface
202
- st.subheader("Terminal")
203
- terminal_input = st.text_input("Enter a command:")
204
- if st.button("Run"):
205
- terminal_output = terminal_interface(terminal_input)
206
- st.session_state.terminal_history.append((terminal_input, terminal_output))
207
- st.code(terminal_output, language="bash")
208
-
209
- # Code Editor Interface
210
- st.subheader("Code Editor")
211
- code_editor = st.text_area("Write your code:", height=300)
212
- if st.button("Format & Lint"):
213
- formatted_code, lint_message = code_editor_interface(code_editor)
214
- st.code(formatted_code, language="python")
215
- st.info(lint_message)
216
-
217
- # Text Summarization Tool
218
- st.subheader("Summarize Text")
219
- text_to_summarize = st.text_area("Enter text to summarize:")
220
- if st.button("Summarize"):
221
- summary = summarize_text(text_to_summarize)
222
- st.write(f"Summary: {summary}")
223
-
224
- # Sentiment Analysis Tool
225
- st.subheader("Sentiment Analysis")
226
- sentiment_text = st.text_area("Enter text for sentiment analysis:")
227
- if st.button("Analyze Sentiment"):
228
- sentiment = sentiment_analysis(sentiment_text)
229
- st.write(f"Sentiment: {sentiment}")
230
-
231
- # Text Translation Tool (Code Translation)
232
- st.subheader("Translate Code")
233
- code_to_translate = st.text_area("Enter code to translate:")
234
- source_language = st.text_input("Enter source language (e.g., 'Python'):")
235
- target_language = st.text_input("Enter target language (e.g., 'JavaScript'):")
236
- if st.button("Translate Code"):
237
- translated_code = translate_code(code_to_translate, source_language, target_language)
238
- st.code(translated_code, language=target_language.lower())
239
-
240
- # Code Generation
241
- st.subheader("Code Generation")
242
- code_idea = st.text_input("Enter your code idea:")
243
- if st.button("Generate Code"):
244
- generated_code = generate_code(code_idea)
245
- st.code(generated_code, language="python")
246
-
247
- elif app_mode == "Workspace Chat App":
248
- # Workspace Chat App
249
- st.header("Workspace Chat App")
250
-
251
- # Project Workspace Creation
252
- st.subheader("Create a New Project")
253
- project_name = st.text_input("Enter project name:")
254
- if st.button("Create Project"):
255
- workspace_status = workspace_interface(project_name)
256
- st.success(workspace_status)
257
-
258
- # Add Code to Workspace
259
- st.subheader("Add Code to Workspace")
260
- code_to_add = st.text_area("Enter code to add to workspace:")
261
- file_name = st.text_input("Enter file name (e.g., 'app.py'):")
262
- if st.button("Add Code"):
263
- add_code_status = add_code_to_workspace(project_name, code_to_add, file_name)
264
- st.success(add_code_status)
265
-
266
- # Terminal Interface with Project Context
267
- st.subheader("Terminal (Workspace Context)")
268
- terminal_input = st.text_input("Enter a command within the workspace:")
269
- if st.button("Run Command"):
270
- terminal_output = terminal_interface(terminal_input, project_name)
271
- st.code(terminal_output, language="bash")
272
-
273
- # Chat Interface for Guidance
274
- st.subheader("Chat with CodeCraft for Guidance")
275
- chat_input = st.text_area("Enter your message for guidance:")
276
- if st.button("Get Guidance"):
277
- chat_response = chat_interface(chat_input)
278
- st.session_state.chat_history.append((chat_input, chat_response))
279
- st.write(f"CodeCraft: {chat_response}")
280
-
281
- # Display Chat History
282
- st.subheader("Chat History")
283
- for user_input, response in st.session_state.chat_history:
284
- st.write(f"User: {user_input}")
285
- st.write(f"CodeCraft: {response}")
286
-
287
- # Display Terminal History
288
- st.subheader("Terminal History")
289
- for command, output in st.session_state.terminal_history:
290
- st.write(f"Command: {command}")
291
- st.code(output, language="bash")
292
-
293
- # Display Projects and Files
294
- st.subheader("Workspace Projects")
295
- for project, details in st.session_state.workspace_projects.items():
296
- st.write(f"Project: {project}")
297
- for file in details['files']:
298
- st.write(f" - {file}")
299
-
300
- # Chat with AI Agents
301
- st.subheader("Chat with AI Agents")
302
- selected_agent = st.selectbox("Select an AI agent", st.session_state.available_agents)
303
- agent_chat_input = st.text_area("Enter your message for the agent:")
304
- if st.button("Send to Agent"):
305
- agent_chat_response = chat_interface_with_agent(agent_chat_input, selected_agent)
306
- st.session_state.chat_history.append((agent_chat_input, agent_chat_response))
307
- st.write(f"{selected_agent}: {agent_chat_response}")
308
-
309
- # Automate Build Process
310
- st.subheader("Automate Build Process")
311
- if st.button("Automate"):
312
- agent = AIAgent(selected_agent, "", []) # Load the agent without skills for now
313
- summary, next_step = agent.autonomous_build(st.session_state.chat_history, st.session_state.workspace_projects)
314
- st.write("Autonomous Build Summary:")
315
- st.write(summary)
316
- st.write("Next Step:")
317
- st.write(next_step)
 
 
 
 
 
 
 
 
1
+ import requests
2
+ from bs4 import BeautifulSoup
3
+ import pandas as pd
4
+ import numpy as np
5
+ import matplotlib.pyplot as plt
6
+ import seaborn as sns
7
+ from datetime import datetime
8
+ from nltk.corpus import stopwords
9
+ from nltk.stem import WordNetLemmatizer
10
+ from nltk.tokenize import word_tokenize
11
+ from gensim.models import LdaModel
12
+ from gensim.corpora import Dictionary
13
+ from textblob import TextBlob
14
+ from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
15
+ import networkx as nx
16
+ from sklearn.model_selection import train_test_split
17
+ from sklearn.linear_model import LogisticRegression
18
+ from sklearn.ensemble import RandomForestClassifier
19
+ from sklearn.metrics import accuracy_score, classification_report, roc_auc_score
20
+ from sklearn.preprocessing import StandardScaler
21
+ from sklearn.pipeline import Pipeline
22
+ from sklearn.feature_extraction.text import TfidfVectorizer
23
+ import plotly.graph_objects as go
24
+ from collections import Counter
25
+ import warnings
26
+ warnings.filterwarnings("ignore")
27
+
28
+ # Set up logging
29
+ import logging
30
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
31
+
32
+ # Function to fetch HTML content from GitHub issue pages
33
+ def fetch_issue_data(username, repository, start_page, end_page):
34
+ issues_data = []
35
+ for page in range(start_page, end_page + 1):
36
+ url = f"https://github.com/{username}/{repository}/issues?page={page}"
37
+ response = requests.get(url)
38
+ soup = BeautifulSoup(response.content, 'html.parser')
39
+ issue_elements = soup.find_all('div', class_='flex-shrink-0')
40
+ for issue_element in issue_elements:
41
+ issue_link = issue_element.find('a', class_='Link--primary')['href']
42
+ issue_url = f"https://github.com{issue_link}"
43
+ issue_data = fetch_issue_details(issue_url)
44
+ issues_data.append(issue_data)
45
+ return issues_data
46
+
47
+ # Function to fetch details of a specific issue
48
+ def fetch_issue_details(issue_url):
49
+ response = requests.get(issue_url)
50
+ soup = BeautifulSoup(response.content, 'html.parser')
51
+ issue_title = soup.find('h1', class_='gh-header-title').text.strip()
52
+ issue_body = soup.find('div', class_='markdown-body').text.strip()
53
+ issue_created_at = soup.find('relative-time')['datetime']
54
+ issue_closed_at = soup.find('relative-time', class_='no-wrap')
55
+ if issue_closed_at:
56
+ issue_closed_at = issue_closed_at['datetime']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  else:
58
+ issue_closed_at = None
59
+ issue_author = soup.find('a', class_='author').text.strip()
60
+ issue_assignee = soup.find('a', class_='Link--muted')
61
+ if issue_assignee:
62
+ issue_assignee = issue_assignee.text.strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  else:
64
+ issue_assignee = None
65
+ return {
66
+ 'title': issue_title,
67
+ 'body': issue_body,
68
+ 'created_at': issue_created_at,
69
+ 'closed_at': issue_closed_at,
70
+ 'author': issue_author,
71
+ 'assignee': issue_assignee
72
+ }
73
+
74
+ # Function to clean and structure the data
75
+ def clean_and_structure_data(issues_data):
76
+ df = pd.DataFrame(issues_data)
77
+ df['created_at'] = pd.to_datetime(df['created_at'])
78
+ df['closed_at'] = pd.to_datetime(df['closed_at'])
79
+ df['resolution_time'] = (df['closed_at'] - df['created_at']).dt.days
80
+ df['resolution_time'] = df['resolution_time'].fillna(-1)
81
+ df['is_closed'] = (df['closed_at'].notna()).astype(int)
82
+ return df
83
+
84
+ # Function for exploratory data analysis (EDA)
85
+ def perform_eda(df):
86
+ # Descriptive statistics
87
+ print("Descriptive Statistics:")
88
+ print(df.describe())
89
+
90
+ # Visualizations
91
+ plt.figure(figsize=(10, 6))
92
+ sns.histplot(df['resolution_time'], kde=True)
93
+ plt.title('Distribution of Issue Resolution Time')
94
+ plt.xlabel('Resolution Time (Days)')
95
+ plt.ylabel('Frequency')
96
+ plt.show()
97
+
98
+ # Trend analysis
99
+ df['created_at_month'] = df['created_at'].dt.month
100
+ plt.figure(figsize=(10, 6))
101
+ sns.lineplot(x='created_at_month', y='resolution_time', data=df)
102
+ plt.title('Trend of Issue Resolution Time Over Months')
103
+ plt.xlabel('Month')
104
+ plt.ylabel('Resolution Time (Days)')
105
+ plt.show()
106
+
107
+ # Top Authors and Assignees
108
+ top_authors = df['author'].value_counts().nlargest(10)
109
+ top_assignees = df['assignee'].value_counts().nlargest(10)
110
+ print("\nTop 10 Authors:")
111
+ print(top_authors)
112
+ print("\nTop 10 Assignees:")
113
+ print(top_assignees)
114
+
115
+ # Function for text analysis using NLP
116
+ def analyze_text_content(df):
117
+ # Text preprocessing
118
+ stop_words = set(stopwords.words('english'))
119
+ lemmatizer = WordNetLemmatizer()
120
+ df['processed_body'] = df['body'].apply(lambda text: ' '.join([lemmatizer.lemmatize(word) for word in word_tokenize(text) if word.lower() not in stop_words]))
121
+
122
+ # Topic modeling
123
+ dictionary = Dictionary([word_tokenize(text) for text in df['processed_body']])
124
+ corpus = [dictionary.doc2bow(word_tokenize(text)) for text in df['processed_body']]
125
+ lda_model = LdaModel(corpus, num_topics=5, id2word=dictionary)
126
+ print("Top 5 Topics:")
127
+ for topic in lda_model.print_topics(num_words=5):
128
+ print(topic)
129
+
130
+ # Sentiment analysis
131
+ analyzer = SentimentIntensityAnalyzer()
132
+ df['sentiment'] = df['body'].apply(lambda text: analyzer.polarity_scores(text)['compound'])
133
+ print("Sentiment Analysis:")
134
+ print(df['sentiment'].describe())
135
+
136
+ # Word Cloud for Common Words
137
+ from wordcloud import WordCloud
138
+ all_words = ' '.join([text for text in df['processed_body']])
139
+ wordcloud = WordCloud(width=800, height=400, background_color='white').generate(all_words)
140
+ plt.figure(figsize=(10, 6), facecolor=None)
141
+ plt.imshow(wordcloud)
142
+ plt.axis("off")
143
+ plt.tight_layout(pad=0)
144
+ plt.show()
145
+
146
+ # Function to create a network graph of issues, authors, and assignees
147
+ def create_network_graph(df):
148
+ graph = nx.Graph()
149
+ for index, row in df.iterrows():
150
+ graph.add_node(row['title'], type='issue')
151
+ graph.add_node(row['author'], type='author')
152
+ if row['assignee']:
153
+ graph.add_node(row['assignee'], type='assignee')
154
+ graph.add_edge(row['title'], row['author'])
155
+ if row['assignee']:
156
+ graph.add_edge(row['title'], row['assignee'])
157
+
158
+ # Interactive Network Graph with Plotly
159
+ pos = nx.spring_layout(graph, k=0.5)
160
+ edge_x = []
161
+ edge_y = []
162
+ for edge in graph.edges():
163
+ x0, y0 = pos[edge[0]]
164
+ x1, y1 = pos[edge[1]]
165
+ edge_x.append([x0, x1, None])
166
+ edge_y.append([y0, y1, None])
167
+
168
+ edge_trace = go.Scatter(
169
+ x=edge_x,
170
+ y=edge_y,
171
+ line=dict(width=0.5, color='#888'),
172
+ hoverinfo='none',
173
+ mode='lines'
174
+ )
175
+
176
+ node_x = []
177
+ node_y = []
178
+ for node in graph.nodes():
179
+ x, y = pos[node]
180
+ node_x.append(x)
181
+ node_y.append(y)
182
+
183
+ node_trace = go.Scatter(
184
+ x=node_x,
185
+ y=node_y,
186
+ mode='markers',
187
+ marker=dict(
188
+ color=[],
189
+ size=10,
190
+ line=dict(width=2, color='black')
191
+ ),
192
+ text=[],
193
+ hoverinfo='text'
194
+ )
195
+
196
+ # Set node colors based on type
197
+ node_colors = []
198
+ for node in graph.nodes():
199
+ if graph.nodes[node]['type'] == 'issue':
200
+ node_colors.append('red')
201
+ elif graph.nodes[node]['type'] == 'author':
202
+ node_colors.append('blue')
203
+ else:
204
+ node_colors.append('green')
205
+
206
+ # Set node labels
207
+ node_labels = []
208
+ for node in graph.nodes():
209
+ node_labels.append(node)
210
+
211
+ node_trace.marker.color = node_colors
212
+ node_trace.text = node_labels
213
+
214
+ # Create the figure
215
+ fig = go.Figure(data=[edge_trace, node_trace],
216
+ layout=go.Layout(
217
+ title="GitHub Issue Network Graph",
218
+ showlegend=False,
219
+ hovermode='closest',
220
+ margin=dict(b=20, l=5, r=5, t=40),
221
+ xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
222
+ yaxis=dict(showgrid=False, zeroline=False, showticklabels=False)
223
+ )
224
+ )
225
+
226
+ fig.show()
227
+
228
+ # Function to build a predictive model for issue resolution time
229
+ def build_predictive_model(df):
230
+ # Feature engineering
231
+ df['created_at_day'] = df['created_at'].dt.day
232
+ df['created_at_weekday'] = df['created_at'].dt.weekday
233
+ df['created_at_hour'] = df['created_at'].dt.hour
234
+ df['author_encoded'] = df['author'].astype('category').cat.codes
235
+ df['assignee_encoded'] = df['assignee'].astype('category').cat.codes
236
+
237
+ # Select features and target variable
238
+ features = ['created_at_day', 'created_at_weekday', 'created_at_hour', 'author_encoded', 'assignee_encoded', 'sentiment']
239
+ target = 'resolution_time'
240
+
241
+ # Split data into training and testing sets
242
+ X_train, X_test, y_train, y_test = train_test_split(df[features], df[target], test_size=0.2, random_state=42)
243
+
244
+ # Create a pipeline for feature scaling and model training
245
+ pipeline = Pipeline([
246
+ ('scaler', StandardScaler()),
247
+ ('model', RandomForestClassifier(random_state=42))
248
+ ])
249
+
250
+ # Train the model
251
+ pipeline.fit(X_train, y_train)
252
+
253
+ # Evaluate the model
254
+ y_pred = pipeline.predict(X_test)
255
+ accuracy = accuracy_score(y_test, y_pred)
256
+ print("Accuracy:", accuracy)
257
+ print(classification_report(y_test, y_pred))
258
+
259
+ # Make predictions on new data
260
+ # ...
261
+
262
+ # Main function
263
+ if __name__ == "__main__":
264
+ # Replace with your GitHub username and repository name
265
+ username = "miagiii"
266
+ repository = "miagiii"
267
+
268
+ # Fetch issue data from GitHub
269
+ issues_data = fetch_issue_data(username, repository, 1, 10) # Fetch issues from pages 1 to 10
270
+
271
+ # Clean and structure the data
272
+ df = clean_and_structure_data(issues_data)
273
+
274
+ # Perform exploratory data analysis (EDA)
275
+ perform_eda(df)
276
+
277
+ # Analyze text content using NLP
278
+ analyze_text_content(df)
279
+
280
+ # Create a network graph of issues, authors, and assignees
281
+ create_network_graph(df)
282
+
283
+ # Build a predictive model for issue resolution time
284
+ build_predictive_model(df)