Пример #1
0
def test_make_df_validate():
    table = parser.HTMLTableParser(HTML, 1)
    columns = [
        parser.DataColumn(i, {0: RESULT1[0][i]}, parser.div_parser) for i in range(5)
    ]
    df = pd.DataFrame(DF_DATA[1:])
    assert df.equals(table.make_df(columns, 1))
Пример #2
0
 def _download(self, item: str, last_index: Optional[Any]) -> List[Dict[str, Any]]:
     url = f"https://www.dohod.ru/ik/analytics/dividend/{item.lower()}"
     with self._session.get(url) as respond:
         try:
             respond.raise_for_status()
         except requests.HTTPError:
             raise POptimizerError(f"Данные {url} не загружены")
         else:
             html = respond.text
     table = parser.HTMLTableParser(html, TABLE_INDEX)
     date_col = parser.DataColumn(
         DATE, 0, {0: "Дата закрытия реестра"}, parser.date_parser
     )
     div_col = parser.DataColumn(item, 2, {0: "Дивиденд (руб.)"}, parser.div_parser)
     columns = [date_col, div_col]
     data = table.get_formatted_data(columns, HEADER_SIZE)
     return sort_and_group(item, data)
Пример #3
0
def test_get_formatted_data():
    table = parser.HTMLTableParser(HTML, 1)
    columns = [
        parser.DataColumn(f"col_{i}", i, {}, lambda x: x) for i in range(5)
    ]
    df = pd.DataFrame(RESULT1)
    df.columns = [f"col_{i}" for i in range(5)]
    rez = df.to_dict("records")
    assert rez == table.get_formatted_data(columns)
Пример #4
0
def test_get_formatted_data_validate():
    table = parser.HTMLTableParser(HTML, 1)
    columns = [
        parser.DataColumn(f"col_{i}", i, {0: RESULT1[0][i]}, parser.div_parser)
        for i in range(5)
    ]
    df = pd.DataFrame(DF_DATA[1:])
    df.columns = [f"col_{i}" for i in range(5)]
    rez = df.to_dict("records")
    assert rez == table.get_formatted_data(columns, 1)
Пример #5
0
def test_get_formatted_data_with_parsed_data():
    table = parser.HTMLTableParser(HTML, 1)
    columns = [
        parser.DataColumn(f"col_{i}", i, {}, parser.div_parser)
        for i in range(5)
    ]
    df = pd.DataFrame(DF_DATA)
    df.columns = [f"col_{i}" for i in range(5)]
    rez = df.to_dict("records")
    assert rez == table.get_formatted_data(columns)
Пример #6
0
 def _download(self, item: str,
               last_index: Optional[Any]) -> List[Dict[str, Any]]:
     while True:
         try:
             html = asyncio.run(get_html(item))
         except asyncio.TimeoutError:
             continue
         else:
             break
     # noinspection PyUnboundLocalVariable
     table = parser.HTMLTableParser(html, TABLE_INDEX)
     date_column = parser.DataColumn(
         DATE,
         5,
         {
             1: "Дата закрытия реестра акционеров",
             2: "Под выплату дивидендов"
         },
         parser.date_parser,
     )
     columns = [date_column]
     common_column = parser.DataColumn(item, 7, {
         1: "Размер дивидендов",
         2: "АОИ"
     }, parser.div_parser)
     preferred_column = parser.DataColumn(item, 8, {
         1: "Размер дивидендов",
         2: "АПИ"
     }, parser.div_parser)
     if is_common(item):
         columns.append(common_column)
     else:
         columns.append(preferred_column)
     data = table.get_formatted_data(columns, HEADER_SIZE)
     data = [row for row in data if row[DATE] is not None]
     return dohod.sort_and_group(item, data)
Пример #7
0
# Параметры поиска страницы эмитента
SEARCH_URL = "https://www.conomy.ru/search"
SEARCH_FIELD = '//*[@id="issuer_search"]'

# Параметры поиска данных по дивидендам
DIVIDENDS_MENU = '//*[@id="page-wrapper"]/div/nav/ul/li[5]/a'
DIVIDENDS_TABLE = '//*[@id="page-container"]/div[2]/div/div[1]'

