2017-09-26 11 views
0

私は、それぞれがタイムスタンプの範囲のあるサブセットに存在するIDからなるデータセットを持っています。 1813のタイムスタンプ[0、...、1812]があり、すべてのタイムスタンプ上にいくつかのIDが存在し、範囲(0、n)、一部(n、m)、一部(m、1812)各IDには、それが存在する各タイムスタンプに108個の機能があります。ndarrayの1次元を0で埋める

私は現在、次の行で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が上に存在するタイムスタンプの数に等しい長さです。代わりに、私は擬似コードで108

な長さの配列を0で指定されたIDのいずれかの存在しないタイムスタンプをパディング、長さ1813であるように、このディメンション内のすべての要素が必要になります。

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

これを私が以前に行ったのと同様の方法で達成するための効率的な、Pythonの方法?ここでEDIT

は、私はパンダDATAFRAMEにインポート私のデータセットのサンプル構造である:

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彼は最低終了タイムスタンプが最初であり、それらのタイムスタンプによって依然として順序付けられています。

例えば:

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'])] 

この後、あなたの既存のコードを適用することができます。

関連する問題