只在一年的最后一天带着Pandas回来?

2024-09-27 21:32:36 发布

您现在位置:Python中文网/ 问答频道 /正文

从financialmodelingprep api获取指定公司股票的历史收盘价的api get请求。它返回股票的每个记录日期。问题是,我只需要过去5年的最后一个日期,以便与财务报表进行比较。 有人知道如何过滤数据集以获取一年中的最后一个日期,而不指定确切的日期吗?目标是将表格导出为csv格式,并进一步与其他公司合并

有没有更好的方法来获得我需要的结果

symbols = ["MMM",
           "ABT",
           "ABBV",
           "ABMD",
           "ACN",
           ]
import requests
import pandas as pd
import datetime

API_KEY = 'my_key'
api_stock_price_url =  "https://financialmodelingprep.com/api/v3/historical-price-full/" + symbols[0] + "?serietype=line&apikey=" + API_KEY
company_stock_price = pd.read_json(api_stock_price_url)
date_and_close = pd.json_normalize(company_stock_price["historical"])
company_stock_price["date"] = date_and_close["date"]
company_stock_price["close"] = date_and_close["close"]

company_stock_price.index = [company_stock_price["date"]]
# CHANGES THE INDEX TO BE THE NORMALIZED DATE
company_stock_price["date"] = pd.to_datetime(company_stock_price["date"])
# CHANGES THE FORMAT TO DATE

del company_stock_price['historical']
del company_stock_price['date']
# deletes the unwanted columns

返回的公司股票价格

    symbol  close
date        
2020-12-04  MMM 172.460007
2020-12-03  MMM 171.830002
2020-12-02  MMM 171.850006
2020-12-01  MMM 170.520004
2020-11-30  MMM 172.729996
... ... ...
1970-09-14  MMM 0.322600
1970-09-11  MMM 0.321700
1970-09-10  MMM 0.323500
1970-09-09  MMM 0.324000
1970-09-08  MMM 0.318800
12675 rows × 2 columns

我需要的理想输出如下所示:

    symbol  close
date        
2020-12-31  MMM 172.460007
2019-12-31  MMM 131.112123
2018-12-31  MMM 123.123123
2017-12-31  MMM 111.111111
2016-11-31  MMM 101.111111

这件事的问题是,我无法具体说明确切的日期,因为一些s&;p500家公司(我将对其进行循环)在返回的api响应中缺少该日期的股价


Tags: andtheimportapiclosedatestock公司
3条回答
df2 = df.groupby(pd.DatetimeIndex(df['date']).year, 
    as_index=False).agg({'date': max}).reset_index(drop=True)

        date symbol       close
0 1970-09-14    MMM    0.322600
1 2020-12-04    MMM  172.460007

这里,数据帧按date列的年份分组,然后返回具有每年最大日期的行。然后,您可以按日期对其进行排序,并获得最后五行:

df2.sort_values('date').iloc[-5:]

您可以获取最近的日期并使用.loc()获取所需的行,如下所示:

recent_date = company_stock_price["date"].max()
latest_stock_price = company_stock_price.loc[company_stock_price['date'] == recent_date]

您可以使用名为iloc的函数。此函数给出pd数据帧的特定行数。因此,您可以像列表一样从中获取信息,例如:pandas.iloc[-1]

这是一个如何工作的示例:

mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},
          {'a': 100, 'b': 200, 'c': 300, 'd': 400},
          {'a': 1000, 'b': 2000, 'c': 3000, 'd': 4000 }]
df = pd.DataFrame(mydict)

df.iloc[-1]

输出最后一行:

a    1000
b    2000
c    3000
d    4000
Name: 2, dtype: int64

使用pd.iloc[0]输出第一行:

a    1
b    2
c    3
d    4
Name: 0, dtype: int64

现在,如果您希望每5年获取一次最后一次日期,您可以在阵列上循环并获取数据范围。在这种情况下,5年的范围。所以应该是这样的:

arrayofData=company_stock_price['close']
every5YearsData = []
for i in range(len(arrayofData)):
  fiveYearList=[]
  if arrayofData[i] % 5!=0:
    fiveYearList.append(arrayofData[i])
  else:
    every5YearsData.append(fiveYearList[0])

相关问题 更多 >

    热门问题