Python Pandas – 时间序列的随机抽样
发布时间:2020-12-20 13:31:02 所属栏目:Python 来源:网络整理
导读:Pandas的新手,寻找最有效的方法来做到这一点. 我有一系列的DataFrames.每个DataFrame具有相同的列但不同的索引,并且它们按日期索引.该系列由股票代码索引.因此,序列中的每个项目代表每个股票表现的单个时间序列. 我需要随机生成n个数据帧的列表,其中每个数据
Pandas的新手,寻找最有效的方法来做到这一点.
我有一系列的DataFrames.每个DataFrame具有相同的列但不同的索引,并且它们按日期索引.该系列由股票代码索引.因此,序列中的每个项目代表每个股票表现的单个时间序列. 我需要随机生成n个数据帧的列表,其中每个数据帧是可用股票历史的一些随机分类的子集.如果有重叠,只要开始结束日期不同,就可以了. 以下代码可以实现,但它确实很慢,我想知道是否有更好的方法: 码 def random_sample(data=None,timesteps=100,batch_size=100,subset='train'): if type(data) != pd.Series: return None if subset=='validate': offset = 0 elif subset=='test': offset = 200 elif subset=='train': offset = 400 tickers = np.random.randint(0,len(data),size=len(data)) ret_data = [] while len(ret_data) != batch_size: for t in tickers: data_t = data[t] max_len = len(data_t)-timesteps-1 if len(ret_data)==batch_size: break if max_len-offset < 0: continue index = np.random.randint(offset,max_len) d = data_t[index:index+timesteps] if len(d)==timesteps: ret_data.append(d) return ret_data 档案输出: Timer unit: 1e-06 s File: finance.py Function: random_sample at line 137 Total time: 0.016142 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 137 @profile 138 def random_sample(data=None,subset='train'): 139 1 5 5.0 0.0 if type(data) != pd.Series: 140 return None 141 142 1 1 1.0 0.0 if subset=='validate': 143 offset = 0 144 1 1 1.0 0.0 elif subset=='test': 145 offset = 200 146 1 0 0.0 0.0 elif subset=='train': 147 1 1 1.0 0.0 offset = 400 148 149 1 1835 1835.0 11.4 tickers = np.random.randint(0,size=len(data)) 150 151 1 2 2.0 0.0 ret_data = [] 152 2 3 1.5 0.0 while len(ret_data) != batch_size: 153 116 148 1.3 0.9 for t in tickers: 154 116 2497 21.5 15.5 data_t = data[t] 155 116 317 2.7 2.0 max_len = len(data_t)-timesteps-1 156 116 80 0.7 0.5 if len(ret_data)==batch_size: break 157 115 69 0.6 0.4 if max_len-offset < 0: continue 158 159 100 101 1.0 0.6 index = np.random.randint(offset,max_len) 160 100 10840 108.4 67.2 d = data_t[index:index+timesteps] 161 100 241 2.4 1.5 if len(d)==timesteps: ret_data.append(d) 162 163 1 1 1.0 0.0 return ret_data 解决方法
您确定需要找到更快的方法吗?你当前的方法并不那么慢.以下更改可能会简化,但不一定会更快:
步骤1:从数据帧列表中随机抽取样本(替换) rand_stocks = np.random.randint(0,size=batch_size) 您可以将此数组rand_stocks视为要应用于数据帧系列的索引列表.大小已经是批量大小,因此无需在第156行进行while循环和比较. 也就是说,您可以迭代rand_stocks并访问股票,如下所示: for idx in rand_stocks: stock = data.ix[idx] # Get a sample from this stock. 第2步:为随机选择的每只股票获取随机数据范围. start_idx = np.random.randint(offset,len(stock)-timesteps) d = data_t[start_idx:start_idx+timesteps] 我没有你的数据,但这是我把它放在一起的方式: def random_sample(data=None,subset='train'): if subset=='train': offset = 0 #you can obviously change this back rand_stocks = np.random.randint(0,size=batch_size) ret_data = [] for idx in rand_stocks: stock = data[idx] start_idx = np.random.randint(offset,len(stock)-timesteps) d = stock[start_idx:start_idx+timesteps] ret_data.append(d) return ret_data 创建数据集: In [22]: import numpy as np In [23]: import pandas as pd In [24]: rndrange = pd.DateRange('1/1/2012',periods=72,freq='H') In [25]: rndseries = pd.Series(np.random.randn(len(rndrange)),index=rndrange) In [26]: rndseries.head() Out[26]: 2012-01-02 2.025795 2012-01-03 1.731667 2012-01-04 0.092725 2012-01-05 -0.489804 2012-01-06 -0.090041 In [27]: data = [rndseries,rndseries,rndseries] 测试功能: In [42]: random_sample(data,timesteps=2,batch_size = 2) Out[42]: [2012-01-23 1.464576 2012-01-24 -1.052048,2012-01-23 1.464576 2012-01-24 -1.052048] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |