1

I have a pandas dataframe with 1 row, I am trying to extract the values from certain columns to do calculations, error : TypeError: 'NoneType' object is not subscriptable

Failure happends where I have added - **

Code:

result = []
for kur, knb, bm_pp, zzavcurr, wa, datefrom, dateto in zip(df.kur, df.knb, df.bm_pp, df.zzavcurr, df.wa, df.datefrom, df.dateto):
    if kur == knb:
        result.append(bm_pp)
    elif kur != knb and wa == "HUF":
        result.append(bm_pp)
    elif kur != knb and wa in ("SEK", "DKK", "MXN"):
        result.append(bm_pp)
    elif kur != knb and knb == 'IA' and wa not in ("SEK", "DKK", "MXN", "USD", "HUF"):
        df = getExchangeRate(ctx, knb, wa, bm_pp, zzavcurr, datefrom, dateto, dfTC)
        ** bm_pp_usd_off = df['bm_pp'].values[0] / df['zzavcurr'].values[0]
        bm_pp_c_new = bm_pp_usd_off / df['ukurs'].values[0]
        result.append(bm_pp_c_new)
    else:
        result.append("Fail")
df["bm_pp_c_new"] = result

def getExchangeRate(ctx, knvv_kurst, waers, bm_pp, zzavcurr, datefrom, dateto, dfTC):
if datefrom == dateto:
    data = [[knb, wa, bm_pp, zzavcurr, datefrom, dateto]]
    df_BA = pd.DataFrame(data, columns=['knb', 'wa', 'bm_pp', 'zzavcurr', 'datefrom', 'dateto'])
    dfBA = ctx.spark_session.createDataFrame(df_BA)
    dfR = dfBA.join(dfTC, (dfBA.knb == dfTC.kur_TC) & (dfBA.wa == dfTC.fcurr) & ('USD' == dfTC.tcurr) & (dfBA.datefrom == dfTC.gdatu), how='left')
    df = dfR.toPandas()
    return (df)
else:
    data = [[knb, wa, bm_pp, zzavcurr, datefrom, dateto]]
    df_BA = pd.DataFrame(data, columns=['knb', 'wa', 'bm_pp', 'zzavcurr', 'datefrom', 'dateto'])
    dfBA = ctx.spark_session.createDataFrame(df_BA)
    dfR = dfBA.join(dfTC, (dfBA.knb == dfTC.kur_TC) & (dfBA.wa == dfTC.fcurr) & ('USD' == dfTC.tcurr) & (dfBA.datefrom == dfTC.gdatu), how='left')
    df = dfR.toPandas()
    return (df)

Dataframe:

enter image description here

Head:

Row(knb='IATA', wa='EUR', bm_pp=1.08084, zzavcurr=1926.13, datefrom=datetime.date(2020, 2, 1), dateto=datetime.date(2020, 2, 1), kur='IATA', fcurr='EUR', tcurr='USD', gdatu=datetime.date(2020, 2, 1), ukurs=-0.90202)

jeffry
  • 327
  • 2
  • 8
  • 23

1 Answers1

1

This code works for me in pandas 1.0.1. Are your df columns used in your calculations numeric data types? Do you have a typo somewhere?

df = pd.DataFrame({'bm_pp':[1.0808], 'zzavcurr': [1926.1], 'ukurs':[-0.902]})

bm_pp_usd_off = df['bm_pp'].values[0] / df['zzavcurr'].values[0]

bm_pp_c_new = bm_pp_usd_off / df['ukurs'].values[0]

>>>bm_pp_c_new
-0.00062209966464868

Have you tried using .at since your calculations use scalars?

df = pd.DataFrame({'bm_pp':[1.0808], 'zzavcurr': [1926.1], 'ukurs':[-0.902]})

bm_pp_usd_off = df.at[0 ,'bm_pp'] / df.at[0 ,'zzavcurr']

bm_pp_c_new = bm_pp_usd_off / df.at[0 ,'ukurs']

>>>bm_pp_c_new
-0.00062209966464868
Matthew Borish
  • 3,016
  • 2
  • 13
  • 25
  • I can't find any typos and the columns in the calculations are of type 'double'. When using .at there is an error : AttributeError: 'DataFrame' object has no attribute 'at' – jeffry Apr 02 '20 at 07:39