def new_dividends(tickers: tuple[str, ...]) -> set[str]: """Список тикеров с новой информацией о дивидендах. По российским акция используется информация о предстоящих дивидендах со SmartLab, а по иностранным с MOEX. Выбираются только тикеры из предоставленного списка. :param tickers: Тикеры, для которых нужно проверить актуальность данных. :return: Список новых тикеров. """ status = set() for ticker, date, div_value in _new_div_all().itertuples(): if ticker not in tickers: continue df = div.dividends(ticker) if not _check_div_in_df(ticker, date, div_value, df): status.add(ticker) if status: print("\nДАННЫЕ ПО ДИВИДЕНДАМ ТРЕБУЮТ ОБНОВЛЕНИЯ\n") # noqa: WPS421 print(", ".join(status)) # noqa: WPS421 return status
def dividends_validation(ticker: str) -> pd.DataFrame: """Проверяет корректности данных о дивидендах для тикера. Запускает принудительное обновление, сравнивает основные данные по дивидендам с альтернативными источниками и распечатывает результаты. """ bootstrap.BUS.handle_event(events.UpdateDivCommand(ticker)) df_local = div.dividends(ticker) df_local.columns = ["LOCAL"] div_ex = div.div_ext(ticker) df_comp = _compare(div_ex.iloc[:, -1:], df_local) df_comp = pd.concat( [div_ex.iloc[:, :-1], df_comp], axis=1, ) first_quote = not_div.quotes((ticker, ))[0].index[0] df_comp = df_comp.loc[first_quote:] comp_str = f"\nСравнение интернет источников с локальными данными - {ticker}\n\n{df_comp}" LOGGER.info(comp_str) # noqa: WPS421 return df_comp
def test_dividends(ticker, div_data): """Проверка, что первые дивиденды после даты обрезки.""" df = div.dividends(ticker) assert isinstance(df, pd.DataFrame) assert df.index.is_monotonic_increasing assert df.index[0] >= bootstrap.START_DATE assert df.columns.tolist() == [ticker] date, div_value = div_data assert df.loc[date, ticker] == div_value