| 
									
										
										
										
											2024-09-04 19:51:07 +08:00
										 |  |  | # | 
					
						
							|  |  |  | #  Copyright 2024 The InfiniFlow Authors. All Rights Reserved. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  | #  you may not use this file except in compliance with the License. | 
					
						
							|  |  |  | #  You may obtain a copy of the License at | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  | #  distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  | #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | #  See the License for the specific language governing permissions and | 
					
						
							|  |  |  | #  limitations under the License. | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-11-14 17:13:48 +08:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2024-09-04 19:51:07 +08:00
										 |  |  | from abc import ABC | 
					
						
							|  |  |  | import pandas as pd | 
					
						
							|  |  |  | from agent.component.base import ComponentBase, ComponentParamBase | 
					
						
							|  |  |  | import yfinance as yf | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class YahooFinanceParam(ComponentParamBase): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Define the YahooFinance component parameters. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self): | 
					
						
							|  |  |  |         super().__init__() | 
					
						
							|  |  |  |         self.info = True | 
					
						
							|  |  |  |         self.history = False | 
					
						
							|  |  |  |         self.count = False | 
					
						
							|  |  |  |         self.financials = False | 
					
						
							|  |  |  |         self.income_stmt = False | 
					
						
							|  |  |  |         self.balance_sheet = False | 
					
						
							|  |  |  |         self.cash_flow_statement = False | 
					
						
							|  |  |  |         self.news = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def check(self): | 
					
						
							|  |  |  |         self.check_boolean(self.info, "get all stock info") | 
					
						
							|  |  |  |         self.check_boolean(self.history, "get historical market data") | 
					
						
							|  |  |  |         self.check_boolean(self.count, "show share count") | 
					
						
							|  |  |  |         self.check_boolean(self.financials, "show financials") | 
					
						
							|  |  |  |         self.check_boolean(self.income_stmt, "income statement") | 
					
						
							|  |  |  |         self.check_boolean(self.balance_sheet, "balance sheet") | 
					
						
							|  |  |  |         self.check_boolean(self.cash_flow_statement, "cash flow statement") | 
					
						
							|  |  |  |         self.check_boolean(self.news, "show news") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class YahooFinance(ComponentBase, ABC): | 
					
						
							|  |  |  |     component_name = "YahooFinance" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _run(self, history, **kwargs): | 
					
						
							|  |  |  |         ans = self.get_input() | 
					
						
							|  |  |  |         ans = "".join(ans["content"]) if "content" in ans else "" | 
					
						
							|  |  |  |         if not ans: | 
					
						
							|  |  |  |             return YahooFinance.be_output("") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         yohoo_res = [] | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             msft = yf.Ticker(ans) | 
					
						
							|  |  |  |             if self._param.info: | 
					
						
							|  |  |  |                 yohoo_res.append({"content": "info:\n" + pd.Series(msft.info).to_markdown() + "\n"}) | 
					
						
							|  |  |  |             if self._param.history: | 
					
						
							|  |  |  |                 yohoo_res.append({"content": "history:\n" + msft.history().to_markdown() + "\n"}) | 
					
						
							|  |  |  |             if self._param.financials: | 
					
						
							| 
									
										
										
										
											2024-09-12 19:00:35 +08:00
										 |  |  |                 yohoo_res.append({"content": "calendar:\n" + pd.DataFrame(msft.calendar).to_markdown() + "\n"}) | 
					
						
							| 
									
										
										
										
											2024-09-04 19:51:07 +08:00
										 |  |  |             if self._param.balance_sheet: | 
					
						
							|  |  |  |                 yohoo_res.append({"content": "balance sheet:\n" + msft.balance_sheet.to_markdown() + "\n"}) | 
					
						
							|  |  |  |                 yohoo_res.append( | 
					
						
							|  |  |  |                     {"content": "quarterly balance sheet:\n" + msft.quarterly_balance_sheet.to_markdown() + "\n"}) | 
					
						
							|  |  |  |             if self._param.cash_flow_statement: | 
					
						
							|  |  |  |                 yohoo_res.append({"content": "cash flow statement:\n" + msft.cashflow.to_markdown() + "\n"}) | 
					
						
							|  |  |  |                 yohoo_res.append( | 
					
						
							|  |  |  |                     {"content": "quarterly cash flow statement:\n" + msft.quarterly_cashflow.to_markdown() + "\n"}) | 
					
						
							|  |  |  |             if self._param.news: | 
					
						
							|  |  |  |                 yohoo_res.append({"content": "news:\n" + pd.DataFrame(msft.news).to_markdown() + "\n"}) | 
					
						
							| 
									
										
										
										
											2024-11-12 17:35:13 +08:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2024-11-14 17:13:48 +08:00
										 |  |  |             logging.exception("YahooFinance got exception") | 
					
						
							| 
									
										
										
										
											2024-09-04 19:51:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if not yohoo_res: | 
					
						
							|  |  |  |             return YahooFinance.be_output("") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return pd.DataFrame(yohoo_res) |