Return 只有一年的最后一天 pandas?

Return only the last day of the year with pandas?

api 从 financialmodelingprep api 获取指定公司股票的历史收盘价请求。它 returns 股票的每个记录日期。问题是我只需要过去 5 年的最后一个日期,以便将其与财务报表进行比较。 有谁知道如何在不指定确切日期的情况下过滤数据集以获取年份的最后日期?目标是将 table 导出为 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

返回company_stock_pricetable

    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

这种情况下的问题是我无法指定确切的日期,因为一些标准普尔 500 指数公司(我要 for 循环)在返回的日期中缺少该日期的股票价格api 个回复。

您可以使用 pandas 称为 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])

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

recent_date = company_stock_price["date"].max()
latest_stock_price = company_stock_price.loc[company_stock_price['date'] == recent_date]
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:]