用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到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'])]
在此之后,你可以将你的现有代码。
示例数据将非常有用 – Dark
在我的编辑中添加了它。 – KOB
所以,你的意思是说每个独特的时间戳,你需要添加空行0,使他们的长度1813? – Dark