Exemplo n.º 1
0
    def get_form_headers(
        self,
        form_type: Optional[Union[str, List[str]]] = None,
        cik: Optional[peconf.CIK_TYPE] = None,
        start_datetime: Optional[str] = None,
        end_datetime: Optional[str] = None,
        date_mode: Optional[str] = None,
        output_type: Optional[str] = "dataframes",
    ) -> Union[List[peconf.SERVER_RESPONSE_TYPE], pd.DataFrame]:
        """
        Get form headers metadata with the following parameters.

        :param form_type: Form type or list of form types.
            Example: form_type=['13F-HR', '4']
        :param cik: Central Index Key as integer. It could be a list of P1_CIK
            or just one identifier. None means all CIKs.
        :param start_datetime: Get data where filing date is >= start_date. Date
            format is "YYYY-MM-DDTHH-MI-SS". None means the entire available date range.
        :param end_datetime: Get data where filing date is <= end_date. Date format
            is "YYYY-MM-DDTHH-MI-SS". None means the entire available date range.
        :param date_mode: Define whether dates are
            interpreted as publication dates or knowledge dates
        :param output_type: Output format: 'dict' or 'dataframes'.
        """
        peutil.check_date_mode(start_datetime, end_datetime, date_mode)
        peutil.check_form_type(form_type, self.form_types)
        cik = peutil.check_sorted_unique_param("cik", cik)
        params: Dict[str, Any] = {}
        params = self._set_optional_params(
            params,
            form_type=form_type,
            start_datetime=start_datetime,
            end_datetime=end_datetime,
            date_mode=date_mode,
            cik=cik,
        )
        url = f'{self.base_url}{self._api_routes["HEADERS"]}'
        result: Union[List[peconf.SERVER_RESPONSE_TYPE], pd.DataFrame] = []
        for data in self._payload_form_cik_cusip_generator(
            method="GET", url=url, headers=self.headers, params=params
        ):
            result += data
        if output_type == "dataframes":
            try:
                result = pd.DataFrame(result)
            except (KeyError, json.JSONDecodeError) as e:
                raise pexcep.ParseResponseException(
                    "Can't transform server response to a Pandas Dataframe"
                ) from e
        else:
            phdbg.dfatal(f"Output type {output_type} is not valid.")
        return result
Exemplo n.º 2
0
    def get_form8_payload(
        self,
        cik: Optional[peconf.CIK_TYPE] = None,
        start_datetime: Optional[str] = None,
        end_datetime: Optional[str] = None,
        date_mode: Optional[str] = None,
        item: Optional[str] = None,
    ) -> pd.DataFrame:
        """
        Get payload data for a form 8 and a company.

        :param cik: Central Index Key as integer. It could be a list of P1_CIK
            or just one identifier. None means all CIKs.
        :param start_datetime: Get data where filing date is >= start_date. Date
            format is "YYYY-MM-DDTHH-MI-SS". None means the entire available date range.
        :param end_datetime: Get data where filing date is <= end_date. Date format
            is "YYYY-MM-DDTHH-MI-SS". None means the entire available date range.
        :param date_mode: Define whether dates are
            interpreted as publication dates or knowledge dates
        :param item: Item to retrieve. None means all items.
        :return: Pandas dataframe with payload data.
        """
        peutil.check_date_mode(start_datetime, end_datetime, date_mode)
        cik = peutil.check_sorted_unique_param("cik", cik)
        form_name = "form8"
        params: Dict[str, Any] = {}
        params = self._set_optional_params(
            params,
            start_datetime=start_datetime,
            end_datetime=end_datetime,
            item=item,
            cik=cik,
            date_mode=date_mode,
        )
        url = f'{self.base_url}{self._api_routes["PAYLOAD"]}' f"/{form_name}"
        payload_dataframe = pd.DataFrame()
        for df in self._payload_form_cik_cusip_generator(
            method="GET", url=url, headers=self.headers, params=params
        ):
            payload_dataframe = payload_dataframe.append(df, ignore_index=True)
        if (
            not payload_dataframe.empty
            and {
                "filing_date",
                "cik",
                "item_name",
            }.issubset(payload_dataframe.columns)
        ):
            payload_dataframe = payload_dataframe.sort_values(
                ["filing_date", "cik", "item_name"]
            )
        return payload_dataframe.reset_index(drop=True)
Exemplo n.º 3
0
    def get_form10_payload(
        self,
        cik: Optional[peconf.CIK_TYPE] = None,
        start_datetime: Optional[str] = None,
        end_datetime: Optional[str] = None,
        date_mode: Optional[str] = None,
    ) -> List[peconf.SERVER_RESPONSE_TYPE]:
        """
        Get payload data for a form10, and a company.

        :param cik: Central Index Key as integer. Could be list of P1_CIK or
            just one identifier.
        :param start_datetime: Get data where filing date is >= start_date. Date
            format is "YYYY-MM-DDTHH-MI-SS". None means the entire available date range.
        :param end_datetime: Get data where filing date is <= end_date. Date format
            is "YYYY-MM-DDTHH-MI-SS". None means the entire available date range.
        :param date_mode: Define whether dates are
            interpreted as publication dates or knowledge dates
        :return: List with payload data.
        """
        peutil.check_date_mode(start_datetime, end_datetime, date_mode)
        cik = peutil.check_sorted_unique_param("cik", cik)
        form_name = "form10"
        params: Dict[str, Any] = {}
        params = self._set_optional_params(
            params, start_datetime=start_datetime, end_datetime=end_datetime,
            date_mode=date_mode
        )
        url = f'{self.base_url}{self._api_routes["PAYLOAD"]}/{form_name}'
        cik_list: List[Union[int, None]] = [None]
        compound_data = []
        if cik is not None:
            cik_list = [cik] if isinstance(cik, int) else cik
        self.spinner.start()
        with peutil.spinner_exception_handling(self.spinner):
            for current_cik in tauto.tqdm(cik_list, desc="Processing CIK: "):
                self._set_optional_params(params, cik=current_cik)
                response = self._make_request(
                    "GET", url, headers=self.headers, params=params
                )
                self.spinner.stop()
                data = response.json()["data"]
                _LOG.info("%s: %s forms loaded",
                          current_cik or "Total",
                          len(data))
                compound_data += response.json()["data"]
        return compound_data
Exemplo n.º 4
0
 def get_form4_payload(
     self,
     cik: Optional[peconf.CIK_TYPE] = None,
     start_datetime: Optional[str] = None,
     end_datetime: Optional[str] = None,
     date_mode: Optional[str] = None,
     output_type: str = "dataframes",
 ) -> Dict[str, List[peconf.SERVER_RESPONSE_TYPE]]:
     peutil.check_date_mode(start_datetime, end_datetime, date_mode)
     cik = peutil.check_sorted_unique_param("cik", cik)
     form_type = "form4"
     result = self._get_form4_13_payload(
         form_type,
         cik=cik,
         start_datetime=start_datetime,
         end_datetime=end_datetime,
         date_mode=date_mode,
         output_type=output_type,
     )
     return result