比如对于一个股价时间序列表:
年月 | 年月日 | 股价 | |
---|---|---|---|
贵州茅台 | 202301 | 20230101 | 1500 |
贵州茅台 | 202301 | 20230120 | 1600 |
贵州茅台 | 202301 | 20230131 | 1400 |
贵州茅台 | 202302 | 20230205 | 1300 |
贵州茅台 | 202302 | 20230228 | 1700 |
五粮液 | 202301 | 20230102 | 1000 |
五粮液 | 202301 | 20230131 | 2000 |
怎样筛选出每个股票在月底那天的股价?
两种方法:
1) 先制定好一个每年每月最后一个交易日的表,然后查表
2)数据分析方法,先按股票和年月分组,然后再定位选取每个月里面日期最大的那一行。
下面是第二种方法的代码:
- import pandas as pd
-
- # 假设你的数据框为df,ym是年月,ymd是年月日,code是股票代码,sc是股价
- df = pd.DataFrame({'ym': ['202301', '202301','202301','202302','202302', '202301', '202301'],
- 'code':['贵州茅台','贵州茅台','贵州茅台','贵州茅台','贵州茅台','五粮液','五粮液'],
- 'ymd': ['20230101', '20230120', '20230131', '20230205','20230228','20230102','20230131'],
- "sc":[1500,1600,1400,1300,1700,1000,2000]})
- df['ymd'] = pd.to_datetime(df['ymd'])
-
- print(df)
-
- # 假设您的数据框名为df,包含年月(ym)、年月日(ymd)和得分(sc)列
- # 首先按年月分组
- grouped = df.groupby(['code','ym'])
-
- # 在每个组里面选取年月日最大的那一行记录
- #两种方法:
- # 1)
- #result = grouped.apply(lambda x: x[x['ymd'] == x['ymd'].max()])
- #2)
- max_date_rows = grouped['ymd'].idxmax()
- result = df.loc[max_date_rows]
-
-
- # 重置索引
- result.reset_index(drop=True, inplace=True)
-
- print(result)
运行结果:
年月 代码 年月日 股价
0 202301 贵州茅台 2023-01-01 1500
1 202301 贵州茅台 2023-01-20 1600
2 202301 贵州茅台 2023-01-31 1400
3 202302 贵州茅台 2023-02-05 1300
4 202302 贵州茅台 2023-02-28 1700
5 202301 五粮液 2023-01-02 1000
6 202301 五粮液 2023-01-31 2000
年月 代码 年月日 股价
0 202301 五粮液 2023-01-31 2000
1 202301 贵州茅台 2023-01-31 1400
2 202302 贵州茅台 2023-02-28 1700