我有一个pandas数据帧,其中包含10年的日期时间索引每天测量股票开盘价。
以下是该集合中的一些示例数据:
date stock price open
2005-01-01 5.5
2005-01-02 6.5
2005-01-03 6.3
2005-01-04 6
...
2006-01-01 8
2006-01-02 8.5
...
2015-01-01 19.5
2015-01-02 20
10年来的每一天都是一次观察。(不包括闰年(
我想要的是制作一个显示最高股票价格的专栏十年中每一天的价值。
这是10年内的最大值,但今年可以在日期栏中给出,我只需要股票价值。
像这样:
date max stock price open (over decade)
01-01 19.5
01-02 20
01-03 21
01-04 25
...
03-01 22
03-02 19
...
12-01 27
12-02 26
...
有什么想法吗?我对如何在没有指定具体年份的情况下按日期分组感到困惑。
df = pd.read_csv('stocks.txt', sep=r"[ ]{2,}")
df['date'] = df['date'].str[5:]
print(df)
date stock price open
0 01-01 5.5
1 01-02 6.5
2 01-03 6.3
3 01-04 6.0
4 01-01 8.0
5 01-02 8.5
6 01-01 19.5
7 01-02 20.0
df_gb = df['stock price open'].groupby([df['date']]).max()
print(df_gb)
date
01-01 19.5
01-02 20.0
01-03 6.3
01-04 6.0
要在新的df中获得最长年份,您可以这样做:
df_gb_dict = df_gb.to_dict()
max_year_list = []
for idx, row in df.iterrows():
for k, v in df_gb_dict.items():
if k == row['date_2'] and v == row['stock price open']:
print(k, v, idx)
max_year_list.append([k, v, idx])
new_df = pd.DataFrame(max_year_list, columns=['month_day', 'spo_high', 'date'])
new_df.sort_values(by='month_day', inplace=True)
new_df.reset_index(drop=True)
print(new_df)
month_day spo_high date
0 01-01 19.5 2015-01-01
1 01-02 20.0 2015-01-02
2 01-03 6.3 2005-01-03
3 01-04 6.0 2005-01-04
假设decate=200-2009、2010-2019等,但您可以通过更改下面的decate_variance计算来更改它
import pandas as pd
import datetime as dt
导入数据帧
decade = pd.read_excel('C:/stackoverflow/decade.xlsx', index_col='Date')
创建一列以按十年划分数据
decade_variance = decade.index.year//10*10 - decade.index.year
decade['Date_decade'] = decade.index.copy()
for i in range(len(decade.index)):
decade['Date_decade'][i] = decade['Date_decade'][i] + pd.DateOffset(years=decade_variance[i])
按月天只保留十年来最大的价格,并按日期对数据进行排序
decade.sort_values(by=['Date_decade','stock Price Open'], ascending=[True, False], inplace=True)
decade.drop_duplicates(subset=['Date_decade'],inplace=True)
decade['Date_decade'] = decade['Date_decade'].dt.year
重置索引以显示月份日期并删除年份(这将把索引从DatetimeIndex更改为字符串索引(
decade['month-day'] = decade.index.copy()
decade['month-day'] = decade['month-day'].apply(lambda x: pd.datetime.strftime(x, "%m-%d"))
decade.set_index('month-day', inplace=True)
decade
stock Price Open Date_decade
month-day
01-01 8.0 2000
01-02 8.5 2000
01-03 6.3 2000
01-04 6.0 2000
01-01 19.5 2010
01-02 20.0 2010