Esempio n. 1
0
 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))
Esempio n. 2
0
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
Esempio n. 3
0
 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')
Esempio n. 4
0
 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')
Esempio n. 5
0
 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'
     )
Esempio n. 6
0
 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')
Esempio n. 7
0
    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)
Esempio n. 8
0
 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',
     )
Esempio n. 9
0
    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"
            ]
        ]
Esempio n. 10
0
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
Esempio n. 11
0
 def test_timespan(self):
     f = Filters(keyword="airline", timespan="FULL")
     self.assertEqual(f.query_string,
                      '"airline"&timespan=FULL&maxrecords=250')