# Параметры парсинга таблицы с дивидендами
TABLE_INDEX = 1
HEADER_SIZE = 3

DATE_COLUMN = parser.DataColumn(
    5,
    {
        1: "Дата закрытия реестра акционеров",
        2: "Под выплату дивидендов"
    },
    parser.date_parser,
)

COMMON_TICKER_LENGTH = 4
COMMON_COLUMN = parser.DataColumn(7, {
    1: "Размер дивидендов",
    2: "АОИ"
}, parser.div_parser)
PREFERRED_TICKER_ENDING = "P"
PREFERRED_COLUMN = parser.DataColumn(8, {
    1: "Размер дивидендов",
    2: "АПИ"
}, parser.div_parser)
Пример #8
0
from typing import Union, Tuple

import aiohttp

from poptimizer.config import POptimizerError
from poptimizer.store import parser
from poptimizer.store.manager import AbstractManager
from poptimizer.store.utils import DATE

# Данные  хранятся в отдельной базе
CATEGORY_DOHOD = "dohod"

TABLE_INDEX = 2
HEADER_SIZE = 1

DATE_COLUMN = parser.DataColumn(0, {0: "Дата закрытия реестра"},
                                parser.date_parser)

DIVIDENDS_COLUMN = parser.DataColumn(2, {0: "Дивиденд (руб.)"},
                                     parser.div_parser)


class Dohod(AbstractManager):
    """Информация о дивидендам с https://dohod.ru

    Каждый раз обновляется с нуля.
    """

    CREATE_FROM_SCRATCH = True

    def __init__(self, ticker: Union[str, Tuple[str, ...]]):
        super().__init__(ticker, CATEGORY_DOHOD)
Пример #9
0
from poptimizer.store.utils import DATE, TICKER, DIVIDENDS

# Наименование данных в коллекции MISC
SMART_LAB = "smart-lab"

# Параметры парсинга сайта
URL = "https://smart-lab.ru/dividends/index/order_by_cut_off_date/asc/"
TABLE_INDEX = 0
HEADER_SIZE = 1
FOOTER_SIZE = 1

TICKER_COLUMN = parser.DataColumn(
    TICKER,
    1,
    {
        0: "Тикер",
        -1: "\n+добавить дивиденды\nИстория выплаченных дивидендов\n"
    },
    lambda x: x,
)

DATE_COLUMN = parser.DataColumn(
    DATE,
    9,
    {
        0: "дата отсечки",
        -1: "\n+добавить дивиденды\nИстория выплаченных дивидендов\n"
    },
    parser.date_parser,
)
Пример #10
0
def test_get_formatted_data_raise_validate():
    table = parser.HTMLTableParser(HTML, 1)
    columns = [parser.DataColumn("col", 1, {0: "2.2", 1: "test"}, lambda x: x)]
    with pytest.raises(POptimizerError) as error:
        table.get_formatted_data(columns)
        assert error.value == 'Значение в таблице "5.55 (сов)" - должно быть "test"'
Пример #11
0
def test_make_df():
    table = parser.HTMLTableParser(HTML, 1)
    columns = [parser.DataColumn(i, {}, lambda x: x) for i in range(5)]
    df = pd.DataFrame(RESULT1)
    assert df.equals(table.make_df(columns))
Пример #12
0
def test_make_df_fail_validate():
    table = parser.HTMLTableParser(HTML, 1)
    columns = [parser.DataColumn(1, {0: "2.2", 1: "test"}, lambda x: x)]
    with pytest.raises(POptimizerError) as error:
        table.make_df(columns)
        assert error.value == 'Значение в таблице "5.55 (сов)" - должно быть "test"'
Пример #13
0
def test_make_df_drop():
    table = parser.HTMLTableParser(HTML, 1)
    columns = [parser.DataColumn(i, {}, parser.div_parser) for i in range(5)]
    df = pd.DataFrame(DF_DATA[1:2])
    assert df.equals(table.make_df(columns, 1, 1))
Пример #14
0
def test_make_df_with_parsed_data():
    table = parser.HTMLTableParser(HTML, 1)
    columns = [parser.DataColumn(i, {}, parser.div_parser) for i in range(5)]
    df = pd.DataFrame(DF_DATA)
    assert df.equals(table.make_df(columns))