Python Pandas – 时间序列的随机抽样

Python Pandas – 时间序列的随机抽样,第1张

概述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 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 – 时间序列的随机抽样所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1196739.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存