2017-09-26 215 views
0

我有一個由ID組成的數據集,每個ID都存在於時間戳範圍的某個子集中。有1813個時間戳[0,...,1812],並且在所有時間戳上存在一些ID,一些超出範圍(0,n),一些超過(n,m)和一些超過(m,1812)。每個ID在其存在的每個時間戳處具有108個特徵。用0填充ndarray的一維

我目前創建ndarray使用以下行:

# Shape: (1424, ?, 108) = (numIDs, numIDTimestamps, numFeatures) 
inputMatrix = np.array([df.loc[df['id'] == ID, [feature for feature in features]].as_matrix() for ID in IDs]) 

在這裏,在1維的每個元素是一個長度等於該ID在存在時間戳的數目。相反,我需要的每一個元素在此尺寸是長度1813,填充對於給定的ID的任何不存在時間戳與lenght陣列0 108

在僞代碼:

for each ID: 
    for each timestamps: 
     if ID exists at timestamp: 
      append its array of 108 features 
     else: 
      append array of 108 0s 

什麼是最高效率,Pythonic方式來實現這一點與我之前做過的類似的方式?

編輯

這裏是我的數據集的樣本結構,我導入到熊貓數據幀:

id  timestamp derived_0 ...  technical_108  y 
10  0   0.370326 ...  NaN    -0.011753 
11  0   0.014765 ...  NaN    -0.001240 
12  0   -0.010622 ...  NaN    -0.020940 
25  0   NaN   ...  NaN    -0.015959 
26  0   0.176693 ...  NaN    -0.007338 

...  ...   ...   ...  ...    ... 

2150 1812  -0.123364 ...  0.001004  0.004604 
2151 1812  -10.437184 ...  0.044597  -0.009241 
2154 1812  -0.077930 ...  0.030816  -0.006852 
2156 1812  -0.269845 ...  -0.011706  -0.000785 
2158 1812  NaN   ...  NaN    0.003497 

這是我做達imputMatrix線以上的處理:

df = df.fillna(df.mean()) 

# SORT BY LAST TIMESTAMP 
df = df.assign(start=df.groupby('id')['timestamp'].transform('min'), 
       end=df.groupby('id')['timestamp'].transform('max'))\ 
       .sort_values(by=['end', 'start', 'timestamp']) 

cols = list(df) 
featureNames = ['derived', 'fundamental', 'technical'] 
features = [col for col in cols if col.split('_')[0] in featureNames] 
numFeatures = len(features) 
IDs = list((df['id'].unique()))     # Sorted by ascending last timestamp 
timestamps = list(df['timestamp'].unique())  # Sorted 

「按上次時間戳排序」意味着DataFrame的行被重新排序,以便帶有t他最低結局時間戳是第一個,仍然按照他們的時間戳排序。

e.g:

id  timestamp ... 
1314 0   ... 
1314 1 
1314 2 
1699 0 
1699 1 
1699 2 
1699 3 

... 
+0

示例數據將非常有用 – Dark

+0

在我的編輯中添加了它。 – KOB

+0

所以,你的意思是說每個獨特的時間戳,你需要添加空行0,使他們的長度1813? – Dark

回答

0

您可以附加一個系列,從0到1812時間戳每一個ID,然後取出其中的時間戳和ID有重複的情況下,和Y列丟失。

這段代碼的草圖低於:

for ID in IDs: 
    df.ix[df['id']==ID, 'timestamp'] = df.ix[df['id']==ID, 'timestamp'].append(pd.Series(range(0, 1813))) 

df.drop[df.duplicated(subset=('id', 'timestamp'), keep=False) and pd.isnull(df['y'])] 

在此之後,你可以將你的現有代碼。