2017-09-26 5 views
0

Ich habe eine Datenmenge bestehend aus IDs, von denen jede über eine Teilmenge einer Reihe von Zeitstempeln besteht. Es gibt 1813 Zeitstempel [0, ..., 1812] und einige IDs existieren über alle Zeitstempel, einige über den Bereich (0, n), einige über (n, m) und einige über (m, 1812). Jede ID hat an jedem vorhandenen Zeitstempel 108 Merkmale.Auffüllen einer Dimension von NDarray mit 0s

I erstellen derzeit ein ndarray mit der folgenden Zeile:

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

hier jedes Element in der Abmessung 1 ist mit einer Länge gleich die Anzahl von Zeitstempeln, dass diese über ID existiert. Stattdessen muß ich jedes Element in dieser Dimension der Länge 1813 sein, für eine bestimmte ID jeden nicht vorhandenen Zeitstempel Klotzen mit einer Reihe 0s der Länge 108

In Pseudo-Code:

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

Was ist die Effizienter, pythonischer Weg, dies auf ähnliche Weise zu erreichen, wie ich es vorher getan habe?

EDIT

Hier ist ein Beispiel Struktur meines Datensatz, die ich in einen Pandas Datenrahmen zu importieren:

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 

Und das ist die Verarbeitung Ich habe oben auf die imputMatrix Linie getan:

"Nach letzten Zeitstempel sortieren" bedeutet, dass die Zeilen des DataFrames neu geordnet werden, so dass die IDs mit t Der unterste Zeitstempel ist der erste und wird immer noch nach ihren Zeitstempeln geordnet.

z:

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

... 
+0

Eine Beispieldaten wäre wirklich hilfreich – Dark

+0

Hinzugefügt in meiner Bearbeitung. – KOB

+0

Sie wollen also sagen, dass Sie für jeden eindeutigen Zeitstempel leere Zeilen von 0s hinzufügen müssen, um ihre Länge 1813 zu erhalten? – Dark

Antwort

0

Sie eine Reihe für jede ID mit Zeitstempel 0-1812 anhängen und dann die Fälle entfernen, wo der Zeitstempel und ID dupliziert und die y-Spalte fehlt.

Eine grobe Skizze dieses Codes ist unter:

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

Danach Sie Ihre vorhandenen Code anwenden können.

Verwandte Themen