【问题标题】:Efficient time series data extract高效的时间序列数据提取
【发布时间】:2015-07-01 00:43:27
【问题描述】:

我目前在 python 中有一个问题,我不确定如何高效地解决。我有大量的时间序列数据被读入生成器。到现在为止,当我调用yield的时候,每一个数据都会一个一个的还给我。当每个时间序列具有相同的索引时,这一切都很好,每个时间序列都在同一日期开始并在同一日期结束。问题是当我有一组时间序列数据的开始日期不同但结束日期相同时。

当我查询时,最好的实现是什么,它将返回该特定日期的值。这样我就不必担心开始日期。它就像时间点。

我使用 pandas,目前不知道如何有效地实现这一点。

我用来逐个导入csv文件的代码:

def _open_convert_csv_files(self):

    comb_index = None
    for s in self.symbol_list:
        print s
        # Load the CSV file with no header information, indexed on date
        self.symbol_data[s] = pd.io.parsers.read_csv(
                                  os.path.join(self.csv_dir, '%s.csv' % s),
                                  header=0, index_col=0, parse_dates=True,
                                  names=['Date','Open','High','Low','Close','Total Volume']
                              ).sort()


        # Combine the index to pad forward values
        if comb_index is None:
            comb_index = self.symbol_data[s].index
        else:
            comb_index.union(self.symbol_data[s].index)

        # Set the latest symbol_data to None
        self.latest_symbol_data[s] = []

    print ''
    # Reindex the dataframes
    for s in self.symbol_list:
        self.symbol_data[s] = self.symbol_data[s].reindex(index=comb_index, method='pad').iterrows()

如您所见,self.symbol_data[s] 在时间序列具有相同的开始日期时工作正常,但当它们没有时,它将无法工作,因为在我的模拟过程中,我循环遍历循环中的每个符号以获取数据。另一个词我需要考虑每个迭代日期的横截面价格数据

很想听听其他人为实现这一目标所做的工作。

我知道我们可以将它们并排排列在一起,以便它们的日期匹配并逐行循环,但是当我有 100k 不同的证券时,这在记忆中很慢。另外,每个csv文件不是单列而是多列...

谢谢,


Date    Open    High    Low Close   Total Volume
19991118    29.69620186 32.63318885 26.10655108 28.71720619 685497
19991119    28.02375093 28.06454241 25.98417662 26.3513 166963
19991122    26.96317229 28.71720619 26.14734257 28.71720619 72092
19991123    27.73821052 28.47245727 26.10655108 26.10655108 65492
19991124    26.18813405 27.37108715 26.10655108 26.80000634 53081
19991126    26.67763189 27.08554675 26.59604891 26.88158932 18955

【问题讨论】:

  • 你能发布一个csv文件的样本吗?另外,symbol_list 是文件的子集吗?
  • Symbol_list 是符号名称列表,即["SPY","GE"]
  • 我不知道如何发布 csv 文件,它有 6 列,开盘价高低收盘价,数量和持仓量。索引列只是日期。不是盘中数据。
  • 日期字段是什么样的?能给个样品吗? (例如 20150515 与 2015 年 5 月 5 日)
  • 想一想,我的数据的面板表示是否有效?如果我有多个符号,我有多个代表每个符号的列。我的长轴是日期,我的短轴是开盘高低收盘数据。不确定熊猫中是否有面板数据的迭代.....

标签: python pandas


【解决方案1】:

让我们从这个开始:

pd.read_csv(file_path, parse_dates=True, index_col=0)
                 Open       High        Low      Close  Total Volume
Date                                                                
1999-11-18  29.696202  32.633189  26.106551  28.717206        685497
1999-11-19  28.023751  28.064542  25.984177  26.351300        166963
1999-11-22  26.963172  28.717206  26.147343  28.717206         72092
1999-11-23  27.738211  28.472457  26.106551  26.106551         65492
1999-11-24  26.188134  27.371087  26.106551  26.800006         53081
1999-11-26  26.677632  27.085547  26.596049  26.881589         18955

这还不足以满足您的需求吗?

【讨论】:

    【解决方案2】:

    假设您的数据如下所示:

    In [52]: print open('aa1.csv').read()
    Date,Open,High,Low,Close,Total Volume
    1999-11-18,29,32,26,30,10000
    1999-11-20,30,33,27,31,9000
    1999-11-22,31,34,28,32,8000
    
    In [53]: print open('aa2.csv').read()
    Date,Open,High,Low,Close,Total Volume
    1999-11-18,50,51,49,50,9000
    1999-11-19,50,52,48,50,8000
    1999-11-21,50,53,47,50,7000
    

    您现在可以将所有数据加载到DataFrames 的数组中,添加一个Symbol 列来识别它。

    In [54]: symbol_list = ['aa1', 'aa2']
    
    In [55]: result = []
    
    In [56]: for symbol in symbol_list:
       ....:         data = pd.read_csv(symbol + '.csv', parse_dates=True)
       ....:         data['Symbol'] = symbol
       ....:         result.append(data)
       ....:
    

    这些可以连接成一个单个DataFrame,这使得操作变得容易。我们用它制作了一个数据透视表,向前填充缺失的值,并为方便起见重新排序列级别。

    In [57]: combined = pd.concat(result).pivot_table(
       ....:     index='Date',
       ....:     columns='Symbol',
       ....:     values=['Open', 'High', 'Low', 'Close', 'Total Volume']
       ....: ).ffill().reorder_levels([1, 0], axis=1)
    
    In [58]: combined
    Out[58]:
    Symbol      aa1  aa2  aa1  aa2 aa1 aa2   aa1   aa2          aa1          aa2
               Open Open High High Low Low Close Close Total Volume Total Volume
    Date
    1999-11-18   29   50   32   51  26  49    30    50        10000         9000
    1999-11-19   29   50   32   52  26  48    30    50        10000         8000
    1999-11-20   30   50   33   52  27  48    31    50         9000         8000
    1999-11-21   30   50   33   53  27  47    31    50         9000         7000
    1999-11-22   31   50   34   53  28  47    32    50         8000         7000
    

    .pivot_table() 操作会自动为您创建一个组合索引,您还可以跨代码比较指标(例如跨符号Close)。

    由于这没有任何循环,它应该是相当有效的。

    【讨论】:

    • 如何获取所有交易品种特定日期的收盘价?
    • 更准确地说,是 1999-11-18 的收盘价
    • combined.reorder_levels([1, 0], axis=1)['Close'] 为您提供所有收盘价。 combined.reorder_levels([1, 0], axis=1)['Close'].ix['1999-11-18'] 为您提供 1999 年 11 月 18 日的收盘价。
    • 可以把每一行都转成一个迭代器吗?
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2023-01-27
    • 2013-12-07
    • 2020-04-12
    • 2020-03-11
    • 2014-07-01
    相关资源
    最近更新 更多