2017-06-22 1 views
0

Also, das hat mich ein wenig ratlos. Ich habe ein Diktat, über das ich versuche zu iterieren, und ich suche nach den Spitzenwerten. Das Konzept ist hier:Iterate über ein Diktat, vergleichen aktuellen und vorherigen Wert

out = {} 
for i in data.keys(): 
    if(data[i].next() -2 > data[i]: 
     out.update(i, data[i]) 

ich versucht habe, setze diese in list(range(len(data))) und Iterieren durch diese Art und Weise, die mit Dummy-Daten arbeitet. Allerdings meine Daten nicht Schlüssel wie 1, 2, 3, 4. Exmaple Daten:

{ 29600: 0.65867825014992798, 
30000: 1.3958743297851659, 
30400: 2.1166100767879361, 
30800: 2.0297784488567414, 
31200: 1.9480822174184762, 
31600: 1.887373119058025, 
32000: 1.8890589139490572, 
32400: 4.1795916676025842, 
32800: 3.828821494194075, 
33200: 3.7060572197219459, 
33600: 3.647037270729065, 
34000: 3.6029200898094329, 
34400: 3.5352886422138452, 
34800: 6.7902577064444039, 
35200: 6.857, 

Es gibt Punkte in den Daten, wobei der Wert erhöht sich um einen großen Wert (etwa 3) und ich versuche zu finde den Index und den Wert, der diesen Punkten zugeordnet ist. Daher verwende ich den nächsten Wert - 2 und sehe, ob es immer noch größer als der vorherige Wert ist. Dieses Diktat kann leicht eine Pandas-Datenreihe sein, wenn es so einfacher ist.

+0

Können Sie den Spitzenwert in Ihrem Beispiel angeben? – Tbaki

+0

Beachten Sie, dass Wörterbücher erst dann bestellt werden, wenn Sie ein [OrderedDict] (https://docs.python.org/3/library/collections.html#collections.OrderedDict) erstellen. Wenn Sie so iterieren, wie Sie sich jetzt auf Ihren "nächsten" Wert verlassen, wird eine Zahl nicht immer funktionieren. – MCBama

+0

Ich habe bessere Beispieldaten hinzugefügt, @Tbaki, und das funktioniert überhaupt nicht, ich kann nicht über die Daten iterieren. –

Antwort

3

Sie die Liste der Tasten mit halten können in sortierter Reihenfolge verwendet es dann offenkundigen Wörterbuch iterieren:

data = { 29600: 0.65867825014992798, 
     30000: 1.3958743297851659, 
     30400: 2.1166100767879361, 
     30800: 2.0297784488567414, 
     31200: 1.9480822174184762, 
     31600: 1.887373119058025, 
     32000: 1.8890589139490572, 
     32400: 4.1795916676025842, 
     32800: 3.828821494194075, 
     33200: 3.7060572197219459, 
     33600: 3.647037270729065, 
     34000: 3.6029200898094329, 
     34400: 3.5352886422138452, 
     34800: 6.7902577064444039, 
     35200: 6.857} 

out = {} 
# keep the keys in sorted order 
sorted_keys = sorted(data) 

# now for each key in the list 
for i in range(len(sorted_keys)-1): 

    # get key at index i and key at index i+1 and compare them 
    if(data[sorted_keys[i+1]] -2 > data[sorted_keys[i]]): 

     # if condition matched update the out 
     out[sorted_keys[i]] = data[sorted_keys[i]] 
     out[sorted_keys[i+1]] = data[sorted_keys[i+1]] 

print(out) 

Ausgang:

{32000: 1.8890589139490572, 
32400: 4.179591667602584, 
34400: 3.535288642213845, 
34800: 6.790257706444404} 
+1

Großartig, ich wusste nicht über 'sorted()'! –

+0

@NickHale Ich bin glücklich, es hat funktioniert! 'Glückliche Kodierung'. – 0p3n5ourcE

2

Mit Datenrahmen, da Sie mit Pandas in Ordnung sind:

Eingang

k  v 
0 29600 0.658678250149928 
1 30000 1.395874329785166 
2 30400 2.116610076787936 
3 30800 2.0297784488567414 
4 31200 1.948082217418476 
5 31600 1.887373119058025 
6 32000 1.8890589139490568 
7 32400 4.179591667602584 
8 32800 3.8288214941940755 
9 33200 3.7060572197219455 
10 33600 3.647037270729065 
11 34000 3.602920089809433 
12 34400 3.5352886422138448 
13 34800 6.790257706444404 
14 35200 6.86 


d["new"] = d.v - d.v.shift(-1) 
d["new"] = d["new"].apply(lambda x:abs(x)) 
d[d["new"] >2] 

Ausgabe

k  v     new 
6 32000 1.8890589139490568 2.2905327536535274 
12 34400 3.5352886422138448 3.254969064230559 
+0

das funktioniert bei mir, gute antwort, ich kann aber nur eins annehmen! –

+0

@NickHale kein Problem, viel Glück: D – Tbaki

Verwandte Themen