用0填充ndarray的一维

用0填充ndarray的一维

问题描述:

我有一个由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到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'])] 

在此之后,你可以将你的现有代码。