Создайте новый столбец, превратив каждую строку в dict в pandas кадре данных - PullRequest
0 голосов
/ 01 мая 2020

Итак, я создал pandas фрейм данных из следующего csv:

id  age00   education   marital gender  ethnic  industry    income00
0   51.965         17         0      1       0         5    76110
1   41.807         12         1      0       0         1    43216
2   36.331         12         1      0       1         3    52118
3   56.758          9         1      1       2         2    47770

Моя цель - создать новый столбец с именем future_income , который берет каждую строку и вычисляет будущее доход с использованием моей модели.

Это делается с помощью переменной gnasttFinalIncome в классе, который я создал ниже:

class myModel:
  def __init__(self, bias) :
    self.bias = bias # bias is a dictionary with info to set bias on the gender function and the ethnic function


  def b_gender(self, gender):
    effect = 0
    if (self.bias["gender"]): # if there is gender bias in this model/world (from the constructor) 
      effect = -0.0005 if (gender<1) else 0.0005  # This amount to 1.2% difference annually
    return self.scale * effect

  def b_ethnic(self, ethnic):
    effect = 0
    if (self.bias["ethnic"]): # if there is ethnic bias in this model/world (from the constructor) 
      effect = -0.0007 if (ethnic < 1) else -0.0003 if (ethnic < 2) else 0.0005 
    return self.scale * effect


  # other methods/functions
  def predictGrowthFactor( self, person ): # edited
    factor = 1 + person['education'] + person['marital'] + person['income'] + person['industry']
    return factor

  def predictIncome( self, person ): # perdict the new income one MONTH later. (At least on average, each month the income grows.)
    return person['income']*self.predictGrowthFactor( person )

  def predictFinalIncome( self, n, person ): 
    n_income = self.predictIncome( person )
    for i in range(n):
       n_income = n_income * i
    return n_income

n в данном случае равно 120.

Итак, вкратце. Я хотел бы взять каждую строку, бросить ее в функцию класса с именем pregnetFinalIncome и иметь новую переменную на моем df с именем future_income, которая является их доходом за 120 месяцев.

РЕДАКТИРОВАТЬ:

Мне на самом деле не нужен личный класс. Я случайно удалил свой init__ в классе, который определяет аргумент 'смещение'. Вместо этого, основываясь на коде @Cavin Dsouza. Но это не работает.

Код читается следующим образом:

utopModel = myModel( { "gender": False, "ethnic": False } ) # no bias


n =120
#Utopia
u = utopModel
world1['incomeFinal_utop'] = world1.apply(lambda row: u.predictFinalIncome(n, row), axis=1)

Таким образом, ошибка заключается в следующем, когда он переходит к предсказаниюFinalIncome:

TypeError: 'str' object cannot be interpreted as an integer

During handling of the above exception, another exception occurred:

KeyError        

KeyError: 'income'


1 Ответ

1 голос
/ 01 мая 2020

Я думаю, вы просто делаете это очень сложно, все вычисления, которые вы сделали, могут быть выполнены с помощью одной функции, если вам не нужны промежуточные результаты для других целей.

Вы можете создать функцию, которая может быть применяется к каждой строке вашего фрейма данных:

def predictFinalIncome(row, n):
    factor = 1 + row['education'] + row['marital'] + row['income'] + row['industry']
    n_income = row['income'] * factor
    for i in range(n):
        n_income = n_income * i
    return n_income

Затем используйте df.apply:

df.apply(lambda r: predictFinalIncome(r, 120), axis=1)

Возвращается 0, потому что когда вы делаете for i in range(n), вы фактически начинаете с 0, таким образом, результат всегда будет 0. Что вам нужно исправить.


Обновление: заставьте функцию жить внутри Model класса

Дон Я не вижу очевидной причины того, что эта функция живет внутри Модели после публикации, особенно эта функция не использует ни другие методы, ни созданный вами атрибут смещения, но здесь это так.

class myModel:
    def __init__(self, bias) :
        self.bias = bias

    def predictFinalIncome(self, row, n):
        factor = 1 + row['education'] + row['marital'] + row['income'] + row['industry']
        n_income = row['income'] * factor
        for i in range(n):
            n_income = n_income * i
        return n_income

# to use:
model = myModel(bias)
df.apply(lambda r: model.predictFinalIncome(r, 120), axis=1)
...