Skip to content

Commit 8de6e66

Browse files
authored
V0.0.18.0 mergers and acquisitions (#27)
* update pre-commit * update version * added mergers and aquisitions and tests
1 parent 9d63c6a commit 8de6e66

File tree

4 files changed

+217
-4
lines changed

4 files changed

+217
-4
lines changed

poetry.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "fmp-py"
3-
version = "0.0.17.0"
3+
version = "0.0.18.0"
44
description = "Python package for Financial Modeling Prep API"
55
authors = ["TexasCoding <[email protected]>"]
66
readme = "README.md"
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import pandas as pd
2+
from fmp_py.fmp_base import FmpBase
3+
import os
4+
from dotenv import load_dotenv
5+
6+
load_dotenv()
7+
8+
9+
"""
10+
The FmpMergersAndAquisitions class provides methods for retrieving mergers and acquisitions data from the Financial Modeling Prep API.
11+
Refer to the official documentation (https://site.financialmodelingprep.com/developer/docs#mergers-&-acquisitions) for more information.
12+
13+
def ma_rss_feed(self, page: int = 0) -> pd.DataFrame:
14+
Reference: https://site.financialmodelingprep.com/developer/docs#m&a-rss-feed-mergers-&-acquisitions
15+
16+
def search_ma(self, query: str) -> pd.DataFrame:
17+
Reference: https://site.financialmodelingprep.com/developer/docs#search-m&a-mergers-&-acquisitions
18+
"""
19+
20+
21+
class FmpMergersAndAquisitions(FmpBase):
22+
def __init__(self, api_key: str = os.getenv("FMP_API_KEY")) -> None:
23+
super().__init__(api_key)
24+
25+
#####################################
26+
# Mergers and Acquisitions Search
27+
#####################################
28+
def search_ma(self, name: str) -> pd.DataFrame:
29+
"""
30+
Retrieves mergers and acquisitions data based on a search name.
31+
32+
Args:
33+
name (str): The search name of company.
34+
35+
Returns:
36+
pd.DataFrame: A DataFrame containing the mergers and acquisitions data.
37+
"""
38+
url = "v4/mergers-acquisitions/search"
39+
params = {"name": name}
40+
response = self.get_request(url, params)
41+
42+
if not response:
43+
raise ValueError("No data found for the specified parameters.")
44+
45+
data_df = (
46+
pd.DataFrame(response)
47+
.fillna("")
48+
.rename(
49+
columns={
50+
"companyName": "company_name",
51+
"symbol": "symbol",
52+
"targetedCompanyName": "targeted_company_name",
53+
"targetedCik": "targeted_cik",
54+
"targetedSymbol": "targeted_symbol",
55+
"transactionDate": "transaction_date",
56+
"acceptanceTime": "acceptance_time",
57+
"url": "url",
58+
}
59+
)
60+
.astype(
61+
{
62+
"company_name": "str",
63+
"symbol": "str",
64+
"targeted_company_name": "str",
65+
"targeted_cik": "str",
66+
"targeted_symbol": "str",
67+
"transaction_date": "datetime64[ns]",
68+
"acceptance_time": "datetime64[ns]",
69+
"url": "str",
70+
}
71+
)
72+
)
73+
return data_df
74+
75+
#####################################
76+
# Mergers and Acquisitions RSS Feed
77+
#####################################
78+
def ma_rss_feed(self, page: int = 0) -> pd.DataFrame:
79+
"""
80+
Retrieves mergers and acquisitions data from the RSS feed.
81+
82+
Args:
83+
page (int): The page number for the RSS feed.
84+
85+
Returns:
86+
pd.DataFrame: A DataFrame containing the mergers and acquisitions data.
87+
"""
88+
url = "v4/mergers-acquisitions-rss-feed"
89+
params = {"page": page}
90+
response = self.get_request(url, params)
91+
92+
if not response:
93+
raise ValueError("No data found for the specified parameters.")
94+
95+
data_df = (
96+
pd.DataFrame(response)
97+
.fillna("")
98+
.rename(
99+
columns={
100+
"companyName": "company_name",
101+
"symbol": "symbol",
102+
"targetedCompanyName": "targeted_company_name",
103+
"targetedCik": "targeted_cik",
104+
"targetedSymbol": "targeted_symbol",
105+
"transactionDate": "transaction_date",
106+
"acceptanceTime": "acceptance_time",
107+
"url": "url",
108+
}
109+
)
110+
.astype(
111+
{
112+
"company_name": "str",
113+
"symbol": "str",
114+
"targeted_company_name": "str",
115+
"targeted_cik": "str",
116+
"targeted_symbol": "str",
117+
"transaction_date": "datetime64[ns]",
118+
"acceptance_time": "datetime64[ns]",
119+
"url": "str",
120+
}
121+
)
122+
)
123+
return data_df
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import pytest
2+
import pandas as pd
3+
4+
from fmp_py.fmp_mergers_and_aquisitions import FmpMergersAndAquisitions
5+
6+
7+
@pytest.fixture
8+
def fmp_mergers_and_aquisitions():
9+
return FmpMergersAndAquisitions()
10+
11+
12+
def test_fmp_mergers_and_aquisitions_init(fmp_mergers_and_aquisitions):
13+
assert isinstance(fmp_mergers_and_aquisitions, FmpMergersAndAquisitions)
14+
15+
16+
def test_fmp_mergers_and_aquisitions_ma_rss_feed(fmp_mergers_and_aquisitions):
17+
result = fmp_mergers_and_aquisitions.ma_rss_feed()
18+
assert isinstance(result, pd.DataFrame)
19+
assert not result.empty
20+
assert result.columns.tolist() == [
21+
"company_name",
22+
"cik",
23+
"symbol",
24+
"targeted_company_name",
25+
"targeted_cik",
26+
"targeted_symbol",
27+
"transaction_date",
28+
"acceptance_time",
29+
"url",
30+
]
31+
assert isinstance(result["company_name"].iloc[0], str)
32+
assert isinstance(result["cik"].iloc[0], str)
33+
assert isinstance(result["symbol"].iloc[0], str)
34+
assert isinstance(result["targeted_company_name"].iloc[0], str)
35+
assert isinstance(result["targeted_cik"].iloc[0], str)
36+
assert isinstance(result["targeted_symbol"].iloc[0], str)
37+
assert isinstance(result["transaction_date"].iloc[0], pd.Timestamp)
38+
assert isinstance(result["acceptance_time"].iloc[0], pd.Timestamp)
39+
assert isinstance(result["url"].iloc[0], str)
40+
41+
42+
def test_fmp_mergers_and_aquisitions_ma_rss_feed_by_page(fmp_mergers_and_aquisitions):
43+
result = fmp_mergers_and_aquisitions.ma_rss_feed(page=1)
44+
assert isinstance(result, pd.DataFrame)
45+
assert not result.empty
46+
assert result.columns.tolist() == [
47+
"company_name",
48+
"cik",
49+
"symbol",
50+
"targeted_company_name",
51+
"targeted_cik",
52+
"targeted_symbol",
53+
"transaction_date",
54+
"acceptance_time",
55+
"url",
56+
]
57+
assert isinstance(result["company_name"].iloc[0], str)
58+
assert isinstance(result["cik"].iloc[0], str)
59+
assert isinstance(result["symbol"].iloc[0], str)
60+
assert isinstance(result["targeted_company_name"].iloc[0], str)
61+
assert isinstance(result["targeted_cik"].iloc[0], str)
62+
assert isinstance(result["targeted_symbol"].iloc[0], str)
63+
assert isinstance(result["transaction_date"].iloc[0], pd.Timestamp)
64+
assert isinstance(result["acceptance_time"].iloc[0], pd.Timestamp)
65+
assert isinstance(result["url"].iloc[0], str)
66+
67+
68+
def test_fmp_mergers_and_aquisitions_search_ma(fmp_mergers_and_aquisitions):
69+
result = fmp_mergers_and_aquisitions.search_ma(name="test")
70+
assert isinstance(result, pd.DataFrame)
71+
assert not result.empty
72+
assert result.columns.tolist() == [
73+
"company_name",
74+
"cik",
75+
"symbol",
76+
"targeted_company_name",
77+
"targeted_cik",
78+
"targeted_symbol",
79+
"transaction_date",
80+
"acceptance_time",
81+
"url",
82+
]
83+
assert isinstance(result["company_name"].iloc[0], str)
84+
assert isinstance(result["symbol"].iloc[0], str)
85+
assert isinstance(result["targeted_company_name"].iloc[0], str)
86+
assert isinstance(result["targeted_cik"].iloc[0], str)
87+
assert isinstance(result["targeted_symbol"].iloc[0], str)
88+
assert isinstance(result["transaction_date"].iloc[0], pd.Timestamp)
89+
assert isinstance(result["acceptance_time"].iloc[0], pd.Timestamp)
90+
assert isinstance(result["url"].iloc[0], str)

0 commit comments

Comments
 (0)