diff --git a/.gitignore b/.gitignore index 93a18c4943..4c925f739e 100644 --- a/.gitignore +++ b/.gitignore @@ -188,3 +188,5 @@ local_cache notebook/result.png samples/apps/autogen-studio/autogenstudio/models/test/ + +notebook/coding diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8fa68e0e34..fcea09223c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -43,6 +43,7 @@ repos: website/static/img/ag.svg | website/yarn.lock | website/docs/tutorial/code-executors.ipynb | + website/docs/topics/code-execution/custom-executor.ipynb | website/docs/topics/non-openai-models/cloud-gemini.ipynb | notebook/.* )$ diff --git a/notebook/agentchat_agentoptimizer.ipynb b/notebook/agentchat_agentoptimizer.ipynb index 924f1a5573..13df0a0d77 100644 --- a/notebook/agentchat_agentoptimizer.ipynb +++ b/notebook/agentchat_agentoptimizer.ipynb @@ -1,467 +1,466 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "front_matter": { - "description": "AgentOptimizer is able to prompt LLMs to iteratively optimize function/skills of AutoGen agents according to the historical conversation and performance.", - "tags": [ - "optimization", - "tool/function" - ] - } - }, - "source": [ - "# AgentOptimizer: An Agentic Way to Train Your LLM Agent\n", - "\n", - "AutoGen offers conversable agents powered by LLM, tool, or human, which can be used to perform tasks collectively via automated chat. This framework allows tool use and human participation through multi-agent conversation.\n", - "Please find documentation about this feature [here](https://microsoft.github.io/autogen/docs/Use-Cases/agent_chat).\n", - "\n", - "In traditional ML pipeline, we train a model by updating its parameter according to the loss on the training set, while in the era of LLM agents, how should we train an agent? Here, we take an initial step towards the agent training. Inspired by the [function calling](https://platform.openai.com/docs/guides/function-calling) capabilities provided by OpenAI, we draw an analogy between model parameters and agent functions/skills, and update agent’s functions/skills based on its historical performance on the training set. As an agentic way of training an agent, our approach help enhance the agents’ abilities without requiring access to the LLMs parameters.\n", - "\n", - "In this notebook, we introduce a new class, ‘AgentOptimizer’, which is able to improve the function list of one Assistant-UserProxy pair according to the historical conversation histories.\n", - "This feature would support agents in improving their ability to solve problems of the same type as previous tasks.\n", - "Specifically, given a set of training data, AgentOptimizer would iteratively prompt the LLM to optimize the existing function list of the AssistantAgent and UserProxyAgent with code implementation if necessary. It also includes two strategies, roll-back, and early-stop, to streamline the training process.\n", - "In the example scenario, we test the proposed AgentOptimizer in solving problems from the [MATH dataset](https://github.com/hendrycks/math). \n", - "\n", - "![AgentEval](../website/blog/2023-12-23-AgentOptimizer/img/agentoptimizer.png)\n", - "\n", - "More information could be found in the [paper](https://arxiv.org/abs/2402.11359).\n", - "\n", - "Authors:\n", - "- [Shaokun Zhang](https://github.com/skzhang1), Ph.D. student at the The Pennsylvania State University\n", - "- [Jieyu Zhang](https://jieyuz2.github.io), Ph.D. student at the University of Washington" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "import copy\n", - "import json\n", - "import os\n", - "from typing import Any, Callable, Dict, List, Optional, Tuple, Union\n", - "\n", - "from openai import BadRequestError\n", - "\n", - "import autogen\n", - "from autogen import config_list_from_json\n", - "from autogen.agentchat import Agent\n", - "from autogen.agentchat.contrib.agent_optimizer import AgentOptimizer\n", - "from autogen.agentchat.contrib.math_user_proxy_agent import MathUserProxyAgent\n", - "from autogen.code_utils import extract_code\n", - "from autogen.math_utils import get_answer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# MathUserProxy with function_call\n", - "\n", - "This agent is a customized MathUserProxy inherits from its [partent class](https://github.com/microsoft/autogen/blob/main/autogen/agentchat/contrib/math_user_proxy_agent.py).\n", - "\n", - "It supports using both function_call and python to solve math problems.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def is_termination_msg_mathchat(message):\n", - " \"\"\"Check if a message is a termination message.\"\"\"\n", - " if isinstance(message, dict):\n", - " message = message.get(\"content\")\n", - " if message is None:\n", - " return False\n", - " cb = extract_code(message)\n", - " contain_code = False\n", - " for c in cb:\n", - " if c[0] == \"python\":\n", - " contain_code = True\n", - " break\n", - " if message.rstrip().find(\"TERMINATE\") >= 0:\n", - " return True\n", - " return not contain_code and get_answer(message) is not None and get_answer(message) != \"\"\n", - "\n", - "\n", - "class MathUserProxyAgent(MathUserProxyAgent):\n", - " MAX_CONSECUTIVE_AUTO_REPLY = 15\n", - " DEFAULT_REPLY = \"Continue. Please keep solving the problem until you need to query. (If you get to the answer, put it in \\\\boxed{}.)\"\n", - " PROMPTS = \"\"\"Let's solve a math problem.\n", - "Query requirements:\n", - "You should always use the 'print' function for the output and use fractions/radical forms instead of decimals.\n", - "You can use packages like sympy to help you.\n", - "You must follow the formats below to write your code:\n", - "```python\n", - "# your code\n", - "```\n", - "If some packages are missing, you could also suggest a code to install the corresponding package.\n", - "\n", - "Please follow this process:\n", - "1. Solve the problem step by step (do not over-divide the steps).\n", - "2. Take out any queries that can be asked through Python code (for example, any calculations or equations that can be calculated) and functions you know in the context of this conversation.\n", - "\n", - "Please\n", - "(1) do not mix suggested Python codes and function calls in one step.\n", - "(2) You MUST remember that you don’t have a function named \"python\" available.\n", - "\n", - "You must follow the formats below to write your Python code:\n", - "```python\n", - "# your code\n", - "```\n", - "\n", - "3. Wait for me to give the results or wait for the executed results of the function call.\n", - "4. Continue if you think the result is correct. If the result is invalid or unexpected, please correct your query or reasoning.\n", - "\n", - "After all the queries are run and you get the answer, put the answer in \\\\boxed{}.\n", - "\n", - "Problem:\n", - "\"\"\"\n", - "\n", - " def __init__(\n", - " self,\n", - " name: Optional[str] = \"MathChatAgent\",\n", - " is_termination_msg: Optional[Callable[[Dict], bool]] = is_termination_msg_mathchat,\n", - " human_input_mode: Optional[str] = \"NEVER\",\n", - " default_auto_reply: Optional[Union[str, Dict, None]] = DEFAULT_REPLY,\n", - " max_invalid_q_per_step=3,\n", - " **kwargs,\n", - " ):\n", - " super().__init__(\n", - " name=name,\n", - " is_termination_msg=is_termination_msg,\n", - " human_input_mode=human_input_mode,\n", - " default_auto_reply=default_auto_reply,\n", - " max_invalid_q_per_step=max_invalid_q_per_step,\n", - " **kwargs,\n", - " )\n", - " del self._reply_func_list[2]\n", - " self.register_reply([Agent, None], MathUserProxyAgent._generate_math_reply, position=4)\n", - " del self._reply_func_list[3]\n", - " self.register_reply(\n", - " trigger=autogen.ConversableAgent, reply_func=MathUserProxyAgent.generate_function_call_reply, position=3\n", - " )\n", - " self.register_reply(\n", - " trigger=autogen.ConversableAgent, reply_func=MathUserProxyAgent._check_final_result, position=0\n", - " )\n", - "\n", - " self.max_function_call_trial = 3\n", - " self.query = None\n", - " self.answer = None\n", - " self.is_correct = None\n", - "\n", - " def generate_function_call_reply(\n", - " self,\n", - " messages: Optional[List[Dict]] = None,\n", - " sender: Optional[autogen.ConversableAgent] = None,\n", - " config: Optional[Any] = None,\n", - " ) -> Tuple[bool, Union[Dict, None]]:\n", - " \"\"\"Generate a reply using function call.\"\"\"\n", - " if messages is None:\n", - " messages = self._oai_messages[sender]\n", - " message = messages[-1]\n", - " if \"function_call\" in message:\n", - " is_exec_success, func_return = self.execute_function(message[\"function_call\"])\n", - " if is_exec_success:\n", - " self.max_function_call_trial = 3\n", - " return True, func_return\n", - " else:\n", - " if self.max_function_call_trial == 0:\n", - " error_message = func_return[\"content\"]\n", - " self.max_function_call_trial = 3\n", - " return (\n", - " True,\n", - " \"The func is executed failed many times. \"\n", - " + error_message\n", - " + \". Please directly reply me with TERMINATE. We need to terminate the conversation.\",\n", - " )\n", - " else:\n", - " revise_prompt = \"You may make a wrong function call (It may due the arguments you provided doesn't fit the function arguments like missing required positional argument). \\\n", - " If you think this error occurs due to you make a wrong function arguments input and you could make it success, please try to call this function again using the correct arguments. \\\n", - " Otherwise, the error may be caused by the function itself. Please directly reply me with TERMINATE. We need to terminate the conversation. \"\n", - " error_message = func_return[\"content\"]\n", - " return True, \"The func is executed failed.\" + error_message + revise_prompt\n", - " return False, None\n", - "\n", - " def initiate_chat(\n", - " self,\n", - " recipient,\n", - " answer: None,\n", - " silent: Optional[bool] = False,\n", - " **context,\n", - " ):\n", - " self.query = context[\"problem\"]\n", - " if not isinstance(answer, str):\n", - " answer = str(answer)\n", - " if answer.endswith(\".0\"):\n", - " answer = answer[:-2]\n", - " self._answer = answer\n", - " else:\n", - " self._answer = answer\n", - "\n", - " self.is_correct = None\n", - "\n", - " self._prepare_chat(recipient, True)\n", - " error_message = None\n", - " try:\n", - " prompt = self.PROMPTS + context[\"problem\"]\n", - " self.send(prompt, recipient, silent=silent)\n", - " except BadRequestError as e:\n", - " error_message = str(e)\n", - " self.is_correct = 0\n", - " print(\"error information: {}\".format(error_message))\n", - "\n", - " recipient.reset()\n", - " is_correct = copy.deepcopy(self.is_correct)\n", - " self._reset()\n", - " return is_correct\n", - "\n", - " def _check_final_result(\n", - " self,\n", - " messages: Optional[List[Dict]] = None,\n", - " sender: Optional[autogen.Agent] = None,\n", - " config: Optional[Any] = None,\n", - " ):\n", - "\n", - " messages = messages[-1]\n", - " if isinstance(messages, dict):\n", - " messages = messages.get(\"content\")\n", - " if messages is None:\n", - " return False, None\n", - "\n", - " cb = extract_code(messages)\n", - " contain_code = False\n", - " for c in cb:\n", - " if c[0] == \"python\":\n", - " contain_code = True\n", - " break\n", - " if not contain_code and get_answer(messages) is not None and get_answer(messages) != \"\":\n", - " if get_answer(messages) == self._answer:\n", - " self.is_correct = 1\n", - " return True, \"The result is Correct. Please reply me with TERMINATE.\"\n", - " else:\n", - " self.is_correct = 0\n", - " return False, None\n", - " else:\n", - " return False, None\n", - "\n", - " def _reset(self):\n", - " super()._reset()\n", - " self.max_function_call_trial = 3\n", - " self.is_correct = None\n", - " self.query = None\n", - " self.answer = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Load dataset\n", - "\n", - "MATAH dataset contains 12,500 challenging competition mathematics problems. Each problem in MATH has a full step-by-step solution which can be used to teach models to generate answer derivations and explanations. \n", - "\n", - "We strictly follow the [train](https://github.com/lifan-yuan/CRAFT/blob/main/tab_and_math/MATH/dataset/train/algebra.jsonl)/[test](https://github.com/lifan-yuan/CRAFT/blob/main/tab_and_math/MATH/dataset/algebra.jsonl) splits of [Craft](https://github.com/lifan-yuan/CRAFT). Please specific your own path to the dataset. Here we sample the first 10 algebra problems as examples. " - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "test_data, train_data = [], []\n", - "with open(\"MATH/dataset/algebra.jsonl\", \"r\", encoding=\"utf-8\") as f:\n", - " for line in f:\n", - " test_data.append(json.loads(line))\n", - "with open(\"MATH/dataset/train/algebra.jsonl\", \"r\", encoding=\"utf-8\") as f:\n", - " for line in f:\n", - " train_data.append(json.loads(line))\n", - "test_data, train_data = test_data[0:10], train_data[0:10]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Agents construction\n", - "\n", - "Constructing MathUserProxyAgent and AssistantAgent used in solving these problems. Here, we use gpt-4-1106-preview to construct the AssistantAgent. " - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "llm_config = {\n", - " \"config_list\": [\n", - " {\n", - " \"model\": \"gpt-4-1106-preview\",\n", - " \"api_type\": \"azure\",\n", - " \"api_key\": os.environ[\"AZURE_OPENAI_API_KEY\"],\n", - " \"base_url\": \"https://ENDPOINT.openai.azure.com/\",\n", - " \"api_version\": \"2023-07-01-preview\",\n", - " }\n", - " ]\n", - "}\n", - "\n", - "assistant = autogen.AssistantAgent(\n", - " name=\"assistant\",\n", - " system_message=\"You are a helpful assistant.\",\n", - " llm_config=llm_config,\n", - ")\n", - "user_proxy = MathUserProxyAgent(\n", - " name=\"mathproxyagent\",\n", - " human_input_mode=\"NEVER\",\n", - " code_execution_config={\"work_dir\": \"_output\", \"use_docker\": False},\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test without agent optimizations \n", - "\n", - "Below is the code to get the performance without the agents optimization process. \n", - "\n", - "In this case, the AssistantAgent and MathUserProxyAgent don't have any function calls but solely solve problems with Python." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sum = 0\n", - "for index, query in enumerate(test_data):\n", - " is_correct = user_proxy.initiate_chat(recipient=assistant, answer=query[\"answer\"], problem=query[\"question\"])\n", - " print(is_correct)\n", - " sum += is_correct\n", - "success_rate_without_agent_training = sum / 10" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Agent Training \n", - "\n", - "Then, we use the AgentOptimizer to iteratively optimize the agents by optimizing the function calls according to the historical conversations and performance.\n", - "The AgentOptimizer yields register_for_llm and register_for_executor at each iteration, which are subsequently utilized to update the assistant and user_proxy agents, respectively. \n", - "Here we optimize these two agents for ten epochs. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "EPOCH = 10\n", - "optimizer_model = \"gpt-4-1106-preview\"\n", - "optimizer = AgentOptimizer(max_actions_per_step=3, llm_config=llm_config, optimizer_model=optimizer_model)\n", - "for i in range(EPOCH):\n", - " for index, query in enumerate(train_data):\n", - " is_correct = user_proxy.initiate_chat(assistant, answer=query[\"answer\"], problem=query[\"question\"])\n", - " history = assistant.chat_messages_for_summary(user_proxy)\n", - " optimizer.record_one_conversation(history, is_satisfied=is_correct)\n", - " register_for_llm, register_for_exector = optimizer.step()\n", - " for item in register_for_llm:\n", - " assistant.update_function_signature(**item)\n", - " if len(register_for_exector.keys()) > 0:\n", - " user_proxy.register_function(function_map=register_for_exector)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test with agent optimizations \n", - "\n", - "After agent optimization, the agents obtained a list of functions from the AgentOptimizers after 10 optimization iterations as shown below.\n", - "\n", - "We then show the final performances with/without the agent optimization process. We observe the agents after optimization are obviously better.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sum = 0\n", - "for index, query in enumerate(test_data):\n", - " is_correct = user_proxy.initiate_chat(recipient=assistant, answer=query[\"answer\"], problem=query[\"question\"])\n", - " sum += is_correct\n", - "success_rate_with_agent_training = sum / 10" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------------------------------------------Functions learned------------------------------------------------\n", - "evaluate_expression: Evaluate arithmetic or mathematical expressions provided as strings.\n", - "\n", - "calculate_compound_interest_principal: Calculate the principal amount needed to achieve a certain future value with quarterly compound interest.\n", - "\n", - "solve_linear_system: Solve a system of linear equations represented as coefficients and variables.\n", - "\n", - "------------------------------------------------Summary------------------------------------------------\n", - "\n", - "success_rate_without_agent_training: 60.0%\n", - "\n", - "success_rate_with_agent_training: 90.0%\n", - "\n" - ] + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AgentOptimizer: An Agentic Way to Train Your LLM Agent\n", + "\n", + "AutoGen offers conversable agents powered by LLM, tool, or human, which can be used to perform tasks collectively via automated chat. This framework allows tool use and human participation through multi-agent conversation.\n", + "Please find documentation about this feature [here](https://microsoft.github.io/autogen/docs/Use-Cases/agent_chat).\n", + "\n", + "In traditional ML pipeline, we train a model by updating its parameter according to the loss on the training set, while in the era of LLM agents, how should we train an agent? Here, we take an initial step towards the agent training. Inspired by the [function calling](https://platform.openai.com/docs/guides/function-calling) capabilities provided by OpenAI, we draw an analogy between model parameters and agent functions/skills, and update agent’s functions/skills based on its historical performance on the training set. As an agentic way of training an agent, our approach help enhance the agents’ abilities without requiring access to the LLMs parameters.\n", + "\n", + "In this notebook, we introduce a new class, ‘AgentOptimizer’, which is able to improve the function list of one Assistant-UserProxy pair according to the historical conversation histories.\n", + "This feature would support agents in improving their ability to solve problems of the same type as previous tasks.\n", + "Specifically, given a set of training data, AgentOptimizer would iteratively prompt the LLM to optimize the existing function list of the AssistantAgent and UserProxyAgent with code implementation if necessary. It also includes two strategies, roll-back, and early-stop, to streamline the training process.\n", + "In the example scenario, we test the proposed AgentOptimizer in solving problems from the [MATH dataset](https://github.com/hendrycks/math). \n", + "\n", + "![AgentOptimizer](../website/blog/2023-12-23-AgentOptimizer/img/agentoptimizer.png)\n", + "\n", + "More information could be found in the [paper](https://arxiv.org/abs/2402.11359).\n", + "\n", + "Authors:\n", + "- [Shaokun Zhang](https://github.com/skzhang1), Ph.D. student at the The Pennsylvania State University\n", + "- [Jieyu Zhang](https://jieyuz2.github.io), Ph.D. student at the University of Washington" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "import copy\n", + "import json\n", + "import os\n", + "from typing import Any, Callable, Dict, List, Optional, Tuple, Union\n", + "\n", + "from openai import BadRequestError\n", + "\n", + "import autogen\n", + "from autogen import config_list_from_json\n", + "from autogen.agentchat import Agent\n", + "from autogen.agentchat.contrib.agent_optimizer import AgentOptimizer\n", + "from autogen.agentchat.contrib.math_user_proxy_agent import MathUserProxyAgent\n", + "from autogen.code_utils import extract_code\n", + "from autogen.math_utils import get_answer" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# MathUserProxy with function_call\n", + "\n", + "This agent is a customized MathUserProxy inherits from its [partent class](https://github.com/microsoft/autogen/blob/main/autogen/agentchat/contrib/math_user_proxy_agent.py).\n", + "\n", + "It supports using both function_call and python to solve math problems.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def is_termination_msg_mathchat(message):\n", + " \"\"\"Check if a message is a termination message.\"\"\"\n", + " if isinstance(message, dict):\n", + " message = message.get(\"content\")\n", + " if message is None:\n", + " return False\n", + " cb = extract_code(message)\n", + " contain_code = False\n", + " for c in cb:\n", + " if c[0] == \"python\":\n", + " contain_code = True\n", + " break\n", + " if message.rstrip().find(\"TERMINATE\") >= 0:\n", + " return True\n", + " return not contain_code and get_answer(message) is not None and get_answer(message) != \"\"\n", + "\n", + "\n", + "class MathUserProxyAgent(MathUserProxyAgent):\n", + " MAX_CONSECUTIVE_AUTO_REPLY = 15\n", + " DEFAULT_REPLY = \"Continue. Please keep solving the problem until you need to query. (If you get to the answer, put it in \\\\boxed{}.)\"\n", + " PROMPTS = \"\"\"Let's solve a math problem.\n", + "Query requirements:\n", + "You should always use the 'print' function for the output and use fractions/radical forms instead of decimals.\n", + "You can use packages like sympy to help you.\n", + "You must follow the formats below to write your code:\n", + "```python\n", + "# your code\n", + "```\n", + "If some packages are missing, you could also suggest a code to install the corresponding package.\n", + "\n", + "Please follow this process:\n", + "1. Solve the problem step by step (do not over-divide the steps).\n", + "2. Take out any queries that can be asked through Python code (for example, any calculations or equations that can be calculated) and functions you know in the context of this conversation.\n", + "\n", + "Please\n", + "(1) do not mix suggested Python codes and function calls in one step.\n", + "(2) You MUST remember that you don’t have a function named \"python\" available.\n", + "\n", + "You must follow the formats below to write your Python code:\n", + "```python\n", + "# your code\n", + "```\n", + "\n", + "3. Wait for me to give the results or wait for the executed results of the function call.\n", + "4. Continue if you think the result is correct. If the result is invalid or unexpected, please correct your query or reasoning.\n", + "\n", + "After all the queries are run and you get the answer, put the answer in \\\\boxed{}.\n", + "\n", + "Problem:\n", + "\"\"\"\n", + "\n", + " def __init__(\n", + " self,\n", + " name: Optional[str] = \"MathChatAgent\",\n", + " is_termination_msg: Optional[Callable[[Dict], bool]] = is_termination_msg_mathchat,\n", + " human_input_mode: Optional[str] = \"NEVER\",\n", + " default_auto_reply: Optional[Union[str, Dict, None]] = DEFAULT_REPLY,\n", + " max_invalid_q_per_step=3,\n", + " **kwargs,\n", + " ):\n", + " super().__init__(\n", + " name=name,\n", + " is_termination_msg=is_termination_msg,\n", + " human_input_mode=human_input_mode,\n", + " default_auto_reply=default_auto_reply,\n", + " max_invalid_q_per_step=max_invalid_q_per_step,\n", + " **kwargs,\n", + " )\n", + " del self._reply_func_list[2]\n", + " self.register_reply([Agent, None], MathUserProxyAgent._generate_math_reply, position=4)\n", + " del self._reply_func_list[3]\n", + " self.register_reply(\n", + " trigger=autogen.ConversableAgent, reply_func=MathUserProxyAgent.generate_function_call_reply, position=3\n", + " )\n", + " self.register_reply(\n", + " trigger=autogen.ConversableAgent, reply_func=MathUserProxyAgent._check_final_result, position=0\n", + " )\n", + "\n", + " self.max_function_call_trial = 3\n", + " self.query = None\n", + " self.answer = None\n", + " self.is_correct = None\n", + "\n", + " def generate_function_call_reply(\n", + " self,\n", + " messages: Optional[List[Dict]] = None,\n", + " sender: Optional[autogen.ConversableAgent] = None,\n", + " config: Optional[Any] = None,\n", + " ) -> Tuple[bool, Union[Dict, None]]:\n", + " \"\"\"Generate a reply using function call.\"\"\"\n", + " if messages is None:\n", + " messages = self._oai_messages[sender]\n", + " message = messages[-1]\n", + " if \"function_call\" in message:\n", + " is_exec_success, func_return = self.execute_function(message[\"function_call\"])\n", + " if is_exec_success:\n", + " self.max_function_call_trial = 3\n", + " return True, func_return\n", + " else:\n", + " if self.max_function_call_trial == 0:\n", + " error_message = func_return[\"content\"]\n", + " self.max_function_call_trial = 3\n", + " return (\n", + " True,\n", + " \"The func is executed failed many times. \"\n", + " + error_message\n", + " + \". Please directly reply me with TERMINATE. We need to terminate the conversation.\",\n", + " )\n", + " else:\n", + " revise_prompt = \"You may make a wrong function call (It may due the arguments you provided doesn't fit the function arguments like missing required positional argument). \\\n", + " If you think this error occurs due to you make a wrong function arguments input and you could make it success, please try to call this function again using the correct arguments. \\\n", + " Otherwise, the error may be caused by the function itself. Please directly reply me with TERMINATE. We need to terminate the conversation. \"\n", + " error_message = func_return[\"content\"]\n", + " return True, \"The func is executed failed.\" + error_message + revise_prompt\n", + " return False, None\n", + "\n", + " def initiate_chat(\n", + " self,\n", + " recipient,\n", + " answer: None,\n", + " silent: Optional[bool] = False,\n", + " **context,\n", + " ):\n", + " self.query = context[\"problem\"]\n", + " if not isinstance(answer, str):\n", + " answer = str(answer)\n", + " if answer.endswith(\".0\"):\n", + " answer = answer[:-2]\n", + " self._answer = answer\n", + " else:\n", + " self._answer = answer\n", + "\n", + " self.is_correct = None\n", + "\n", + " self._prepare_chat(recipient, True)\n", + " error_message = None\n", + " try:\n", + " prompt = self.PROMPTS + context[\"problem\"]\n", + " self.send(prompt, recipient, silent=silent)\n", + " except BadRequestError as e:\n", + " error_message = str(e)\n", + " self.is_correct = 0\n", + " print(\"error information: {}\".format(error_message))\n", + "\n", + " recipient.reset()\n", + " is_correct = copy.deepcopy(self.is_correct)\n", + " self._reset()\n", + " return is_correct\n", + "\n", + " def _check_final_result(\n", + " self,\n", + " messages: Optional[List[Dict]] = None,\n", + " sender: Optional[autogen.Agent] = None,\n", + " config: Optional[Any] = None,\n", + " ):\n", + "\n", + " messages = messages[-1]\n", + " if isinstance(messages, dict):\n", + " messages = messages.get(\"content\")\n", + " if messages is None:\n", + " return False, None\n", + "\n", + " cb = extract_code(messages)\n", + " contain_code = False\n", + " for c in cb:\n", + " if c[0] == \"python\":\n", + " contain_code = True\n", + " break\n", + " if not contain_code and get_answer(messages) is not None and get_answer(messages) != \"\":\n", + " if get_answer(messages) == self._answer:\n", + " self.is_correct = 1\n", + " return True, \"The result is Correct. Please reply me with TERMINATE.\"\n", + " else:\n", + " self.is_correct = 0\n", + " return False, None\n", + " else:\n", + " return False, None\n", + "\n", + " def _reset(self):\n", + " super()._reset()\n", + " self.max_function_call_trial = 3\n", + " self.is_correct = None\n", + " self.query = None\n", + " self.answer = None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Load dataset\n", + "\n", + "MATAH dataset contains 12,500 challenging competition mathematics problems. Each problem in MATH has a full step-by-step solution which can be used to teach models to generate answer derivations and explanations. \n", + "\n", + "We strictly follow the [train](https://github.com/lifan-yuan/CRAFT/blob/main/tab_and_math/MATH/dataset/train/algebra.jsonl)/[test](https://github.com/lifan-yuan/CRAFT/blob/main/tab_and_math/MATH/dataset/algebra.jsonl) splits of [Craft](https://github.com/lifan-yuan/CRAFT). Please specific your own path to the dataset. Here we sample the first 10 algebra problems as examples. " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "test_data, train_data = [], []\n", + "with open(\"MATH/dataset/algebra.jsonl\", \"r\", encoding=\"utf-8\") as f:\n", + " for line in f:\n", + " test_data.append(json.loads(line))\n", + "with open(\"MATH/dataset/train/algebra.jsonl\", \"r\", encoding=\"utf-8\") as f:\n", + " for line in f:\n", + " train_data.append(json.loads(line))\n", + "test_data, train_data = test_data[0:10], train_data[0:10]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Agents construction\n", + "\n", + "Constructing MathUserProxyAgent and AssistantAgent used in solving these problems. Here, we use gpt-4-1106-preview to construct the AssistantAgent. " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "llm_config = {\n", + " \"config_list\": [\n", + " {\n", + " \"model\": \"gpt-4-1106-preview\",\n", + " \"api_type\": \"azure\",\n", + " \"api_key\": os.environ[\"AZURE_OPENAI_API_KEY\"],\n", + " \"base_url\": \"https://ENDPOINT.openai.azure.com/\",\n", + " \"api_version\": \"2023-07-01-preview\",\n", + " }\n", + " ]\n", + "}\n", + "\n", + "assistant = autogen.AssistantAgent(\n", + " name=\"assistant\",\n", + " system_message=\"You are a helpful assistant.\",\n", + " llm_config=llm_config,\n", + ")\n", + "user_proxy = MathUserProxyAgent(\n", + " name=\"mathproxyagent\",\n", + " human_input_mode=\"NEVER\",\n", + " code_execution_config={\"work_dir\": \"_output\", \"use_docker\": False},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Test without agent optimizations \n", + "\n", + "Below is the code to get the performance without the agents optimization process. \n", + "\n", + "In this case, the AssistantAgent and MathUserProxyAgent don't have any function calls but solely solve problems with Python." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sum = 0\n", + "for index, query in enumerate(test_data):\n", + " is_correct = user_proxy.initiate_chat(recipient=assistant, answer=query[\"answer\"], problem=query[\"question\"])\n", + " print(is_correct)\n", + " sum += is_correct\n", + "success_rate_without_agent_training = sum / 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Agent Training \n", + "\n", + "Then, we use the AgentOptimizer to iteratively optimize the agents by optimizing the function calls according to the historical conversations and performance.\n", + "The AgentOptimizer yields register_for_llm and register_for_executor at each iteration, which are subsequently utilized to update the assistant and user_proxy agents, respectively. \n", + "Here we optimize these two agents for ten epochs. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "EPOCH = 10\n", + "optimizer_model = \"gpt-4-1106-preview\"\n", + "optimizer = AgentOptimizer(max_actions_per_step=3, llm_config=llm_config, optimizer_model=optimizer_model)\n", + "for i in range(EPOCH):\n", + " for index, query in enumerate(train_data):\n", + " is_correct = user_proxy.initiate_chat(assistant, answer=query[\"answer\"], problem=query[\"question\"])\n", + " history = assistant.chat_messages_for_summary(user_proxy)\n", + " optimizer.record_one_conversation(history, is_satisfied=is_correct)\n", + " register_for_llm, register_for_exector = optimizer.step()\n", + " for item in register_for_llm:\n", + " assistant.update_function_signature(**item)\n", + " if len(register_for_exector.keys()) > 0:\n", + " user_proxy.register_function(function_map=register_for_exector)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Test with agent optimizations \n", + "\n", + "After agent optimization, the agents obtained a list of functions from the AgentOptimizers after 10 optimization iterations as shown below.\n", + "\n", + "We then show the final performances with/without the agent optimization process. We observe the agents after optimization are obviously better.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sum = 0\n", + "for index, query in enumerate(test_data):\n", + " is_correct = user_proxy.initiate_chat(recipient=assistant, answer=query[\"answer\"], problem=query[\"question\"])\n", + " sum += is_correct\n", + "success_rate_with_agent_training = sum / 10" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "------------------------------------------------Functions learned------------------------------------------------\n", + "evaluate_expression: Evaluate arithmetic or mathematical expressions provided as strings.\n", + "\n", + "calculate_compound_interest_principal: Calculate the principal amount needed to achieve a certain future value with quarterly compound interest.\n", + "\n", + "solve_linear_system: Solve a system of linear equations represented as coefficients and variables.\n", + "\n", + "------------------------------------------------Summary------------------------------------------------\n", + "\n", + "success_rate_without_agent_training: 60.0%\n", + "\n", + "success_rate_with_agent_training: 90.0%\n", + "\n" + ] + } + ], + "source": [ + "print(\n", + " \"------------------------------------------------Functions learned------------------------------------------------\"\n", + ")\n", + "for func in assistant.llm_config[\"functions\"]:\n", + " print(func[\"name\"] + \": \" + func[\"description\"] + \"\\n\")\n", + "print(\"------------------------------------------------Summary------------------------------------------------\\n\")\n", + "print(\"success_rate_without_agent_training: {average}%\\n\".format(average=success_rate_without_agent_training * 100))\n", + "print(\"success_rate_with_agent_training: {average}%\\n\".format(average=success_rate_with_agent_training * 100))" + ] + } + ], + "metadata": { + "front_matter": { + "description": "AgentOptimizer is able to prompt LLMs to iteratively optimize function/skills of AutoGen agents according to the historical conversation and performance.", + "tags": [ + "optimization", + "tool/function" + ] + }, + "kernelspec": { + "display_name": "py3.9", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" } - ], - "source": [ - "print(\n", - " \"------------------------------------------------Functions learned------------------------------------------------\"\n", - ")\n", - "for func in assistant.llm_config[\"functions\"]:\n", - " print(func[\"name\"] + \": \" + func[\"description\"] + \"\\n\")\n", - "print(\"------------------------------------------------Summary------------------------------------------------\\n\")\n", - "print(\"success_rate_without_agent_training: {average}%\\n\".format(average=success_rate_without_agent_training * 100))\n", - "print(\"success_rate_with_agent_training: {average}%\\n\".format(average=success_rate_with_agent_training * 100))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "py3.9", - "language": "python", - "name": "python3" }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/notebook/agentchat_auto_feedback_from_code_execution.ipynb b/notebook/agentchat_auto_feedback_from_code_execution.ipynb index 37584acdcc..b81b58472c 100644 --- a/notebook/agentchat_auto_feedback_from_code_execution.ipynb +++ b/notebook/agentchat_auto_feedback_from_code_execution.ipynb @@ -10,16 +10,13 @@ "source": [ "# Task Solving with Code Generation, Execution and Debugging\n", "\n", - "AutoGen offers conversable LLM agents, which can be used to solve various tasks with human or automatic feedback, including tasks that require using tools via code.\n", - "Please find documentation about this feature [here](https://microsoft.github.io/autogen/docs/Use-Cases/agent_chat).\n", - "\n", "In this notebook, we demonstrate how to use `AssistantAgent` and `UserProxyAgent` to write code and execute the code. Here `AssistantAgent` is an LLM-based agent that can write Python code (in a Python coding block) for a user to execute for a given task. `UserProxyAgent` is an agent which serves as a proxy for the human user to execute the code written by `AssistantAgent`, or automatically execute the code. Depending on the setting of `human_input_mode` and `max_consecutive_auto_reply`, the `UserProxyAgent` either solicits feedback from the human user or returns auto-feedback based on the result of code execution (success or failure and corresponding outputs) to `AssistantAgent`. `AssistantAgent` will debug the code and suggest new code if the result contains error. The two agents keep communicating to each other until the task is done.\n", "\n", "````{=mdx}\n", ":::info Requirements\n", - "Install `pyautogen`:\n", + "Install the following packages before running the code below:\n", "```bash\n", - "pip install pyautogen\n", + "pip install pyautogen matplotlib yfinance\n", "```\n", "\n", "For more information, please refer to the [installation guide](/docs/installation/).\n", @@ -29,36 +26,18 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "import csv\n", - "from typing import Dict, Union\n", + "import os\n", "\n", - "from IPython import get_ipython\n", "from IPython.display import Image, display\n", "\n", "import autogen\n", + "from autogen.coding import LocalCommandLineCodeExecutor\n", "\n", - "config_list = autogen.config_list_from_json(\n", - " \"OAI_CONFIG_LIST\",\n", - " # filter_dict={\n", - " # \"model\": [\"gpt-4\", \"gpt-4-0314\", \"gpt4\", \"gpt-4-32k\", \"gpt-4-32k-0314\", \"gpt-4-32k-v0314\"],\n", - " # },\n", - ")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "````{=mdx}\n", - ":::tip\n", - "Learn more about configuring LLMs for agents [here](/docs/topics/llm_configuration).\n", - ":::\n", - "````" + "config_list = [{\"model\": \"gpt-4\", \"api_key\": os.getenv(\"OPENAI_API_KEY\")}]" ] }, { @@ -73,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -87,108 +66,175 @@ "--------------------------------------------------------------------------------\n", "\u001b[33massistant\u001b[0m (to user_proxy):\n", "\n", - "To get the current date, we can use Python's `datetime` module. After that, we will need to retrieve the year-to-date (YTD) gain for both META (Meta Platforms, Inc.) and TESLA (Tesla, Inc.). We can do this by fetching the stock prices from the beginning of the year and the current stock prices, then calculating the percentage change.\n", - "\n", - "First, let's write a Python script to get the current date:\n", + "First, let's get the current date using Python. \n", "\n", "```python\n", - "# filename: get_current_date.py\n", + "# Python code\n", + "from datetime import date\n", "\n", - "from datetime import datetime\n", + "# Get today's date\n", + "today = date.today()\n", "\n", - "# Get the current date\n", - "current_date = datetime.now()\n", - "\n", - "# Print the current date in YYYY-MM-DD format\n", - "print(current_date.strftime('%Y-%m-%d'))\n", + "# Print today's date\n", + "print(\"Today's date:\", today)\n", "```\n", "\n", - "Please save the above code in a file named `get_current_date.py` and execute it to get today's date. After that, we will proceed to the next step of fetching the stock data.\n", + "Next, we need to fetch the stock prices for META (Facebook) and TESLA for the current year. We can use the `yfinance` library in Python to fetch this data. If `yfinance` is not installed, it can be installed using pip: `pip install yfinance`.\n", "\n", - "--------------------------------------------------------------------------------\n", - "\u001b[31m\n", - ">>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33muser_proxy\u001b[0m (to assistant):\n", - "\n", - "exitcode: 0 (execution succeeded)\n", - "Code output: \n", - "2024-03-03\n", - "\n", - "\n", - "--------------------------------------------------------------------------------\n", - "\u001b[33massistant\u001b[0m (to user_proxy):\n", - "\n", - "Great, today's date is March 3, 2024. Now, let's proceed to the next step, which is to fetch the stock prices for META and TESLA.\n", - "\n", - "We will use Python to retrieve the stock data. For this purpose, we can use the `yfinance` library, which allows us to fetch historical market data from Yahoo Finance. If `yfinance` is not installed on your system, you will need to install it using `pip install yfinance`.\n", - "\n", - "Here's the Python script to fetch the YTD gain for META and TESLA:\n", + "Here is the Python code to fetch the stock prices and calculate the year-to-date gain:\n", "\n", "```python\n", - "# filename: ytd_gain_comparison.py\n", - "\n", + "# Python code\n", "import yfinance as yf\n", "from datetime import datetime\n", "\n", - "# Define the tickers for Meta Platforms, Inc. and Tesla, Inc.\n", - "tickers = [\"META\", \"TSLA\"]\n", + "# Get the current year\n", + "current_year = datetime.now().year\n", "\n", - "# Define the start of the year\n", - "start_of_year = datetime(datetime.now().year, 1, 1)\n", + "# Download stock data for the current year\n", + "meta_data = yf.download('FB', start=f'{current_year}-01-01', end=today)\n", + "tesla_data = yf.download('TSLA', start=f'{current_year}-01-01', end=today)\n", "\n", - "# Get the current date\n", - "current_date = datetime.now()\n", - "\n", - "# Function to calculate YTD gain\n", - "def calculate_ytd_gain(ticker):\n", - " # Fetch historical data for the ticker\n", - " data = yf.download(ticker, start=start_of_year, end=current_date)\n", - " \n", - " # Get the first available closing price of the year (approximation of the price at the start of the year)\n", - " start_price = data['Close'].iloc[0]\n", - " \n", - " # Get the most recent closing price\n", - " end_price = data['Close'].iloc[-1]\n", - " \n", - " # Calculate the YTD gain\n", - " ytd_gain = ((end_price - start_price) / start_price) * 100\n", - " \n", - " return ytd_gain\n", - "\n", - "# Calculate and print the YTD gain for each ticker\n", - "for ticker in tickers:\n", - " ytd_gain = calculate_ytd_gain(ticker)\n", - " print(f\"{ticker} YTD Gain: {ytd_gain:.2f}%\")\n", + "# Calculate the year-to-date gain for each stock\n", + "meta_ytd_gain = ((meta_data['Close'][-1] - meta_data['Close'][0]) / meta_data['Close'][0]) * 100\n", + "tesla_ytd_gain = ((tesla_data['Close'][-1] - tesla_data['Close'][0]) / tesla_data['Close'][0]) * 100\n", "\n", + "# Print the year-to-date gain for each stock\n", + "print(f'META year-to-date gain: {meta_ytd_gain}%')\n", + "print(f'TESLA year-to-date gain: {tesla_ytd_gain}%')\n", "```\n", "\n", - "Please save the above code in a file named `ytd_gain_comparison.py` and execute it. The script will output the YTD gain for both META and TESLA. If `yfinance` is not installed, you will need to install it first by running `pip install yfinance`.\n", + "This code fetches the closing prices for META and TESLA for the current year, calculates the year-to-date gain for each stock, and prints the results. The year-to-date gain is calculated as the percentage change in the closing price from the first trading day of the year to the most recent trading day.\n", "\n", "--------------------------------------------------------------------------------\n", "\u001b[31m\n", - ">>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...\u001b[0m\n", + ">>>>>>>> EXECUTING 2 CODE BLOCKS (inferred languages are [python, python])...\u001b[0m\n", "\u001b[33muser_proxy\u001b[0m (to assistant):\n", "\n", - "exitcode: 0 (execution succeeded)\n", - "Code output: \n", - "META YTD Gain: 45.05%\n", - "TSLA YTD Gain: -18.43%\n", + "exitcode: 1 (execution failed)\n", + "Code output: Today's date: 2024-04-12\n", + "Traceback (most recent call last):\n", + " File \"/Users/ekzhu/autogen/notebook/coding/tmp_code_cb9ef30baa23cf28e127198c0ebeb7e6.py\", line 9, in \n", + " meta_data = yf.download('FB', start=f'{current_year}-01-01', end=today)\n", + " ^^^^^\n", + "NameError: name 'today' is not defined\n", "\n", "\n", "--------------------------------------------------------------------------------\n", "\u001b[33massistant\u001b[0m (to user_proxy):\n", "\n", - "The year-to-date (YTD) gain for META (Meta Platforms, Inc.) is 45.05%, indicating that the stock price has increased by this percentage since the beginning of the year.\n", + "I apologize for the oversight. The variable `today` was defined in the first code block but not in the second one. Let's correct this by defining `today` in the second code block as well. Here's the corrected code:\n", "\n", - "On the other hand, TESLA (Tesla, Inc.) has a YTD loss of -18.43%, which means that the stock price has decreased by this percentage since the start of the year.\n", + "```python\n", + "# Python code\n", + "import yfinance as yf\n", + "from datetime import datetime, date\n", "\n", - "In summary, as of today, March 3, 2024, META has had a significant gain since the beginning of the year, while TESLA has experienced a decline.\n", + "# Get the current year and today's date\n", + "current_year = datetime.now().year\n", + "today = date.today()\n", + "\n", + "# Download stock data for the current year\n", + "meta_data = yf.download('FB', start=f'{current_year}-01-01', end=today)\n", + "tesla_data = yf.download('TSLA', start=f'{current_year}-01-01', end=today)\n", + "\n", + "# Calculate the year-to-date gain for each stock\n", + "meta_ytd_gain = ((meta_data['Close'][-1] - meta_data['Close'][0]) / meta_data['Close'][0]) * 100\n", + "tesla_ytd_gain = ((tesla_data['Close'][-1] - tesla_data['Close'][0]) / tesla_data['Close'][0]) * 100\n", + "\n", + "# Print the year-to-date gain for each stock\n", + "print(f'META year-to-date gain: {meta_ytd_gain}%')\n", + "print(f'TESLA year-to-date gain: {tesla_ytd_gain}%')\n", + "```\n", + "\n", + "This code should now correctly fetch the stock prices for META and TESLA, calculate the year-to-date gain for each, and print the results.\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> EXECUTING CODE BLOCK (inferred language is python)...\u001b[0m\n", + "\u001b[33muser_proxy\u001b[0m (to assistant):\n", + "\n", + "exitcode: 1 (execution failed)\n", + "Code output: \n", + "[*********************100%%**********************] 1 of 1 completed\n", + "\n", + "1 Failed download:\n", + "['FB']: Exception('%ticker%: No timezone found, symbol may be delisted')\n", + "/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "\n", + "[*********************100%%**********************] 1 of 1 completed\n", + "/Users/ekzhu/autogen/notebook/coding/tmp_code_9ca584c3d8b484c70ee49c1ce5e4b975.py:14: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + " meta_ytd_gain = ((meta_data['Close'][-1] - meta_data['Close'][0]) / meta_data['Close'][0]) * 100\n", + "Traceback (most recent call last):\n", + " File \"/Users/ekzhu/autogen/notebook/coding/tmp_code_9ca584c3d8b484c70ee49c1ce5e4b975.py\", line 14, in \n", + " meta_ytd_gain = ((meta_data['Close'][-1] - meta_data['Close'][0]) / meta_data['Close'][0]) * 100\n", + " ~~~~~~~~~~~~~~~~~~^^^^\n", + " File \"/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/pandas/core/series.py\", line 1109, in __getitem__\n", + " return self._values[key]\n", + " ~~~~~~~~~~~~^^^^^\n", + "IndexError: index -1 is out of bounds for axis 0 with size 0\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33massistant\u001b[0m (to user_proxy):\n", + "\n", + "I apologize for the confusion. It seems like the ticker symbol for Meta Platforms Inc. (formerly Facebook) has changed from 'FB' to 'META'. Let's correct this in the code. Also, it seems like the data for the current day might not be available yet, so let's fetch the data until the previous day. Here's the corrected code:\n", + "\n", + "```python\n", + "# Python code\n", + "import yfinance as yf\n", + "from datetime import datetime, timedelta\n", + "\n", + "# Get the current year and yesterday's date\n", + "current_year = datetime.now().year\n", + "yesterday = datetime.now() - timedelta(1)\n", + "\n", + "# Download stock data for the current year\n", + "meta_data = yf.download('META', start=f'{current_year}-01-01', end=yesterday)\n", + "tesla_data = yf.download('TSLA', start=f'{current_year}-01-01', end=yesterday)\n", + "\n", + "# Calculate the year-to-date gain for each stock\n", + "meta_ytd_gain = ((meta_data['Close'][-1] - meta_data['Close'][0]) / meta_data['Close'][0]) * 100\n", + "tesla_ytd_gain = ((tesla_data['Close'][-1] - tesla_data['Close'][0]) / tesla_data['Close'][0]) * 100\n", + "\n", + "# Print the year-to-date gain for each stock\n", + "print(f'META year-to-date gain: {meta_ytd_gain}%')\n", + "print(f'TESLA year-to-date gain: {tesla_ytd_gain}%')\n", + "```\n", + "\n", + "This code should now correctly fetch the stock prices for META and TESLA, calculate the year-to-date gain for each, and print the results.\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> EXECUTING CODE BLOCK (inferred language is python)...\u001b[0m\n", + "\u001b[33muser_proxy\u001b[0m (to assistant):\n", + "\n", + "exitcode: 0 (execution succeeded)\n", + "Code output: /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "\n", + "[*********************100%%**********************] 1 of 1 completed\n", + "/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "\n", + "[*********************100%%**********************] 1 of 1 completed\n", + "/Users/ekzhu/autogen/notebook/coding/tmp_code_0b52d7fcfe06d76c8b1e0ce9333cb5cf.py:14: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + " meta_ytd_gain = ((meta_data['Close'][-1] - meta_data['Close'][0]) / meta_data['Close'][0]) * 100\n", + "/Users/ekzhu/autogen/notebook/coding/tmp_code_0b52d7fcfe06d76c8b1e0ce9333cb5cf.py:15: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + " tesla_ytd_gain = ((tesla_data['Close'][-1] - tesla_data['Close'][0]) / tesla_data['Close'][0]) * 100\n", + "META year-to-date gain: 50.11406747602124%\n", + "TESLA year-to-date gain: -30.85903076529873%\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33massistant\u001b[0m (to user_proxy):\n", + "\n", + "The code has successfully fetched the stock prices for META and TESLA and calculated the year-to-date gain for each. \n", + "\n", + "As of yesterday, the year-to-date gain for META (Meta Platforms Inc.) is approximately 50.11%, and for TESLA (Tesla Inc.) it is approximately -30.86%. This means that so far this year, META's stock price has increased by about 50.11% while TESLA's stock price has decreased by about 30.86%.\n", + "\n", + "Please note that stock prices can fluctuate and the exact gain may vary depending on the time of checking.\n", "\n", "TERMINATE\n", "\n", @@ -206,6 +252,7 @@ " \"temperature\": 0, # temperature for sampling\n", " }, # configuration for autogen's enhanced inference API which is compatible with OpenAI API\n", ")\n", + "\n", "# create a UserProxyAgent instance named \"user_proxy\"\n", "user_proxy = autogen.UserProxyAgent(\n", " name=\"user_proxy\",\n", @@ -213,8 +260,8 @@ " max_consecutive_auto_reply=10,\n", " is_termination_msg=lambda x: x.get(\"content\", \"\").rstrip().endswith(\"TERMINATE\"),\n", " code_execution_config={\n", - " \"work_dir\": \"coding\",\n", - " \"use_docker\": False, # Please set use_docker=True if docker is available to run the generated code. Using docker is safer than running the generated code directly.\n", + " # the executor to run the generated code\n", + " \"executor\": LocalCommandLineCodeExecutor(work_dir=\"coding\"),\n", " },\n", ")\n", "# the assistant receives a message from the user_proxy, which contains the task description\n", @@ -230,9 +277,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The example above involves code execution. In AutoGen, code execution is triggered automatically by the `UserProxyAgent` when it detects an executable code block in a received message and no human user input is provided. This process occurs in a designated working directory, using a Docker container by default. Unless a specific directory is specified, AutoGen defaults to the `autogen/extensions` directory. Users have the option to specify a different working directory by setting the `work_dir` argument when constructing a new instance of the `UserProxyAgent`.\n", - "\n", - "The whole chat is auto-generated." + "The example above involves code execution. In AutoGen, code execution is triggered automatically by the `UserProxyAgent` when it detects an executable code block in a received message and no human user input is provided. \n", + "Users have the option to specify a different working directory by setting the `work_dir` argument when constructing a new instance of the `LocalCommandLineCodeExecutor`.\n", + "For Docker-based or Jupyter kernel-based code execution, please refer to \n", + "[Code Executors Tutorial](/docs/tutorial/code-executors) for more information." ] }, { @@ -250,16 +298,16 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Chat history: [{'content': 'What date is today? Compare the year-to-date gain for META and TESLA.', 'role': 'assistant'}, {'content': \"To get the current date, we can use Python's `datetime` module. After that, we will need to retrieve the year-to-date (YTD) gain for both META (Meta Platforms, Inc.) and TESLA (Tesla, Inc.). We can do this by fetching the stock prices from the beginning of the year and the current stock prices, then calculating the percentage change.\\n\\nFirst, let's write a Python script to get the current date:\\n\\n```python\\n# filename: get_current_date.py\\n\\nfrom datetime import datetime\\n\\n# Get the current date\\ncurrent_date = datetime.now()\\n\\n# Print the current date in YYYY-MM-DD format\\nprint(current_date.strftime('%Y-%m-%d'))\\n```\\n\\nPlease save the above code in a file named `get_current_date.py` and execute it to get today's date. After that, we will proceed to the next step of fetching the stock data.\", 'role': 'user'}, {'content': 'exitcode: 0 (execution succeeded)\\nCode output: \\n2024-03-03\\n', 'role': 'assistant'}, {'content': 'Great, today\\'s date is March 3, 2024. Now, let\\'s proceed to the next step, which is to fetch the stock prices for META and TESLA.\\n\\nWe will use Python to retrieve the stock data. For this purpose, we can use the `yfinance` library, which allows us to fetch historical market data from Yahoo Finance. If `yfinance` is not installed on your system, you will need to install it using `pip install yfinance`.\\n\\nHere\\'s the Python script to fetch the YTD gain for META and TESLA:\\n\\n```python\\n# filename: ytd_gain_comparison.py\\n\\nimport yfinance as yf\\nfrom datetime import datetime\\n\\n# Define the tickers for Meta Platforms, Inc. and Tesla, Inc.\\ntickers = [\"META\", \"TSLA\"]\\n\\n# Define the start of the year\\nstart_of_year = datetime(datetime.now().year, 1, 1)\\n\\n# Get the current date\\ncurrent_date = datetime.now()\\n\\n# Function to calculate YTD gain\\ndef calculate_ytd_gain(ticker):\\n # Fetch historical data for the ticker\\n data = yf.download(ticker, start=start_of_year, end=current_date)\\n \\n # Get the first available closing price of the year (approximation of the price at the start of the year)\\n start_price = data[\\'Close\\'].iloc[0]\\n \\n # Get the most recent closing price\\n end_price = data[\\'Close\\'].iloc[-1]\\n \\n # Calculate the YTD gain\\n ytd_gain = ((end_price - start_price) / start_price) * 100\\n \\n return ytd_gain\\n\\n# Calculate and print the YTD gain for each ticker\\nfor ticker in tickers:\\n ytd_gain = calculate_ytd_gain(ticker)\\n print(f\"{ticker} YTD Gain: {ytd_gain:.2f}%\")\\n\\n```\\n\\nPlease save the above code in a file named `ytd_gain_comparison.py` and execute it. The script will output the YTD gain for both META and TESLA. If `yfinance` is not installed, you will need to install it first by running `pip install yfinance`.', 'role': 'user'}, {'content': 'exitcode: 0 (execution succeeded)\\nCode output: \\nMETA YTD Gain: 45.05%\\nTSLA YTD Gain: -18.43%\\n', 'role': 'assistant'}, {'content': 'The year-to-date (YTD) gain for META (Meta Platforms, Inc.) is 45.05%, indicating that the stock price has increased by this percentage since the beginning of the year.\\n\\nOn the other hand, TESLA (Tesla, Inc.) has a YTD loss of -18.43%, which means that the stock price has decreased by this percentage since the start of the year.\\n\\nIn summary, as of today, March 3, 2024, META has had a significant gain since the beginning of the year, while TESLA has experienced a decline.\\n\\nTERMINATE', 'role': 'user'}]\n", - "Summary: Today's date is March 3, 2024. The year-to-date (YTD) gain for META (Meta Platforms, Inc.) is 45.05%, indicating an increase in stock price since the beginning of the year. In contrast, TESLA (Tesla, Inc.) has a YTD loss of -18.43%, showing a decrease in stock price over the same period.\n", - "Cost info: ({'total_cost': 0.14834999999999998, 'gpt-4': {'cost': 0.14834999999999998, 'prompt_tokens': 3267, 'completion_tokens': 839, 'total_tokens': 4106}}, {'total_cost': 0})\n" + "Chat history: [{'content': 'What date is today? Compare the year-to-date gain for META and TESLA.', 'role': 'assistant'}, {'content': 'First, let\\'s get the current date using Python. \\n\\n```python\\n# Python code\\nfrom datetime import date\\n\\n# Get today\\'s date\\ntoday = date.today()\\n\\n# Print today\\'s date\\nprint(\"Today\\'s date:\", today)\\n```\\n\\nNext, we need to fetch the stock prices for META (Facebook) and TESLA for the current year. We can use the `yfinance` library in Python to fetch this data. If `yfinance` is not installed, it can be installed using pip: `pip install yfinance`.\\n\\nHere is the Python code to fetch the stock prices and calculate the year-to-date gain:\\n\\n```python\\n# Python code\\nimport yfinance as yf\\nfrom datetime import datetime\\n\\n# Get the current year\\ncurrent_year = datetime.now().year\\n\\n# Download stock data for the current year\\nmeta_data = yf.download(\\'FB\\', start=f\\'{current_year}-01-01\\', end=today)\\ntesla_data = yf.download(\\'TSLA\\', start=f\\'{current_year}-01-01\\', end=today)\\n\\n# Calculate the year-to-date gain for each stock\\nmeta_ytd_gain = ((meta_data[\\'Close\\'][-1] - meta_data[\\'Close\\'][0]) / meta_data[\\'Close\\'][0]) * 100\\ntesla_ytd_gain = ((tesla_data[\\'Close\\'][-1] - tesla_data[\\'Close\\'][0]) / tesla_data[\\'Close\\'][0]) * 100\\n\\n# Print the year-to-date gain for each stock\\nprint(f\\'META year-to-date gain: {meta_ytd_gain}%\\')\\nprint(f\\'TESLA year-to-date gain: {tesla_ytd_gain}%\\')\\n```\\n\\nThis code fetches the closing prices for META and TESLA for the current year, calculates the year-to-date gain for each stock, and prints the results. The year-to-date gain is calculated as the percentage change in the closing price from the first trading day of the year to the most recent trading day.', 'role': 'user'}, {'content': 'exitcode: 1 (execution failed)\\nCode output: Today\\'s date: 2024-04-12\\nTraceback (most recent call last):\\n File \"/Users/ekzhu/autogen/notebook/coding/tmp_code_cb9ef30baa23cf28e127198c0ebeb7e6.py\", line 9, in \\n meta_data = yf.download(\\'FB\\', start=f\\'{current_year}-01-01\\', end=today)\\n ^^^^^\\nNameError: name \\'today\\' is not defined\\n', 'role': 'assistant'}, {'content': \"I apologize for the oversight. The variable `today` was defined in the first code block but not in the second one. Let's correct this by defining `today` in the second code block as well. Here's the corrected code:\\n\\n```python\\n# Python code\\nimport yfinance as yf\\nfrom datetime import datetime, date\\n\\n# Get the current year and today's date\\ncurrent_year = datetime.now().year\\ntoday = date.today()\\n\\n# Download stock data for the current year\\nmeta_data = yf.download('FB', start=f'{current_year}-01-01', end=today)\\ntesla_data = yf.download('TSLA', start=f'{current_year}-01-01', end=today)\\n\\n# Calculate the year-to-date gain for each stock\\nmeta_ytd_gain = ((meta_data['Close'][-1] - meta_data['Close'][0]) / meta_data['Close'][0]) * 100\\ntesla_ytd_gain = ((tesla_data['Close'][-1] - tesla_data['Close'][0]) / tesla_data['Close'][0]) * 100\\n\\n# Print the year-to-date gain for each stock\\nprint(f'META year-to-date gain: {meta_ytd_gain}%')\\nprint(f'TESLA year-to-date gain: {tesla_ytd_gain}%')\\n```\\n\\nThis code should now correctly fetch the stock prices for META and TESLA, calculate the year-to-date gain for each, and print the results.\", 'role': 'user'}, {'content': 'exitcode: 1 (execution failed)\\nCode output: \\n[*********************100%%**********************] 1 of 1 completed\\n\\n1 Failed download:\\n[\\'FB\\']: Exception(\\'%ticker%: No timezone found, symbol may be delisted\\')\\n/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The \\'unit\\' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\\n df.index += _pd.TimedeltaIndex(dst_error_hours, \\'h\\')\\n\\n[*********************100%%**********************] 1 of 1 completed\\n/Users/ekzhu/autogen/notebook/coding/tmp_code_9ca584c3d8b484c70ee49c1ce5e4b975.py:14: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\\n meta_ytd_gain = ((meta_data[\\'Close\\'][-1] - meta_data[\\'Close\\'][0]) / meta_data[\\'Close\\'][0]) * 100\\nTraceback (most recent call last):\\n File \"/Users/ekzhu/autogen/notebook/coding/tmp_code_9ca584c3d8b484c70ee49c1ce5e4b975.py\", line 14, in \\n meta_ytd_gain = ((meta_data[\\'Close\\'][-1] - meta_data[\\'Close\\'][0]) / meta_data[\\'Close\\'][0]) * 100\\n ~~~~~~~~~~~~~~~~~~^^^^\\n File \"/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/pandas/core/series.py\", line 1109, in __getitem__\\n return self._values[key]\\n ~~~~~~~~~~~~^^^^^\\nIndexError: index -1 is out of bounds for axis 0 with size 0\\n', 'role': 'assistant'}, {'content': \"I apologize for the confusion. It seems like the ticker symbol for Meta Platforms Inc. (formerly Facebook) has changed from 'FB' to 'META'. Let's correct this in the code. Also, it seems like the data for the current day might not be available yet, so let's fetch the data until the previous day. Here's the corrected code:\\n\\n```python\\n# Python code\\nimport yfinance as yf\\nfrom datetime import datetime, timedelta\\n\\n# Get the current year and yesterday's date\\ncurrent_year = datetime.now().year\\nyesterday = datetime.now() - timedelta(1)\\n\\n# Download stock data for the current year\\nmeta_data = yf.download('META', start=f'{current_year}-01-01', end=yesterday)\\ntesla_data = yf.download('TSLA', start=f'{current_year}-01-01', end=yesterday)\\n\\n# Calculate the year-to-date gain for each stock\\nmeta_ytd_gain = ((meta_data['Close'][-1] - meta_data['Close'][0]) / meta_data['Close'][0]) * 100\\ntesla_ytd_gain = ((tesla_data['Close'][-1] - tesla_data['Close'][0]) / tesla_data['Close'][0]) * 100\\n\\n# Print the year-to-date gain for each stock\\nprint(f'META year-to-date gain: {meta_ytd_gain}%')\\nprint(f'TESLA year-to-date gain: {tesla_ytd_gain}%')\\n```\\n\\nThis code should now correctly fetch the stock prices for META and TESLA, calculate the year-to-date gain for each, and print the results.\", 'role': 'user'}, {'content': \"exitcode: 0 (execution succeeded)\\nCode output: /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\\n df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\\n\\n[*********************100%%**********************] 1 of 1 completed\\n/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\\n df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\\n\\n[*********************100%%**********************] 1 of 1 completed\\n/Users/ekzhu/autogen/notebook/coding/tmp_code_0b52d7fcfe06d76c8b1e0ce9333cb5cf.py:14: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\\n meta_ytd_gain = ((meta_data['Close'][-1] - meta_data['Close'][0]) / meta_data['Close'][0]) * 100\\n/Users/ekzhu/autogen/notebook/coding/tmp_code_0b52d7fcfe06d76c8b1e0ce9333cb5cf.py:15: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\\n tesla_ytd_gain = ((tesla_data['Close'][-1] - tesla_data['Close'][0]) / tesla_data['Close'][0]) * 100\\nMETA year-to-date gain: 50.11406747602124%\\nTESLA year-to-date gain: -30.85903076529873%\\n\", 'role': 'assistant'}, {'content': \"The code has successfully fetched the stock prices for META and TESLA and calculated the year-to-date gain for each. \\n\\nAs of yesterday, the year-to-date gain for META (Meta Platforms Inc.) is approximately 50.11%, and for TESLA (Tesla Inc.) it is approximately -30.86%. This means that so far this year, META's stock price has increased by about 50.11% while TESLA's stock price has decreased by about 30.86%.\\n\\nPlease note that stock prices can fluctuate and the exact gain may vary depending on the time of checking.\\n\\nTERMINATE\", 'role': 'user'}]\n", + "Summary: The year-to-date gain for META (Meta Platforms Inc.) is approximately 50.11%, and for TESLA (Tesla Inc.) it is approximately -30.86%. This means that so far this year, META's stock price has increased by about 50.11% while TESLA's stock price has decreased by about 30.86%.\n", + "Cost info: ({'total_cost': 0.32256, 'gpt-4-0613': {'cost': 0.32256, 'prompt_tokens': 8224, 'completion_tokens': 1264, 'total_tokens': 9488}}, {'total_cost': 0.32256, 'gpt-4-0613': {'cost': 0.32256, 'prompt_tokens': 8224, 'completion_tokens': 1264, 'total_tokens': 9488}})\n" ] } ], @@ -280,7 +328,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -294,77 +342,66 @@ "--------------------------------------------------------------------------------\n", "\u001b[33massistant\u001b[0m (to user_proxy):\n", "\n", - "To plot a chart of the stock price change YTD for META and TESLA, and to save the data to `stock_price_ytd.csv` and the plot to `stock_price_ytd.png`, we will use Python with the `yfinance`, `pandas`, and `matplotlib` libraries. If `matplotlib` is not installed on your system, you will need to install it using `pip install matplotlib`.\n", + "To plot a chart of the stock price change year-to-date (YTD) for META and TESLA, and to save the data and the plot, we can use the `matplotlib` and `pandas` libraries in Python. If these libraries are not installed, they can be installed using pip: `pip install matplotlib pandas`.\n", "\n", - "Here's the Python script to fetch the stock data, save it to a CSV file, plot the chart, and save the plot to a PNG file:\n", + "Here is the Python code to fetch the stock prices, plot the chart, and save the data and the plot:\n", "\n", "```python\n", - "# filename: plot_stock_price_ytd.py\n", - "\n", + "# Python code\n", "import yfinance as yf\n", - "import pandas as pd\n", "import matplotlib.pyplot as plt\n", - "from datetime import datetime\n", + "import pandas as pd\n", + "from datetime import datetime, timedelta\n", "\n", - "# Define the tickers for Meta Platforms, Inc. and Tesla, Inc.\n", - "tickers = [\"META\", \"TSLA\"]\n", + "# Get the current year and yesterday's date\n", + "current_year = datetime.now().year\n", + "yesterday = datetime.now() - timedelta(1)\n", "\n", - "# Define the start of the year\n", - "start_of_year = datetime(datetime.now().year, 1, 1)\n", + "# Download stock data for the current year\n", + "meta_data = yf.download('META', start=f'{current_year}-01-01', end=yesterday)\n", + "tesla_data = yf.download('TSLA', start=f'{current_year}-01-01', end=yesterday)\n", "\n", - "# Get the current date\n", - "current_date = datetime.now()\n", - "\n", - "# Initialize a dictionary to store data\n", - "stock_data = {}\n", - "\n", - "# Fetch historical data for each ticker\n", - "for ticker in tickers:\n", - " stock_data[ticker] = yf.download(ticker, start=start_of_year, end=current_date)\n", - "\n", - "# Combine the closing prices of each stock into a single DataFrame\n", - "combined_data = pd.DataFrame({\n", - " ticker: data['Close']\n", - " for ticker, data in stock_data.items()\n", - "})\n", - "\n", - "# Save the combined data to CSV\n", - "combined_data.to_csv('stock_price_ytd.csv')\n", - "\n", - "# Plot the normalized stock price change YTD\n", - "normalized_data = (combined_data / combined_data.iloc[0]) * 100\n", - "normalized_data.plot(figsize=(10, 5))\n", - "\n", - "# Set plot title and labels\n", - "plt.title('Stock Price Change YTD')\n", + "# Plot the closing prices\n", + "plt.figure(figsize=(14, 7))\n", + "plt.plot(meta_data['Close'], label='META')\n", + "plt.plot(tesla_data['Close'], label='TESLA')\n", + "plt.title('META vs TESLA Stock Price YTD')\n", "plt.xlabel('Date')\n", - "plt.ylabel('Normalized Price (Base 100)')\n", - "\n", - "# Save the plot to a PNG file\n", + "plt.ylabel('Closing Price')\n", + "plt.legend()\n", + "plt.grid(True)\n", "plt.savefig('stock_price_ytd.png')\n", "\n", - "# Show the plot\n", - "plt.show()\n", + "# Save the data to a CSV file\n", + "data = pd.concat([meta_data['Close'], tesla_data['Close']], axis=1)\n", + "data.columns = ['META', 'TESLA']\n", + "data.to_csv('stock_price_ytd.csv')\n", "```\n", "\n", - "Please save the above code in a file named `plot_stock_price_ytd.py` and execute it. The script will fetch the stock data, save it to `stock_price_ytd.csv`, plot the chart, and save the plot to `stock_price_ytd.png`. If `matplotlib` is not installed, you will need to install it first by running `pip install matplotlib`.\n", + "This code fetches the closing prices for META and TESLA for the current year, plots the closing prices, saves the plot to 'stock_price_ytd.png', and saves the closing prices to 'stock_price_ytd.csv'.\n", "\n", "--------------------------------------------------------------------------------\n", "\u001b[31m\n", - ">>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...\u001b[0m\n", + ">>>>>>>> EXECUTING CODE BLOCK (inferred language is python)...\u001b[0m\n", "\u001b[33muser_proxy\u001b[0m (to assistant):\n", "\n", "exitcode: 0 (execution succeeded)\n", - "Code output: \n", - "Figure(1000x500)\n", + "Code output: /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "\n", + "[*********************100%%**********************] 1 of 1 completed\n", + "/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "\n", + "[*********************100%%**********************] 1 of 1 completed\n", "\n", "\n", "--------------------------------------------------------------------------------\n", "\u001b[33massistant\u001b[0m (to user_proxy):\n", "\n", - "The script has successfully executed and created a chart showing the stock price change YTD for META and TESLA. It has also saved the data to `stock_price_ytd.csv` and the plot to `stock_price_ytd.png`.\n", + "The code has successfully fetched the stock prices for META and TESLA, plotted the chart of their stock price change year-to-date (YTD), and saved the data to 'stock_price_ytd.csv' and the plot to 'stock_price_ytd.png'.\n", "\n", - "You should now have a CSV file with the stock price data and a PNG image with the plotted chart. The chart is normalized to show the percentage change in stock prices from the beginning of the year, with the starting price indexed to 100 for comparison purposes.\n", + "You can now view the chart in the 'stock_price_ytd.png' file and the data in the 'stock_price_ytd.csv' file in your current working directory.\n", "\n", "TERMINATE\n", "\n", @@ -390,12 +427,12 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAH0CAYAAACuKActAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACsdUlEQVR4nOzdd3hTdf/G8Xe6d9oCXexdNsgSZIhUlgsFEQUF3PqgPxyo6OMeKG4coI8oLhwMFyqKDEFBNsiUVTZtKd175Pz+OG2gtqUF2iZt79d15Upyzsk5nxQCvfNdFsMwDERERERERETEoVwcXYCIiIiIiIiIKKCLiIiIiIiIOAUFdBEREREREREnoIAuIiIiIiIi4gQU0EVEREREREScgAK6iIiIiIiIiBNQQBcRERERERFxAgroIiIiIiIiIk5AAV1ERERERETECSigi4iIiIiIiDgBBXQRERERERERJ6CALiIiIiIiIuIEFNBFREREREREnIACuoiIiIiIiIgTUEAXERERERERcQIK6CIiIiIiIiJOQAFdRERERERExAkooIuIiIiIiIg4AQV0ERERERERESeggC4iIiIiIiLiBBTQRURERERERJyAArqIiIiIiIiIE1BAFxEREREREXECCugiIiIiIiIiTkABXURERERERMQJKKCLiIiIiIiIOAEFdBEREREREREnoIAuIiIiIiIi4gQU0EVEREREREScgAK6iIiIiIiIiBNQQBcRERERERFxAgroIiIiIiIiIk5AAV1ERERERETECSigi4iIiIiIiDgBBXQRERERERERJ6CALiIiIiIiIuIEFNBFREREREREnIACuoiI1GrLly/HYrEwb948h1x/9uzZWCwWDhw44JDrl8fFF19M+/btHV2GiIhIjaeALiIiVW7r1q2MHDmSxo0b4+XlRf369bn00kt56623ihz3wgsv8O233zqmyHI4cOAAFovFfnN1daVRo0ZcffXVbN682dHllSklJYWnn36aTp064efnh7e3N+3bt+fhhx/m2LFjji6vSuTm5tKhQweaN29OZmZmsf0HDhzAx8eHa6+9tsif9Zluy5cvL/Z3w93dnbp169K7d28effRRDh065IB3KyIizs5iGIbh6CJERKT2WLVqFQMGDKBRo0aMGzeOsLAwDh8+zF9//cW+ffvYu3ev/Vg/Pz9GjhzJ7NmzK62e5cuXM2DAAObOncvIkSPP6rUHDhygadOmXH/99QwbNoz8/Hx27tzJjBkzyM7O5q+//qJz585nPEd+fj65ubl4enpisVjO452cnf379xMVFcWhQ4e49tpr6dOnDx4eHvz999988cUXBAcHs3v3bsBsQY+Pj2fbtm1VVl9VWr16NRdddBGPPPIIL7zwQpF9l19+OX/88Qc7d+5kyZIlRfZ98sknLF68mE8//bTI9ksvvZTMzMwifzdsNhuJiYmsW7eOBQsWYLFYmDVrFqNHj6709yciItWHm6MLEBGR2uX555/HarWybt06AgMDi+yLi4tzTFHn6YILLmDs2LH25xdddBFXXnklM2bM4L333ivxNenp6fj6+uLq6oqrq2tVlQpAXl4e11xzDbGxsSxfvpw+ffoU2f/888/z0ksvVWlNjtSrVy/uvPNOXnnlFcaMGUO7du0AmD9/Pj/++CPvvvsu4eHhRf6MAf766y8WL15cbDtgH7Lw778bAAcPHmTQoEGMGzeONm3a0KlTp8p5YyIiUu2oi7uIiFSpffv20a5du2LhHCAkJMT+2GKxkJ6ezscff2zvJjx+/Hj7/k2bNjF06FACAgLw8/Nj4MCB/PXXX8XOmZSUxH333UeTJk3w9PSkQYMG3HTTTcTHx5daY3Z2NpdffjlWq5VVq1ad9Xu85JJLAIiOjgZOjTP//fffufvuuwkJCaFBgwZF9v17DPrPP/9M//798ff3JyAggO7duzNnzpwix6xZs4YhQ4ZgtVrx8fGhf//+/Pnnn2XWN3/+fLZs2cJjjz1WLJwDBAQE8PzzzxfbvmPHDgYMGICPjw/169dn2rRpRfbn5OTwxBNP0LVrV6xWK76+vvTt25dly5YVOa6w+/crr7zC+++/T/PmzfH09KR79+6sW7eu2HXnzp1L27Zt8fLyon379nzzzTeMHz+eJk2aFDnOZrPxxhtv0K5dO7y8vAgNDeWOO+4gMTGxzJ/J1KlTqVu3LnfeeSeGYZCWlsakSZPs4b0iNW7cmNmzZ5OTk1PsZygiIrWbWtBFRKRKNW7cmNWrV7Nt27YzTjz26aefcuutt9KjRw9uv/12AJo3bw7A9u3b6du3LwEBATz00EO4u7vz3nvvcfHFF/P777/Ts2dPANLS0ujbty87d+7k5ptv5oILLiA+Pp7vv/+eI0eOULdu3WLXzczM5KqrrmL9+vX89ttvdO/e/azf4759+wCoU6dOke1333039erV44knniA9Pb3U18+ePZubb76Zdu3aMWXKFAIDA9m0aROLFi3ihhtuAGDp0qUMHTqUrl278uSTT+Li4sJHH33EJZdcwsqVK+nRo0ep5//+++8BuPHGG8v9nhITExkyZAjXXHMNo0aNYt68eTz88MN06NCBoUOHAuaY9g8++IDrr7+e2267jdTUVGbNmsXgwYNZu3Ztse7+c+bMITU1lTvuuAOLxcK0adO45ppr2L9/P+7u7gD8+OOPXHfddXTo0IGpU6eSmJjILbfcQv369YvVeMcddzB79mwmTJjAvffeS3R0NG+//TabNm3izz//tJ+zJFarlenTp3PttdfywQcfsGPHDmJjY/n5558rZehBr169aN68OYsXL67wc4uISDVmiIiIVKFff/3VcHV1NVxdXY1evXoZDz30kPHLL78YOTk5xY719fU1xo0bV2z78OHDDQ8PD2Pfvn32bceOHTP8/f2Nfv362bc98cQTBmAsWLCg2DlsNpthGIaxbNkyAzDmzp1rpKamGv379zfq1q1rbNq0qcz3Eh0dbQDG008/bZw4ccKIiYkxli9fbnTp0sUAjPnz5xuGYRgfffSRARh9+vQx8vLyipyjcF90dLRhGIaRlJRk+Pv7Gz179jQyMzNLrNlmsxktW7Y0Bg8ebN9mGIaRkZFhNG3a1Lj00kvPWHeXLl0Mq9Va5vsr1L9/fwMwPvnkE/u27OxsIywszBgxYoR9W15enpGdnV3ktYmJiUZoaKhx880327cV/tzq1KljJCQk2Ld/9913BmD88MMP9m0dOnQwGjRoYKSmptq3LV++3ACMxo0b27etXLnSAIzPP/+8yPUXLVpU4vbSXH755YbVajVcXV2NKVOmnPHY//znP0Zpv0oVvseXX3651NdfddVVBmAkJyeXqzYREan51MVdRESq1KWXXsrq1au58sor2bJlC9OmTWPw4MHUr1/f3rJ7Jvn5+fz6668MHz6cZs2a2beHh4dzww038Mcff5CSkgKYXbk7derE1VdfXew8/24VTU5OZtCgQezatYvly5eXObnb6Z588knq1atHWFgYF198Mfv27eOll17immuuKXLcbbfdVuZ488WLF5OamsojjzyCl5dXiTVv3ryZPXv2cMMNN3Dy5Eni4+OJj48nPT2dgQMHsmLFCmw2W6nXSElJwd/fv9zvD8wJ+04fS+3h4UGPHj3Yv3+/fZurqyseHh6A2d08ISGBvLw8unXrxsaNG4ud87rrriMoKMj+vG/fvgD2cx47doytW7dy00034efnZz+uf//+dOjQoci55s6di9Vq5dJLL7X/POLj4+natSt+fn7FutmX5p133iEnJ4eGDRvy+OOPl+s156rwPaWmplbqdUREpPpQF3cREaly3bt3Z8GCBeTk5LBlyxa++eYbXn/9dUaOHMnmzZtp27Ztqa89ceIEGRkZtG7duti+Nm3aYLPZOHz4MO3atWPfvn2MGDGiXDVNmjSJrKwsNm3aZJ8krLxuv/12rr32WlxcXAgMDKRdu3Z4enoWO65p06Zlnquwe/yZuv/v2bMHgHHjxpV6THJycpHwe7qAgIAiwbo8GjRoUOxLjaCgIP7+++8i2z7++GNeffVVdu3aRW5urn17Se+9UaNGxc4H2MeMHzx4EIAWLVoUe22LFi2KhP49e/aQnJxcZB6D05V3AsJGjRoREhJCu3bt8Pb2LtdrzlVaWhrAWX9ZIiIiNZcCuoiIOIyHhwfdu3ene/futGrVigkTJjB37lyefPLJKq/lqquu4ssvv+TFF1/kk08+wcWl/J3MWrZsSVRUVJnHVVTgK2wdf/nll0tt6T+9xfnfIiMj2bRpE4cPH6Zhw4blumZpLf/Gaau1fvbZZ4wfP57hw4czefJkQkJCcHV1ZerUqfYvHs72nOVls9kICQnh888/L3F/vXr1zvqclW3btm2EhIQQEBDg6FJERMRJKKCLiIhT6NatGwDHjx+3bytpcq569erh4+PDP//8U2zfrl27cHFxsYfO5s2bl3vt7uHDhzNo0CDGjx+Pv78/M2bMOJe3cd4KJ8Lbtm1biS3Hpx8TEBBQri8G/u2KK67giy++4LPPPmPKlCnnXuy/zJs3j2bNmtnX+S50rl+4NG7cGIC9e/cW2/fvbc2bN+e3337joosuqvSW74qwevVq9u3bV+ISbSIiUntpDLqIiFSpZcuWldhC+tNPPwEU6bru6+tLUlJSkeNcXV0ZNGgQ3333XZGlyWJjY5kzZw59+vSxt0iOGDHC3oX+30qq4aabbmL69OnMnDmThx9++Fze3nkbNGgQ/v7+TJ06laysrCL7Cmvu2rUrzZs355VXXrF3kz7diRMnzniNkSNH0qFDB55//nlWr15dbH9qaiqPPfbYWdde2CJ++s92zZo1JV6jPCIiImjfvj2ffPJJkff5+++/s3Xr1iLHjho1ivz8fJ599tli58nLyyv298iRDh48yPjx4/Hw8GDy5MmOLkdERJyIWtBFRKRK3XPPPWRkZHD11VcTGRlJTk4Oq1at4quvvqJJkyZMmDDBfmzXrl357bffeO2114iIiKBp06b07NmT5557jsWLF9OnTx/uvvtu3NzceO+998jOzi6yrvTkyZOZN28e1157LTfffDNdu3YlISGB77//npkzZ9KpU6di9U2cOJGUlBQee+wxrFYrjz76aJX8XAoFBATw+uuvc+utt9K9e3duuOEGgoKC2LJlCxkZGXz88ce4uLjwwQcfMHToUNq1a8eECROoX78+R48eZdmyZQQEBPDDDz+Ueg13d3cWLFhAVFQU/fr1Y9SoUVx00UW4u7uzfft25syZQ1BQUIlroZ/J5ZdfzoIFC7j66qu57LLLiI6OZubMmbRt27bELxLK44UXXuCqq67ioosuYsKECSQmJvL222/Tvn37Iufs378/d9xxB1OnTmXz5s0MGjQId3d39uzZw9y5c3nzzTcZOXLkOdVwPjZu3Mhnn32GzWYjKSmJdevWMX/+fCwWC59++ikdO3as8ppERMSJOXIKeRERqX1+/vln4+abbzYiIyMNPz8/w8PDw2jRooVxzz33GLGxsUWO3bVrl9GvXz/D29vbAIosubZx40Zj8ODBhp+fn+Hj42MMGDDAWLVqVbHrnTx50pg4caJRv359w8PDw2jQoIExbtw4Iz4+3jCMosusne6hhx4yAOPtt98u9b2UZyktwzi1lNq6detK3Ve4zFqh77//3ujdu7fh7e1tBAQEGD169DC++OKLIsds2rTJuOaaa4w6deoYnp6eRuPGjY1Ro0YZS5YsOWM9hRITE40nnnjC6NChg+Hj42N4eXkZ7du3N6ZMmWIcP37cflz//v2Ndu3aFXv9uHHjiix1ZrPZjBdeeMFo3Lix4enpaXTp0sVYuHBhsePO9HMDjCeffLLIti+//NKIjIw0PD09jfbt2xvff/+9MWLECCMyMrLY699//32ja9euhre3t+Hv72906NDBeOihh4xjx46V62diGIbRuHFj47LLLivzuPIss1Z4c3NzM4KDg42ePXsaU6ZMMQ4ePFjuekREpPawGMY5zMQiIiIi4kCdO3emXr16LF682NGliIiIVBiNQRcRERGnlZubS15eXpFty5cvZ8uWLVx88cWOKUpERKSSqAVdREREnNaBAweIiopi7NixREREsGvXLmbOnInVamXbtm3UqVPH0SWKiIhUGE0SJyIiIk4rKCiIrl278sEHH3DixAl8fX257LLLePHFFxXORUSkxlELuoiIiIiIiIgT0Bh0ERERERERESeggC4iIiIiIiLiBDQGvZax2WwcO3YMf39/LBaLo8sREREREREHMQyD1NRUIiIicHFR260zUECvZY4dO0bDhg0dXYaIiIiIiDiJw4cP06BBA0eXISig1zr+/v6A+SEMCAhwcDUiIiIiIuIoKSkpNGzY0J4RxPEU0GuZwm7tAQEBCugiIiIiIqKhr05EAw1EREREREREnIACuoiIiIiIiIgTUEAXERERERERcQIagy4lys/PJzc319Fl1Bju7u64uro6ugwREREREXFiCuhShGEYxMTEkJSU5OhSapzAwEDCwsI0CYeIiIiIiJRIAV2KKAznISEh+Pj4KExWAMMwyMjIIC4uDoDw8HAHVyQiIiIiIs5IAV3s8vPz7eG8Tp06ji6nRvH29gYgLi6OkJAQdXcXEREREZFiNEmc2BWOOffx8XFwJTVT4c9VY/tFRERERKQkCuhSjLq1Vw79XEVERERE5EwU0EVEREREREScgAK6iIiIiIhIFTEMw9EliBNTQJcaYfz48VgsFu68885i+/7zn/9gsVgYP358kWP/fRsyZAjLly8vcd/pt+XLlwNw5MgRPDw8aN++fRW+UxERERGprrLz8hn30ToW74h1dCnipBTQpcZo2LAhX375JZmZmfZtWVlZzJkzh0aNGhU5dsiQIRw/frzI7YsvvqB3795Fto0aNarYsb179wZg9uzZjBo1ipSUFNasWVOl71VEREREqp+nf9jBit0nmDxvCylZmjhYitMya1JjXHDBBezbt48FCxYwZswYABYsWECjRo1o2rRpkWM9PT0JCwsr8Tynb/f29iY7O7vYsYZh8NFHH/Huu+/SoEEDZs2aRc+ePSv4HYmIiIhITfHVukPMWXMIiwXeuK4zAV7uji5JnJACupyRYRhk5uZX+XW93V3Padbzm2++mY8++sge0D/88EMmTJhg75ZeUZYtW0ZGRgZRUVHUr1+f3r178/rrr+Pr61uh1xERERGR6m/z4SQe/3Y7AA8Oas3FrUMcXJE4KwV0OaPM3HzaPvFLlV93xzOD8fE4+7+eY8eOZcqUKRw8eBCAP//8ky+//LJYQF+4cCF+fn5Ftj366KM8+uij5brOrFmzGD16NK6urrRv355mzZoxd+5c+zh3ERERERGAE6nZ3PnpBnLybQxuF8rdFzd3dEnixBTQpUapV68el112GbNnz8YwDC677DLq1q1b7LgBAwYwY8aMItuCg4PLdY2kpCQWLFjAH3/8Yd82duxYZs2apYAuIiIiIna5+Tb+M2cjMSlZNK/nyyvXdjqnXqJSeyigyxl5u7uy45nBDrnuubr55puZOHEiAO+8806Jx/j6+tKiRYtzOv+cOXPIysoqMubcMAxsNhu7d++mVatW53ReEREREalZXvhpJ2ujE/DzdOP9m7rhr3HnUgYFdDkji8VyTl3NHWnIkCHk5ORgsVgYPLjiv1yYNWsWDzzwQLHW8rvvvpsPP/yQF198scKvKSIiIiLVyzebjvDRnwcAeG1UJ5rX8zvzC0RQQJcayNXVlZ07d9oflyQ7O5uYmJgi29zc3ErsDn+6zZs3s3HjRj7//HMiIyOL7Lv++ut55plneO6553Bz00dLREREpLbafiyZKQu2AnDPJS0Y1K7k1YNE/k3roEuNFBAQQEBAQKn7Fy1aRHh4eJFbnz59yjzvrFmzaNu2bbFwDnD11VcTFxfHTz/9dF61i4iIiEj1lZiewx2fbiAr18bFresxKUrDH6X8LIZhGI4uQqpOSkoKVquV5OTkYgE2KyuL6OhomjZtipeXl4MqrLn08xURERGp2fJtBuM/WsvKPfE0ruPD9//pg9XHecednykbiGOoBV1ERERERKQCvPLrP6zcE4+3uyvv3djVqcO5OCcFdBERERERkfP009bjzFi+D4CXRnYkMkwt0nL2FNBFRERERETOw+7YVB6cuwWA2/o25cpOEQ6uSKorBXQREREREZFzlJyZyx2fbiAjJ5/ezevw8JDikwmLlJcCuoiIiIiIyDnIys3n/q82Ex2fTv1Ab966vgturopYcu60WLOIiIiIiMhZWrU3nke/2cqBkxl4uLkwc2xX6vh5OrosqeYU0EVERERERMopMT2H53/aybwNRwAIDfBk2shOdGhgdXBlUhMooIuIiIiIiJTBMAy+23yMZxbuICE9B4sFbrywMZMHt8bfS8upScXQAIkqsmLFCq644goiIiKwWCx8++23pR575513YrFYeOONN4psT0hIYMyYMQQEBBAYGMgtt9xCWlpa5RYuIiIiIlJNHU3K5OkftvPoN1tZuiuWrNz8czrPoZMZ3PThWiZ9tZmE9Bxahfox787ePHNVe4VzqVAK6FUkPT2dTp068c4775zxuG+++Ya//vqLiIjiSzOMGTOG7du3s3jxYhYuXMiKFSu4/fbbK6vkasFisZzx9tRTTwHmz/XCCy/EarXi7+9Pu3btmDRpkv08s2fPJjAwsFzXjIyMxNPTk5iYmIp/QyIiIiKVbMPBBKYt2sUPW45xJDEDwzAcXVKFS8nK5cWfdzHgleV89OcB5qw5xM2z19P12cX85/ONfLf5KMmZuWWeJy/fxnu/72PQG7+zck88Hm4uTB7cmoX39KVr46AqeCdS26iLexUZOnQoQ4cOPeMxR48e5Z577uGXX37hsssuK7Jv586dLFq0iHXr1tGtWzcA3nrrLYYNG8Yrr7xSYqCvDY4fP25//NVXX/HEE0/wzz//2Lf5+fmxZMkSrrvuOp5//nmuvPJKLBYLO3bsYPHixWd9vT/++IPMzExGjhzJxx9/zMMPP1wh70NERESkKqRm5XLbJxtISM+xb6vn70nnhoF0aRRIl4ZBdGxgxdezesaEnDwbn/11kLeW7iExwwzgPZsG0yrUn8U7YolJyeLHrcf5cetx3F0tXNisDoPahTGobSihAV5FzvX3kSQemb+VHcdTAOjVrA4vXNOBpnV9q/x9Se1RPT95NZDNZuPGG29k8uTJtGvXrtj+1atXExgYaA/nAFFRUbi4uLBmzRquvvrqEs+bnZ1Ndna2/XlKSkrFF+9AYWFh9sdWqxWLxVJkG8APP/zARRddxOTJk+3bWrVqxfDhw8/6erNmzeKGG26gf//+/N///Z8CuoiIiFQrH6yMJiE9h9AAT0IDvNhxLIUTqdks3hHL4h2xALhYoFWoP10aBdGlILg3r+eHi4vFwdWXzjAMftoaw7RfdnHwZAYALUL8eGRIJAPbhGCxWHjmqnb8fSSZX3fE8Mv2WPbGpbFyTzwr98Tz+Lfb6NwwkEHtQrm4VQjzNhxh9qpobAYE+rjz2LA2jOzaAIvFeX8GUjMooDuJl156CTc3N+69994S98fExBASElJkm5ubG8HBwWfsaj116lSefvrpCq21ugkLC2POnDls27aN9u3bn/N5UlNTmTt3LmvWrCEyMpLk5GRWrlxJ3759K7BaERER+bcVu0/w6DdbueaCBtwX1VIh6RzFp2Xzwcr9ADx5RTuGdQgnKzefbUeT2Xw4iU2Hkth0KJFjyVnsikllV0wqX6w9BICHqwvBvh4E+XoQ7OtOsK8nwT7uBc8Lbj4e9udBPh54uFXNaNr1BxJ4/qedbDqUBEBdP0/uv7QVo7o1KLImucVioVPDQDo1DGTy4Ej2nUhj8Y5Yftkew6ZDSWw+bN6mLTrVG3N45wj+e3lb6mr5NKkiCuhOYMOGDbz55pts3Lixwv/DmTJlCvfff7/9eUpKCg0bNiz/CQwDcjMqtKZycfeBCvpZ3HPPPaxcuZIOHTrQuHFjLrzwQgYNGsSYMWPw9Cz/P7ZffvklLVu2tPdwGD16NLNmzVJAFxERqURbDidx52cbyMjJZ/qSPfh6uHJH/+aOLqtaenvpXtJz8unYwMrQ9maPQy93V7o1CaZbk2D7cbEpWWZYP5zI5kNJ/H0kmczcfGJSsohJySr39fw93QgqDPU+BaHetyDU+5wK9oXPrd7uZ9VKv+9EGtMW7eKX7WbLv7e7K7f3a8bt/ZqVq4t+83p+NO/vx539mxOXksWvO2L5dUcsq/fFE2715pmr2nFx65AyzyNSkRTQncDKlSuJi4ujUaNG9m35+fk88MADvPHGGxw4cICwsDDi4uKKvC4vL4+EhIRiXbpP5+npeVYhtJjcDHjBAePbHz0GHhUzvsfX15cff/yRffv2sWzZMv766y8eeOAB3nzzTVavXo2Pj0+5zvPhhx8yduxY+/OxY8fSv39/3nrrLfz9/SukVhERETnlQHw6N89eR0ZOPo2CfTiUkMHUn3dRz9+Tay5o4OjyqpXDCRl8vuYgAA8PiTxjo1BogBdD2ocxpCDE5+XbiEnJIjE9l4SMHBLTcziZbt7/+3liRg4J6TnYDEjNziM1O49DCeVr7HGxQJDPqcAe5HtaqD8t0Ad4u/PNxqPMWXuIfJuBiwWu696Q+6JaEfKvceTlFRLgxdgLGzP2wsbk5ttwd9Vc2uIYCuhO4MYbbyQqKqrItsGDB3PjjTcyYcIEAHr16kVSUhIbNmyga9euACxduhSbzUbPnj2rvObqqHnz5jRv3pxbb72Vxx57jFatWvHVV1/Zf8ZnsmPHDv766y/Wrl1bZNx5fn4+X375Jbfddltlli4iIlLrnEjN5qYP13IyPYf29QP48vZevPnbbv63MpqH5v1NsK+HWjfPwmuLd5Obb9CnRV0ualH3rF7r5upCgyAfGpRz0nKbzSAlK5cEe2DPJSE9m4T0XHuAt4f6guepWXnYDDhZsL28BkaG8MjQSFqGVlxjicK5OJICehVJS0tj79699ufR0dFs3ryZ4OBgGjVqRJ06dYoc7+7uTlhYGK1btwagTZs2DBkyhNtuu42ZM2eSm5vLxIkTGT16dOXO4O7uY7ZmVzX38rVqn6smTZrg4+NDenp6uY6fNWsW/fr1K7ZM3kcffcSsWbMU0EVERCpQWnYeE2av5VBCBo2CffhofA/8PN2YMrQNJ1Kz+XbzMe76bCNf3H4hnRsGOrpcp7fzeArfbj4KwENDWlf69VxcLAT6eBDo41Hu1+Tk2UjKMFvkzQBfPNSffmsU7MN9l7aiV/M6ZZ9cpBpRQK8i69evZ8CAAfbnhePCx40bx+zZs8t1js8//5yJEycycOBAXFxcGDFiBNOnT6+Mck+xWCqsq7mjPPXUU2RkZDBs2DAaN25MUlIS06dPJzc3l0svvdR+XH5+Pps3by7yWk9PT1q0aMGnn37KM888U2ySuVtvvZXXXnuN7du3lzj7voiIiJydnDwbd322gW1HU6jj68HHN/egnr85XM/FxcK0kZ04mZ7Dyj3x3Dx7HfPu7EWzen4Ortq5vfzLPxgGXNYhnI4NAh1dTok83FwICfA65y7qIjWFAnoVufjiizEMo9zHHzhwoNi24OBg5syZU4FV1Q79+/fnnXfe4aabbiI2NpagoCC6dOnCr7/+au+hAGYvhy5duhR5bfPmzXnppZc4efJkiUvZtWnThjZt2jBr1ixee+21Sn8vIiIiNZnNZvDQvC2s3BOPj4crH47vXmzNaQ83F2aM7cr17//F1qPJ3PThWhbc1VvBrhRroxNYuisOVxcLDwxq5ehyRKQMFuNsUqNUeykpKVitVpKTkwkICCiyLysri+joaJo2bYqXl/6Tq2j6+YqIiJzZCz/t5P0V+3FzsfDBuG5nHGMen5bNyBmrOHAygzbhAXx1x4UEeLlXYbXOzzAMRs5czYaDiVzfoxFTr+ng6JLEyZwpG4hjaAYEEREREXG4D1bu5/0V5hrd00Z2LHMCuLp+nnxyc0/q+nmy83gKt3+ynuy8/Kootdr4bWccGw4m4uXuwqSolo4uR0TKQQFdRERERBzqu81Hee7HnQA8MjSy3EuoNarjw+wJ3fHzdOOv/Qnc/9UW8m3qHAqQbzN4+ZddAEy4qCmhGgIgUi0ooIuIiIiIw/yxJ54H524BYMJFTbijX7Ozen37+lZmju2Ku6uFH7ce55kftp/VvD811TebjrI7No0ALzfu7Nfc0eWISDkpoIuIiMg5WbUvnjEf/MX8DUfUainnZNvRZO74dD25+QaXdQzn8cvaYrFYzvo8fVrW5dVRnQH4ePVB3l2+r4IrrV6y8/J5ffFuAO4e0AKrj8bmi1QXCugiIiJyTj776yB/7j3JA3O3cNn0lSzbFaeWSym3QyczGP/ROtJz8unVrA6vjeqEi8vZh/NCV3aK4InL2wLmsmJfrz9cUaVWO5/9dYijSZmEBngyrlcTR5cjImdBy6xJMfrlqnLo5yoiNc2RxEwAXF0s7IpJZcLsdfRoGswjQyO5oFGQg6sTZ5aYnsNNH64hPi2bNuEBvHdTVzzdXM/7vDf3aUpcajYzf9/HlAVb+fHv4/h4uOLt4Yq3u3nz8XDFy8MVH3dzu5e7Kz4ebuZ+j1PHnNrnirtr9WnTSs3K5Z1lewGYFNUKb4/z/7mKSNVRQBc7d3ez+1NGRgbe3t4OrqbmycjIAE79nEVEqrujBQH905t78PueE8z+8wBroxO45t1VDGkXxoODW9MixM/BVYqzMQyDyfO2cOBkBvUDvfl4QvcKXR7t4SGtOZGazfyNR/h994kKOaebi+VUyD/t3sf+2A1vd5fTHp/6IsAe+P/1BYDXaefwcnM9r94Dp/vfymgS0nNoVteXa7uWb7I9EXEeCuhi5+rqSmBgIHFxcQD4+Pic0zgwKcowDDIyMoiLiyMwMBBXV32TLSLVX1ZuPifTcwBoGxFA7xZ1Gd+7CW8s3sPcDYdZtD2GxTtjGdWtAf83sBVhVs0gLabZqw7w2844PNxceP+mroRU8OziFouFl0d25KrOEcSkZJGVm09mTj4ZOflk5Zr3mbkFt5yCfbn5ZBVsP3VcHoVTK+TZDFKz8kjNyqvQWk/nVRjwC4J7kI8HQ9qHcXWX+tTx8yzXOU6kZvPBSnOpugcHt8atGrX8i4hJAV2KCAsLA7CHdKk4gYGB9p+viEh1dzTJbD339XDF6m22foZbvXlpZEdu7duUab/8w+IdsXyx9jDfbDrKhIuacmf/5vZjpXbadjSZqT+ZS389NqwN7SKslXIdFxcL/VrVO69zGIZBTr6NrBwbGbl5RUJ+0SBfEPRzT93bjzst/BeeIyvXRkZOHpm55uNCWbk2snJtJJJbsCWd9QcTeWnRLqLahDKqe0P6tayH6xla2t9ZtpeMnHw6NrAytL1+5xCpjhTQpQiLxUJ4eDghISHk5uaW/QIpF3d3d7Wci0iNUti9vX6Qd7HeVi1D/fnfTd1YfyCBF3/exfqDicxYvo85aw4xcUALbuzVGC/36vdvYk6ejSOJGfYWWDOY5ZGRcyqkZRQEsayCx76ebrSNCKBDfSstQvyq1VjmipaWncc9X2wiJ9/GpW1DualXY0eXdEYWiwVPN1c83VyxUjlfLNlsBll5Jbfw74lN5ev1R9h6NJmft8Xw87YYwgK8GNm1AaO6NaRRHZ8i5zp0MoPP1xwE4OEhkeoFKVJNWQzNXFWrpKSkYLVaSU5OJiAgwNHliIhINfXF2kNMWbCVAa3r8dGEHqUeZxgGS3bG8dKiXeyJSwMgwurFfZe24poLGpyxNdCZZOflc/U7q9hxPOWcz+Hh5kKbMH/a1bfSPsJK+/oBtAr1r/IvKwpbhnPyCm6nPc4+7XlevkHHhtYKGx9+/9ebWbDxKBFWL376v74E+nhUyHlruh3HUvh6/WG+3XyUpIxTjScXNgvmuu4NGdo+HC93V+77ajPfbDpK35Z1+fSWng6sWKoTZQPno4Bey+hDKCIiFeGVX/7h7WV7GXthI54b3qHM4/NtBgs2HuG1xbs5npwFQKtQPx4eEsklkSFO39r32q//MH3pXtxdLQT7ehSZ9dunyMzfbvh4nJoFPCEth23Hktl+NIXU7OLjl91cLLQM9ad9RADt61sJDfA0Q/K/gvPpz7NL2Jebb27LLuH4kh6XVz1/Tz6e0IO2Eef3O8P8DUd4YO4WXCzw1R296N4k+LzOVxtl5+WzeEcsX607zB974yn8Dd7fy41L24byzaajGAb8MLEPHRpUztABqXmUDZyPAnotow+hiIhUhMLWuoeGtObui1uU+3VZufl8svoA7yzbR3Km2RrYvUkQjwyNpGtj5wxtO4+ncMVbf5BnM3h3zAUM6xB+1uew2QwOJ2aw7WgKW48ms/1YMtuOJpOY4fjhZO6uFjxcXfBwM2/uBY9TMvOIT8vG39ON/43rxoXN6pzT+fefSOPyt/4gIyefBy5txT0DW1bwO6h9jiZlMm/9EeZuOGxf7hDgso7hvHPDBQ6sTKobZQPno4Bey+hDKCIiFWHUe6tZG53Am6M7c1Xn+mf9+uTMXGb+vo8P/4gmO89s0R3UNpSHhrSmRYh/RZd7zvLybVwzYxV/H0lmcLtQZo7tWmGt/YZhcCw5i21Hk9l+NJltx1JIzswtEpY93FzwPP35v/Z5uLrgWeS5a7FjPc/wWg9Xl1KX90rOzOW2T9azNjoBDzcXpo/uzJD2Z/flxOlDAy5sFsznt15YbYY1VAc2m8Hq/Sf5at1hjiVl8vp1nWkY7FP2C0UKKBs4HwX0WkYfQhERqQgXvbiUo0mZzL+r13m1fMckZ/HGb7v5ev1hbAa4WODarg2ZdGlLwq3eFVjxuXl/xT5e+GkXAV5u/HZ//wpfEszZZeXmc+8Xm/h1RywuFnhueAdu6Nmo3K9/6vvtzF51gGBfD37+v76E1rKfn4izUzZwPrV3KlERERE5J3n5NmJSzHHk9QPPr7UuzOrFiyM68ut9/RjcLhSbAV+tP8zFLy/nxZ93kezALuDR8em8+utuAP57edtaF84BvNxdeXfMBYzu3hCbAY9+s5XpS/ZQnvadxTtimb3qAACvXNtR4VxEpBwU0EVEROSsxKZmk28zcHe1EOLvWSHnbBHiz3s3dmP+Xb3p0SSY7DwbM3/fR7+Xl/He7/vIys2vkOuUl81m8Mj8v8nOs9GnRV2u7dqgSq/vTNxcXZh6TQfuucSca+C1xbt58vvt5NtKD+nHkzOZPG8LALf2acolkaFVUquISHWngC4iIiJnpXAN9HCrd6njl89V18ZBfHXHhXw4vhutQ/1Jzsxl6s+7GPDKcr5ef/iMobAifbHuEGuiE/B2d2XqNR2cfpb5ymaxWHhgUGueuqItFgt8svog9365iey84l+c5OXb+L8vNpOUkUuH+lYeGhLpgIpFRKonBXQRERE5K8eSzIAeEVg5XZYtFguXRIby0//15ZVrOxFh9eJ4chYPzfubIW+sYPGO2HJ1sT5Xx5MzmfrTLgAmD26tSbdOM/6iprw5ugvurhZ+/Ps4N89eR9q/lo97a+le1h5IwM/Tjbeu74KHm37dFBEpL/2LKSIiImflaEFAP9/x52VxdbEwsmsDlj54Mf+9rA2BPu7siUvjtk/Wc+3M1aw/kFDh1zQMg8e+2UZadh4XNApkXO8mFX6N6u7KThF8OL47Ph6u/Ln3JKPfX018WjYAq/ed5K2lewB4/ur2NKnr68hSRUSqHQV0EREROSuF6y7XD6qaWda93F25tW8zfp88gLsvbo6XuwvrDyYycuZqbv14PbtjUyvsWt9vOcbSXXF4uLrw0oiOWhKsFH1b1uPL2y8k2NeDbUdTGDljFVsOJzHpq03YDLi2a4NzWn5PRKS2U0AXERGRs1LYgt4gsGqXQbN6u/PQkEh+nzyA63s0wtXFwm87Yxnyxgomz91i73p/rk6mZfPU99sBuOeSFrQMdZ712J1RxwaBzLuzF/UDvTlwMoOr3vmT2JRsmtXz5emr2jm6PBGRakkBXURERM7K0cQMoOpa0P8tNMCLqdd04JdJ/RjSLgybAXM3HOHiV5bzwk877d2tz9bTP+wgMSOXyDB/7ujfvIKrrpma1fNjwd29iQwzv8zwcHPh7esvwMfDzcGViYhUTwroIiIiUm6GYdhb0COquAX931qE+DHzxq4suLs3PZoGk5Nn4/0V++nz0lKe+WEHMclZ5T7Xbzti+X7LMVwsMG1kR01sdhZCA7z46o5e3Nm/OR/c1I22EQGOLklEpNrS/z4iIiJSbokZuWTl2gAIt1bOLO5n64JGQXx1+4V8NL47nRpYycq18eGf0fSbtoz/fruVIwUt/qVJycrlv99uA+C2fs3o2CCwCqquWaze7jwyNJJ+reo5uhQRkWpN/Y9ERESk3ArXQK/n74mXu6uDqznFYrEwIDKEi1vXY+WeeN5auod1BxL57K9DfLn2MFd3qc9/BrQocVbxqT/tIiYliyZ1fLgvqpUDqhcRETEpoIuIiEi5HU0qGH/u4O7tpbFYLPRrVY9+rerx1/6TvL10L3/sjWfuhiPM33iEKztF8J8BpyaAW7Uvni/WHgLgxREdnepLBxERqX0U0EVERKTcqnqJtfNxYbM6XNisDhsPJfLO0r0s2RXHt5uP8d2WYwxpF8atfZsxZcFWAMb0bMSFzeo4uGIREantFNBFRESk3By1xNr5uKBRELPGd2fb0WTeWbaXn7fF2G9gjqV/ZGikg6sUERFRQD+jnTt38uWXX7Jy5UoOHjxIRkYG9erVo0uXLgwePJgRI0bg6enp6DJFRESqzDEnmcH9XLSvb2XG2K7sjk3lnWV7+WHLMWwGPH91e/y93B1dnoiIiGZxL8nGjRuJioqiS5cu/PHHH/Ts2ZNJkybx7LPPMnbsWAzD4LHHHiMiIoKXXnqJ7Oyy11tdsWIFV1xxBREREVgsFr799tsi+5966ikiIyPx9fUlKCiIqKgo1qxZU+SYhIQExowZQ0BAAIGBgdxyyy2kpaVV5FsXERE5o8IWdGcdg14erUL9eXN0F36fPICF9/ThkshQR5ckIiICqAW9RCNGjGDy5MnMmzePwMDAUo9bvXo1b775Jq+++iqPPvroGc+Znp5Op06duPnmm7nmmmuK7W/VqhVvv/02zZo1IzMzk9dff51Bgwaxd+9e6tUzlywZM2YMx48fZ/HixeTm5jJhwgRuv/125syZc17vV0REpLyOVqMx6GVpGOxDQ0cXISIichqLYRiGo4twNrm5ubi7l7+r29keb7FY+Oabbxg+fHipx6SkpGC1Wvntt98YOHAgO3fupG3btqxbt45u3boBsGjRIoYNG8aRI0eIiIgo17ULz5ucnExAQEC5axYREcnIyaPtE78A8PdTgwhQt3ARkWpN2cD5qIt7Cc4mbJ/L8WXJycnh/fffx2q10qlTJ8BsrQ8MDLSHc4CoqChcXFyKdYUXERGpDIWt5/5ebgrnIiIilUBd3M8gPj6eDz/8kNWrVxMTY870GhYWRu/evRk/fry963lFWbhwIaNHjyYjI4Pw8HAWL15M3bp1AYiJiSEkJKTI8W5ubgQHB9trK0l2dnaRMfIpKSkVWrOIiNQeR2rA+HMRERFnphb0Uqxbt45WrVoxffp0rFYr/fr1o1+/flitVqZPn05kZCTr16+v0GsOGDCAzZs3s2rVKoYMGcKoUaOIi4s7r3NOnToVq9VqvzVsqNF2IiJybo4poIuIiFQqtaCX4p577uHaa69l5syZWCyWIvsMw+DOO+/knnvuYfXq1RV2TV9fX1q0aEGLFi248MILadmyJbNmzWLKlCmEhYUVC+t5eXkkJCQQFhZW6jmnTJnC/fffb3+ekpKikC4iIuekJk0QJyIi4owU0EuxZcsWZs+eXSycgznJ23333UeXLl0qtQabzWbvnt6rVy+SkpLYsGEDXbt2BWDp0qXYbDZ69uxZ6jk8PT21VruIiFSImrDEmoiIiDNTQC9FWFgYa9euJTIyssT9a9euJTS0/OumpqWlsXfvXvvz6OhoNm/eTHBwMHXq1OH555/nyiuvJDw8nPj4eN555x2OHj3KtddeC0CbNm0YMmQIt912GzNnziQ3N5eJEycyevTocs/gLiIicj7Ugi4iIlK5FNBL8eCDD3L77bezYcMGBg4caA/jsbGxLFmyhP/973+88sor5T7f+vXrGTBggP15YbfzcePGMXPmTHbt2sXHH39MfHw8derUoXv37qxcuZJ27drZX/P5558zceJEBg4ciIuLCyNGjGD69OkV9I5FRETOTC3oIiIilUvroJ/BV199xeuvv86GDRvIz88HwNXVla5du3L//fczatQoB1d49rTWoYiInIvcfBut//szNgPWPjqQkAAvR5ckIiLnSdnA+agF/Qyuu+46rrvuOnJzc4mPjwegbt26Fb7uuYiIiLOLSc7CZoCHqwt1/TS3iYiISGVQQC8Hd3d3goOD7Y9FRERqm8Lu7RGBXri4FJ9AVURERM6f1kE/g8WLFzNs2DCCgoLw8fHBx8eHoKAghg0bxm+//ebo8kRERKqMJogTERGpfAropfj4448ZNmwYVquV119/nYULF7Jw4UJef/11AgMDGTZsGJ9++qmjyxQREakSmiBORESk8qmLeymef/553njjDf7zn/8U2zd+/Hj69OnDM888w4033uiA6kRERKqWvQU90MfBlYiIiNRcakEvxaFDh4iKiip1/8CBAzly5EgVViQiIuI4x5JPjUEXERGRyqGAXop27doxa9asUvd/+OGHtG3btgorEhERcRyNQRcREal86uJeildffZXLL7+cRYsWERUVRWhoKACxsbEsWbKE/fv38+OPPzq4ShERkcpnGIZ9DHoDdXEXERGpNAropbj44ovZtm0bM2bM4K+//iImJgaAsLAwhg4dyp133kmTJk0cW6SIiEgViE/LITvPhsUCYVZ1cRcREaksCuhn0KRJE1566SVHlyEiIuJQha3nof5eeLhpdJyIiEhl0f+yIiIickbHkjRBnIiISFVQQD9HW7ZswdXV1dFliIiIVLpTE8Rp/LmIiEhlUkA/D4ZhOLoEERGRSlfYxb1+oGZwFxERqUwag16Ka6655oz7k5OTsVgsVVSNiIiI4xzREmsiIiJVQgG9FD/88AOXXnqpfXm1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++6TJk2aiK+vryQlJdX4fugBs1QX81QPs7RuPL7qYZbqYp7qYp7aYfZEd44NehVdvHhRBg0aJG5ubjJy5Ejp2LGjuLq6KoPOqVOnxMPDQ9555x0RESktLVW+193dXRYvXiwiIkVFRTJo0CBp1aqVfPXVVzW+H3rALNXFPNXDLK0bj696mKW6mKe6mKd2mD3R3WODXgVFRUUyduxYGT58uJw7d055PDg4WMaNGyciIgUFBTJnzhypU6eOpKWliciN62169uwpL730kvJ9hw8frsHq9YVZqot5qodZWjceX/UwS3UxT3UxT+0weyJ18Br0Kqhbty6cnZ0xbtw4tG7dGhUVFQCA0NBQpKSkQETQoEEDPP/883jooYfw7LPP4sKFCzAYDEhLS0NOTg4GDx6sPF/nzp012hPtMUt1MU/1MEvrxuOrHmapLuapLuapHWZPpA7eB72Kbr73ovn+jCNHjkS9evUQFRWlbJeRkYFevXqhoqICQUFBOHDgANq3b4/Vq1ejefPmWpWvK8xSXcxTPczSuvH4qodZqot5qot5aofZE909Nuh3oUePHnj55ZcxduxYGI1GAICdnR3Onj2LI0eOIDExEQEBARg7dqzGleofs1QX81QPs7RuPL7qYZbqYp7qYp7aYfZE1cMG/Q6dO3cOISEh2LFjhzIFp6ysDE5OThpXVvswS3UxT/UwS+vG46seZqku5qku5qkdZk9UfbwGvZrM72fs27cP9evXVwabmTNnIiIiAjk5OVqWV6swS3UxT/UwS+vG46seZqku5qku5qkdZk905xy0LqC2MRgMAIBDhw4hLCwM3333HSZMmIDi4mLExsbCzc1N4wprD2apLuapHmZp3Xh81cMs1cU81cU8tcPsie5CzS0Ybz1KSkqkTZs2YjAYxNnZWf7xj39oXVKtxSzVxTzVwyytG4+vepilupinupindpg90Z3hNeh36PHHH0fbtm2xaNEiuLi4aF1OrcYs1cU81cMsrRuPr3qYpbqYp7qYp3aYPVH1sUG/Q5WVlbC3t9e6DKvALNXFPNXDLK0bj696mKW6mKe6mKd2mD1R9bFBJyIiIiIiItIBruJOREREREREpANs0ImIiIiIiIh0gA06ERERERERkQ6wQSciIiIiIiLSATboRERERERERDrABp2IiIiIiIhIB9igExEREREREekAG3QiIqJaaty4cTAYDDAYDHB0dETz5s3x+OOPY8WKFTAajVV+npiYGDRq1OjeFUpERERVwgadiIioFhswYAAyMzORmpqKnTt34rHHHkNERAQGDRqEiooKrcsjIiKiamCDTkREVIs5OzvD3d0dHh4eeOihh/C3v/0NW7Zswc6dOxETEwMAWLRoETp27Ih69erB09MTr776KgoLCwEACQkJeOGFF5Cfn6+cjX///fcBAKWlpZg2bRo8PDxQr149dOnSBQkJCdrsKBERkQ1gg05ERGRlevfujYCAAGzcuBEAYGdnh2XLluGXX37B559/jt27d2P69OkAgJCQECxZsgQNGzZEZmYmMjMzMW3aNABAeHg4Dh48iK+++go//fQThg0bhgEDBuDMmTOa7RsREZE1M4iIaF0EERERVd+4ceOQl5eHzZs33/K1ESNG4KeffkJycvItX1u/fj0mTZqEy5cvAzBdg/76668jLy9P2SYtLQ0PPPAA0tLS0LJlS+Xxvn37Ijg4GHPnzlV9f4iIiGydg9YFEBERkfpEBAaDAQAQHx+PefPm4eTJkygoKEBFRQWuXbuG4uJi1K1b9w+//8SJE6isrES7du0sHi8tLUWTJk3uef1ERES2iA06ERGRFUpJSUHr1q2RmpqKQYMG4ZVXXsEHH3yAxo0bY9++fRg/fjzKysr+tEEvLCyEvb09jhw5Ant7e4uv1a9fvyZ2gYiIyOawQSciIrIyu3fvxokTJxAZGYkjR47AaDRi4cKFsLMzLT2zdu1ai+2dnJxQWVlp8VhgYCAqKyuRk5ODRx55pMZqJyIismVs0ImIiGqx0tJSZGVlobKyEtnZ2YiLi8O8efMwaNAgjBkzBj///DPKy8vx0Ucf4cknn8T+/fvx2WefWTyHt7c3CgsLsWvXLgQEBKBu3bpo164dRo4ciTFjxmDhwoUIDAzEpUuXsGvXLvj7+2PgwIEa7TEREZH14iruREREtVhcXBxatGgBb29vDBgwAHv27MGyZcuwZcsW2NvbIyAgAIsWLcL8+fPh5+eHVatWYd68eRbPERISgkmTJmH48OFo1qwZFixYAABYuXIlxowZgzfeeAMPPvggBg8ejKSkJHh5eWmxq0RERFaPq7gTERERERER6QDPoBMRERERERHpABt0IiIiIiIiIh1gg05ERERERESkA2zQiYiIiIiIiHSADToRERERERGRDrBBJyIiIiIiItIBNuhEREREREREOsAGnYiIiIiIiEgH2KATERERERER6QAbdCIiIiIiIiIdYINOREREREREpANs0ImIiIiIiIh0gA06ERERERERkQ6wQSciIiIiIiLSATboRERERERERDrABp2IiIiIiIhIB9igExEREREREekAG3QiIiIiIiIiHWCDTkRERERERKQDbNCJiIiIiIiIdIANOhEREREREZEO/H8SLfcXJN0ADwAAAABJRU5ErkJggg==", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAK8CAYAAABV1dcbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAADYJ0lEQVR4nOzdd3hUBdrG4WdmMumNdEoIJNRQBAEhIEhHQERFRSyIulasuOqHriuKbV27WFBRLBRF0VVEpUiR3mvoPZCekF4mM+f7IxCJoSQhZBLyu68rV5JT3zMcIzx55z0mwzAMAQAAAAAAAABqHbOzCwAAAAAAAAAAVA4BLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAAAAAADUUgS8AAAAAAAAAFBLEfACAAAAAAAAQC1FwAsAAAAAAAAAtRQBLwAAAFBLjRkzRt7e3k47f+/evdW7d2+nnR8AAAAEvAAAAGc1depUmUwmmUwmLVu2rMx6wzAUHh4uk8mkq666qtS6k/ud7uO+++7T4sWLz7rNqR+nuvHGG2UymfTUU09d0Gsvr969e5frGiZMmCBJatKkyRm3ufLKK0sde9myZRo8eLAaNmwod3d3NW7cWMOGDdP06dNLbWcymfTggw+Wu+YPPvhAJpNJXbt2rdC1OhwOffnll+ratasCAgLk4+OjFi1aaPTo0Vq1alXJdrGxsZowYYIOHjxYoeNXpwkTJpR67T09PRUdHa1//etfyszMdHZ5ZdhsNrVr105RUVHKy8srs/7gwYPy9PTUDTfcUO7/rhYvXqyDBw+WWma1WhUUFKTu3bvr6aef1uHDh51wtQAAAOXn4uwCAAAAagN3d3dNnz5dl19+eanlS5YsUVxcnNzc3E6734ABAzR69Ogyy1u0aKGIiAh99dVXpZaPHz9e3t7eeuaZZ057vMzMTP38889q0qSJZsyYoVdffbVMAFzdnnnmGf3jH/8o+X7t2rV699139fTTT6t169Yly9u3b1/ydYcOHfT444+XOVaDBg1Kvp41a5ZGjhypDh066JFHHlG9evV04MABLV26VJ988oluvvnmStc8bdo0NWnSRGvWrNHevXvVrFmzcu338MMP6/3339fw4cN1yy23yMXFRbt27dKvv/6qyMhIdevWTVJxwPv888+rd+/eatKkSaXrrA4ffvihvL29lZ2drXnz5umll17SH3/8oeXLl5/z3po3b141VSlZrVZ9/PHH6tGjhyZOnKiXX3651PoHH3xQrq6uevfddzV8+PBS67788kvNnz+/zH9vrVu3LgmLR40apSFDhsjhcCg9PV1r167V22+/rXfeeUdTpkzRTTfddGEvEAAAoLIMAAAAnNHnn39uSDKuu+46IygoyLDZbKXW33333UanTp2MiIgIY+jQoaXWSTLGjh1bofO1adPGuOKKK864/rPPPjOsVqvxxx9/GJKMxYsXV+j41WHWrFmGJGPRokWnXX+61+p0oqOjjTZt2hgFBQVl1iUmJpb6viKv9f79+w1JxuzZs43g4GBjwoQJ5dovISHBMJlMxt13311mncPhKFXTuV6DqnL77bcbXl5eldr3ueeeMyQZycnJpZZfd911hiRjxYoVZ9w3JyenUuesCvfff79htVqNbdu2lSz77rvvDEnGBx98cNp9xo4da5zpnz4HDhwwJBn//e9/y6w7ePCg0aJFC8PV1dXYtGlT1VwAAABAFWNEAwAAQDmMGjVKqampmj9/fsmywsJCfffdd+fVSVpR06ZN04ABA9SnTx+1bt1a06ZNO+c+NptNAQEBuuOOO8qsy8zMlLu7u/75z3+WLHvvvffUpk0beXp6ql69eurcuXOZkQjVYd++ferSpYtcXV3LrAsJCan0cadNm6Z69epp6NChuv7668v1GkrSgQMHZBiGevToUWadyWQqqWnq1Km64YYbJEl9+vQpNQ7gpA8++EBt2rSRm5ubGjRooLFjx+r48eNljrt69WoNGTJE9erVk5eXl9q3b6933nnnrHVu2rRJwcHB6t27t7Kzs8t1bafq27dvyfVKxSM42rZtq/Xr16tXr17y9PTU008/XbLu7zN48/PzNWHCBLVo0ULu7u6qX7++rrvuOu3bt69kG4fDobfffltt2rSRu7u7QkNDde+99yo9Pf2c9b3yyisKCgrSfffdJ8MwlJ2drUcffVQxMTG67777Kny9ZxMREaGpU6eqsLBQr732WpUeGwAAoKoQ8AIAAJRDkyZNFBMToxkzZpQs+/XXX5WRkXHWt27n5+crJSWlzEdhYWGFazh27JgWLVqkUaNGSSoOnb/77rtzHstqteraa6/Vjz/+WGbbH3/8UQUFBSXX8Mknn+jhhx9WdHS03n77bT3//PPq0KGDVq9eXeF6z8Zms532dTl1tmpERIQWLlyouLi4Kj33tGnTdN1118nV1VWjRo3Snj17tHbt2nPuFxERIal4dERubu4Zt+vVq5cefvhhSdLTTz+tr776Sl999VXJuIoJEyZo7NixatCggd544w2NGDFCkydP1sCBA2Wz2UqOM3/+fPXq1UuxsbF65JFH9MYbb6hPnz6aM2fOGc+9du1a9e3bVx07dtSvv/5aqQewnQxiAwMDS5alpqZq8ODB6tChg95++2316dPntPva7XZdddVVev7559WpUye98cYbeuSRR5SRkaFt27aVbHfvvffqiSeeUI8ePfTOO+/ojjvu0LRp0zRo0KBSr8Hp+Pn56d1339WyZcv06aef6tlnn1ViYqI+/vjjCzKuJCYmRlFRUaV+uQMAAFCjOLuFGAAAoCY7OaJh7dq1xqRJkwwfHx8jNzfXMAzDuOGGG4w+ffoYhnH6sQOSzvgxY8aM057vbCMaXn/9dcPDw8PIzMw0DMMwdu/ebUgyfvjhh3Nex++//25IMn7++edSy4cMGWJERkaWfD98+HCjTZs25zze2ZRnRMOZXpdXXnmlZLspU6YYkgxXV1ejT58+xrPPPmv8+eefht1uL3NMlXNEw7p16wxJxvz58w3DKB6t0KhRI+ORRx4p17WNHj3akGTUq1fPuPbaa43XX3/d2LFjR7lfg6SkJMPV1dUYOHBgqeuYNGmSIcn47LPPDMMwjKKiIqNp06ZGRESEkZ6eXuoYDoej5OtTRzQsW7bM8PX1NYYOHWrk5+ef81pOjmjYtWuXkZycbBw4cMCYPHmy4ebmZoSGhpaMYbjiiisMScZHH31U5hhXXHFFqfv1s88+MyQZb775ZpltT9b9559/GpKMadOmlVr/22+/nXb5mVx11VWGn5+fYbFYjPHjx59128qOaDhp+PDhhiQjIyOjXLUBAABUJzp4AQAAyunGG29UXl6e5syZo6ysLM2ZM+ec4xmGDx+u+fPnl/k4Uwfk2UybNk1Dhw6Vj4+PJKl58+bq1KlTuUYM9O3bV0FBQfrmm29KlqWnp2v+/PkaOXJkyTJ/f3/FxcWVq6P1fHTt2vW0r8vJ7mRJuvPOO/Xbb7+pd+/eWrZsmSZOnKiePXuqefPmWrFiRaXOO23aNIWGhpa8/iaTSSNHjtTMmTNlt9vPuf/nn3+uSZMmqWnTpvrhhx/0z3/+U61bt1a/fv109OjRc+6/YMECFRYW6tFHH5XZ/Ndfxe+++275+vrql19+kSRt3LhRBw4c0KOPPip/f/9Sxzhdl+qiRYs0aNAg9evXT7Nnzz7jQ/9Op2XLlgoODlbTpk117733qlmzZvrll1/k6elZso2bm9tpR3z83ffff6+goCA99NBDZdadrHvWrFny8/PTgAEDSnVvd+rUSd7e3lq0aFG56n7//fdVWFio8PBwPfvss+W82so52QmdlZV1Qc8DAABQGS7OLgAAAKC2CA4OVv/+/TV9+nTl5ubKbrfr+uuvP+s+jRo1Uv/+/c/73Dt27NDGjRs1evRo7d27t2R579699f777yszM1O+vr5n3N/FxUUjRozQ9OnTVVBQIDc3N82ePVs2m61UwPvUU09pwYIFuuyyy9SsWTMNHDhQN99882nnzp6PoKCgcr0ugwYN0qBBg5Sbm6v169frm2++0UcffaSrrrpKO3furNAsXrvdrpkzZ6pPnz4l82Wl4rD5jTfe0MKFCzVw4MCzHsNsNmvs2LEaO3asUlNTtXz5cn300Uf69ddfddNNN+nPP/886/6HDh2SVByqnsrV1VWRkZEl60+OSWjbtu05rys/P19Dhw5Vp06d9O2338rFpWJ/xf/+++/l6+srq9WqRo0aKSoqqsw2DRs2PO0s5L/bt2+fWrZsedYa9uzZo4yMjDP+2SUlJZWr7saNGyskJERt2rSRh4dHufaprJOzjE/+cgUAAKAmIeAFAACogJtvvll33323EhISNHjw4DLdlRfK119/LUl67LHH9Nhjj5VZ//3335+zw/Kmm27S5MmT9euvv+qaa67Rt99+q1atWumSSy4p2aZ169batWuX5syZo99++03ff/+9PvjgA/373//W888/X7UXVQGenp7q2bOnevbsqaCgID3//PP69ddfdfvtt5f7GH/88Yfi4+M1c+ZMzZw5s8z6adOmnTPgPVVgYKCuvvpqXX311erdu7eWLFmiQ4cOlczqrS5ubm4aMmSI/ve//+m3337TVVddVaH9e/XqpaCgoLNuU5UBqsPhUEhIyBk7z4ODg6vsXFVl27ZtCgkJOesvUQAAAJyFgBcAAKACrr32Wt17771atWpVqXEHF5JhGJo+fbr69OmjBx54oMz6iRMnatq0aecMeHv16qX69evrm2++0eWXX64//vhDzzzzTJntvLy8NHLkSI0cOVKFhYW67rrr9NJLL2n8+PFyd3evsuuqrM6dO0uS4uPjK7TftGnTFBISovfff7/MutmzZ+uHH37QRx99VKkws3PnzlqyZIni4+MVERFxxod9nQx/d+3apcjIyJLlhYWFOnDgQElX88ku2m3btp2z09lkMmnatGkaPny4brjhBv3666/q3bt3ha+hKkRFRWn16tWy2WyyWq1n3GbBggXq0aPHBe+8rQorV67Uvn37dOuttzq7FAAAgNNiBi8AAEAFeHt768MPP9SECRM0bNiwajnn8uXLdfDgQd1xxx26/vrry3yMHDlSixYt0rFjx856HLPZrOuvv14///yzvvrqKxUVFZUazyBJqamppb53dXVVdHS0DMOQzWar8ms7m4UL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5+dr+vTpaty4caltr7zySn3++eellrm5ucnLy0vx8fElyx555BFlZmaW2jYgIECSNHXqVN14441aunSpVq9era5du16oSwMAAAAAAEAVI+AFaphLL71U+/bt0+zZs3XLLbdIkmbPnq3GjRuradOmpbZ1c3NTWFjYaY9z6nIPDw8VFBSU2dYwDH3++ef64IMP1KhRI02ZMoWAFwAAAAAAoBZhRAPqBMMwlFtYVG0feYV25RYWyTCMStV75513luq2/eyzz3THHXdU1ctRYtGiRcrNzVX//v116623aubMmcrJyany8wAAAAAAAODCoIMXdUKeza7of/9e7eeNfWGQPF0r/p/ZrbfeqvHjx+vQoUOSpOXLl2vmzJklc3NPmjNnjry9vUste/rpp/X000+X6zxTpkzRTTfdJIvForZt2yoyMlKzZs0qmfMLAAAAAACAmo2AF6iBgoODNXToUE2dOlWGYWjo0KEKCgoqs12fPn304Ycfllp2crbuuRw/flyzZ8/WsmXLSpbdeuutmjJlCgEvAAAAAABALUHAizrBw2pR7AuDquVcDodDWZlZ8vH1kYfVUunj3HnnnXrwwQclSe+///5pt/Hy8lKzZs0qdfzp06crPz+/1MxdwzDkcDi0e/dutWjRolLHBQAAAAAAQPUh4EWdYDKZKjUqoTIcDoeKXC3ydHWRyWSq9HGuvPJKFRYWymQyadCgqg+np0yZoscff7xMt+4DDzygzz77TK+++mqVnxMAAAAAAABVi4AXqKEsFot27NhR8vXpFBQUKCEhodQyFxeX045zONWmTZu0YcMGTZs2Ta1atSq1btSoUXrhhRf04osvysWFHxEAAAAAAAA1mdnZBQA4M19fX/n6+p5x/W+//ab69euX+rj88svPedwpU6YoOjq6TLgrSddee62SkpI0d+7c86odAAAAAFA7GIah2Rvi9N36OGXl25xdDoAKoj0PqEGmTp161vU//vhjqW3Ptf2Zjvvee++dcduwsDDZ7fZyHRcAAAAAUPst3ZOicd9uliQ984NZA6JDdd2lDdWzebCsFnoDgZqOgBcAAAAAAKAO+2TpfkmSj5uLsgqKNGdLvOZsiVegl6uGXdJAIy5tpLYNfc/rOTMALhwCXgAAAAAAgDpq+7EMLdubIovZpF8f7am0nELN3nBUP28+ptScQk1dcVBTVxxUsxBv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VmRkpPXUU09dcI3c3Fxr3bp1hbahQ4daTZo0sdatW2edOnXqorVFR0db//znP/P3nThxokwXWTt3AYhRo0axyNpleOp4OdfFFlkrSo8ePaxbb721xM+B0qsMY3T//v1Wo0aNrLvvvtvKyckp1n0//fTTVsuWLQvtu+eee1gM5DI8dbyc62ILHJ0vJyfHatKkifXEE0+U+Dk8SWUYU+fbs2ePJclauHDhRc/hNah0PHW8nIvXINfm7mN0z549ha47e/ZsS5L1zTffWPv27bvoffOaBnguAl64raFDh1phYWHWokWLrKSkpPwtIyMj/5xHHnnEql27trVgwQLr999/t+Li4qy4uLj84+vWrbOqV69u3XfffYWukZKSctHnLc7KqJZlWa+99poVHh5uTZs2zVq7dq3Vr18/q169etbp06fzz9mzZ4+1atUqa8yYMVZwcLC1atUqa9WqVdbJkycvet3U1FQrKirKuv/++63169dbkydPtgIDA60PPvgg/5ysrKz8a8XExFh/+ctfrFWrVlnbtm27bN2VlaeOF8uyrA0bNlirVq2ybr75ZqtLly75j8vzxhtvWFOnTrW2bdtmrVu3znr88cctLy8va968eZetG2XH3cfo/v37rYYNG1rdu3e39u/fX+j5L2Xnzp1WYGCg9dRTT1mbNm2yxo8fb3l7e1uzZs3KP+fkyZP541aS9e9//9tatWqVtWfPnsvWXVl56nixLCt/LLRv394aOHCgtWrVKmvDhg35x8eMGWPNnj3b2rFjh5WYmGjdfffdlr+/f6FzcCF3H1O//PKL9c4771irVq2ydu/ebc2fP9/q2LGj1aBBAyszM/Oi1+U1qHQ8dbxYFq9B7sLdx+j5du3aZUkq9N/wReE1DfBcBLxwW5KK3CZMmJB/zunTp61HH33UqlKlihUYGGjdeuuthf7n8YUXXijyGnXq1Lno8xb3l7bD4bD+9re/WVFRUZafn5/VvXt3a8uWLYXOGTx4cJHPf7mZA2vWrLGuv/56y8/Pz6pZs6b12muvFTqe9x8A52833njjZeuurDx5vNSpU6fIx+V5/fXXrQYNGlj+/v5WRESE1aVLF2vBggWXrRlly93H6IQJEy56D5ezcOFCq23btpavr69Vv379Qvecd7yo6w4ePPiy166sPHm8XK7mESNGWLVr17Z8fX2tqKgoq0+fPtbKlSsve11P5+5jau3atVbXrl2tiIgIy8/Pz6pbt671yCOPWPv377/stXkNKjlPHi+8BrkHdx+j5ytuwGtZvKYBnspmWWe7yAMAAAAAAAAA3IqXswsAAAAAAAAAAJQOAS8AAAAAAAAAuCkCXgAAAAAAAABwUwS8AAAAAAAAAOCmCHgBAAAAAAAAwE0R8AIAAAAAAACAmyLgBQAAAAAAAAA3RcALAAAAAAAAAG6KgBcAAAAeYciQIbLZbLLZbLLb7YqKilLPnj31ySefyOFwFPs6EydOVHh4ePkVCgAAAJQAAS8AAAA8Rq9evZSUlKTdu3dr5syZ6tq1qx5//HHddNNNysnJcXZ5AAAAQIkR8AIAAMBj+Pn5KTo6WjVr1tRVV12lZ599VtOmTdPMmTM1ceJESdK///1vtWrVSkFBQYqNjdWjjz6qU6dOSZIWLVqkP/zhDzpx4kT+bOAXX3xRkpSVlaW//OUvqlmzpoKCgnTttddq0aJFzrlRAAAAeAwCXgAAAHi0bt26qU2bNpoyZYokycvLS2+//bY2bNigTz/9VAsWLNDTTz8tSerYsaPefPNNhYaGKikpSUlJSfrLX/4iSRo+fLiWL1+uyZMna+3atbrjjjvUq1cvbdu2zWn3BgAAgMrPZlmW5ewiAAAAgPI2ZMgQpaamaurUqRccu/vuu7V27Vpt3LjxgmPffPONHnnkER05ckSS6cE7YsQIpaam5p+zd+9e1a9fX3v37lWNGjXy9/fo0UPXXHONXn311TK/HwAAAECSfJxdAAAAAOBslmXJZrNJkubNm6exY8dq8+bNSktLU05OjjIzM5WRkaHAwMAiH79u3Trl5uaqcePGhfZnZWWpatWq5V4/AAAAPBcBLwAAADzepk2bVK9ePe3evVs33XSThg4dqldeeUURERH6+eef9cADD+jMmTMXDXhPnTolb29vJSYmytvbu9Cx4ODgirgFAAAAeCgCXgAAAHi0BQsWaN26dXriiSeUmJgoh8Ohf/3rX/LyMstVfPXVV4XO9/X1VW5ubqF97dq1U25urlJSUnTDDTdUWO0AAAAAAS8AAAA8RlZWlpKTk5Wbm6tDhw5p1qxZGjt2rG666SYNGjRI69evV3Z2tt555x3dfPPNWrp0qd5///1C16hbt65OnTql+fPnq02bNgoMDFTjxo117733atCgQfrXv/6ldu3a6fDhw5o/f75at26tvn37OumOAQAAUNl5ObsAAAAAoKLMmjVLMTExqlu3rnr16qWFCxfq7bff1rRp0+Tt7a02bdro3//+t15//XW1bNlSX3zxhcaOHVvoGh07dtQjjzyiu+66S9WrV9e4ceMkSRMmTNCgQYP05JNPqkmTJurfv79+++031a5d2xm3CgAAAA9hsyzLcnYRAAAAAAAAAICSYwYvAAAAAAAAALgpAl4AAAAAAAAAcFMEvAAAAAAAAADgpgh4AQAAAAAAAMBNEfACAAAAAAAAgJsi4AUAAAAAAAAAN0XACwAAAAAAAABuioAXAAAAAAAAANwUAS8AAAAAAAAAuCkCXgAAAAAAAABwUwS8AAAAAAAAAOCmCHgBAAAAAAAAwE0R8AIAAAAAAACAmyLgBQAAAAAAAAA3RcALAAAAAAAAAG6KgBcAAAAAAAAA3BQBLwAAAAAAAAC4KQJeAAAAAAAAAHBTBLwAAAAAAAAA4KYIeAEAAAAAAADATRHwAgAAAAAAAICbIuAFAAAAAAAAADdFwAsAAAAAAAAAboqAFwAAAAAAAADcFAEvAAAAAAAAALgpAl4AAAAAAAAAcFMEvAAAAAAAAADgpgh4AQAAAAAAAMBNEfACAAAAAAAAgJsi4AUAAAAAAAAAN0XACwAAAAAAAABuioAXAAAAAAAAANwUAS8AAAAAAAAAuCkCXgAAAAAAAABwUwS8AAAAAAAAAOCmCHgBAAAAAAAAwE39PxUbywGxcgDbAAAAAElFTkSuQmCC", "text/plain": [ "" ] @@ -421,14 +458,14 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['Date', 'META', 'TSLA']\n", + "['Date', 'META', 'TESLA']\n", "['2024-01-02', '346.2900085449219', '248.4199981689453']\n", "['2024-01-03', '344.4700012207031', '238.4499969482422']\n", "['2024-01-04', '347.1199951171875', '237.92999267578125']\n", @@ -470,7 +507,34 @@ "['2024-02-27', '487.04998779296875', '199.72999572753906']\n", "['2024-02-28', '484.0199890136719', '202.0399932861328']\n", "['2024-02-29', '490.1300048828125', '201.8800048828125']\n", - "['2024-03-01', '502.29998779296875', '202.63999938964844']\n" + "['2024-03-01', '502.29998779296875', '202.63999938964844']\n", + "['2024-03-04', '498.19000244140625', '188.13999938964844']\n", + "['2024-03-05', '490.2200012207031', '180.74000549316406']\n", + "['2024-03-06', '496.0899963378906', '176.5399932861328']\n", + "['2024-03-07', '512.1900024414062', '178.64999389648438']\n", + "['2024-03-08', '505.95001220703125', '175.33999633789062']\n", + "['2024-03-11', '483.5899963378906', '177.77000427246094']\n", + "['2024-03-12', '499.75', '177.5399932861328']\n", + "['2024-03-13', '495.57000732421875', '169.47999572753906']\n", + "['2024-03-14', '491.8299865722656', '162.5']\n", + "['2024-03-15', '484.1000061035156', '163.57000732421875']\n", + "['2024-03-18', '496.9800109863281', '173.8000030517578']\n", + "['2024-03-19', '496.239990234375', '171.32000732421875']\n", + "['2024-03-20', '505.5199890136719', '175.66000366210938']\n", + "['2024-03-21', '507.760009765625', '172.82000732421875']\n", + "['2024-03-22', '509.5799865722656', '170.8300018310547']\n", + "['2024-03-25', '503.0199890136719', '172.6300048828125']\n", + "['2024-03-26', '495.8900146484375', '177.6699981689453']\n", + "['2024-03-27', '493.8599853515625', '179.8300018310547']\n", + "['2024-03-28', '485.5799865722656', '175.7899932861328']\n", + "['2024-04-01', '491.3500061035156', '175.22000122070312']\n", + "['2024-04-02', '497.3699951171875', '166.6300048828125']\n", + "['2024-04-03', '506.739990234375', '168.3800048828125']\n", + "['2024-04-04', '510.9200134277344', '171.11000061035156']\n", + "['2024-04-05', '527.3400268554688', '164.89999389648438']\n", + "['2024-04-08', '519.25', '172.97999572753906']\n", + "['2024-04-09', '516.9000244140625', '176.8800048828125']\n", + "['2024-04-10', '519.8300170898438', '171.75999450683594']\n" ] } ], @@ -502,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -513,7 +577,7 @@ "\n", "Analyze the data and write a brief but engaging blog post. \n", " Data: \n", - "Date,META,TSLA\n", + "Date,META,TESLA\n", "2024-01-02,346.2900085449219,248.4199981689453\n", "2024-01-03,344.4700012207031,238.4499969482422\n", "2024-01-04,347.1199951171875,237.92999267578125\n", @@ -556,124 +620,134 @@ "2024-02-28,484.0199890136719,202.0399932861328\n", "2024-02-29,490.1300048828125,201.8800048828125\n", "2024-03-01,502.29998779296875,202.63999938964844\n", + "2024-03-04,498.19000244140625,188.13999938964844\n", + "2024-03-05,490.2200012207031,180.74000549316406\n", + "2024-03-06,496.0899963378906,176.5399932861328\n", + "2024-03-07,512.1900024414062,178.64999389648438\n", + "2024-03-08,505.95001220703125,175.33999633789062\n", + "2024-03-11,483.5899963378906,177.77000427246094\n", + "2024-03-12,499.75,177.5399932861328\n", + "2024-03-13,495.57000732421875,169.47999572753906\n", + "2024-03-14,491.8299865722656,162.5\n", + "2024-03-15,484.1000061035156,163.57000732421875\n", + "2024-03-18,496.9800109863281,173.8000030517578\n", + "2024-03-19,496.239990234375,171.32000732421875\n", + "2024-03-20,505.5199890136719,175.66000366210938\n", + "2024-03-21,507.760009765625,172.82000732421875\n", + "2024-03-22,509.5799865722656,170.8300018310547\n", + "2024-03-25,503.0199890136719,172.6300048828125\n", + "2024-03-26,495.8900146484375,177.6699981689453\n", + "2024-03-27,493.8599853515625,179.8300018310547\n", + "2024-03-28,485.5799865722656,175.7899932861328\n", + "2024-04-01,491.3500061035156,175.22000122070312\n", + "2024-04-02,497.3699951171875,166.6300048828125\n", + "2024-04-03,506.739990234375,168.3800048828125\n", + "2024-04-04,510.9200134277344,171.11000061035156\n", + "2024-04-05,527.3400268554688,164.89999389648438\n", + "2024-04-08,519.25,172.97999572753906\n", + "2024-04-09,516.9000244140625,176.8800048828125\n", + "2024-04-10,519.8300170898438,171.75999450683594\n", "\n", "\n", "--------------------------------------------------------------------------------\n", "\u001b[33massistant\u001b[0m (to user_proxy):\n", "\n", - "To write a blog post, we need to analyze the data to identify trends, significant changes, and any other notable points. We will start by calculating the percentage change for both META and TSLA stocks from the beginning to the end of the data provided. This will give us an idea of the overall performance of each stock over the period.\n", + "To analyze this data and write a blog post, we first need to load the data into a pandas DataFrame, then perform some basic analysis on it. We can then use the results of this analysis to write the blog post.\n", "\n", - "Let's write a Python script to calculate the percentage change for both stocks.\n", + "Here is the Python code to load the data and perform the analysis:\n", "\n", "```python\n", - "# filename: stock_analysis.py\n", - "\n", + "# Python code\n", "import pandas as pd\n", "from io import StringIO\n", "\n", - "# Data provided as a CSV string\n", "data = \"\"\"\n", - "Date,META,TSLA\n", + "Date,META,TESLA\n", "2024-01-02,346.2900085449219,248.4199981689453\n", "2024-01-03,344.4700012207031,238.4499969482422\n", - "2024-01-04,347.1199951171875,237.92999267578125\n", - "2024-01-05,351.95001220703125,237.49000549316406\n", - "2024-01-08,358.6600036621094,240.4499969482422\n", - "2024-01-09,357.42999267578125,234.9600067138672\n", - "2024-01-10,370.4700012207031,233.94000244140625\n", - "2024-01-11,369.6700134277344,227.22000122070312\n", - "2024-01-12,374.489990234375,218.88999938964844\n", - "2024-01-16,367.4599914550781,219.91000366210938\n", - "2024-01-17,368.3699951171875,215.5500030517578\n", - "2024-01-18,376.1300048828125,211.8800048828125\n", - "2024-01-19,383.45001220703125,212.19000244140625\n", - "2024-01-22,381.7799987792969,208.8000030517578\n", - "2024-01-23,385.20001220703125,209.13999938964844\n", - "2024-01-24,390.70001220703125,207.8300018310547\n", - "2024-01-25,393.17999267578125,182.6300048828125\n", - "2024-01-26,394.1400146484375,183.25\n", - "2024-01-29,401.0199890136719,190.92999267578125\n", - "2024-01-30,400.05999755859375,191.58999633789062\n", - "2024-01-31,390.1400146484375,187.2899932861328\n", - "2024-02-01,394.7799987792969,188.86000061035156\n", - "2024-02-02,474.989990234375,187.91000366210938\n", - "2024-02-05,459.4100036621094,181.05999755859375\n", - "2024-02-06,454.7200012207031,185.10000610351562\n", - "2024-02-07,469.5899963378906,187.5800018310547\n", - "2024-02-08,470.0,189.55999755859375\n", - "2024-02-09,468.1099853515625,193.57000732421875\n", - "2024-02-12,468.8999938964844,188.1300048828125\n", - "2024-02-13,460.1199951171875,184.02000427246094\n", - "2024-02-14,473.2799987792969,188.7100067138672\n", - "2024-02-15,484.0299987792969,200.4499969482422\n", - "2024-02-16,473.32000732421875,199.9499969482422\n", - "2024-02-20,471.75,193.75999450683594\n", - "2024-02-21,468.0299987792969,194.77000427246094\n", - "2024-02-22,486.1300048828125,197.41000366210938\n", - "2024-02-23,484.0299987792969,191.97000122070312\n", - "2024-02-26,481.739990234375,199.39999389648438\n", - "2024-02-27,487.04998779296875,199.72999572753906\n", - "2024-02-28,484.0199890136719,202.0399932861328\n", - "2024-02-29,490.1300048828125,201.8800048828125\n", - "2024-03-01,502.29998779296875,202.63999938964844\n", + "...\n", + "2024-04-10,519.8300170898438,171.75999450683594\n", "\"\"\"\n", "\n", - "# Read the data into a pandas DataFrame\n", + "# Load the data into a pandas DataFrame\n", "df = pd.read_csv(StringIO(data))\n", "\n", - "# Calculate the percentage change for META and TSLA\n", - "meta_start = df['META'].iloc[0]\n", - "meta_end = df['META'].iloc[-1]\n", - "meta_change = ((meta_end - meta_start) / meta_start) * 100\n", + "# Calculate the mean, max, min, and standard deviation for each stock\n", + "meta_mean = df['META'].mean()\n", + "meta_max = df['META'].max()\n", + "meta_min = df['META'].min()\n", + "meta_std = df['META'].std()\n", "\n", - "tsla_start = df['TSLA'].iloc[0]\n", - "tsla_end = df['TSLA'].iloc[-1]\n", - "tsla_change = ((tsla_end - tsla_start) / tsla_start) * 100\n", + "tesla_mean = df['TESLA'].mean()\n", + "tesla_max = df['TESLA'].max()\n", + "tesla_min = df['TESLA'].min()\n", + "tesla_std = df['TESLA'].std()\n", "\n", "# Print the results\n", - "print(f\"META stock changed by {meta_change:.2f}% from the beginning to the end of the period.\")\n", - "print(f\"TSLA stock changed by {tsla_change:.2f}% from the beginning to the end of the period.\")\n", + "print(f\"META - Mean: {meta_mean}, Max: {meta_max}, Min: {meta_min}, Std: {meta_std}\")\n", + "print(f\"TESLA - Mean: {tesla_mean}, Max: {tesla_max}, Min: {tesla_min}, Std: {tesla_std}\")\n", "```\n", "\n", - "Please run this script to calculate the percentage change for both META and TSLA stocks. Once we have the results, we can proceed to write the blog post.\n", + "After running this code, we can use the results to write the blog post. Here is a possible blog post based on the results:\n", + "\n", + "---\n", + "\n", + "Title: A Comparative Analysis of META and TESLA Stocks in Early 2024\n", + "\n", + "In the first quarter of 2024, the stock market saw some interesting movements in the tech sector. Two companies that stood out during this period were META and TESLA. \n", + "\n", + "META, the social media giant, had an average stock price of [META Mean] during this period. The highest it reached was [META Max], while the lowest was [META Min]. The standard deviation, a measure of how spread out the prices were, was [META Std].\n", + "\n", + "On the other hand, TESLA, the electric vehicle and clean energy company, had an average stock price of [TESLA Mean]. The stock reached a high of [TESLA Max] and a low of [TESLA Min]. The standard deviation for TESLA was [TESLA Std].\n", + "\n", + "These figures show that both META and TESLA had their ups and downs during this period. However, the higher standard deviation for [Company with higher Std] indicates that its stock price fluctuated more compared to [Company with lower Std].\n", + "\n", + "As we move further into 2024, it will be interesting to see how these trends evolve. Will META and TESLA continue on their current trajectories, or will we see a shift in the market dynamics? Only time will tell.\n", + "\n", + "---\n", + "\n", + "Please replace [META Mean], [META Max], [META Min], [META Std], [TESLA Mean], [TESLA Max], [TESLA Min], [TESLA Std], [Company with higher Std], and [Company with lower Std] with the actual values obtained from the Python code.\n", "\n", "--------------------------------------------------------------------------------\n", "\u001b[31m\n", - ">>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...\u001b[0m\n", + ">>>>>>>> EXECUTING CODE BLOCK (inferred language is python)...\u001b[0m\n", "\u001b[33muser_proxy\u001b[0m (to assistant):\n", "\n", "exitcode: 0 (execution succeeded)\n", - "Code output: \n", - "META stock changed by 45.05% from the beginning to the end of the period.\n", - "TSLA stock changed by -18.43% from the beginning to the end of the period.\n", + "Code output: META - Mean: 403.53000895182294, Max: 519.8300170898438, Min: 344.4700012207031, Std: 100.72287240911488\n", + "TESLA - Mean: 219.54332987467447, Max: 248.4199981689453, Min: 171.75999450683594, Std: 41.68075797345465\n", "\n", "\n", "--------------------------------------------------------------------------------\n", "\u001b[33massistant\u001b[0m (to user_proxy):\n", "\n", - "Based on the analysis, we can see that META stock experienced a significant increase of 45.05% from the beginning to the end of the period, while TSLA stock saw a decrease of 18.43% in the same timeframe. This information will be the foundation for our blog post.\n", - "\n", - "Here's a draft for the blog post:\n", + "Great! Now that we have the results, let's write the blog post.\n", "\n", "---\n", "\n", - "**A Tale of Two Stocks: META Soars as TSLA Dips in Early 2024**\n", + "Title: A Comparative Analysis of META and TESLA Stocks in Early 2024\n", "\n", - "As we navigate through the early months of 2024, the stock market has presented a mixed bag of performances, with some companies experiencing remarkable growth and others facing downward trends. Two notable examples that have caught the attention of investors are META and TSLA.\n", + "In the first quarter of 2024, the stock market saw some interesting movements in the tech sector. Two companies that stood out during this period were META and TESLA. \n", "\n", - "META, the social media giant, has seen its stock price skyrocket by an impressive 45.05% since the start of the year. This surge can be attributed to a series of successful product launches and strategic acquisitions, positioning the company at the forefront of innovation and profitability. Investors have shown their confidence in META's future, as the company continues to diversify its revenue streams and expand its global reach.\n", + "META, the social media giant, had an average stock price of 403.53 during this period. The highest it reached was 519.83, while the lowest was 344.47. The standard deviation, a measure of how spread out the prices were, was 100.72.\n", "\n", - "On the other hand, TSLA, the electric vehicle pioneer, has faced a challenging period with its stock price declining by 18.43%. The dip reflects concerns over production delays, increased competition in the electric vehicle market, and a series of high-profile controversies surrounding its CEO. Despite these setbacks, loyal supporters of TSLA believe in the company's long-term vision and its potential to rebound as it addresses these challenges.\n", + "On the other hand, TESLA, the electric vehicle and clean energy company, had an average stock price of 219.54. The stock reached a high of 248.42 and a low of 171.76. The standard deviation for TESLA was 41.68.\n", "\n", - "The contrasting trajectories of META and TSLA highlight the volatile nature of the stock market, where fortunes can shift rapidly based on consumer sentiment, market conditions, and internal company developments. As investors continue to monitor these stocks, the coming months will be crucial in determining whether META can maintain its upward momentum and if TSLA can steer back onto the path of growth.\n", + "These figures show that both META and TESLA had their ups and downs during this period. However, the higher standard deviation for META indicates that its stock price fluctuated more compared to TESLA.\n", "\n", - "For those looking to invest, the current landscape serves as a reminder of the importance of due diligence and a balanced portfolio. While the allure of quick gains is tempting, the market's unpredictability necessitates a strategy that can withstand the ebbs and flows of stock valuations.\n", - "\n", - "As we move forward into 2024, all eyes will be on these two industry titans, as their stories unfold and continue to shape the investment world.\n", + "As we move further into 2024, it will be interesting to see how these trends evolve. Will META and TESLA continue on their current trajectories, or will we see a shift in the market dynamics? Only time will tell.\n", "\n", "---\n", "\n", - "This blog post provides a narrative based on the data analysis we performed. It should engage readers by discussing the recent performance of both stocks and offering a broader perspective on market volatility.\n", + "This blog post provides a brief but engaging analysis of the META and TESLA stocks based on the provided data. It highlights the mean, max, min, and standard deviation of the stock prices for both companies, and provides some commentary on what these figures might mean for the future.\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33muser_proxy\u001b[0m (to assistant):\n", + "\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33massistant\u001b[0m (to user_proxy):\n", "\n", "TERMINATE\n", "\n", @@ -698,6 +772,8 @@ " recipient=assistant,\n", " message=my_message_generator,\n", " file_name=\"coding/stock_price_ytd.csv\",\n", + " summary_method=\"reflection_with_llm\",\n", + " summary_args={\"summary_prompt\": \"Return the blog post in Markdown format.\"},\n", ")" ] }, @@ -710,38 +786,28 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Based on the analysis, we can see that META stock experienced a significant increase of 45.05% from the beginning to the end of the period, while TSLA stock saw a decrease of 18.43% in the same timeframe. This information will be the foundation for our blog post.\n", - "\n", - "Here's a draft for the blog post:\n", - "\n", "---\n", "\n", - "**A Tale of Two Stocks: META Soars as TSLA Dips in Early 2024**\n", + "# A Comparative Analysis of META and TESLA Stocks in Early 2024\n", "\n", - "As we navigate through the early months of 2024, the stock market has presented a mixed bag of performances, with some companies experiencing remarkable growth and others facing downward trends. Two notable examples that have caught the attention of investors are META and TSLA.\n", + "In the first quarter of 2024, the stock market saw some interesting movements in the tech sector. Two companies that stood out during this period were META and TESLA. \n", "\n", - "META, the social media giant, has seen its stock price skyrocket by an impressive 45.05% since the start of the year. This surge can be attributed to a series of successful product launches and strategic acquisitions, positioning the company at the forefront of innovation and profitability. Investors have shown their confidence in META's future, as the company continues to diversify its revenue streams and expand its global reach.\n", + "META, the social media giant, had an average stock price of 403.53 during this period. The highest it reached was 519.83, while the lowest was 344.47. The standard deviation, a measure of how spread out the prices were, was 100.72.\n", "\n", - "On the other hand, TSLA, the electric vehicle pioneer, has faced a challenging period with its stock price declining by 18.43%. The dip reflects concerns over production delays, increased competition in the electric vehicle market, and a series of high-profile controversies surrounding its CEO. Despite these setbacks, loyal supporters of TSLA believe in the company's long-term vision and its potential to rebound as it addresses these challenges.\n", + "On the other hand, TESLA, the electric vehicle and clean energy company, had an average stock price of 219.54. The stock reached a high of 248.42 and a low of 171.76. The standard deviation for TESLA was 41.68.\n", "\n", - "The contrasting trajectories of META and TSLA highlight the volatile nature of the stock market, where fortunes can shift rapidly based on consumer sentiment, market conditions, and internal company developments. As investors continue to monitor these stocks, the coming months will be crucial in determining whether META can maintain its upward momentum and if TSLA can steer back onto the path of growth.\n", + "These figures show that both META and TESLA had their ups and downs during this period. However, the higher standard deviation for META indicates that its stock price fluctuated more compared to TESLA.\n", "\n", - "For those looking to invest, the current landscape serves as a reminder of the importance of due diligence and a balanced portfolio. While the allure of quick gains is tempting, the market's unpredictability necessitates a strategy that can withstand the ebbs and flows of stock valuations.\n", + "As we move further into 2024, it will be interesting to see how these trends evolve. Will META and TESLA continue on their current trajectories, or will we see a shift in the market dynamics? Only time will tell.\n", "\n", - "As we move forward into 2024, all eyes will be on these two industry titans, as their stories unfold and continue to shape the investment world.\n", - "\n", - "---\n", - "\n", - "This blog post provides a narrative based on the data analysis we performed. It should engage readers by discussing the recent performance of both stocks and offering a broader perspective on market volatility.\n", - "\n", - "\n" + "---\n" ] } ], @@ -749,6 +815,25 @@ "print(chat_res.summary)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the blog post that the agents generated.\n", + "\n", + "# A Comparative Analysis of META and TESLA Stocks in Early 2024\n", + "\n", + "In the first quarter of 2024, the stock market saw some interesting movements in the tech sector. Two companies that stood out during this period were META and TESLA. \n", + "\n", + "META, the social media giant, had an average stock price of 403.53 during this period. The highest it reached was 519.83, while the lowest was 344.47. The standard deviation, a measure of how spread out the prices were, was 100.72.\n", + "\n", + "On the other hand, TESLA, the electric vehicle and clean energy company, had an average stock price of 219.54. The stock reached a high of 248.42 and a low of 171.76. The standard deviation for TESLA was 41.68.\n", + "\n", + "These figures show that both META and TESLA had their ups and downs during this period. However, the higher standard deviation for META indicates that its stock price fluctuated more compared to TESLA.\n", + "\n", + "As we move further into 2024, it will be interesting to see how these trends evolve. Will META and TESLA continue on their current trajectories, or will we see a shift in the market dynamics? Only time will tell." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -765,270 +850,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "({'total_cost': 0.7510199999999999, 'gpt-4': {'cost': 0.7510199999999999, 'prompt_tokens': 14984, 'completion_tokens': 5025, 'total_tokens': 20009}}, {'total_cost': 0.3678, 'gpt-4': {'cost': 0.3678, 'prompt_tokens': 7478, 'completion_tokens': 2391, 'total_tokens': 9869}})\n" + "({'total_cost': 0.84249, 'gpt-4-0613': {'cost': 0.84249, 'prompt_tokens': 22513, 'completion_tokens': 2785, 'total_tokens': 25298}}, {'total_cost': 0.84249, 'gpt-4-0613': {'cost': 0.84249, 'prompt_tokens': 22513, 'completion_tokens': 2785, 'total_tokens': 25298}})\n" ] } ], "source": [ "print(chat_res.cost)" ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Use a Different Code Execution Environment\n", - "\n", - "The code execution happened in a separate process, so the plot is not directly displayed in the notebook. Is it possible to change the code execution environment into IPython?\n", - "\n", - "Yes! In the following we demonstrate how to extend the `UserProxyAgent` to use a different code execution environment." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "class IPythonUserProxyAgent(autogen.UserProxyAgent):\n", - " def __init__(self, name: str, **kwargs):\n", - " super().__init__(name, **kwargs)\n", - " self._ipython = get_ipython()\n", - "\n", - " def run_code(self, code, **kwargs):\n", - " result = self._ipython.run_cell(\"%%capture --no-display cap\\n\" + code)\n", - " log = self._ipython.ev(\"cap.stdout\")\n", - " log += self._ipython.ev(\"cap.stderr\")\n", - " if result.result is not None:\n", - " log += str(result.result)\n", - " exitcode = 0 if result.success else 1\n", - " if result.error_before_exec is not None:\n", - " log += f\"\\n{result.error_before_exec}\"\n", - " exitcode = 1\n", - " if result.error_in_exec is not None:\n", - " log += f\"\\n{result.error_in_exec}\"\n", - " exitcode = 1\n", - " return exitcode, log, None" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The implementation overrides two functions in `UserProxyAgent`:\n", - "* constructor. We get the ipython instance as the code execution environment.\n", - "* `run_code`. We execute the code with the ipython instance.\n", - "\n", - "In addition, we create a **user defined message function** shown below to generate the initiate message to the chat. In this function, we append the raw message, carryover information (both of which are provide via `context`), and a string specifing IPython execution together as the final message." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def my_ipy_message_generator(sender, recipient, context):\n", - " raw_message = context.get(\"raw_message\", \"\")\n", - " carryover = context.get(\"carryover\", \"\")\n", - " return raw_message + carryover + \"If you suggest code, the code will be executed in IPython.\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the new `IPythonUserProxyAgent`, we are able to run the code within the current notebook environment and display the plot directly." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33mipython_user_proxy\u001b[0m (to assistant):\n", - "\n", - "Plot a chart of META and TESLA stock price gain YTD. Use data from the following csv file if it exists: coding/stock_price_ytd.csv. Use csv to read the file. Otherwise, figure out how to get the data.If you suggest code, the code will be executed in IPython.\n", - "\n", - "--------------------------------------------------------------------------------\n", - "\u001b[33massistant\u001b[0m (to ipython_user_proxy):\n", - "\n", - "First, we need to check if the file `coding/stock_price_ytd.csv` exists and if it contains the necessary data for META and TESLA stock price gains YTD (Year-To-Date). We will attempt to read the file using Python's `csv` module. If the file does not exist or we cannot obtain the necessary data from it, we will then look for an alternative way to get the data.\n", - "\n", - "Let's start by checking if the file exists and reading its contents.\n", - "\n", - "```python\n", - "# filename: check_csv_file.py\n", - "\n", - "import csv\n", - "import os\n", - "\n", - "# Define the path to the CSV file\n", - "file_path = 'coding/stock_price_ytd.csv'\n", - "\n", - "# Check if the file exists\n", - "if os.path.exists(file_path):\n", - " try:\n", - " # Attempt to read the file and print its contents\n", - " with open(file_path, mode='r') as file:\n", - " csv_reader = csv.DictReader(file)\n", - " meta_data = []\n", - " tesla_data = []\n", - " for row in csv_reader:\n", - " if 'META' in row:\n", - " meta_data.append(row)\n", - " if 'TESLA' in row:\n", - " tesla_data.append(row)\n", - " print(\"META data:\", meta_data)\n", - " print(\"TESLA data:\", tesla_data)\n", - " except Exception as e:\n", - " print(f\"An error occurred while reading the file: {e}\")\n", - "else:\n", - " print(\"The file does not exist.\")\n", - "```\n", - "\n", - "Please execute the above code to check for the file and read its contents. If the file exists and contains the required data, we will proceed to plot the chart. If not, we will explore alternative ways to obtain the data.\n", - "\n", - "--------------------------------------------------------------------------------\n", - "\u001b[31m\n", - ">>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...\u001b[0m\n", - "\u001b[33mipython_user_proxy\u001b[0m (to assistant):\n", - "\n", - "exitcode: 0 (execution succeeded)\n", - "Code output: \n", - "META data: [{'Date': '2024-01-02', 'META': '346.2900085449219', 'TSLA': '248.4199981689453'}, {'Date': '2024-01-03', 'META': '344.4700012207031', 'TSLA': '238.4499969482422'}, {'Date': '2024-01-04', 'META': '347.1199951171875', 'TSLA': '237.92999267578125'}, {'Date': '2024-01-05', 'META': '351.95001220703125', 'TSLA': '237.49000549316406'}, {'Date': '2024-01-08', 'META': '358.6600036621094', 'TSLA': '240.4499969482422'}, {'Date': '2024-01-09', 'META': '357.42999267578125', 'TSLA': '234.9600067138672'}, {'Date': '2024-01-10', 'META': '370.4700012207031', 'TSLA': '233.94000244140625'}, {'Date': '2024-01-11', 'META': '369.6700134277344', 'TSLA': '227.22000122070312'}, {'Date': '2024-01-12', 'META': '374.489990234375', 'TSLA': '218.88999938964844'}, {'Date': '2024-01-16', 'META': '367.4599914550781', 'TSLA': '219.91000366210938'}, {'Date': '2024-01-17', 'META': '368.3699951171875', 'TSLA': '215.5500030517578'}, {'Date': '2024-01-18', 'META': '376.1300048828125', 'TSLA': '211.8800048828125'}, {'Date': '2024-01-19', 'META': '383.45001220703125', 'TSLA': '212.19000244140625'}, {'Date': '2024-01-22', 'META': '381.7799987792969', 'TSLA': '208.8000030517578'}, {'Date': '2024-01-23', 'META': '385.20001220703125', 'TSLA': '209.13999938964844'}, {'Date': '2024-01-24', 'META': '390.70001220703125', 'TSLA': '207.8300018310547'}, {'Date': '2024-01-25', 'META': '393.17999267578125', 'TSLA': '182.6300048828125'}, {'Date': '2024-01-26', 'META': '394.1400146484375', 'TSLA': '183.25'}, {'Date': '2024-01-29', 'META': '401.0199890136719', 'TSLA': '190.92999267578125'}, {'Date': '2024-01-30', 'META': '400.05999755859375', 'TSLA': '191.58999633789062'}, {'Date': '2024-01-31', 'META': '390.1400146484375', 'TSLA': '187.2899932861328'}, {'Date': '2024-02-01', 'META': '394.7799987792969', 'TSLA': '188.86000061035156'}, {'Date': '2024-02-02', 'META': '474.989990234375', 'TSLA': '187.91000366210938'}, {'Date': '2024-02-05', 'META': '459.4100036621094', 'TSLA': '181.05999755859375'}, {'Date': '2024-02-06', 'META': '454.7200012207031', 'TSLA': '185.10000610351562'}, {'Date': '2024-02-07', 'META': '469.5899963378906', 'TSLA': '187.5800018310547'}, {'Date': '2024-02-08', 'META': '470.0', 'TSLA': '189.55999755859375'}, {'Date': '2024-02-09', 'META': '468.1099853515625', 'TSLA': '193.57000732421875'}, {'Date': '2024-02-12', 'META': '468.8999938964844', 'TSLA': '188.1300048828125'}, {'Date': '2024-02-13', 'META': '460.1199951171875', 'TSLA': '184.02000427246094'}, {'Date': '2024-02-14', 'META': '473.2799987792969', 'TSLA': '188.7100067138672'}, {'Date': '2024-02-15', 'META': '484.0299987792969', 'TSLA': '200.4499969482422'}, {'Date': '2024-02-16', 'META': '473.32000732421875', 'TSLA': '199.9499969482422'}, {'Date': '2024-02-20', 'META': '471.75', 'TSLA': '193.75999450683594'}, {'Date': '2024-02-21', 'META': '468.0299987792969', 'TSLA': '194.77000427246094'}, {'Date': '2024-02-22', 'META': '486.1300048828125', 'TSLA': '197.41000366210938'}, {'Date': '2024-02-23', 'META': '484.0299987792969', 'TSLA': '191.97000122070312'}, {'Date': '2024-02-26', 'META': '481.739990234375', 'TSLA': '199.39999389648438'}, {'Date': '2024-02-27', 'META': '487.04998779296875', 'TSLA': '199.72999572753906'}, {'Date': '2024-02-28', 'META': '484.0199890136719', 'TSLA': '202.0399932861328'}, {'Date': '2024-02-29', 'META': '490.1300048828125', 'TSLA': '201.8800048828125'}, {'Date': '2024-03-01', 'META': '502.29998779296875', 'TSLA': '202.63999938964844'}]\n", - "TESLA data: []\n", - "\n", - "\n", - "--------------------------------------------------------------------------------\n", - "\u001b[33massistant\u001b[0m (to ipython_user_proxy):\n", - "\n", - "The output indicates that the file `coding/stock_price_ytd.csv` exists and contains the necessary data for META stock price gains YTD. However, it seems that the TESLA data is not separated correctly, as the TESLA data appears to be within the same rows as the META data, but the script is looking for a separate 'TESLA' entry in the rows.\n", - "\n", - "We need to adjust the script to correctly parse the TESLA data from the same rows as the META data. Let's modify the script to extract both META and TESLA stock prices from the same rows and then plot the chart.\n", - "\n", - "```python\n", - "# filename: plot_stock_prices.py\n", - "\n", - "import csv\n", - "import os\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# Define the path to the CSV file\n", - "file_path = 'coding/stock_price_ytd.csv'\n", - "\n", - "# Initialize lists to hold the parsed data\n", - "dates = []\n", - "meta_prices = []\n", - "tesla_prices = []\n", - "\n", - "# Check if the file exists\n", - "if os.path.exists(file_path):\n", - " try:\n", - " # Read the file and parse the data\n", - " with open(file_path, mode='r') as file:\n", - " csv_reader = csv.DictReader(file)\n", - " for row in csv_reader:\n", - " dates.append(row['Date'])\n", - " meta_prices.append(float(row['META']))\n", - " tesla_prices.append(float(row['TSLA']))\n", - " \n", - " # Plot the data\n", - " plt.figure(figsize=(14, 7))\n", - " plt.plot(dates, meta_prices, label='META', marker='o')\n", - " plt.plot(dates, tesla_prices, label='TESLA', marker='x')\n", - " \n", - " # Formatting the plot\n", - " plt.title('META vs TESLA Stock Price Gain YTD')\n", - " plt.xlabel('Date')\n", - " plt.ylabel('Stock Price')\n", - " plt.xticks(rotation=45)\n", - " plt.legend()\n", - " plt.tight_layout()\n", - " \n", - " # Show the plot\n", - " plt.show()\n", - " except Exception as e:\n", - " print(f\"An error occurred while processing the file: {e}\")\n", - "else:\n", - " print(\"The file does not exist.\")\n", - "```\n", - "\n", - "Please execute the above code to plot the chart of META and TESLA stock price gains YTD.\n", - "\n", - "--------------------------------------------------------------------------------\n", - "\u001b[31m\n", - ">>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...\u001b[0m\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABW0AAAKyCAYAAACuWPzHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD4XElEQVR4nOzdd3hUZfrG8Xsy6W0gPUAIIdRQpBcbvSgiq1hQse3qKrJrXde6ApbVdVdX14L+XDsgNiywgoIFFVB6DVJDS4WETHqbOb8/QkbGJGQCSWaSfD/XNReZ97TnDAnizXue12QYhiEAAAAAAAAAgEfwcncBAAAAAAAAAIBfEdoCAAAAAAAAgAchtAUAAAAAAAAAD0JoCwAAAAAAAAAehNAWAAAAAAAAADwIoS0AAAAAAAAAeBBCWwAAAAAAAADwIIS2AAAAAAAAAOBBCG0BAAAAAAAAwIMQ2gIAAABucsMNNyg4ONht1x85cqRGjhzptus3tNmzZ8tkMrm7DAAAgDNGaAsAAFq0t956SyaTSSaTST/++GO17YZhKC4uTiaTSRdddJHTtqrjanrdeuut+u677065z8mvk11xxRUymUy67777GvXeXTVy5EiX7mH27NmSpE6dOtW6z8SJE53O/eOPP+qCCy5Q+/bt5e/vr44dO2ry5MlasGCB034mk0l/+tOfXK755Zdflslk0tChQ+t1r3a7Xe+8846GDh2qsLAwhYSEqFu3brruuuv0008/OfZLTk7W7NmzdeDAgXqdvylVBZRVr8DAQCUlJenhhx9WXl6eu8ur09atW3XjjTcqISFB/v7+Cg4OVr9+/fTXv/5V+/fvd3d5euqpp2QymfTll1/WuP3CCy+UxWLR+PHjXfr5ueGGGyQ5/7x5eXkpNDRU3bt317XXXqvly5c34R0CAABP5u3uAgAAAJqCv7+/FixYoHPPPddpfOXKlTpy5Ij8/PxqPG7cuHG67rrrqo1369ZN8fHxevfdd53GH3jgAQUHB+uhhx6q8Xx5eXlavHixOnXqpPfee88RDLnTQw89pJtuusnxft26dfrPf/6jBx98UD179nSM9+3b1/F1v379dM8991Q7V7t27Rxff/jhh7ryyivVr18/3XHHHWrbtq1SUlL0/fff67XXXtPVV1992jXPnz9fnTp10tq1a7V371516dLFpeNuv/12vfTSS5oyZYquueYaeXt7a9euXVq6dKk6d+6sYcOGSaoMbefMmaORI0eqU6dOp11nU5g7d66Cg4NVUFCgr776Sk888YS++eYbrVq1qs7vra+++qqJqnT22muvacaMGYqIiNA111yjHj16qKKiQtu3b9c777yj5557TsXFxTKbzfU678MPP6z777+/QWq85557tGDBAt12223avn27AgICHNs+/PBDLV26VC+99JL69+/v9GdESkqKHnnkEf3xj3/Ueeed5xhPTEx0fN2hQwc9+eSTkqTCwkLt3btXixYt0rx583TFFVdo3rx58vHxaZD7AAAAzZQBAADQgr355puGJOPSSy81IiIijPLycqftN998szFw4EAjPj7emDRpktM2ScbMmTPrdb1evXoZI0aMqHX7G2+8Yfj4+BjffPONIcn47rvv6nX+pvDhhx8akoxvv/22xu01fVY1SUpKMnr16mWUlpZW25aZmen0vj6f9f79+w1JxqJFi4zIyEhj9uzZLh2XkZFhmEwm4+abb662zW63O9VU12fQUK6//nojKCjotI6dNWuWIck4evSo0/ill15qSDJWr15d67GFhYWndc2GsGrVKsNsNhvnn3++kZeXV217cXGx8fDDDxsVFRVuqM7ZmjVrDC8vL+OBBx5wjOXl5Rnt2rUzhg0bZthstmrHrFu3zpBkvPnmmzWec8SIEUavXr2qjVdUVBi33XabIcn461//2mD3AAAAmifaIwAAgFbhqquuUnZ2ttPjx2VlZfroo4/OaMZnfc2fP1/jxo3TqFGj1LNnT82fP7/OY8rLyxUWFqYbb7yx2ra8vDz5+/vrL3/5i2PshRdeUK9evRQYGKi2bdtq0KBB1doRNIV9+/Zp8ODB8vX1rbYtKirqtM87f/58tW3bVpMmTdJll13m0mcoVc6ANAxD55xzTrVtJpPJUdNbb72lyy+/XJI0atQox6Ps3333nWP/l19+Wb169ZKfn5/atWunmTNnKjc3t9p5f/75Z1144YVq27atgoKC1LdvXz3//POnrHPz5s2KjIzUyJEjVVBQ4NK9nWz06NGO+5UqH8fv3bu3NmzYoPPPP1+BgYF68MEHHdt+29O2pKREs2fPVrdu3eTv76/Y2Fhdeuml2rdvn2Mfu92u5557Tr169ZK/v7+io6N1yy236Pjx43XWN2fOHJlMJs2fP18hISHVtvv7++uxxx5zmmX7ww8/6PLLL1fHjh3l5+enuLg43XXXXSouLnY6tqaetlWtNz799FP17t1bfn5+6tWrl5YtW1ZnrcOGDdOtt96qf/3rX0pOTpZUOZs3KytL//d//ycvr4b73ymz2az//Oc/SkpK0osvviir1dpg5wYAAM0PoS0AAGgVOnXqpOHDh+u9995zjC1dulRWq1XTpk2r9biSkhIdO3as2qusrKzeNaSlpenbb7/VVVddJakySP7oo4/qPJePj48uueQSffrpp9X2/fTTT1VaWuq4h9dee0233367kpKS9Nxzz2nOnDnq16+ffv7553rXeyrl5eU1fi4nh2jx8fH6+uuvdeTIkQa99vz583XppZfK19dXV111lfbs2aN169bVeVx8fLykykfbi4qKat3v/PPP1+233y5JevDBB/Xuu+/q3XffdbSKmD17tmbOnKl27drpmWee0dSpU/Xqq69q/PjxKi8vd5xn+fLlOv/885WcnKw77rhDzzzzjEaNGqUlS5bUeu1169Zp9OjR6t+/v5YuXXpai5RVhavh4eGOsezsbF1wwQXq16+fnnvuOY0aNarGY202my666CLNmTNHAwcO1DPPPKM77rhDVqtV27dvd+x3yy236N5779U555yj559/XjfeeKPmz5+vCRMmOH0Gv1VUVKRvvvlGI0eOVIcOHVy+p6rfsxkzZuiFF17QhAkT9MILL9TYuqQmP/74o2677TZNmzZNTz/9tEpKSjR16lRlZ2fXeeyTTz6pyMhI3XLLLdqwYYNeeukl/eUvf1GfPn1crt9VZrNZV111lYqKimrswQ0AAFoRd0/1BQAAaExV7RHWrVtnvPjii0ZISIhRVFRkGIZhXH755caoUaMMw6j5kX9Jtb7ee++9Gq93qvYI//rXv4yAgADHI+G7d+82JBmffPJJnffx5ZdfGpKMxYsXO41feOGFRufOnR3vp0yZUuOj1/XhSnuE2j6XJ5980rHf66+/bkgyfH19jVGjRhl/+9vfjB9++KHGR8rlYnuE9evXG5KM5cuXG4ZR2dagQ4cOxh133OHSvV133XWGJKNt27bGJZdcYvzrX/8ydu7c6fJnkJWVZfj6+hrjx493uo8XX3zRkGS88cYbhmFUPuqekJBgxMfHG8ePH3c6h91ud3x9cnuEH3/80QgNDTUmTZpklJSU1HkvVe0Rdu3aZRw9etRISUkxXn31VcPPz8+Ijo52tEAYMWKEIcl45ZVXqp1jxIgRTt+vb7zxhiHJePbZZ6vtW1X3Dz/8YEgy5s+f77R92bJlNY6fbMuWLYYk484776y2LTs72zh69KjjdXJbjaqf2ZM9+eSThslkMg4ePFjtMzlZ1ffg3r17q9Xxwgsv1FrryT766CNDkhEWFmZ07ty5xnqqnG57hCqffPKJIcl4/vnnXaoNAAC0TMy0BQAArcYVV1yh4uJiLVmyRPn5+VqyZEmdrRGmTJmi5cuXV3vVNlPxVObPn69JkyY5Hgnv2rWrBg4c6NLj/aNHj1ZERITef/99x9jx48e1fPlyXXnllY6xNm3a6MiRIy7NPD0TQ4cOrfFzqZpFLEm///3vtWzZMo0cOVI//vijHnvsMZ133nnq2rWrVq9efVrXnT9/vqKjox2fv8lk0pVXXqmFCxfKZrPVefybb76pF198UQkJCfrkk0/0l7/8RT179tSYMWOUmppa5/ErVqxQWVmZ7rzzTqdH42+++WaFhobqf//7nyRp06ZNSklJ0Z133qk2bdo4naOmxcG+/fZbTZgwQWPGjNGiRYtqXRivJt27d1dkZKQSEhJ0yy23qEuXLvrf//6nwMBAxz5+fn41ttf4rY8//lgRERH685//XG1bVd0ffvihLBaLxo0b5zTLeuDAgQoODta3335b6/nz8vIkqcYZxJ07d1ZkZKTj9fnnnzu2nbwIWGFhoY4dO6azzz5bhmFo06ZNdd7X2LFjnRYC69u3r0JDQ7V///46j5WkqVOn6sILL1ROTo5eeuklp3oaWtVnk5+f32jXAAAAns/b3QUAAAA0lcjISI0dO1YLFixQUVGRbDabLrvsslMe06FDB40dO/aMr71z505t2rRJ1113nfbu3esYHzlypF566SXl5eUpNDS01uO9vb01depULViwQKWlpfLz89OiRYtUXl7uFNred999WrFihYYMGaIuXbpo/Pjxuvrqq2vs43omIiIiXPpcJkyYoAkTJqioqEgbNmzQ+++/r1deeUUXXXSRfvnll3r1trXZbFq4cKFGjRrl6NcqVQbIzzzzjL7++muNHz/+lOfw8vLSzJkzNXPmTGVnZ2vVqlV65ZVXtHTpUk2bNk0//PDDKY8/ePCgpMqg9GS+vr7q3LmzY3tVi4LevXvXeV8lJSWaNGmSBg4cqA8++EDe3vX7K/rHH3+s0NBQ+fj4qEOHDk7hZJX27dvX2Fv4t/bt26fu3bufsoY9e/bIarXW+nuXlZVV67FV/2BRU6/ezz77TOXl5dqyZYtTj2ZJOnTokB555BF9/vnn1frmutL7tWPHjtXG2rZt61IP3iqDBw/WF198oUGDBrl8zOmo+mxq6vcLAABaD0JbAADQqlx99dW6+eablZGRoQsuuKDaLMjGMm/ePEnSXXfdpbvuuqva9o8//rjOmZDTpk3Tq6++qqVLl+p3v/udPvjgA/Xo0UNnnXWWY5+ePXtq165dWrJkiZYtW6aPP/5YL7/8sh555BHNmTOnYW+qHgIDA3XeeefpvPPOU0REhObMmaOlS5fq+uuvd/kc33zzjdLT07Vw4UItXLiw2vb58+fXGdqeLDw8XBdffLEuvvhijRw5UitXrtTBgwcdvW+bip+fny688EJ99tlnWrZsmS666KJ6HX/++ecrIiLilPs05MxQu92uqKioWmeIR0ZG1npsly5d5O3t7dQft8qIESMkqVpgbLPZNG7cOOXk5Oi+++5Tjx49FBQUpNTUVN1www2y2+111nzyomYnMwyjzmObWtVn06VLFzdXAgAA3InQFgAAtCqXXHKJbrnlFv30009OrQYak2EYWrBggUaNGqXbbrut2vbHHntM8+fPrzO0Pf/88xUbG6v3339f5557rr755hs99NBD1fYLCgrSlVdeqSuvvFJlZWW69NJL9cQTT+iBBx6Qv79/g93X6aqaqZienl6v4+bPn6+oqCi99NJL1bYtWrRIn3zyiV555ZXTCigHDRqklStXKj09XfHx8TW2MJB+Xcxs165d6ty5s2O8rKxMKSkpjtnHVbNdt2/fXueMZJPJpPnz52vKlCm6/PLLtXTpUo0cObLe99AQEhMT9fPPP6u8vFw+Pj617rNixQqdc8459f6sg4KCHAF5amqq2rdvX+cx27Zt0+7du/X22287LTy2fPnyel27ObDZbFqwYIECAwN17rnnurscAADgRvS0BQAArUpwcLDmzp2r2bNna/LkyU1yzVWrVunAgQO68cYbddlll1V7XXnllfr222+VlpZ2yvN4eXnpsssu0+LFi/Xuu++qoqLCqTWCJGVnZzu99/X1VVJSkgzDUHl5eYPf26l8/fXXNY5/8cUXkqq3GDiV4uJiLVq0SBdddFGNn+Gf/vQn5efnO/VB/a2MjAwlJydXGy8rK9PXX38tLy8vx+zGoKAgSVJubq7TvmPHjpWvr6/+85//OM3SfP3112W1WjVp0iRJ0oABA5SQkKDnnnuu2jlqmt3p6+urRYsWafDgwZo8ebLWrl3r0ufS0KZOnapjx47pxRdfrLatqu4rrrhCNptNjz32WLV9Kioqqt3vbz3yyCOy2WyaPn16jW0Sfvv5VM2SPXncMAw9//zzdd5Pc2Kz2XT77bdr586duv3220/ZLgUAALR8zLQFAACtTn0eyd+9e7ejtcHJoqOjNW7cOJfOMX/+fJnNZkeg91sXX3yxHnroIS1cuFB33333Kc915ZVX6oUXXtCsWbPUp08f9ezZ02n7+PHjFRMTo3POOUfR0dHauXOnXnzxRacF0BpCampqjZ9LcHCwfve730mqXMQtISFBkydPVmJiogoLC7VixQotXrzYEU6ebP369Xr88cernXPkyJFKTU1Vfn6+Lr744hrrGTZsmCIjIzV//vxqQXaVI0eOaMiQIRo9erTGjBmjmJgYZWVl6b333tOWLVt05513OtoM9OvXT2azWf/4xz9ktVrl5+en0aNHKyoqSg888IDmzJmjiRMn6uKLL9auXbv08ssva/DgwZo+fbqkyoB97ty5mjx5svr166cbb7xRsbGx+uWXX7Rjxw59+eWX1eoLCAjQkiVLNHr0aF1wwQVauXKlSz1xG9J1112nd955R3fffbfWrl2r8847z/H7dtttt2nKlCkaMWKEbrnlFj355JPavHmzxo8fLx8fH+3Zs0cffvihnn/++VP2ij7vvPP04osv6s9//rO6du2qa665Rj169FBZWZl2796t+fPny9fXVzExMZKkHj16KDExUX/5y1+Umpqq0NBQffzxx/XqR+tprFar4+enqKhIe/fu1aJFi7Rv3z5NmzatxkAcAAC0MgYAAEAL9uabbxqSjHXr1p1yv/j4eGPSpElOY5JqfY0YMaLG8/Tq1ctpW1lZmREeHm6cd955p7x+QkKC0b9//zrvx263G3FxcYYk4/HHH6+2/dVXXzXOP/98Izw83PDz8zMSExONe++917BarXWeu8qHH35oSDK+/fbbGrfHx8fX+rnEx8c79nvvvfeMadOmGYmJiUZAQIDh7+9vJCUlGQ899JCRl5fndM5TfdaPPfaYMXnyZMPf398o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z9a///1vBQUFNWC1AAAAAAAAaCzZBaWaszhZn29JkyQlRATpqUv7aGjncDdX1jIR2tZXeZH093and+z3/6x81fa+Lg+mSb4NG3SeffbZ8vLychorKKhc5e/ZZ5/VZZddppiYGPXq1Utnn322pkyZogsuuKBe13j99dc1bdo0mc1m9e7dW507d9aHH36oG264oaFuAwAAAAAAAGfAZje0NiVHWfkligrx15CEMJm9TDIMQ4u3pmv25zuUU1gmL5N08/mdddfYbvL3Mbu77BaL0LaVe//999WzZ88atyUlJWn79u3asGGDVq1ape+//16TJ0/WDTfcoP/+978unT83N1eLFi3Sjz/+6BibPn26Xn/9dUJbAAAAAAAAD7Bse7rmLE5WurXEMRZr8dftY7rq651ZWrEzU5LUIyZET1/WV307tHFTpa0HoW19+QRWznitr6qWCGbfyjYJ599b2SqhvtduYHFxcerSpUut2728vDR48GANHjxYd955p+bNm6drr71WDz30kBISEuo8/4IFC1RSUuLUw9YwDNntdu3evVvdunVrkPsAAAAAAABA/S3bnq4Z8zbK+M14urVEDyzaJknyMZv0p1FdNWNkony9vaqfBA2O0La+TKb6tyhY+XRlYDvqocrFyKoWITP7Oi9O1gwkJSVJkgoLXevD+/rrr+uee+6pNqv2tttu0xtvvKGnnnqqoUsEAAAAAACAC2x2Q3MWJ1cLbE/mYzbps5nnKqldaJPVBULbxlcV0FYFttKvv377hPN7N8jOzlZGRobTWJs2beTv76/LLrtM55xzjs4++2zFxMQoJSVFDzzwgLp166YePXo49rdardq8ebPTOcLDw5Wdna2NGzdq/vz5TvtL0lVXXaVHH31Ujz/+uLy9+TYEAAAAAABoamtTcpxaItSk3GbIWlzeRBWhCmlZY7PbnAPbKlXv7bamr+kkY8eOrTb23nvvadq0aZowYYLee+89Pfnkk7JarYqJidHo0aM1e/Zsp6D1u+++U//+/Z3O8Yc//EEBAQFKSkqqFthK0iWXXKI//elP+uKLL3TxxRc3/I0BAAAAAAA0gNoW6GruDMPQlsO5Lu2blX/qYBcNz2QYxqlmQLcKeXl5slgsslqtCg39dap3SUmJUlJSlJCQIH9/fzdW2LrwuQMAAAAAAE9Q2wJdsyYnaWLvWDdWdnoMw1By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3r3bWrZsaQ8//LBt2bLFNm7caMOHD7cuXbrYHXfcEdQsv2g51v/yyy9Wq1Yte/TRR23v3r22fv1683g89sUXX4Qs041jvRvHebPoOda7sb+EAkVbFNvhw4dtxIgRNnz4cMvIyAgUt/7xj39Yq1at7MiRI0HfKQ4dOmS333673XHHHZaVlRU4+V599dX25JNP2h/+8IeQvvn517/+ZRMnTrQFCxbYxRdfbP3797f58+fbxIkTbcOGDUHLOXDggPXt29cSExMD86666irr2LGjeTweO//88+2FF14IWp7f4sWLrUWLFrZq1arAvFtvvdWuvPJKGzp0qN1+++2B1zmYb3xmz55t7du3ty1btgTmrVy50s444wyrUaNGvg/0wbJv3z5r166dffTRR4F5WVlZtnDhQmvTpo117do1MD8Y27HP57PXXnvNBgwYYAsWLLARI0ZY165d8xVug/1mMiMjw0aNGmXXX3+9HTx4MPDaff7551avXj3btWtXUPPyGjFiRKD4361bNzv//POtV69eduaZZ9qZZ55p69atM7PgrPOWLVusYcOG+VpdzZkzx+rXr29vvPGGmYWmBd+6deusZcuWNm/evMC8kSNHWvfu3e2iiy6ySy+91DZt2mRmwS3UpKSkWJs2bWz16tWBedu3b7c2bdpY3bp1rWPHjkHLMuNYXxaP9WZm11xzjT3//PNmZta9e3c777zzrFmzZtasWTPr3Llz4MN1sF5bN47zZmabNm2y5s2b2w8//BCYd/DgQfvvf/9rrVq1squuuiqoednZ2fbcc8/ZZZddZkuWLLGLL77YOnbsGNLCbUZGho0fP96uvvpqW758ubVq1cratWuX78NJsDMPHDhg1113XeCLT//j/+EPf7ALLrjAzIJ/Ttu7d6916dLFGjduHJh3/fXXW+fOnS0uLs4uv/zyfOf0YBowYIBNmTLFzMx69eplvXr1smrVqlnbtm3tiiuuCHreypUrzev12tixYwPz/vGPf1h8fLwtW7bMzELzBcCsWbOsdevW+fbT3/72t3bPPffYyJEjbcKECUHP/Oyzz6xLly62d+/ewDrNnTvXatasaU2bNg168YtzGue0YElJSbGmTZsG9kkz5zj1pz/9yTp06GAPPPBA0LLMoudYn5aWZkOHDrW7777bfD5f4PGvuOIK+/vf/24vv/yyzZo1K6iZfqV5rHfrOG8WHcd6N/aXUKFPWxSbmSkrK0vnnHOO4uPjFRMTI0mqXbu29u7dq4yMjKBnxsTE6IorrtBdd92l2NhYeb1ePfXUU/rPf/6j1atX69tvv9Wzzz6rBx54IOjZkpSYmKhp06apc+fOGj16tBITE3XllVdq3LhxKleunKTgDDgSGxur2267TXXr1tVll12mAQMGKDs7W48++qh+/PFHnXHGGZoyZUrQOyuvWLGiMjIy9O677yozM1NPPvmk/u///k+tWrVSvXr1NGfOHJ177rmSgttnZ0ZGhvbv369t27YF5h09elQ1a9bUY489pg0bNuj9998PWp4kJSUlyePx6Ntvvw3Mi42NVadOnfTaa6/pwIEDGj16tKTgDKDg8Xh0+eWX684771Tnzp3117/+VZ07d9aHH36oV155RYcOHQp6f6Rmpvj4ePXp00cVK1YM7KPVq1fX4cOHQ7KP5rV48WL961//UvXq1TVt2jT973//008//aQGDRpo0KBBkoKzHcXFxenVV1/Vs88+G5jXq1cvXXrppXr66aeVnp4eWPdgSkpKUnZ2tl555RWlpqbq8ccf1z//+U9ddtlluvTSS7V//37169dPGRkZQR+E48CBA0pJSQlcT0tLk9fr1QsvvKD9+/fney5KimN92TvWS86gdYsXL9Zrr72mpKQkffzxx/r55581ZcoUZWRk6IorrpAUvAFk3DjOS85r6fP59OOPPwbmVaxYUQMHDtS4ceO0fv16vfrqq0HLi4mJUZ8+fXTjjTeqffv2+vzzz1W7dm1NnDhR06ZNCxwPgnms93q96tatm4YMGaLWrVsrOTlZWVlZuvXWW7Vo0SL5fL6gH4N8Pp/S09PVtWtXeb3ewOM3atRIW7duVVZWVlDzJGc9r7jiClWvXl133XWX+vbtq/3792vEiBGaNm2a9u3bp+eff14zZswIenZ2draSk5M1ceJEVapUSR9++KFSUlL06KOPasOGDRo5cmRQ82JiYvTiiy9qwoQJgW1l+PDh6tq1qyZMmKDMzMyQDO4UGxurw4cP64svvpAkTZw4Ue+99568Xq92796tDz74QNdcc01QM9PS0rRv3z4dPXo0sE45OTlq3ry5hgwZop9++klz5swJWp7P5+OcxjktKCpVqqSsrKzAGApmpqpVq+qOO+7Q4MGDNXv2bH3++edBy/N6verevXtUHOsvvvhi3XHHHfJ4PPJ6vXr66ac1bdo0TZs2Ta+88ooefPBBvfDCC0HPLs1jvVvHeSk6jvVuvDcKGZeKxSgj/D/DNcttyTZv3jw7++yz833rtmLFiqBlHjlyJPB3SkqKVapUKV//nGPHjrVOnTrZjh07gpbp/2Zx9erV1q1bt8D8/v37W4UKFax79+42c+bMoOWZOS0B/vvf/1rTpk2tZ8+e+Z7r/fv323nnnWfXXnttUDP3799vo0ePtoYNG1q/fv0sLi7O/vvf/wZunzVrltWpUyfoPxH59ddfrUmTJnb99dfblClTbObMmZaUlBT45rFnz55B7RfL/63ak08+aT179rRPP/003+3Z2dn20EMPWd++fQMto0IhKyurwBa3b775Zokf27+Ou3fvDszz75ObNm2yFi1a2J49ewK3/fTTTyXOzJs7e/ZsO+ecc6xnz56Bn7z48+fPn28NGjSwn3/+ucR5BX277583a9Ysa9q0qf373/8+6X1LIisry/72t79Zo0aNbMCAAVahQgV7//33A7dv3LjRqlatmm9eMOzZs8cuvPBCu+KKK2zSpEn26aefWpUqVezBBx80M7Nrr73Wbr755qBmRtOx3szK9LHev4++88471q9fP+vfv789+uij+e7z4YcfWqtWrQIt4oNh06ZNduaZZ5bacd7v8OHDdvPNN1v//v1tyZIl+W47cuSIXXnllTZkyJCgZh7/E+CMjIx8LW79t3/yySdBy8y7v5iZHT16NF+rEjPntQ/m9rt58+bA3/7jwscff2ydO3fOd7+8LXlKas+ePfanP/3JzjjjDLvgggvy7f87d+60s846y+69996g5fmPCePHj7fLLrvMrrjiinz9/GdmZtqzzz5rPXv2tH379gUt92TGjx9vLVu2DDynwT6v7dixw6655hpr3Lix9e/f32JiYvIdd9966y0766yzLCUlJWiZK1eutAoVKtj9999vP/zwg82bN88SExMDLb2aNGlizzzzTFCy/Me/vNtNqM9p/sy87ydL65zmVxrnNP96Hj161D766KNSO6f5X6/SPqeZOb/au+CCC2zQoEEn/HotLS3NOnToYCNGjAhq5tGjR0+4XhaP9YcPHw78/dNPP1nlypVt6tSplp2dbVlZWTZ06FDr37//Cc9HcfnX68knnyyVY/2pWniG+jhv5u6x/r777gv5sd7PjfdGoUDRFkWya9cuW7Roka1cuTJfwSfvweSnn36yhg0b2sGDB83MeRPSr1+/Yh/g8mbu3bvXzJydy3+w2759e75leOONN6x169YlOqDmzcz7OD6fz84//3zbuHGj3XDDDVavXj177bXXbNCgQdalS5cSFTMLem4PHDhgn3/+uX355ZeBk4n/8v7777fzzjuvRAfygjL3799vGzZssB9++MHOPvvsfJ2wL1q0yJo1a2bz588vdubxuf6i4vz5861Dhw525plnWsOGDfMNInXdddcF+qkqrrwfov3bzsaNG61Xr1528cUX27fffpvv/u+99541a9YsX9GzJJnH87+OmZmZgcLtM888Y3fccYfFxMTYxo0bS5SZ9+dE/ut+a9eutTp16tjWrVvNzGzcuHHWrl27Yne4X9B67tmzx2655RaLi4uzvn375rtt2bJl1qpVqxK9ESjsz9z8r28wFLQNZWdn2759+2zFihXWunXrwOvm8/lszZo11rp16xO2reLm5n1Nf/nlFxs8eLC1bNnSWrRoke8Dyr333lvivjrT0tJs/fr1tnXr1sCx3Cy0x/q8mXn7eg7lsT5vZt4PCD6fzy644IKQHOsLWs+DBw+G9Fhf0Hr++uuv1qdPn8CAInnNnj3bWrRoUaKfzebN9A8K4z/ON23aNCTHeTPng8isWbNsxowZgW1m2bJlVrduXRs0aFC+bkXMzF588UXr0KFDvu28JJn+gkveY4SZ80HBX7j94IMP7M4777S6desGjsNFtW/fPlu7dq2lpqbm62LH5/MFBn88cuRI4MPJ3LlzbcSIEda+fftiH+v9mTt37sz3fOXtfmbq1KnWokWLwPUxY8bYddddF1jG4mampqYGMlNTU+3111+3r7766oTn+frrr7eBAwcWK6ugTP9yr1ixItAv3vFfLnz66afWsmVL27lzZ9By/fupf73867l//36rXbu2jRo1qkRZBWX6n99t27bZokWL7OOPP7YOHTrkG2xoxowZduaZZ9rKlSuDkuk/Nnz11VdWs2bNQHcpeZ/jiy++uMSFeP8+cfx7o1Ce0woahDWvUJzTTpUZqnNa3kz/dnrkyJGQntMKWs/Nmzdb3759Q3ZOM3O6udi1a5cdPHgwsAzz5s2z+Ph4u+eee04YAG3s2LHWp0+f024Lhc08vquvUB3rC1pPs/z7S7CP9adaz6NHj9qvv/5qZrnb0bPPPmsdOnTI994tGJkrV64M6bE+b6b/+Tz+p/rBPs4fn+v/XLFjx46QHusLyvz666+tVq1aITvWu/HeqDRQtEWhLV261Jo3b25Nmza1Bg0aWOfOnW3u3Lkn3O+HH36wKlWq2OHDh+3xxx+32NjYYhf5CpN5/En/vvvusyFDhhT7IH6qzMzMTDv//POtTp061rBhQ1u8eLGZOW82hw4dGjihBCNzzpw5ZuZ8M1/QyX7o0KF2zz33FLsvluMzO3XqFMg0czru7ty5c75vnh577DFr3759iVoBFJTr72tw165dtnnz5nwniKysLLvkkkvsqaeeMrPi9T2zcuVKu+6662zhwoWBx/CfnFesWBEYkMbf/2lmZqY98MADdv755xf7g/zxmQXxL4O/xW1CQoIlJiYWeyThwmSaOQWMChUq2M6dO238+PEWHx9f7H20oEz/Prl582YbMmSIlStXzm677Tbz+Xy2e/due/LJJ61Dhw7FftNTlOf2m2++sbp16+b79jgYmXmLiWbOm4TOnTvnG/DiiSeesFatWpWo5UFBuf7jQXp6uqWnp+c77vh8Phs8eHCJWiympKRYr169rEWLFnbmmWfa/fffX+BrFcxjfWEyj9/3S3qsP1VmRkZGSI71BWX6P7iH6lhfUKa/5dOaNWusS5cuVrVq1cCAIkeOHLHHH3/cevbsGfiiNBiZ/uJkampqSI7zZs5IyGeffba1bt3aGjdubL/5zW8CuQsXLrTKlSvbVVddZd98803gf+644w4bOHBgsX9VcXzmJZdccsK2639dMzIy7JJLLrG4uDirWLHiaY/VJ7N06VJr166dnXXWWXbmmWfakCFD7JdffjGz3OOv/wPS0aNHrW3bthYbG2vly5cPaaaZ03q4QYMGZmb26KOPWkxMTL5+v0uauXz5cjNzjn/Hv2Y5OTl2xRVX2Lhx44qVd7JMf9+CS5cuterVq1uDBg3yHevHjBljffv2LXDE+pLkHv/8+i8fffRR69q1a6DP9GBlDh48OPD8mjnFqO7du9v69esD88aMGWPdu3cv9hfaBWX6n99ff/3VkpOTA8dbM+d41KdPH3v55ZfNrHjHhtWrV9vo0aNP+MLmeME8pxUmM9jntJNl+ny+kH1+KSgzb8viUJzTCsr0v+dbu3ZtSM5pZs575379+lmbNm2sTZs29uKLLwYeb+rUqZaQkGDDhw/PNy7I9ddfb9ddd12xx1U4PvOll16y9PT0fPcJ9rG+MJlmwT3WFzYzrzvuuMNuueWWYg9ud6rXc/ny5SE51hdmPYN9nC8o98UXX8z35dD8+fODfqw/VeaWLVssJSUl6Md6N94blRaKtiiU7du3W6NGjeyRRx6xVatW2ccff2xDhw61uLi4wE9//TvXzz//bF26dLGHHnrIEhISAk3PQ5GZ16FDh2zs2LFWs2bNfB3CByvTP0DA+++/bz169DhhvYr7zeKpMv0doR+fM3bsWKtTp06xv/0qzHO7c+dO69q1q1144YU2ePBgu+WWW6xatWr5DrDByo2NjbV33333hPtv2bLFxo4dazVq1Djtm+2TWbdunTVs2NCqVKliV111VaAgmrf4tWrVKhs8eLC1aNHC6tevb3369LGqVasWe11PllkQ/0nkrrvusqpVqxZ72y1K5oYNG6xjx442fPjwEu2jp3pu/W9Qt27dar///e+tQYMGlpiYaJ06dbI6deoUuzBdlPU0c1oMNWzY0B5++OFit+ooTGZ6eroNHTrUevToYb169bJrr73WatSoUaL95VTPb0Hrsnr1ahszZoxVrVo18CalqH755RerWbOmPfTQQ/bDDz/YU089ZV27dg10k5L3TVSwjvVFyTQLzrH+dJlmZh988IH17NkzaMf6k2X+5z//KfD+wTjWFyZz3bp1ds0111ijRo2sVq1adt5551n16tWLvY8WdT2DcZw3c76Aq1Gjhv3+97+3DRs22JQpU6xZs2b53ogvWLDAOnbsaJ06dbI2bdrY5ZdfbomJiSd0m1DSzLzPnX9f9R8TR44cadWqVSv2trt582arU6eOPfjgg/bTTz/ZSy+9ZAMGDLAqVaoEvmDO+4WgmTMwZPXq1fMV5IKd6f8gNHXqVDv33HPt8ccft4SEhGJ/EDpZZlJSkv34449mlr9YnJ2dbePGjbP69esXezs6Veb3339vZs5I3126dLEWLVpYs2bN7NJLL7UqVaqU6FhflNfUzPmA7fF47F//+lfQM5OSkgKZ69evtxo1athll11m9957r40YMcKqVq1a7P3lVJl5Bwr027Nnj40dO9Zq165d7J+1r1271mrVqmWJiYn2wAMP2Nq1a09632Cd04qSaRacc9qpMv3n0GCf04q7niU5p50sM+/7zmCf08yc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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33mipython_user_proxy\u001b[0m (to assistant):\n", - "\n", - "exitcode: 0 (execution succeeded)\n", - "Code output: \n", - "\n", - "\n", - "--------------------------------------------------------------------------------\n", - "\u001b[33massistant\u001b[0m (to ipython_user_proxy):\n", - "\n", - "It appears that the code executed successfully and the chart should have been displayed on your screen. Since I cannot view the chart, I will assume that you were able to see the META and TESLA stock price gains YTD plotted correctly.\n", - "\n", - "If you have any further requests or need assistance with another task, feel free to ask. Otherwise, if everything is done, please let me know.\n", - "\n", - "TERMINATE\n", - "\n", - "--------------------------------------------------------------------------------\n" - ] - }, - { - "data": { - "text/plain": [ - "ChatResult(chat_id=None, chat_history=[{'content': 'Plot a chart of META and TESLA stock price gain YTD. Use data from the following csv file if it exists: coding/stock_price_ytd.csv. Use csv to read the file. Otherwise, figure out how to get the data.If you suggest code, the code will be executed in IPython.', 'role': 'assistant'}, {'content': 'First, we need to check if the file `coding/stock_price_ytd.csv` exists and if it contains the necessary data for META and TESLA stock price gains YTD (Year-To-Date). We will attempt to read the file using Python\\'s `csv` module. If the file does not exist or we cannot obtain the necessary data from it, we will then look for an alternative way to get the data.\\n\\nLet\\'s start by checking if the file exists and reading its contents.\\n\\n```python\\n# filename: check_csv_file.py\\n\\nimport csv\\nimport os\\n\\n# Define the path to the CSV file\\nfile_path = \\'coding/stock_price_ytd.csv\\'\\n\\n# Check if the file exists\\nif os.path.exists(file_path):\\n try:\\n # Attempt to read the file and print its contents\\n with open(file_path, mode=\\'r\\') as file:\\n csv_reader = csv.DictReader(file)\\n meta_data = []\\n tesla_data = []\\n for row in csv_reader:\\n if \\'META\\' in row:\\n meta_data.append(row)\\n if \\'TESLA\\' in row:\\n tesla_data.append(row)\\n print(\"META data:\", meta_data)\\n print(\"TESLA data:\", tesla_data)\\n except Exception as e:\\n print(f\"An error occurred while reading the file: {e}\")\\nelse:\\n print(\"The file does not exist.\")\\n```\\n\\nPlease execute the above code to check for the file and read its contents. If the file exists and contains the required data, we will proceed to plot the chart. If not, we will explore alternative ways to obtain the data.', 'role': 'user'}, {'content': \"exitcode: 0 (execution succeeded)\\nCode output: \\nMETA data: [{'Date': '2024-01-02', 'META': '346.2900085449219', 'TSLA': '248.4199981689453'}, {'Date': '2024-01-03', 'META': '344.4700012207031', 'TSLA': '238.4499969482422'}, {'Date': '2024-01-04', 'META': '347.1199951171875', 'TSLA': '237.92999267578125'}, {'Date': '2024-01-05', 'META': '351.95001220703125', 'TSLA': '237.49000549316406'}, {'Date': '2024-01-08', 'META': '358.6600036621094', 'TSLA': '240.4499969482422'}, {'Date': '2024-01-09', 'META': '357.42999267578125', 'TSLA': '234.9600067138672'}, {'Date': '2024-01-10', 'META': '370.4700012207031', 'TSLA': '233.94000244140625'}, {'Date': '2024-01-11', 'META': '369.6700134277344', 'TSLA': '227.22000122070312'}, {'Date': '2024-01-12', 'META': '374.489990234375', 'TSLA': '218.88999938964844'}, {'Date': '2024-01-16', 'META': '367.4599914550781', 'TSLA': '219.91000366210938'}, {'Date': '2024-01-17', 'META': '368.3699951171875', 'TSLA': '215.5500030517578'}, {'Date': '2024-01-18', 'META': '376.1300048828125', 'TSLA': '211.8800048828125'}, {'Date': '2024-01-19', 'META': '383.45001220703125', 'TSLA': '212.19000244140625'}, {'Date': '2024-01-22', 'META': '381.7799987792969', 'TSLA': '208.8000030517578'}, {'Date': '2024-01-23', 'META': '385.20001220703125', 'TSLA': '209.13999938964844'}, {'Date': '2024-01-24', 'META': '390.70001220703125', 'TSLA': '207.8300018310547'}, {'Date': '2024-01-25', 'META': '393.17999267578125', 'TSLA': '182.6300048828125'}, {'Date': '2024-01-26', 'META': '394.1400146484375', 'TSLA': '183.25'}, {'Date': '2024-01-29', 'META': '401.0199890136719', 'TSLA': '190.92999267578125'}, {'Date': '2024-01-30', 'META': '400.05999755859375', 'TSLA': '191.58999633789062'}, {'Date': '2024-01-31', 'META': '390.1400146484375', 'TSLA': '187.2899932861328'}, {'Date': '2024-02-01', 'META': '394.7799987792969', 'TSLA': '188.86000061035156'}, {'Date': '2024-02-02', 'META': '474.989990234375', 'TSLA': '187.91000366210938'}, {'Date': '2024-02-05', 'META': '459.4100036621094', 'TSLA': '181.05999755859375'}, {'Date': '2024-02-06', 'META': '454.7200012207031', 'TSLA': '185.10000610351562'}, {'Date': '2024-02-07', 'META': '469.5899963378906', 'TSLA': '187.5800018310547'}, {'Date': '2024-02-08', 'META': '470.0', 'TSLA': '189.55999755859375'}, {'Date': '2024-02-09', 'META': '468.1099853515625', 'TSLA': '193.57000732421875'}, {'Date': '2024-02-12', 'META': '468.8999938964844', 'TSLA': '188.1300048828125'}, {'Date': '2024-02-13', 'META': '460.1199951171875', 'TSLA': '184.02000427246094'}, {'Date': '2024-02-14', 'META': '473.2799987792969', 'TSLA': '188.7100067138672'}, {'Date': '2024-02-15', 'META': '484.0299987792969', 'TSLA': '200.4499969482422'}, {'Date': '2024-02-16', 'META': '473.32000732421875', 'TSLA': '199.9499969482422'}, {'Date': '2024-02-20', 'META': '471.75', 'TSLA': '193.75999450683594'}, {'Date': '2024-02-21', 'META': '468.0299987792969', 'TSLA': '194.77000427246094'}, {'Date': '2024-02-22', 'META': '486.1300048828125', 'TSLA': '197.41000366210938'}, {'Date': '2024-02-23', 'META': '484.0299987792969', 'TSLA': '191.97000122070312'}, {'Date': '2024-02-26', 'META': '481.739990234375', 'TSLA': '199.39999389648438'}, {'Date': '2024-02-27', 'META': '487.04998779296875', 'TSLA': '199.72999572753906'}, {'Date': '2024-02-28', 'META': '484.0199890136719', 'TSLA': '202.0399932861328'}, {'Date': '2024-02-29', 'META': '490.1300048828125', 'TSLA': '201.8800048828125'}, {'Date': '2024-03-01', 'META': '502.29998779296875', 'TSLA': '202.63999938964844'}]\\nTESLA data: []\\n\", 'role': 'assistant'}, {'content': 'The output indicates that the file `coding/stock_price_ytd.csv` exists and contains the necessary data for META stock price gains YTD. However, it seems that the TESLA data is not separated correctly, as the TESLA data appears to be within the same rows as the META data, but the script is looking for a separate \\'TESLA\\' entry in the rows.\\n\\nWe need to adjust the script to correctly parse the TESLA data from the same rows as the META data. Let\\'s modify the script to extract both META and TESLA stock prices from the same rows and then plot the chart.\\n\\n```python\\n# filename: plot_stock_prices.py\\n\\nimport csv\\nimport os\\nimport matplotlib.pyplot as plt\\n\\n# Define the path to the CSV file\\nfile_path = \\'coding/stock_price_ytd.csv\\'\\n\\n# Initialize lists to hold the parsed data\\ndates = []\\nmeta_prices = []\\ntesla_prices = []\\n\\n# Check if the file exists\\nif os.path.exists(file_path):\\n try:\\n # Read the file and parse the data\\n with open(file_path, mode=\\'r\\') as file:\\n csv_reader = csv.DictReader(file)\\n for row in csv_reader:\\n dates.append(row[\\'Date\\'])\\n meta_prices.append(float(row[\\'META\\']))\\n tesla_prices.append(float(row[\\'TSLA\\']))\\n \\n # Plot the data\\n plt.figure(figsize=(14, 7))\\n plt.plot(dates, meta_prices, label=\\'META\\', marker=\\'o\\')\\n plt.plot(dates, tesla_prices, label=\\'TESLA\\', marker=\\'x\\')\\n \\n # Formatting the plot\\n plt.title(\\'META vs TESLA Stock Price Gain YTD\\')\\n plt.xlabel(\\'Date\\')\\n plt.ylabel(\\'Stock Price\\')\\n plt.xticks(rotation=45)\\n plt.legend()\\n plt.tight_layout()\\n \\n # Show the plot\\n plt.show()\\n except Exception as e:\\n print(f\"An error occurred while processing the file: {e}\")\\nelse:\\n print(\"The file does not exist.\")\\n```\\n\\nPlease execute the above code to plot the chart of META and TESLA stock price gains YTD.', 'role': 'user'}, {'content': 'exitcode: 0 (execution succeeded)\\nCode output: \\n', 'role': 'assistant'}, {'content': 'It appears that the code executed successfully and the chart should have been displayed on your screen. Since I cannot view the chart, I will assume that you were able to see the META and TESLA stock price gains YTD plotted correctly.\\n\\nIf you have any further requests or need assistance with another task, feel free to ask. Otherwise, if everything is done, please let me know.\\n\\nTERMINATE', 'role': 'user'}], summary='It appears that the code executed successfully and the chart should have been displayed on your screen. Since I cannot view the chart, I will assume that you were able to see the META and TESLA stock price gains YTD plotted correctly.\\n\\nIf you have any further requests or need assistance with another task, feel free to ask. Otherwise, if everything is done, please let me know.\\n\\n', cost=({'total_cost': 2.1070799999999994, 'gpt-4': {'cost': 2.1070799999999994, 'prompt_tokens': 45338, 'completion_tokens': 12449, 'total_tokens': 57787}}, {'total_cost': 1.7238599999999995, 'gpt-4': {'cost': 1.7238599999999995, 'prompt_tokens': 37832, 'completion_tokens': 9815, 'total_tokens': 47647}}), human_input=[])" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ipy_user = IPythonUserProxyAgent(\n", - " \"ipython_user_proxy\",\n", - " human_input_mode=\"NEVER\",\n", - " max_consecutive_auto_reply=10,\n", - " is_termination_msg=lambda x: x.get(\"content\", \"\").rstrip().endswith(\"TERMINATE\")\n", - " or x.get(\"content\", \"\").rstrip().endswith('\"TERMINATE\".'),\n", - " code_execution_config={\n", - " \"use_docker\": False, # Please set use_docker=True if docker is available to run the generated code. Using docker is safer than running the generated code directly.\n", - " },\n", - ")\n", - "# the assistant receives a message from the user, which contains the task description\n", - "ipy_user.initiate_chat(\n", - " assistant,\n", - " message=my_ipy_message_generator,\n", - " raw_message=\"\"\"Plot a chart of META and TESLA stock price gain YTD. \"\"\",\n", - " carryover=\"Use data from the following csv file if it exists: coding/stock_price_ytd.csv. Use csv to read the file. Otherwise, figure out how to get the data.\",\n", - ")" - ] } ], "metadata": { @@ -1054,7 +882,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.11.5" }, "vscode": { "interpreter": { diff --git a/website/.gitignore b/website/.gitignore index 957507b6b4..c73d767838 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -21,6 +21,9 @@ docs/topics/prompting-and-reasoning/*.mdx docs/topics/non-openai-models/*.mdx docs/topics/non-openai-models/**/*.py docs/topics/non-openai-models/**/*.svg +docs/topics/code-execution/*.mdx +docs/topics/groupchat/customized_speaker_selection.mdx +cell-*-output-*.png # Misc .DS_Store diff --git a/website/docs/topics/code-execution/custom-executor.ipynb b/website/docs/topics/code-execution/custom-executor.ipynb new file mode 100644 index 0000000000..c6ee4c1601 --- /dev/null +++ b/website/docs/topics/code-execution/custom-executor.ipynb @@ -0,0 +1,504 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Custom Code Executor\n", + "\n", + "In this guide we will show you how to create a custom code executor that runs\n", + "code inside the same Jupyter notebook as this one.\n", + "\n", + "First, let's install the required dependencies:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "! pip -qqq install pyautogen matplotlib yfinance" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from typing import List\n", + "\n", + "from IPython import get_ipython\n", + "\n", + "from autogen import ConversableAgent\n", + "from autogen.coding import CodeBlock, CodeExecutor, CodeExtractor, CodeResult, MarkdownCodeExtractor" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can create the custom code executor class by subclassing the\n", + "`CodeExecutor` protocol and implementing the `execute_code_blocks` method." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "class NotebookExecutor(CodeExecutor):\n", + "\n", + " @property\n", + " def code_extractor(self) -> CodeExtractor:\n", + " # Extact code from markdown blocks.\n", + " return MarkdownCodeExtractor()\n", + "\n", + " def __init__(self) -> None:\n", + " # Get the current IPython instance running in this notebook.\n", + " self._ipython = get_ipython()\n", + "\n", + " def execute_code_blocks(self, code_blocks: List[CodeBlock]) -> CodeResult:\n", + " log = \"\"\n", + " for code_block in code_blocks:\n", + " result = self._ipython.run_cell(\"%%capture --no-display cap\\n\" + code_block.code)\n", + " log += self._ipython.ev(\"cap.stdout\")\n", + " log += self._ipython.ev(\"cap.stderr\")\n", + " if result.result is not None:\n", + " log += str(result.result)\n", + " exitcode = 0 if result.success else 1\n", + " if result.error_before_exec is not None:\n", + " log += f\"\\n{result.error_before_exec}\"\n", + " exitcode = 1\n", + " if result.error_in_exec is not None:\n", + " log += f\"\\n{result.error_in_exec}\"\n", + " exitcode = 1\n", + " if exitcode != 0:\n", + " break\n", + " return CodeResult(exit_code=exitcode, output=log)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use the new custom code executor in our agents." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "code_writer_agent = ConversableAgent(\n", + " name=\"CodeWriter\",\n", + " system_message=\"You are a helpful AI assistant.\\n\"\n", + " \"You use your coding skill to solve problems.\\n\"\n", + " \"You have access to a IPython kernel to execute Python code.\\n\"\n", + " \"You can suggest Python code in Markdown blocks, each block is a cell.\\n\"\n", + " \"The code blocks will be executed in the IPython kernel in the order you suggest them.\\n\"\n", + " \"All necessary libraries have already been installed.\\n\"\n", + " \"Once the task is done, returns 'TERMINATE'.\",\n", + " llm_config={\"config_list\": [{\"model\": \"gpt-4\", \"api_key\": os.getenv(\"OPENAI_API_KEY\")}]},\n", + ")\n", + "\n", + "code_executor_agent = ConversableAgent(\n", + " name=\"CodeExecutor\",\n", + " llm_config=False,\n", + " code_execution_config={\"executor\": NotebookExecutor()},\n", + " is_termination_msg=lambda msg: \"TERMINATE\" in msg.get(\"content\", \"\").strip().upper(),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's use the agents to complete a simple task of drawing a plot showing\n", + "the market caps of the top 7 publicly listed companies." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mCodeExecutor\u001b[0m (to CodeWriter):\n", + "\n", + "Create a plot showing the market caps of the top 7 publicly listed companies using data from Yahoo Finance.\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[33mCodeWriter\u001b[0m (to CodeExecutor):\n", + "\n", + "To accomplish this task, we would use the `yfinance` library to fetch data from Yahoo Finance, `pandas` library for data manipulation, and `matplotlib` for data visualization.\n", + "\n", + "Steps:\n", + "1. Identify the tickers for the top 7 largest publicly listed companies. Currently, these companies are: Apple (AAPL), Microsoft (MSFT), Google (GOOGL), Amazon (AMZN), Facebook (FB), Tesla (TSLA), and Berkshire Hathaway (BRK-A).\n", + "2. Fetch market cap information for these companies using yfinance.\n", + "3. Clean and process the fetched data into a usable format (a pandas DataFrame).\n", + "4. Plot the market caps for these companies.\n", + "\n", + "Let's start by fetching data for these companies.\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[33mCodeExecutor\u001b[0m (to CodeWriter):\n", + "\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[33mCodeWriter\u001b[0m (to CodeExecutor):\n", + "\n", + "Great! Before I continue, I need to know if the necessary libraries are installed.\n", + "\n", + "The libraries needed for this task are:\n", + "1. `yfinance`\n", + "2. `pandas`\n", + "3. `matplotlib`\n", + "\n", + "If these libraries are not installed, you can install them using pip:\n", + "\n", + "```python\n", + "!pip install yfinance pandas matplotlib\n", + "```\n", + "\n", + "Assuming these libraries are installed, we would import them and proceed with fetching the market cap data:\n", + "\n", + "```python\n", + "import yfinance as yf\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Define tickers \n", + "tickers = [\"AAPL\", \"MSFT\", \"GOOGL\", \"AMZN\", \"FB\", \"TSLA\", \"BRK-A\"]\n", + "\n", + "# Fetch data\n", + "data = yf.download(tickers, start=\"2022-02-01\", end=\"2022-02-28\")\n", + "\n", + "# Extract only 'Close' values for each ticker\n", + "data = data['Close']\n", + "\n", + "# Create empty dictionary to hold market cap data\n", + "market_caps = {}\n", + "\n", + "# Calculate market caps\n", + "for ticker in tickers:\n", + " info = yf.Ticker(ticker).info\n", + " market_caps[ticker] = info[\"marketCap\"]\n", + "\n", + "# Convert market_caps dictionary to pandas DataFrame\n", + "df = pd.DataFrame(list(market_caps.items()), columns=['Company', 'Market_Cap'])\n", + "\n", + "# Sort DataFrame by Market_Cap in descending order\n", + "df = df.sort_values('Market_Cap', ascending=False)\n", + "\n", + "# Plot data\n", + "plt.figure(figsize=(10,6))\n", + "plt.barh(df['Company'], df['Market_Cap'], color='skyblue')\n", + "plt.xlabel('Market Cap (in trillions)')\n", + "plt.title('Market Caps of Top 7 Publicly Listed Companies')\n", + "plt.gca().invert_yaxis()\n", + "plt.show()\n", + "```\n", + "\n", + "Please note that the start and end dates used while fetching data specifies the time period we are interested in. Feel free to modify these as needed. The 'marketCap' obtained from the 'info' property of the Ticker object represents the market cap as of the end date.\n", + "\n", + "Also note that the final plot shows the companies in descending order of market cap, with the company with the highest market cap at the top of the chart.\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[31m\n", + ">>>>>>>> EXECUTING 2 CODE BLOCKS (inferred languages are [python, python])...\u001b[0m\n" + ] + }, + { + "ename": "KeyError", + "evalue": "'marketCap'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[24], line 20\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ticker \u001b[38;5;129;01min\u001b[39;00m tickers:\n\u001b[1;32m 19\u001b[0m info \u001b[38;5;241m=\u001b[39m yf\u001b[38;5;241m.\u001b[39mTicker(ticker)\u001b[38;5;241m.\u001b[39minfo\n\u001b[0;32m---> 20\u001b[0m market_caps[ticker] \u001b[38;5;241m=\u001b[39m \u001b[43minfo\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmarketCap\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n\u001b[1;32m 22\u001b[0m \u001b[38;5;66;03m# Convert market_caps dictionary to pandas DataFrame\u001b[39;00m\n\u001b[1;32m 23\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame(\u001b[38;5;28mlist\u001b[39m(market_caps\u001b[38;5;241m.\u001b[39mitems()), columns\u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCompany\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mMarket_Cap\u001b[39m\u001b[38;5;124m'\u001b[39m])\n", + "\u001b[0;31mKeyError\u001b[0m: 'marketCap'" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mCodeExecutor\u001b[0m (to CodeWriter):\n", + "\n", + "exitcode: 0 (execution succeeded)\n", + "Code output: Requirement already satisfied: yfinance in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (0.2.36)\n", + "Requirement already satisfied: pandas in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (2.2.1)\n", + "Requirement already satisfied: matplotlib in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (3.8.3)\n", + "Requirement already satisfied: numpy>=1.16.5 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from yfinance) (1.26.4)\n", + "Requirement already satisfied: requests>=2.31 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from yfinance) (2.31.0)\n", + "Requirement already satisfied: multitasking>=0.0.7 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from yfinance) (0.0.11)\n", + "Requirement already satisfied: lxml>=4.9.1 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from yfinance) (5.0.1)\n", + "Requirement already satisfied: appdirs>=1.4.4 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from yfinance) (1.4.4)\n", + "Requirement already satisfied: pytz>=2022.5 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from yfinance) (2023.3.post1)\n", + "Requirement already satisfied: frozendict>=2.3.4 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from yfinance) (2.4.0)\n", + "Requirement already satisfied: peewee>=3.16.2 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from yfinance) (3.17.0)\n", + "Requirement already satisfied: beautifulsoup4>=4.11.1 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from yfinance) (4.12.2)\n", + "Requirement already satisfied: html5lib>=1.1 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from yfinance) (1.1)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from pandas) (2.8.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from pandas) (2023.4)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from matplotlib) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from matplotlib) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from matplotlib) (4.47.2)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from matplotlib) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from matplotlib) (23.2)\n", + "Requirement already satisfied: pillow>=8 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from matplotlib) (10.2.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from matplotlib) (3.1.1)\n", + "Requirement already satisfied: soupsieve>1.2 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from beautifulsoup4>=4.11.1->yfinance) (2.5)\n", + "Requirement already satisfied: six>=1.9 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from html5lib>=1.1->yfinance) (1.16.0)\n", + "Requirement already satisfied: webencodings in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from html5lib>=1.1->yfinance) (0.5.1)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from requests>=2.31->yfinance) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from requests>=2.31->yfinance) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from requests>=2.31->yfinance) (1.26.18)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages (from requests>=2.31->yfinance) (2024.2.2)\n", + "/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "[************** 29%% ] 2 of 7 completed/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "[********************* 43%% ] 3 of 7 completed/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "[**********************57%%* ] 4 of 7 completed/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "[**********************71%%******** ] 5 of 7 completed/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "[*********************100%%**********************] 7 of 7 completed\n", + "\n", + "1 Failed download:\n", + "['FB']: Exception('%ticker%: No timezone found, symbol may be delisted')\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[33mCodeWriter\u001b[0m (to CodeExecutor):\n", + "\n", + "From the error message, it seems that the 'FB' ticker (Facebook) failed to download because it might have been delisted. This is likely due to Facebook's corporate rebranding to Meta Platforms Inc. in late 2021, which resulted in a ticker change from 'FB' to 'META'.\n", + "\n", + "To resolve this, we'll replace 'FB' in our tickers list with 'META' and then retrieve the data again. Here is the modified code:\n", + "\n", + "```python\n", + "# Define tickers \n", + "tickers = [\"AAPL\", \"MSFT\", \"GOOGL\", \"AMZN\", \"META\", \"TSLA\", \"BRK-A\"]\n", + "\n", + "# Fetch data\n", + "data = yf.download(tickers, start=\"2022-02-01\", end=\"2022-02-28\")\n", + "\n", + "# Extract only 'Close' values for each ticker\n", + "data = data['Close']\n", + "\n", + "# Create empty dictionary to hold market cap data\n", + "market_caps = {}\n", + "\n", + "# Calculate market caps\n", + "for ticker in tickers:\n", + " info = yf.Ticker(ticker).info\n", + " market_caps[ticker] = info[\"marketCap\"]\n", + "\n", + "# Convert market_caps dictionary to pandas DataFrame\n", + "df = pd.DataFrame(list(market_caps.items()), columns=['Company', 'Market_Cap'])\n", + "\n", + "# Sort DataFrame by Market_Cap in descending order\n", + "df = df.sort_values('Market_Cap', ascending=False)\n", + "\n", + "# Plot data\n", + "plt.figure(figsize=(10,6))\n", + "plt.barh(df['Company'], df['Market_Cap'], color='skyblue')\n", + "plt.xlabel('Market Cap (in trillions)')\n", + "plt.title('Market Caps of Top 7 Publicly Listed Companies')\n", + "plt.gca().invert_yaxis()\n", + "plt.show()\n", + "```\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[31m\n", + ">>>>>>>> EXECUTING CODE BLOCK (inferred language is python)...\u001b[0m\n" + ] + }, + { + "data": { + "image/png": "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r7Zt23L/FnAH9FwBSFOZMmVUr149LVy4UE8++aSkmx/IsbGxCg0N1fvvv59qnalTp+qpp55St27dlJiYqKioKHXs2FGrVq1SSEiIQ9v169dr8eLFGjRokHx8fNIMPklJSerTp48WLVqkFStW2Lfxzjvv6PXXX1enTp3Ut29f/f3335o2bZoaNWqkXbt2ydvbW//v//0/xcbGOlzO5unpme7xfv3117px44a6d++eqefn559/1g8//KDQ0FCVLFlSx44d04wZM9SkSRPt27dPBQsWdGg/aNAgeXt7a+zYsTpw4IBmzJihmJgY+x+yZ8+eVYsWLeTr66uRI0fK29tbx44dcwiU6Rk7dqzGjRunZs2aacCAAfbt//zzz9q6datcXFw0ZcoUffrpp1qxYoX9Mrnbe4Uy6+rVq2rSpIkOHTqkQYMGqWzZslqyZIl69eqlixcvOvwBK0mffvqpLl26pIEDB+ratWuaOnWqHn/8ce3evVvFixfP0r7nz5+vgIAANWrUKFu1SzfvyZGkokWLZmv9d955RxaLRa+++qrOnj2rKVOmqFmzZoqOjpa7u3umt/PXX3+pdu3aunjxovr376/KlSvrzz//1NKlSxUfH59mz1z37t315ptvatGiRRo0aJB9fsoXHx06dDC91ykxMVEtW7ZUQkKCBg8eLD8/P/35559atWqVLl68KC8vL82bN099+/ZV7dq11b9/f0lS+fLlJUlnzpxR3bp17YHA19dXX3/9tZ599lnFxcXZv8y4evWqnnjiCR0/flxDhgxRiRIlNG/ePK1fvz5TdX755ZcqV66cHnvssUy179u3r+bOnatnnnlGI0aM0E8//aTw8HDt379fK1ascGh76NAhde3aVc8995zCwsI0YcIEtWnTRh999JFGjx6tF154QZIUHh6uTp066cCBAypQ4H/fXyclJSk4OFh169bVe++9pzVr1mjMmDG6ceOG3nzzTXu7rLyHbtmyRcuXL9cLL7ygQoUK6f3331eHDh10/PjxDH+3582bp549e6ply5Z69913FR8frxkzZqhBgwbatWuX/b24Q4cO2rt3rwYPHqwyZcro7Nmz+uabb3T8+PEMv6gC7nsGANwiMjLSkGT8/PPPxgcffGAUKlTIiI+PNwzDMDp27Gg0bdrUMAzDKF26tBESEuKwbkq7FImJiUb16tWNxx9/3GG+JKNAgQLG3r17HeYfPXrUkGT897//Na5fv2507tzZcHd3N9auXWtvc+zYMcPJycl45513HNbdvXu34ezs7DA/JCTEKF26dKaO+8UXXzQkGbt27cpU+9uP1TAM48cffzQkGZ9++ql9XsrzWbNmTSMxMdE+/7333jMkGZ9//rlhGIaxYsUK+/OeFWfPnjVcXV2NFi1aGElJSfb5H3zwgSHJmD17tn3emDFjDEnG33//naV93P48TpkyxZBkfPbZZ/Z5iYmJRr169QxPT08jLi7OMIz/nU93d3fj5MmT9rY//fSTIcl48cUXs1THnj17DEnGK6+8kqn2Kcd74MAB4++//zaOHj1qzJw507BarUbx4sWNK1euGIZx83e5Z8+eqdZv3Lix0bhxY/vjDRs2GJKMBx54wH6MhmEYixcvNiQZU6dOtc/r2bNnqt89ScaYMWPsj3v06GEUKFAgzXOenJzssM8NGzbYl9WrV8+oU6eOQ/vly5enapfRc5LR78Dt+9y1a5chyViyZEmG2/bw8EjzeXz22WcNf39/49y5cw7zQ0NDDS8vL/trKeX3avHixfY2V65cMQIDA+94bLGxsYYko23bthnWmCI6OtqQZPTt29dh/ksvvWRIMtavX2+fV7p0aUOS8cMPP9jnrV271v67HRMTY58/c+bMVLX27NnTkGQMHjzYPi85OdkICQkxXF1dHc5FVt5DXV1djUOHDtnn/frrr4YkY9q0afZ5Ke8/R48eNQzDMC5dumR4e3sb/fr1c9je6dOnDS8vL/v8Cxcu2N+LAWQNlwUCSFenTp109epVrVq1SpcuXdKqVavSvSRQksO39hcuXFBsbKwaNmyonTt3pmrbuHFjVa1aNc3tJCYm2r+t/eqrr9SiRQv7suXLlys5OVmdOnXSuXPn7JOfn58qVKigDRs2ZOtYU0aPK1SoUKba33qs169f1/nz5xUYGChvb+80j7d///5ycXGxPx4wYICcnZ311VdfSfrffVCrVq3S9evXM133t99+q8TERA0bNszhm/J+/frJZrPlyD0mX331lfz8/NSlSxf7PBcXFw0ZMkSXL1/Wpk2bHNq3a9dODzzwgP1x7dq1VadOHfuxZ9b8+fMlKcuXBFaqVEm+vr4qW7asnnvuOQUGBmr16tWpehczq0ePHg6/J88884z8/f2zdDzJyclauXKl2rRpo0cffTTV8owG2ujRo4d++uknew+c9L8evcaNG2e6hszy8vKSJK1du1bx8fFZWtcwDC1btkxt2rSRYRgOr9mWLVsqNjbW/nr56quv5O/vr2eeeca+fsGCBe09YRnJ6us35VwNHz7cYf6IESMkKdXrpmrVqg7359WpU0fSzUtMS5UqlWr+kSNHUu3z1p7GlF68xMREffvtt/b5WXkPbdasmb13ULp5j6LNZktz3ym++eYbXbx4UV26dHE4F05OTqpTp479/dPd3V2urq7auHFjqsuXAWSMywIBpMvX11fNmjXTggULFB8fr6SkJIc/fG63atUqvf3224qOjna4byGtPxTLli2b7nbCw8N1+fJlff3116nueTl48KAMw1CFChXSXPfWAJMVNptNknTp0qVMtb969arCw8MVGRmpP//80+HeiZT7UG51e72enp7y9/e337/QuHFjdejQQePGjdPkyZPVpEkTtWvXTl27ds1wpK+YmBhJNwPErVxdXVWuXDn7cjPFxMSoQoUKDmFOkqpUqeJQU4q0zlXFihW1ePHiTO/TMAwtWLBA1atXz/LljMuWLZPNZpOLi4tKlizp8Adpdtx+PBaLRYGBgVm6F+Xvv/9WXFycqlevnuX9d+7cWcOGDdP8+fP1xhtvKDY2VqtWrdKLL76YI6Mfli1bVsOHD9ekSZM0f/58NWzYUE899ZTCwsLswSs9f//9ty5evKhZs2alO0pfykArMTExCgwMTHUMt/9upyWrr9+YmBgVKFAg1WiUfn5+8vb2TvU7fGuAkv4XOAMCAtKcf3sgKVCggMqVK+cwr2LFipLk8HuTlffQ22uSpMKFC2cYhg4ePCjpf/cd3i7lebRarXr33Xc1YsQIFS9eXHXr1lXr1q3Vo0cP+fn5pbt9AIQrAHfQtWtX9evXT6dPn9aTTz6Z7khz33//vZ566ik1atRI06dPl7+/v1xcXBQZGakFCxakap/RvSktW7bUmjVr9N5776lJkyYO95AkJyfLYrHo66+/TnMUrIzuq8pI5cqVJUm7d+/Www8/fMf2gwcPVmRkpIYNG6Z69erJy8tLFotFoaGhSk5OzvL+U/457bZt2/Tll19q7dq16tOnjyZOnKht27Zl+7juFVu3blVMTIzCw8OzvG6jRo3sowWmJb1AkpSUlC9HWitcuLBat25tD1dLly5VQkJCjo7mOHHiRPXq1Uuff/651q1bpyFDhig8PFzbtm3L8F8TpLwWwsLC1LNnzzTbZPfev1vZbDaVKFEiywOlZDaMpvd7kN5847aBKjIjq++h2dl3yvmYN29emiHp1pFhhw0bpjZt2mjlypVau3atXn/9dYWHh2v9+vUKCgrK6uEB9w3CFYAMtW/fXs8995y2bdumRYsWpdtu2bJlcnNz09q1ax16WiIjI7O8z7p16+r5559X69at1bFjR61YscL+oV++fHkZhqGyZcvav/lNT1a+xX/yySfl5OSkzz77LFODWixdulQ9e/bUxIkT7fOuXbvmMELfrQ4ePKimTZvaH1++fFmnTp1Sq1atHNrVrVtXdevW1TvvvKMFCxaoW7duioqKUt++fdPcbunSpSVJBw4ccPhmPDExUUePHlWzZs3ueCxZVbp0af32229KTk526L36/fffHWpKkfJt+a3++OOPLN0UP3/+fFkslgwvS82uwoULp3neYmJiUvU2SKmPxzAMHTp0KEshwdfXVzabLdujJvbo0UNt27bVzz//rPnz5ysoKEjVqlXL1rYyq0aNGqpRo4Zee+01/fDDD6pfv74++ugjvf3225LSfr35+vqqUKFCSkpKuuPvYunSpbVnzx4ZhuGwrQMHDmSqvtatW2vWrFn68ccf7zjEfunSpZWcnKyDBw/ae1ylm4NvXLx4MdXv8N1KTk7WkSNHHN6z/vjjD0myvw7MfA9NT0qvbbFixTL13lC+fHmNGDFCI0aM0MGDB/Xwww9r4sSJ+uyzz0yrCbjXcM8VgAx5enpqxowZGjt2rNq0aZNuOycnJ1ksFiUlJdnnHTt2TCtXrszWfps1a6aoqCitWbNG3bt3t3/j+vTTT8vJyUnjxo1L9Q2tYRg6f/68/bGHh0eal+ilJSAgQP369dO6des0bdq0VMuTk5Pt/0xXunm8t+9/2rRpDsd/q1mzZjncSzVjxgzduHHDPhLjhQsXUm0vpQcto6GomzVrJldXV73//vsO60dERCg2NjbVCGNmaNWqlU6fPu0Qtm/cuKFp06bJ09Mz1X0/K1eu1J9//ml/vH37dv3000/2Y7+T69eva8mSJWrQoEGal0LdrfLly2vbtm0Ow5+vWrUq3eHVU0Y/TLF06VKdOnUq08cj3bxMrF27dvryyy+1Y8eOVMvv1PPx5JNPysfHR++++642bdqUo71WcXFxunHjhsO8GjVqqECBAg6/mx4eHqlCqpOTkzp06KBly5alGSRvHVK+VatW+uuvvxyGHo+Pj8/0P/195ZVX5OHhob59++rMmTOplh8+fFhTp06170uSpkyZ4tBm0qRJkpQjr5sPPvjA/rNhGPrggw/k4uKiJ554QpL576FpadmypWw2m8aPH5/mvZ0p5yM+Pj7VkP7ly5dXoUKFMj00PnC/oucKwB2ldznPrUJCQjRp0iQFBwera9euOnv2rD788EMFBgbqt99+y9Z+27Vrp8jISPXo0UM2m00zZ85U+fLl9fbbb2vUqFE6duyY2rVrp0KFCuno0aNasWKF+vfvr5deekmSVLNmTS1atEjDhw9XrVq15OnpmWFAnDhxog4fPqwhQ4Zo+fLlat26tQoXLqzjx49ryZIl+v333xUaGirp5rfk8+bNk5eXl6pWraoff/xR3377bbpDICcmJuqJJ56wD9M8ffp0NWjQQE899ZQkae7cuZo+fbrat2+v8uXL69KlS/r4449ls9lS9W7dytfXV6NGjdK4ceMUHBysp556yr79WrVq5cgf3f3799fMmTPVq1cv/fLLLypTpoyWLl2qrVu3asqUKakGFQgMDFSDBg00YMAAJSQkaMqUKSpatKheeeWVTO1v7dq1On/+/F39b6uM9O3bV0uXLlVwcLA6deqkw4cP67PPPkv33qwiRYqoQYMG6t27t86cOaMpU6YoMDBQ/fr1y9J+x48fr3Xr1qlx48bq37+/qlSpolOnTmnJkiXasmVLhv/s2cXFRaGhofrggw/k5OTkMLhIZkyaNCnVgB4FChTQ6NGjU7Vdv369Bg0apI4dO6pixYq6ceOG5s2bZw9OKWrWrKlvv/1WkyZNUokSJVS2bFnVqVNH//nPf7RhwwbVqVNH/fr1U9WqVfXPP/9o586d+vbbb/XPP/9IujkIywcffKAePXrol19+kb+/v+bNm5fpgUfKly+vBQsWqHPnzqpSpYp69Oih6tWrKzExUT/88IP93wVI0kMPPaSePXtq1qxZunjxoho3bqzt27dr7ty5ateunUMvsxnc3Ny0Zs0a9ezZU3Xq1NHXX3+t1atXa/To0fL19ZWUM++ht7PZbJoxY4a6d++uRx55RKGhofL19dXx48e1evVq1a9fXx988IH++OMP+/tV1apV5ezsrBUrVujMmTP290AA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tWrVVKJECa1YsSJTNQJAdhw/flyRkZFasmSJGjZsqPLly+ull15SgwYNHN6TsmrChAm6fPmyOnXqlKX1CFcAcJ/o06ePwwfN7Nmz1bt371Ttrly5ouHDh2vHjh367rvvVKBAAbVv317JyckO7UaOHKmhQ4dq//799j/4U5w4cUINGzZU9erVtXTpUlmtVoWHh+vTTz/VRx99pL179+rFF19UWFiYNm3apICAAC1btkySdODAAZ06dUpTp05N8zjmz5+vSpUqqW3btqmWWSwW+6V5ly5dUs+ePbVlyxZt27ZNFSpUUKtWrXTp0iWHdV5//XV16NBBv/76q7p166bQ0FDt378/3efx+++/V82aNdNdniI+Pl4TJkzQvHnztHnzZh0/flwvvfRSmm3vdPxz586Vq6urtm7dqo8++uiO+76TFStWaOjQoRoxYoT27Nmj5557Tr1799aGDRsc2o0bN06dOnXSb7/9platWqlbt272nqjXX39d+/bt09dff639+/drxowZ8vHxcVi/du3a+v777++6XgBIz+7du5WUlKSKFSvK09PTPm3atMnhi8GsWLBggcaNG6fFixdnudffOVt7BAD864SFhWnUqFGKiYmRJG3dulVRUVEO16VLUocOHRwez549W76+vtq3b5+qV69unz9s2DA9/fTTqfZz4MABNW/eXO3bt9eUKVNksViUkJCg8ePH69tvv1W9evUkSeXKldOWLVs0c+ZMNW7c2H7pRbFixTIcfOHgwYOqVKnSHY/38ccfd3g8a9YseXt7a9OmTWrdurV9fseOHdW3b19J0ltvvaVvvvlG06ZN0/Tp09PcbkxMjEqUKHHH/V+/fl0fffSRypcvL+nmZStvvvlmmm2dnJwyPP4KFSrovffeu+M+M2vChAnq1auXXnjhBUnS8OHDtW3bNk2YMMHegybdvF+vS5cukqTx48fr/fff1/bt2xUcHKzjx48rKChIjz76qCTZ7z+7VYkSJbJ8MzgAZMXly5fl5OSkX375RU5OTg7LPD09s7y9qKgo9e3bV0uWLEl38IuMEK4A4D7h6+urkJAQzZkzR4ZhKCQkJFVPg3QzvLzxxhv66aefdO7cOXuP1fHjxx3CVcof1be6evWqGjZsqK5du2rKlCn2+YcOHVJ8fLyaN2/u0D4xMTHVZYl3YhhGptqdOXNGr732mjZu3Kiz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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mCodeExecutor\u001b[0m (to CodeWriter):\n", + "\n", + "exitcode: 0 (execution succeeded)\n", + "Code output: /Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "[ 0%% ]/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "[********************* 43%% ] 3 of 7 completed/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "[**********************57%%* ] 4 of 7 completed/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "[**********************71%%******** ] 5 of 7 completed/Users/ekzhu/miniconda3/envs/autogen/lib/python3.11/site-packages/yfinance/utils.py:775: FutureWarning: The 'unit' keyword in TimedeltaIndex construction is deprecated and will be removed in a future version. Use pd.to_timedelta instead.\n", + " df.index += _pd.TimedeltaIndex(dst_error_hours, 'h')\n", + "[*********************100%%**********************] 7 of 7 completed\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[33mCodeWriter\u001b[0m (to CodeExecutor):\n", + "\n", + "I see that the fetched data was successfully retrieved and processed. However, it looks like the result of the plot isn't visible, so we don't know whether the plot was generated successfully. Please run the code again and provide the output of the plot.\n", + "\n", + "If there are any issues or any other points you would like me to help with, let me know!\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[33mCodeExecutor\u001b[0m (to CodeWriter):\n", + "\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[33mCodeWriter\u001b[0m (to CodeExecutor):\n", + "\n", + "I'm glad we were able to retrieve and process the data successfully. Please try running the last part of the code again to generate and display the plot:\n", + "\n", + "```python\n", + "# Plot data\n", + "plt.figure(figsize=(10,6))\n", + "plt.barh(df['Company'], df['Market_Cap'], color='skyblue')\n", + "plt.xlabel('Market Cap (in trillions)')\n", + "plt.title('Market Caps of Top 7 Publicly Listed Companies')\n", + "plt.gca().invert_yaxis()\n", + "plt.show()\n", + "```\n", + "\n", + "This section of the code creates a horizontal bar plot of the market capitalizations of the companies. The `plt.gca().invert_yaxis()` line is included to invert the y-axis, so the company with the highest market cap is at the top of the chart.\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[31m\n", + ">>>>>>>> EXECUTING CODE BLOCK (inferred language is python)...\u001b[0m\n" + ] + }, + { + "data": { + "image/png": "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r7Zt23L/FnAH9FwBSFOZMmVUr149LVy4UE8++aSkmx/IsbGxCg0N1fvvv59qnalTp+qpp55St27dlJiYqKioKHXs2FGrVq1SSEiIQ9v169dr8eLFGjRokHx8fNIMPklJSerTp48WLVqkFStW2Lfxzjvv6PXXX1enTp3Ut29f/f3335o2bZoaNWqkXbt2ydvbW//v//0/xcbGOlzO5unpme7xfv3117px44a6d++eqefn559/1g8//KDQ0FCVLFlSx44d04wZM9SkSRPt27dPBQsWdGg/aNAgeXt7a+zYsTpw4IBmzJihmJgY+x+yZ8+eVYsWLeTr66uRI0fK29tbx44dcwiU6Rk7dqzGjRunZs2aacCAAfbt//zzz9q6datcXFw0ZcoUffrpp1qxYoX9Mrnbe4Uy6+rVq2rSpIkOHTqkQYMGqWzZslqyZIl69eqlixcvOvwBK0mffvqpLl26pIEDB+ratWuaOnWqHn/8ce3evVvFixfP0r7nz5+vgIAANWrUKFu1SzfvyZGkokWLZmv9d955RxaLRa+++qrOnj2rKVOmqFmzZoqOjpa7u3umt/PXX3+pdu3aunjxovr376/KlSvrzz//1NKlSxUfH59mz1z37t315ptvatGiRRo0aJB9fsoXHx06dDC91ykxMVEtW7ZUQkKCBg8eLD8/P/35559atWqVLl68KC8vL82bN099+/ZV7dq11b9/f0lS+fLlJUlnzpxR3bp17YHA19dXX3/9tZ599lnFxcXZv8y4evWqnnjiCR0/flxDhgxRiRIlNG/ePK1fvz5TdX755ZcqV66cHnvssUy179u3r+bOnatnnnlGI0aM0E8//aTw8HDt379fK1ascGh76NAhde3aVc8995zCwsI0YcIEtWnTRh999JFGjx6tF154QZIUHh6uTp066cCBAypQ4H/fXyclJSk4OFh169bVe++9pzVr1mjMmDG6ceOG3nzzTXu7rLyHbtmyRcuXL9cLL7ygQoUK6f3331eHDh10/PjxDH+3582bp549e6ply5Z69913FR8frxkzZqhBgwbatWuX/b24Q4cO2rt3rwYPHqwyZcro7Nmz+uabb3T8+PEMv6gC7nsGANwiMjLSkGT8/PPPxgcffGAUKlTIiI+PNwzDMDp27Gg0bdrUMAzDKF26tBESEuKwbkq7FImJiUb16tWNxx9/3GG+JKNAgQLG3r17HeYfPXrUkGT897//Na5fv2507tzZcHd3N9auXWtvc+zYMcPJycl45513HNbdvXu34ezs7DA/JCTEKF26dKaO+8UXXzQkGbt27cpU+9uP1TAM48cffzQkGZ9++ql9XsrzWbNmTSMxMdE+/7333jMkGZ9//rlhGIaxYsUK+/OeFWfPnjVcXV2NFi1aGElJSfb5H3zwgSHJmD17tn3emDFjDEnG33//naV93P48TpkyxZBkfPbZZ/Z5iYmJRr169QxPT08jLi7OMIz/nU93d3fj5MmT9rY//fSTIcl48cUXs1THnj17DEnGK6+8kqn2Kcd74MAB4++//zaOHj1qzJw507BarUbx4sWNK1euGIZx83e5Z8+eqdZv3Lix0bhxY/vjDRs2GJKMBx54wH6MhmEYixcvNiQZU6dOtc/r2bNnqt89ScaYMWPsj3v06GEUKFAgzXOenJzssM8NGzbYl9WrV8+oU6eOQ/vly5enapfRc5LR78Dt+9y1a5chyViyZEmG2/bw8EjzeXz22WcNf39/49y5cw7zQ0NDDS8vL/trKeX3avHixfY2V65cMQIDA+94bLGxsYYko23bthnWmCI6OtqQZPTt29dh/ksvvWRIMtavX2+fV7p0aUOS8cMPP9jnrV271v67HRMTY58/c+bMVLX27NnTkGQMHjzYPi85OdkICQkxXF1dHc5FVt5DXV1djUOHDtnn/frrr4YkY9q0afZ5Ke8/R48eNQzDMC5dumR4e3sb/fr1c9je6dOnDS8vL/v8Cxcu2N+LAWQNlwUCSFenTp109epVrVq1SpcuXdKqVavSvSRQksO39hcuXFBsbKwaNmyonTt3pmrbuHFjVa1aNc3tJCYm2r+t/eqrr9SiRQv7suXLlys5OVmdOnXSuXPn7JOfn58qVKigDRs2ZOtYU0aPK1SoUKba33qs169f1/nz5xUYGChvb+80j7d///5ycXGxPx4wYICcnZ311VdfSfrffVCrVq3S9evXM133t99+q8TERA0bNszhm/J+/frJZrPlyD0mX331lfz8/NSlSxf7PBcXFw0ZMkSXL1/Wpk2bHNq3a9dODzzwgP1x7dq1VadOHfuxZ9b8+fMlKcuXBFaqVEm+vr4qW7asnnvuOQUGBmr16tWpehczq0ePHg6/J88884z8/f2zdDzJyclauXKl2rRpo0cffTTV8owG2ujRo4d++uknew+c9L8evcaNG2e6hszy8vKSJK1du1bx8fFZWtcwDC1btkxt2rSRYRgOr9mWLVsqNjbW/nr56quv5O/vr2eeeca+fsGCBe09YRnJ6us35VwNHz7cYf6IESMkKdXrpmrVqg7359WpU0fSzUtMS5UqlWr+kSNHUu3z1p7GlF68xMREffvtt/b5WXkPbdasmb13ULp5j6LNZktz3ym++eYbXbx4UV26dHE4F05OTqpTp479/dPd3V2urq7auHFjqsuXAWSMywIBpMvX11fNmjXTggULFB8fr6SkJIc/fG63atUqvf3224qOjna4byGtPxTLli2b7nbCw8N1+fJlff3116nueTl48KAMw1CFChXSXPfWAJMVNptNknTp0qVMtb969arCw8MVGRmpP//80+HeiZT7UG51e72enp7y9/e337/QuHFjdejQQePGjdPkyZPVpEkTtWvXTl27ds1wpK+YmBhJNwPErVxdXVWuXDn7cjPFxMSoQoUKDmFOkqpUqeJQU4q0zlXFihW1ePHiTO/TMAwtWLBA1atXz/LljMuWLZPNZpOLi4tKlizp8Adpdtx+PBaLRYGBgVm6F+Xvv/9WXFycqlevnuX9d+7cWcOGDdP8+fP1xhtvKDY2VqtWrdKLL76YI6Mfli1bVsOHD9ekSZM0f/58NWzYUE899ZTCwsLswSs9f//9ty5evKhZs2alO0pfykArMTExCgwMTHUMt/9upyWrr9+YmBgVKFAg1WiUfn5+8vb2TvU7fGuAkv4XOAMCAtKcf3sgKVCggMqVK+cwr2LFipLk8HuTlffQ22uSpMKFC2cYhg4ePCjpf/cd3i7lebRarXr33Xc1YsQIFS9eXHXr1lXr1q3Vo0cP+fn5pbt9AIQrAHfQtWtX9evXT6dPn9aTTz6Z7khz33//vZ566ik1atRI06dPl7+/v1xcXBQZGakFCxakap/RvSktW7bUmjVr9N5776lJkyYO95AkJyfLYrHo66+/TnMUrIzuq8pI5cqVJUm7d+/Www8/fMf2gwcPVmRkpIYNG6Z69erJy8tLFotFoaGhSk5OzvL+U/457bZt2/Tll19q7dq16tOnjyZOnKht27Zl+7juFVu3blVMTIzCw8OzvG6jRo3sowWmJb1AkpSUlC9HWitcuLBat25tD1dLly5VQkJCjo7mOHHiRPXq1Uuff/651q1bpyFDhig8PFzbtm3L8F8TpLwWwsLC1LNnzzTbZPfev1vZbDaVKFEiywOlZDaMpvd7kN5847aBKjIjq++h2dl3yvmYN29emiHp1pFhhw0bpjZt2mjlypVau3atXn/9dYWHh2v9+vUKCgrK6uEB9w3CFYAMtW/fXs8995y2bdumRYsWpdtu2bJlcnNz09q1ax16WiIjI7O8z7p16+r5559X69at1bFjR61YscL+oV++fHkZhqGyZcvav/lNT1a+xX/yySfl5OSkzz77LFODWixdulQ9e/bUxIkT7fOuXbvmMELfrQ4ePKimTZvaH1++fFmnTp1Sq1atHNrVrVtXdevW1TvvvKMFCxaoW7duioqKUt++fdPcbunSpSVJBw4ccPhmPDExUUePHlWzZs3ueCxZVbp0af32229KTk526L36/fffHWpKkfJt+a3++OOPLN0UP3/+fFkslgwvS82uwoULp3neYmJiUvU2SKmPxzAMHTp0KEshwdfXVzabLdujJvbo0UNt27bVzz//rPnz5ysoKEjVqlXL1rYyq0aNGqpRo4Zee+01/fDDD6pfv74++ugjvf3225LSfr35+vqqUKFCSkpKuuPvYunSpbVnzx4ZhuGwrQMHDmSqvtatW2vWrFn68ccf7zjEfunSpZWcnKyDBw/ae1ylm4NvXLx4MdXv8N1KTk7WkSNHHN6z/vjjD0myvw7MfA9NT0qvbbFixTL13lC+fHmNGDFCI0aM0MGDB/Xwww9r4sSJ+uyzz0yrCbjXcM8VgAx5enpqxowZGjt2rNq0aZNuOycnJ1ksFiUlJdnnHTt2TCtXrszWfps1a6aoqCitWbNG3bt3t3/j+vTTT8vJyUnjxo1L9Q2tYRg6f/68/bGHh0eal+ilJSAgQP369dO6des0bdq0VMuTk5Pt/0xXunm8t+9/2rRpDsd/q1mzZjncSzVjxgzduHHDPhLjhQsXUm0vpQcto6GomzVrJldXV73//vsO60dERCg2NjbVCGNmaNWqlU6fPu0Qtm/cuKFp06bJ09Mz1X0/K1eu1J9//ml/vH37dv3000/2Y7+T69eva8mSJWrQoEGal0LdrfLly2vbtm0Ow5+vWrUq3eHVU0Y/TLF06VKdOnUq08cj3bxMrF27dvryyy+1Y8eOVMvv1PPx5JNPysfHR++++642bdqUo71WcXFxunHjhsO8GjVqqECBAg6/mx4eHqlCqpOTkzp06KBly5alGSRvHVK+VatW+uuvvxyGHo+Pj8/0P/195ZVX5OHhob59++rMmTOplh8+fFhTp06170uSpkyZ4tBm0qRJkpQjr5sPPvjA/rNhGPrggw/k4uKiJ554QpL576FpadmypWw2m8aPH5/mvZ0p5yM+Pj7VkP7ly5dXoUKFMj00PnC/oucKwB2ldznPrUJCQjRp0iQFBwera9euOnv2rD788EMFBgbqt99+y9Z+27Vrp8jISPXo0UM2m00zZ85U+fLl9fbbb2vUqFE6duyY2rVrp0KFCuno0aNasWKF+vfvr5deekmSVLNmTS1atEjDhw9XrVq15OnpmWFAnDhxog4fPqwhQ4Zo+fLlat26tQoXLqzjx49ryZIl+v333xUaGirp5rfk8+bNk5eXl6pWraoff/xR3377bbpDICcmJuqJJ56wD9M8ffp0NWjQQE899ZQkae7cuZo+fbrat2+v8uXL69KlS/r4449ls9lS9W7dytfXV6NGjdK4ceMUHBysp556yr79WrVq5cgf3f3799fMmTPVq1cv/fLLLypTpoyWLl2qrVu3asqUKakGFQgMDFSDBg00YMAAJSQkaMqUKSpatKheeeWVTO1v7dq1On/+/F39b6uM9O3bV0uXLlVwcLA6deqkw4cP67PPPkv33qwiRYqoQYMG6t27t86cOaMpU6YoMDBQ/fr1y9J+x48fr3Xr1qlx48bq37+/qlSpolOnTmnJkiXasmVLhv/s2cXFRaGhofrggw/k5OTkMLhIZkyaNCnVgB4FChTQ6NGjU7Vdv369Bg0apI4dO6pixYq6ceOG5s2bZw9OKWrWrKlvv/1WkyZNUokSJVS2bFnVqVNH//nPf7RhwwbVqVNH/fr1U9WqVfXPP/9o586d+vbbb/XPP/9IujkIywcffKAePXrol19+kb+/v+bNm5fpgUfKly+vBQsWqHPnzqpSpYp69Oih6tWrKzExUT/88IP93wVI0kMPPaSePXtq1qxZunjxoho3bqzt27dr7ty5ateunUMvsxnc3Ny0Zs0a9ezZU3Xq1NHXX3+t1atXa/To0fL19ZWUM++ht7PZbJoxY4a6d++uRx55RKGhofL19dXx48e1evVq1a9fXx988IH++OMP+/tV1apV5ezsrBUrVujMmTP290AA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tWrVVKJECa1YsSJTNQJAdhw/flyRkZFasmSJGjZsqPLly+ull15SgwYNHN6TsmrChAm6fPmyOnXqlKX1CFcAcJ/o06ePwwfN7Nmz1bt371Ttrly5ouHDh2vHjh367rvvVKBAAbVv317JyckO7UaOHKmhQ4dq//799j/4U5w4cUINGzZU9erVtXTpUlmtVoWHh+vTTz/VRx99pL179+rFF19UWFiYNm3apICAAC1btkySdODAAZ06dUpTp05N8zjmz5+vSpUqqW3btqmWWSwW+6V5ly5dUs+ePbVlyxZt27ZNFSpUUKtWrXTp0iWHdV5//XV16NBBv/76q7p166bQ0FDt378/3efx+++/V82aNdNdniI+Pl4TJkzQvHnztHnzZh0/flwvvfRSmm3vdPxz586Vq6urtm7dqo8++uiO+76TFStWaOjQoRoxYoT27Nmj5557Tr1799aGDRsc2o0bN06dOnXSb7/9platWqlbt272nqjXX39d+/bt09dff639+/drxowZ8vHxcVi/du3a+v777++6XgBIz+7du5WUlKSKFSvK09PTPm3atMnhi8GsWLBggcaNG6fFixdnudffOVt7BAD864SFhWnUqFGKiYmRJG3dulVRUVEO16VLUocOHRwez549W76+vtq3b5+qV69unz9s2DA9/fTTqfZz4MABNW/eXO3bt9eUKVNksViUkJCg8ePH69tvv1W9evUkSeXKldOWLVs0c+ZMNW7c2H7pRbFixTIcfOHgwYOqVKnSHY/38ccfd3g8a9YseXt7a9OmTWrdurV9fseOHdW3b19J0ltvvaVvvvlG06ZN0/Tp09PcbkxMjEqUKHHH/V+/fl0fffSRypcvL+nmZStvvvlmmm2dnJwyPP4KFSrovffeu+M+M2vChAnq1auXXnjhBUnS8OHDtW3bNk2YMMHegybdvF+vS5cukqTx48fr/fff1/bt2xUcHKzjx48rKChIjz76qCTZ7z+7VYkSJbJ8MzgAZMXly5fl5OSkX375RU5OTg7LPD09s7y9qKgo9e3bV0uWLEl38IuMEK4A4D7h6+urkJAQzZkzR4ZhKCQkJFVPg3QzvLzxxhv66aefdO7cOXuP1fHjxx3CVcof1be6evWqGjZsqK5du2rKlCn2+YcOHVJ8fLyaN2/u0D4xMTHVZYl3YhhGptqdOXNGr732mjZu3Kiz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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mCodeExecutor\u001b[0m (to CodeWriter):\n", + "\n", + "exitcode: 0 (execution succeeded)\n", + "Code output: \n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[33mCodeWriter\u001b[0m (to CodeExecutor):\n", + "\n", + "I see that the code has executed successfully, but unfortunately, the generated plot is not visible here. However, given that there are no errors, it's likely that the plot has been created as expected when you executed the code on your end.\n", + "\n", + "If you have any other questions related to this code or need further assistance with Python coding or data visualization, please let me know! I'm here to help.\n", + "\n", + "Otherwise, if this completes your initial request, I will end this task. Just let me know your decision.\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[33mCodeExecutor\u001b[0m (to CodeWriter):\n", + "\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[31m\n", + ">>>>>>>> USING AUTO REPLY...\u001b[0m\n", + "\u001b[33mCodeWriter\u001b[0m (to CodeExecutor):\n", + "\n", + "Alright. If you have any more questions regarding this task, or if you need help with other tasks in the future, don't hesitate to ask. Have a great day!\n", + "\n", + "'---TERMINATE---'\n", + "\n", + "--------------------------------------------------------------------------------\n" + ] + } + ], + "source": [ + "chat_result = code_executor_agent.initiate_chat(\n", + " code_writer_agent,\n", + " message=\"Create a plot showing the market caps of the top 7 publicly listed companies using data from Yahoo Finance.\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can see the plots are now displayed in the current notebook." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "autogen", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}