2016-11-16 8 views
0

Hallo ich bin newbi in Python-Programmierung und ich lerne es immer noch. Ich möchte fragen, ich habe eine CSV-Daten, die 5 Spalten haben (TC, TD, TG, P, CTTR). und ich möchte einen neuen Wert für die CTTR-Spalte speichern.Python speichern neuen Wert

die neue Formel zu cTTR Spalte ist

enter image description here

i die Nummer der Linie ist.

aber ich weiß nicht, wie man die Formel in Python schreibt. ich weiß, wie man den ursprünglichen CTTR-Wert als Eingabe mit Pandas erhält.

import pandas as pd 

data_df = pd.read_csv("output1.csv") 

cttr = data_df['CTTR'] 

print cttr 

ich habe 12 anzahl der linien und ich möchte die ausgabe haben die gleiche anzahl von zeilen wie der eingang. wenn der Index [0] ist, ist der Wert von cttr [i-2] und cttr [i-1] == 0 und wenn der Index [11] der Wert von cttr [i + 2] und cttrs [i + 1] wird == 0 sein. und dann möchte ich den ursprünglichen Wert von CTTR durch den neuen Wert von CTTR zu csv ersetzen.

Der ursprüngliche cTTR Wert

0 
2 
2 
23 
18 
28 
27 
58 
41 
12 
35 
20 

der Ausgang i

erwartet
0.6------> (0 + 2*0 + 4*0 + 2*2 + 2)/10 
3.5 -----> (0 + 2*0 +4*2 +2*2 + 23)/10 
7.6 
16.2 
20.3 
28.3 
33.9 
40.8 
36.6 
27.8 
24.5-----> (41 + 2*12 + 4*35 + 2*20 + 0)/10 
16.2-----> (12 + 2*35 + 4*20 +2*0 + 0)/10 

Danke!

Antwort

1

Sie sind nicht ganz klar auf der Ausgabe, die Sie suchen, aber eine, wie Sie es tun können, ist:

vals = df.CTTR.values 

np.array([vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] for i in range(2,len(vals)-2)])/10. 

das gesagt ist, im Grunde sind Sie für die einen gewichteten gleitenden Durchschnitt der Umsetzung I bin sicher, dass eine Implementierung gibt es schon (vielleicht einen Blick um Pandas rolling)

Wenn Sie Nullen in der ersten/letzten Positionen haben wollen, wo keine Beobachtungen verfügbar sind, können Sie tun:

np.append(np.append([0,0],np.array([vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] for i in range(2,len(vals)-2)])/10.),[0,0]) 

Obwohl dies ein bisschen unhandlich bekommen, so können Sie dies in einer Funktion möchten wickeln etwa so:

def calc_new_cttr(series): 
    vals = series.values 
    cttrs = np.array([vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] for i in range(2,len(vals)-2)])/10. 
    return np.append(np.append([0,0], cttrs),[0,0]) 

die Sie dann direkt auf Ihre Serie wie folgt aufrufen können:

calc_new_cttr(data_df["CTTR"]) 

zu schreiben zu csv, können Sie die transformierte Spalte zu Ihrem Datenrahmen und Export zuzuweisen csv Pandas csv Writer:

data_df["transformed_cttr"] = calc_new_cttr(data_df["CTTR"]) 
data_df.to_csv("/path/to/your/file.csv") 

------------ EDIT -------- -----

Das Randverhalten in Ihrem neuesten Kommentar beschrieben wird, kann durch einfaches Auffüllen aus der Serie erreicht werden, bevor die Transformation anwenden und dann ohne die ersten und die letzten beiden Einträge die resultierenden Array Rückkehr:

def cttr(series): 
    vals = np.append(np.append([0,0], series.values),[0,0]) 
    cttrs = np.array([vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] for i in range(2,len(vals)-2)])/10. 
    return cttrs 
+0

hey danke für die Beantwortung . Sory, aber ich habe 12 Anzahl der Zeilen und ich möchte die Ausgabe haben die gleiche Anzahl von Zeilen wie die Eingabe. wenn der Index [0] ist, ist der Wert von Vals [i-2] und Vals [i-1] == 0 und wenn der Index [11] der Wert von Vals [i + 2] und Vals [i + 1] wird == 0 sein.und ich möchte den ursprünglichen Wert von CTTR mit dem neuen Wert von CTTR zu CSV ersetzen. –

+0

Nicht sicher, dass ich das verstehe - was ist eine Zeile für dich? Sprechen Sie über das Verhalten des Filters an den Grenzen (d. H. Wo "i-2" und "i-1" nicht existieren)? –

+0

Sory für mein schlechtes Englisch. Ich meine, ich habe insgesamt 12 Stücke von Daten eingegeben (0 2 2 23 18 28 27 58 41 12 35 20), aber Ihr Code geben mir nur 8 Stück Datenausgabe. und ja, wenn die i-2 und i-1 nicht existieren, möchte ich standardmäßig den Wert 0 angeben. –