Python DataFrame按Finaldate与FLAG分组生成4小时OHLC数据的语法
股票数据按自定义标识聚合为4小时OHLC的Python实现
我刚接触Python,需要将15分钟级别股票数据聚合为4小时OHLC数据。由于美国股市于CST时间8:30开盘,4小时K线并非严格的4小时周期,因此已为每日的每个4小时K线创建FLAG标识。现有如下DataFrame:
Volume|Open|Close|High|Low|Ticker|Finaldate|Time|FLAG 5887869|130.465|131.05|131.44|130.465|AAPL|1/9/2023|8:30:00|1 4094933|131.05|132.015|132.06|130.53|AAPL|1/9/2023|8:45:00|1 3942758|132.01|132.13|132.63|131.3218|AAPL|1/9/2023|9:00:00|1 3481345|132.145|132.565|132.735|131.96|AAPL|1/9/2023|9:15:00|1 2526194|132.575|132.735|132.8375|132.4636|AAPL|1/9/2023|9:30:00|1 2756892|132.73|132.74|133.14|132.66|AAPL|1/9/2023|9:45:00|1 2679936|132.74|133.2101|133.34|132.67|AAPL|1/9/2023|10:00:00|1 2366166|133.23|133.085|133.41|132.97|AAPL|1/9/2023|10:15:00|1 2040521|133.09|132.97|133.18|132.8|AAPL|1/9/2023|10:30:00|1 1643790|132.9679|132.945|133.12|132.81|AAPL|1/9/2023|10:45:00|1 1597548|132.94|132.82|132.955|132.57|AAPL|1/9/2023|11:00:00|1 1360285|132.8101|132.745|132.8415|132.6|AAPL|1/9/2023|11:15:00|1 1337147|132.74|132.26|132.83|132.25|AAPL|1/9/2023|11:30:00|1 2046411|132.26|132.459|132.53|132.255|AAPL|1/9/2023|11:45:00|1 1378193|132.46|132.42|132.64|132.26|AAPL|1/9/2023|12:00:00|1 1207053|132.4201|132.495|132.569|132.35|AAPL|1/9/2023|12:15:00|1 2149979|132.495|131.62|132.5101|131.57|AAPL|1/9/2023|12:30:00|2 2455293|131.62|131.395|131.625|131.19|AAPL|1/9/2023|12:45:00|2 2363314|131.39|131.47|131.726|131.2411|AAPL|1/9/2023|13:00:00|2 1812985|131.465|131.495|131.66|131.3|AAPL|1/9/2023|13:15:00|2 1727193|131.49|131.09|131.5667|130.95|AAPL|1/9/2023|13:30:00|2 1609277|131.09|130.67|131.16|130.59|AAPL|1/9/2023|13:45:00|2 1751837|130.68|130.37|130.82|130.36|AAPL|1/9/2023|14:00:00|2 1773304|130.3661|130.445|130.7|130.34|AAPL|1/9/2023|14:15:00|2 2017340|130.45|130.5|130.655|130.16|AAPL|1/9/2023|14:30:00|2 4098579|130.51|130.19|130.52|129.89|AAPL|1/9/2023|14:45:00|2
聚合要求
按Finaldate和FLAG分组,实现以下规则:
- Open:取分组内第一个值
- High:取分组内最大值
- Low:取分组内最小值
- Close:取分组内最后一个值
- Volume:对分组内数值求和
- Time:取分组内最小值
同时保留Ticker、Finaldate字段内容。
实现代码
使用Pandas的groupby结合agg方法即可完成需求,代码如下:
import pandas as pd # 假设你的原始数据存储在DataFrame df中 aggregated_df = df.groupby(['Finaldate', 'FLAG'], as_index=False).agg( Ticker=('Ticker', 'first'), Open=('Open', 'first'), High=('High', 'max'), Low=('Low', 'min'), Close=('Close', 'last'), Volume=('Volume', 'sum'), Time=('Time', 'min') )
代码说明
groupby(['Finaldate', 'FLAG'], as_index=False):按指定的日期和标识字段分组,as_index=False确保分组字段作为普通列保留,不转为索引agg方法接收字典参数,键是聚合后的列名,值为(原列名, 聚合函数)的元组,明确指定每个字段的聚合逻辑- Ticker字段使用
first是因为同一分组内的股票代码一致,取任意一个值都可保证正确
内容的提问来源于stack exchange,提问作者SirBenson
相关产品推荐
相关产品推荐

