我有一系列的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 sfile: finance.pyFunction: random_sample at line 137Total time: 0.016142 sline # 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 npIn [23]: import pandas as pdIn [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.0257952012-01-03 1.7316672012-01-04 0.0927252012-01-05 -0.4898042012-01-06 -0.090041In [27]: data = [rndserIEs,rndserIEs,rndserIEs]
测试功能:
In [42]: random_sample(data,timesteps=2,batch_size = 2)Out[42]:[2012-01-23 1.4645762012-01-24 -1.052048,2012-01-23 1.4645762012-01-24 -1.052048]总结
以上是内存溢出为你收集整理的Python Pandas – 时间序列的随机抽样全部内容,希望文章能够帮你解决Python Pandas – 时间序列的随机抽样所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)