2017-12-20 2 views
1

Ich möchte die folgenden Berechnungen mit meinem df durchführen. Ich habe das in Excel gemacht, aber ich bin nicht sicher, wie man das mit Python macht. Hier ist die Berechnungpython Durchführen von Rekursion auf Zeilen in df

 initial| recursion begins 
Name | 1 | 2  | 3  | 4 ... 
------------------------------------------------ 
A  | A1 | A2  | A3  | A4   <--given 
a  | a1=0 | a2=c1*A2 | a3=c2*A3 | a4=c3*A4 <--calculation (1st cell always = 0) 
c  | c1=1 | c2=c1-a2 | c3=c2-a3 | c4=c3-a4 <--calculation (1st cell always 1) 

Hier ist mein Beispiel:

df

Name 1 2  3 4  5 
---------------------------------- 
A  0 .125 .286 .25 .333 
B  0 0  0 .5 - 

die Ausgabe wäre:

Name 1 2  3  4 5 
---------------------------------- 
A  0 .125 .286 .25 .333 
Ax  0 .125 .25 .156 .156 
Ay  1 .875 .625 .469 .313 
B  0 .1 0  .25 - 
Bx  0 .1 0  .225 - 
By  1 .9 .9 .675 - 

Vielen Dank!

+0

Hmm, ich glaube nicht, das genug Informationen ist die Frage zu beantworten. Hinter den hier erzielten Ergebnissen scheint wenig Intuition zu stecken. Kannst du erklären, was du versuchst zu tun und wie du zu dem Ergebnis kommst? –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Die Logik, die ich hier verwendet habe, ist, wie ich die Formel auf Excel geschrieben habe. Mein Ziel ist es, die 2 Rekursionsformeln für die gegebenen Zeilen A und B auszuführen. Die Ax, Ay und Bx, By werden von den Formeln in der ersten Box abgeleitet. – TylerNG

Antwort

2

Lassen Sie mich ein wenig erklären.

a2=c1*A2;c2=c1-a2, then c2=c1-a2=c1-c1*A2=c1(1-A2),

c3 c3=c2(1-A3)=c1(1-A2)(1-A3) sein sollte, das ist, wo (1-df).cumprod(1), kommen aus

df=df.set_index('Name') 
df1=(1-df).cumprod(1) 
df2=df1.shift(1,axis=1).mul(df) 

pd.concat([df,df1,df2],keys=['','x','y']).fillna({'1':0}) 


Out[769]: 
      1  2  3   4   5 
    Name           
    A  0.0 0.125 0.28600 0.250000 0.333000 
    B  0.0 0.000 0.00000 0.500000  NaN 
x A  1.0 0.875 0.62475 0.468562 0.312531 
    B  1.0 1.000 1.00000 0.500000  NaN 
y A  0.0 0.125 0.25025 0.156187 0.156031 
    B  0.0 0.000 0.00000 0.500000  NaN 
+0

du hast Recht! Aber wenn ich die erste Zeile ausführen, bekomme ich: TypeError: Konnte nicht operieren 1 mit Blockwerten nicht unterstützte Operandentyp (en) für -: 'int' und 'str' – TylerNG

+0

@TylerNG scheint eher 'str' als numerisch zu sein ', df = df.apply (pd.to_numeric) – Wen

+0

Ich kann das nicht tun, da das Feld Name eine Zeichenkette ist. ('String' 'A' konnte nicht an Position 0 ',' bei Indexname 'gefunden werden) – TylerNG

Verwandte Themen