Source code for langchain_community.utilities.google_trends
"""Util that calls Google Scholar Search."""fromtypingimportAny,Dict,Optional,castfromlangchain_core.pydantic_v1importBaseModel,SecretStr,root_validatorfromlangchain_core.utilsimportconvert_to_secret_str,get_from_dict_or_env
[docs]classGoogleTrendsAPIWrapper(BaseModel):"""Wrapper for SerpApi's Google Scholar API You can create SerpApi.com key by signing up at: https://serpapi.com/users/sign_up. The wrapper uses the SerpApi.com python package: https://serpapi.com/integrations/python To use, you should have the environment variable ``SERPAPI_API_KEY`` set with your API key, or pass `serp_api_key` as a named parameter to the constructor. Example: .. code-block:: python from langchain_community.utilities import GoogleTrendsAPIWrapper google_trends = GoogleTrendsAPIWrapper() google_trends.run('langchain') """serp_search_engine:Anyserp_api_key:Optional[SecretStr]=NoneclassConfig:extra="forbid"@root_validator(pre=True)defvalidate_environment(cls,values:Dict)->Dict:"""Validate that api key and python package exists in environment."""values["serp_api_key"]=convert_to_secret_str(get_from_dict_or_env(values,"serp_api_key","SERPAPI_API_KEY"))try:fromserpapiimportSerpApiClientexceptImportError:raiseImportError("google-search-results is not installed. ""Please install it with `pip install google-search-results"">=2.4.2`")serp_search_engine=SerpApiClientvalues["serp_search_engine"]=serp_search_enginereturnvalues
[docs]defrun(self,query:str)->str:"""Run query through Google Trends with Serpapi"""serpapi_api_key=cast(SecretStr,self.serp_api_key)params={"engine":"google_trends","api_key":serpapi_api_key.get_secret_value(),"q":query,}total_results=[]client=self.serp_search_engine(params)client_dict=client.get_dict()total_results=(client_dict["interest_over_time"]["timeline_data"]if"interest_over_time"inclient_dictelseNone)ifnottotal_results:return"No good Trend Result was found"start_date=total_results[0]["date"].split()end_date=total_results[-1]["date"].split()values=[results.get("values")[0].get("extracted_value")forresultsintotal_results]min_value=min(values)max_value=max(values)avg_value=sum(values)/len(values)percentage_change=((values[-1]-values[0])/(values[0]ifvalues[0]!=0else1)*(100ifvalues[0]!=0else1))params={"engine":"google_trends","api_key":serpapi_api_key.get_secret_value(),"data_type":"RELATED_QUERIES","q":query,}total_results2={}client=self.serp_search_engine(params)total_results2=client.get_dict().get("related_queries",{})rising=[]top=[]rising=[results.get("query")forresultsintotal_results2.get("rising",[])]top=[results.get("query")forresultsintotal_results2.get("top",[])]doc=[f"Query: {query}\n"f"Date From: {start_date[0]}{start_date[1]}, {start_date[-1]}\n"f"Date To: {end_date[0]}{end_date[3]}{end_date[-1]}\n"f"Min Value: {min_value}\n"f"Max Value: {max_value}\n"f"Average Value: {avg_value}\n"f"Percent Change: {str(percentage_change)+'%'}\n"f"Trend values: {', '.join([str(x)forxinvalues])}\n"f"Rising Related Queries: {', '.join(rising)}\n"f"Top Related Queries: {', '.join(top)}"]return"\n\n".join(doc)