2015-04-23 23 views
1

我目前在Python中有一個問題,我不知道如何解決高效。我有一大組時間序列數據讀入發生器。到目前爲止,當我呼叫收益率時,每個數據都會一一給我。當每個時間序列具有相同的索引時,這一切都很好,其中每個時間序列從同一日期開始並在同一日期結束。問題是當我有一組時間序列數據不具有相同的開始日期,但具有相同的結束日期。高效的時間序列數據提取

什麼是最好的實現,當我查詢時,它會返回該特定日期的值。這樣我就不必擔心開始日期。它就像時間點。

我使用熊貓,目前沒有線索如何有效地實現這一點。

代碼我用文件導入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 
+0

你可以發佈csv文件的樣本嗎?另外,symbol_list是文件的一個子集? – Alexander

+0

Symbol_list是一個符號名稱列表,例如[「SPY」,「GE」] – user1234440

+0

我不確定如何發佈csv文件,它具有6列開放高低收盤價和開倉價。索引欄只是日期。不是盤中數據。 – user1234440

回答

0

讓我們先從這一點:

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 

怎麼是這個不充分您的需求?

0

說你的數據是這樣的:

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 

您可以現在所有的數據加載到的DataFrame秒的陣列,增加了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) 
    ....: 

這些可以被連接成一個單一數據幀,這使得它易於操縱。我們製作一個數據透視表,向前填充缺失的值,並重新排列列級以方便起見。

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)的能力。

由於這沒有任何循環,它應該是相當有效的。

+0

如何獲取所有符號的特定日期的結束值? – user1234440

+0

更確切地說,收盤價爲1999-11-18 – user1234440

+0

'combined.reorder_levels([1,0],axis = 1)['關閉']'可以讓你獲得所有收盤價。 'combined.reorder_levels([1,0],axis = 1)['Close']。ix ['1999-11-18']'讓你在1999-11-18收盤。 –