我有一個由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
...
示例數據將非常有用 – Dark
在我的編輯中添加了它。 – KOB
所以,你的意思是說每個獨特的時間戳,你需要添加空行0,使他們的長度1813? – Dark