2016-07-29 28 views
1

我正在處理一些大數據集 - 作爲時間函數的觀測值 - 這些數據集在時間上並不連續(即存在大量缺失數據,其中完整記錄缺席)。爲了讓事情變得有趣,有很多數據集,所有的丟失記錄,都在隨機的地方...用缺失值重映射`numpy.array`

我以某種方式需要及時獲取數據「同步」,缺少數據標記爲缺失數據,而不是完全沒有。我設法讓這部分工作,但我仍然有一些問題。

實施例:

import numpy as np 

# The date range (in the format that I'm dealing with), which I define 
# myself for the period in which I'm interested 
dc = np.arange(2010010100, 2010010106) 

# Observation dates (d1) and values (v1) 
d1 = np.array([2010010100, 2010010104, 2010010105]) # date 
v1 = np.array([10,   11,   12  ]) # values 

# Another data set with (partially) other times 
d2 = np.array([2010010100, 2010010102, 2010010104]) # date 
v2 = np.array([13,   14,   15  ]) # values 

# For now set -1 as fill_value 
v1_filled = -1 * np.ones_like(dc) 
v2_filled = -1 * np.ones_like(dc) 

v1_filled[dc.searchsorted(d1)] = v1 
v2_filled[dc.searchsorted(d2)] = v2 

這使我所期望的結果:

v1_filled = [10 -1 -1 -1 11 12] 
v2_filled = [13 -1 14 -1 15 -1] 

但只有當在d1d2值也是在dc;如果在d1d2一個值不在dc代碼失敗,因爲然後searchsorted表現爲:

如果沒有合適的索引,返回0或N(其中N是a長度)。

因此,舉例來說,如果我改變d2v2到:

d2 = np.array([2010010100, 2010010102, 2010010104, 0]) # date 
v2 = np.array([13,   14,   15,   9999]) # values 

結果是

[9999 -1 14 -1 15 -1] 

在這種情況下,因爲d2=0dc,應該丟棄值,而不是在開始(或結束)插入它。任何想法如何輕鬆實現?

+1

這種類型的任務正是熊貓所擅長的。 – shx2

+0

是的,我很擔心這一點..我和熊貓有一點愛和恨的關係;它似乎非常有用,但我也覺得開始有點困難。 – Bart

回答

1

如果您在致電dc.searchsorted(d2)之前撥打d2 = np.intersect1d(dc, d2),它將刪除d2中所有不在dc中的元素。

+0

我最終使用了一種稍微不同的方法(首先壓縮被遮罩的數組以除去被遮罩的值,因爲並非所有的統計例程都能與遮罩數組一起工作),但'intersect1d()'實際上是缺少的步驟...... – Bart