Как перебрать списки из pandas dataframe в функции

1

Вот мой dataframe,

 df = pd.DataFrame({'Id': [102,103,104,303,305],'ExpG_Home':[1.8,1.5,1.6,1.8,2.9],
                  'ExpG_Away':[2.2,1.3,1.2,2.8,0.8],
                  'HomeG_Time':[[93, 109, 187],[169], [31, 159],[176],[16, 48, 66, 128]], 
                  'AwayG_Time':[[90, 177],[],[],[123,136],[40]]})

Во-первых, мне нужно создать массив y для данного идентификационного номера, он принимает значения из той же строки (ExpG_Home & ExpG_Away).

y = [1 - (ExpG_Home + ExpG_Away), ExpG_Home, ExpG_Away]

Во-вторых, я нашел это намного сложнее, поскольку Id, используемый при создании y, функция ниже берет соответствующие списки из HomeG_Time & AwayG_Time и создает массив. К сожалению, моя функция занимает одну строку за раз. Мне нужно сделать это для большого набора данных.

x1 = [1,0,0]    
x2 = [0,1,0]    
x3 = [0,0,1]    
total_timeslot = 200      # number of timeslot per game.
k = 1    # constant



#For Id=102 with ExpG_Home=2.2 and ExpG_Away=1.8
HomeG_Time = [93, 109, 187]  
AwayG_Time = [90, 177]
y = np.array([1-(2.2 + 1.8)/k, 2.2/k, 1.8/k])
  # output of y = [0.98 , 0.011, 0.009]

def squared_diff(x1, x2, x3, y):
    ssd = []
    for k in range(total_timeslot):  
        if k in HomeG_Time:
            ssd.append(sum((x2 - y) ** 2))
        elif k in AwayG_Time:
            ssd.append(sum((x3 - y) ** 2))
        else:
            ssd.append(sum((x1 - y) ** 2))
    return ssd

sum(squared_diff(x1, x2, x3, y))
Out[37]: 7.880400000000012

Этот вывод предназначен только для первой строки.

Теги:
pandas
nested-lists

3 ответа

1
Лучший ответ

попробуй это,

import pandas as pd
import numpy as np
df = pd.DataFrame({'Id': [102,103,104,303,305],'ExpG_Home':[1.8,1.5,1.6,1.8,2.9],
                  'ExpG_Away':[2.2,1.3,1.2,2.8,0.8],
                  'HomeG_Time':[[93, 109, 187],[169], [31, 159],[176],[16, 48, 66, 128]], 
                  'AwayG_Time':[[90, 177],[],[],[123,136],[40]]})
x1 = [1,0,0]    
x2 = [0,1,0]    
x3 = [0,0,1]
k=1    
total_timeslot = 200      # number of timeslot per game.

def squared_diff(x1, x2, x3,AwayG_Time,HomeG_Time, y):
    ssd = []
    for k in range(total_timeslot):  
        if k in HomeG_Time:
            ssd.append(sum((x2 - y) ** 2))
        elif k in AwayG_Time:
            ssd.append(sum((x3 - y) ** 2))
        else:
            ssd.append(sum((x1 - y) ** 2))
    return ssd

s=pd.DataFrame( pd.concat([df,1-(df['ExpG_Home']+df['ExpG_Away'])/k,df['ExpG_Home']/k,df['ExpG_Away']/k],axis=1).values)
df['res']=s.apply(lambda x: sum(squared_diff(x1,x2,x3,x[0],x[3],np.array([x[5],x[6],x[7]]))),axis=1) 
del s
print df

Выход:

   AwayG_Time  ExpG_Away  ExpG_Home         HomeG_Time   Id     res
0   [90, 177]        2.2        1.8     [93, 109, 187]  102  4766.4
1          []        1.3        1.5              [169]  103  2349.4
2          []        1.2        1.6          [31, 159]  104  2354.4
3  [123, 136]        2.8        1.8              [176]  303  6411.6
4        [40]        0.8        2.9  [16, 48, 66, 128]  305  4496.2
2

Вот полный отрывок,

>>> import numpy as np
>>> x1 = np.array( [1,0,0] )
>>> x2 = np.array( [0,1,0] )
>>> x3 = np.array( [0,0,1] )
>>> total_timeslot = 200
>>> HomeG_Time = [93, 109, 187]
>>> AwayG_Time = [90, 177]
>>> ExpG_Home=2.2 
>>> ExpG_Away=1.8
>>> y = np.array( [1 - (ExpG_Home + ExpG_Away), ExpG_Home, ExpG_Away] )
>>> def squared_diff(x1, x2, x3, y):
...     ssd = []
...     for k in range(total_timeslot):  
...         if k in HomeG_Time:
...             ssd.append(sum((x2 - y) ** 2))
...         elif k in AwayG_Time:
...             ssd.append(sum((x3 - y) ** 2))
...         else:
...             ssd.append(sum((x1 - y) ** 2))
...     return ssd
... 
>>> sum(squared_diff(x1, x2, x3, y))
4765.599999999989

Предполагая это. Вычислить y как (N, 3) с помощью pandas.DataFrame.apply

>>> y = np.array( df.apply(lambda row: [1 - (row.ExpG_Home + row.ExpG_Away),
...                row.ExpG_Home, row.ExpG_Away ], 
...              axis=1).tolist() )
>>> y.shape
(5, 3)

Теперь ошибка квадрата квадрата для заданного x

>>> def squared_diff(x, y):
...     return np.sum( np.square(x - y), axis=1)

В вашем случае, если error2 is squared_diff(x2,y) вы добавляете это число экземпляров HomeG_Time

>>> n3 = df.AwayG_Time.apply(len)
>>> n2 = df.HomeG_Time.apply(len)
>>> n1 = 200 - (n2 + n3)

Окончательная сумма квадратичной ошибки (согласно вашему расчету)

>>> squared_diff(x1, y) * n1 + squared_diff(x2, y) * n2 + squared_diff(x3, y) * n3
0    4766.4
1    2349.4
2    2354.4
3    6411.6
4    4496.2
dtype: float64
>>>
1
def squared_diff(row):
    y = np.array([1 - (row.ExpG_Home + row.ExpG_Away), row.ExpG_Home, row.ExpG_Away])
    HomeG_Time = row.HomeG_Time
    AwayG_Time = row.AwayG_Time
    x1 = np.array([1, 0, 0])
    x2 = np.array([0, 1, 0])
    x3 = np.array([0, 0, 1])
    total_timeslot = 200
    ssd = []
    for k in range(total_timeslot):  
        if k in HomeG_Time:
            ssd.append(sum((x2 - y) ** 2))
        elif k in AwayG_Time:
            ssd.append(sum((x3 - y) ** 2))
        else:
            ssd.append(sum((x1 - y) ** 2))
    return sum(ssd)

df.apply(squared_diff, axis=1)

Out[]: 
0    4766.4
1    2349.4
2    2354.4
3    6411.6
4    4496.2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню