def test_unsupported_mode(self): with self.assertRaisesRegex(ValueError, "not in supported API modes"): GdeltDoc().timeline_search( "unsupported", Filters(keyword="environment", start_date=self.start_date, end_date=self.end_date))
def get_data_gdelt(quotation: str, keywords: list, start_date: str, end_date: str, interval="1d", num_records=250, repeats=3) -> pd.DataFrame: """ Взять данные с gdelt params: quotation - имя ценной бумаги keywords - из графа знаний по ключевому слову start_date, end_date - интервал, формат "год-месяц-день" (опционально) interval - периодичность, формат "(номер)(первая буква слова (d, m, y))" (не реализована) (опционально) num_records - сколько максимум записей взять за промежуток (не реализовано) (опционально) repeats - сколько раз должно повториться ключевое слово в статье returns: DataFrame формата "Datetime (индекс), Ticker, [Average_Tone, Article_Count, Volume_Intensity]_[std, mean, sum, min, max] """ # Колонки в полученных DataFrames col_names = ['Average_Tone', 'Article_Count', 'Volume_Intensity'] # Что будем искать для данных ключевых слов # Тон статей, их количество и их кол-во в отношении ко всем остальным на gdelt match_list = ["timelinetone", "timelinevolraw", "timelinevol"] match_dict = dict(zip(match_list, col_names)) df_res = None for keyword in keywords: try: gd_filter = Filters(start_date=start_date, end_date=end_date, keyword=keyword) for feature_name in match_list: gd = GdeltDoc() timeline_data = gd.timeline_search(feature_name, gd_filter) time.sleep(5) timeline_data = timeline_data.fillna(0) timeline_data = timeline_data.groupby( pd.Grouper(key="datetime", freq=interval.upper())) if feature_name in ['timelinetone']: timeline_data = timeline_data.mean() else: timeline_data = timeline_data.sum() if df_res is None: # Выровняем индексы, чтобы при копировании не выдавалось NaN df_res = pd.DataFrame(index=timeline_data.index) col_name = match_dict[feature_name] df_res[f"{keyword}_{feature_name}_{col_name}"] = timeline_data[ col_name.replace('_', ' ')].values except Exception as e: print(f'invalid keyword: {keyword}') return df_res
def test_multiple_themes(self): f = Filters(theme=["ENV_CLIMATECHANGE", "LEADER"], start_date="2020-05-13", end_date="2020-05-14") self.assertEqual( f.query_string, '(theme:ENV_CLIMATECHANGE OR theme:LEADER)&startdatetime=20200513000000&' 'enddatetime=20200514000000&maxrecords=250')
def test_multiple_keywords(self): f = Filters(keyword=["airline", "climate"], start_date="2020-05-13", end_date="2020-05-14") self.assertEqual( f.query_string, '(airline OR climate)&startdatetime=20200513000000&' 'enddatetime=20200514000000&maxrecords=250')
def test_single_keyphrase_filter(self): f = Filters(keyword="climate change", start_date="2020-03-01", end_date="2020-03-02") self.assertEqual( f.query_string, '"climate change"&startdatetime=20200301000000&enddatetime=20200302000000&maxrecords=250' )
def test_theme_and_keyword(self): f = Filters(keyword="airline", theme="ENV_CLIMATECHANGE", start_date="2020-05-13", end_date="2020-05-14") self.assertEqual( f.query_string, '"airline"theme:ENV_CLIMATECHANGE&startdatetime=20200513000000&' 'enddatetime=20200514000000&maxrecords=250')
def setUp(self): self.start_date = (datetime.today() - timedelta(days=7)).strftime("%Y-%m-%d") self.end_date = (datetime.today() - timedelta(days=6)).strftime("%Y-%m-%d") f = Filters(keyword="environment", start_date=self.start_date, end_date=self.end_date) self.articles = GdeltDoc().article_search(f)
def test_multiple_repeats(self): f = Filters( keyword="airline", repeat=multi_repeat([(3, "plane"), (2, "airport")], "OR"), start_date="2020-05-13", end_date="2020-05-14", ) self.assertEqual( f.query_string, '"airline"repeat3:"plane"ORrepeat2:"airport"&startdatetime=20200513000000&enddatetime=20200514000000&maxrecords=250', )
def setUpClass(cls): cls.start_date = (datetime.today() - timedelta(days=7)).strftime("%Y-%m-%d") cls.end_date = (datetime.today() - timedelta(days=6)).strftime("%Y-%m-%d") f = Filters(keyword="environment", start_date=cls.start_date, end_date=cls.end_date) gd = GdeltDoc() cls.all_results = [ gd.timeline_search(mode, f) for mode in [ "timelinevol", "timelinevolraw", "timelinelang", "timelinetone", "timelinesourcecountry" ] ]
def get_data_gdelt(quotation: str, keywords: list, start_date: str, end_date: str, interval="1d", num_records=250, repeats=3) -> pd.DataFrame: """ Взять данные с gdelt params: quotation - имя ценной бумаги keywords - из графа знаний по ключевому слову start_date, end_date - интервал, формат "год-месяц-день" (опционально) interval - периодичность, формат "(номер)(первая буква слова (d, m, y))" (не реализована) (опционально) num_records - сколько максимум записей взять за промежуток (не реализовано) (опционально) repeats - сколько раз должно повториться ключевое слово в статье returns: DataFrame формата "Datetime (индекс), Ticker, [Average_Tone, Article_Count, Volume_Intensity]_[std, mean, sum, min, max] """ df_res = None df_dub = pd.DataFrame() # Как называются колонки в полученных DataFrames col_names = ['Average_Tone', 'Article_Count', 'Volume_Intensity'] # Что будем искать для данных ключевых слов # Тон статей, их количество и их кол-во в отношении ко всем остальным match_list = ["timelinetone", "timelinevolraw", "timelinevol"] match_dict = dict(zip(match_list, col_names)) for ft in keywords: try: f = Filters(start_date=start_date, end_date=end_date, keyword=ft) for timeline in match_list: gd = GdeltDoc() timeline_data = gd.timeline_search(timeline, f) import time time.sleep(5) timeline_data = timeline_data.fillna(0) timeline_data = timeline_data.groupby( pd.Grouper(key="datetime", freq=interval.upper())) if timeline in ['timelinetone']: timeline_data = timeline_data.mean() else: timeline_data = timeline_data.sum() # Собираем все фичи в один датафрейм, далее их разделим col_name = match_dict[timeline] df_dub[f"{ft}_{timeline}_{col_name}"] = timeline_data[ col_name.replace('_', ' ')].values # Так как мы копируем только колонки, то надо один раз откопировать дату в итог if df_res is None: # Так же выровняем индексы, чтобы при копировании не выдавалось NaN df_res = pd.DataFrame(index=timeline_data.index) df_dub.index = timeline_data.index print('TICKER:', quotation, 'KEY:', ft) except Exception as e: print('ERROR!', e, 'TICKER:', quotation, 'KEY:', ft) # Нужно создать колонки со средним, средним отклонением, минимумом и максимумом для каждой фичи # Сначала сформируем список датафреймов, которые нам нужно достать для каждой колонки for pattern in col_names: pattern_list = list() for col in df_dub.columns: if pattern in col: pattern_list.append(col) # Теперь для pattern у нас есть список # Посчитаем для неё std, mean, min, max, sum df_res[f'{pattern}_min'] = df_dub[pattern_list].min(axis=1, skipna=True) df_res[f'{pattern}_max'] = df_dub[pattern_list].max(axis=1, skipna=True) df_res[f'{pattern}_mean'] = df_dub[pattern_list].mean(axis=1, skipna=True) df_res[f'{pattern}_std'] = df_dub[pattern_list].std(axis=1, skipna=True) df_res[f'{pattern}_sum'] = df_dub[pattern_list].sum(axis=1, skipna=True) # Добавим название ценной бумаги в таблицу df_res.loc[:, 'Ticker'] = quotation return df_res
def test_timespan(self): f = Filters(keyword="airline", timespan="FULL") self.assertEqual(f.query_string, '"airline"×pan=FULL&maxrecords=250')