Почему я получаю NaN вместо переменной? - PullRequest
0 голосов
/ 05 марта 2020

Доброе утро,

Я хотел бы спросить вас, почему я получаю Нэн из этого кода? У меня есть Dataframe, где только 4 столбца: flightID, отметка времени, X и Y.

Для каждого рейса у меня есть несколько рядов с разными отметками времени и позициями x, y. То, что я хочу, это рассчитать время от каждой координаты x, y. Затем я хочу сравнить время, полученное от каждой координаты x, y, и иметь только самые маленькие значения для каждой координаты x, y. Я надеюсь, что код написан хорошо, но в последнем массиве min_time у меня есть куча NaN для x или y, подскажите, пожалуйста, почему?

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

data = {'flightID':['11111', '11111', '11111', '11111','2222','2222','2222','3333','3333','3333','3333'], 'timestamp':[1519669804, 1519669844,  1519669884, 1519669924,1519669976,1519679614,1519679615,1519679616,1519679800,1519679876,1519679999],'X':[1,1,1,1,2,3,4,4,4,5,6],'Y':[7,7,7,7,7,7,7,8,8,8,9]} 

Grid_frame2 = pd.DataFrame(data)




    # finding the cells which has something 
flight = []
min_time=[]

for j in range(len(Grid_frame2)-1):
    if Grid_frame2.flightID[j] == Grid_frame2.flightID[j+1]:        # find all the rows from the same flight
        arr = [Grid_frame2.timestamp[j]]
        arr.append(Grid_frame2.X[j])
        arr.append(Grid_frame2.Y[j])
        flight = np.reshape(flight,(-1,3))
        flight = np.vstack((flight,arr))
        arr = []
    else:                                                         # if you have the last one, compute time flown
        time = flight[-1][0] - flight[0][0]
        time = abs(time)
        x = flight[0][1]
        y = flight[0][2]
        if len(min_time) == 0:                                    # if min_time array is empty, insert values
            arr = [time]
            arr.append(x)
            arr.append(y)
            min_time.append(arr)
            arr = []
            flight = []
        else:                                                     # is it is not empty, check if there is the same cell and if it is not smaller value
            for k in range(len(min_time)):
                if min_time[k][1] == x and min_time[k][2] == y and min_time[k][0] > int(time):
                    min_time[k][0] = time
                    flight= []
                elif min_time[k][1] == x and min_time[k][2] == y and min_time[k][0] < int(time):
                    flight = []
                    pass
                else:                                             # if there is no same cell or the value isn't higher, insert values
                    arr = [time]
                    arr.append(x)
                    arr.append(y)
                    min_time = np.vstack((min_time,arr))
                    #min_time = np.reshape(min_time,(-1,3))
                    arr = []
                    flight = []

Проблема в том, что если я пытаюсь увидеть, что после этого l oop в массиве min_time это выглядит так:

> array([[691.,   1.,   7.],
       [812.,  nan,   7.],
       [898.,   6.,  nan],
       ...,
       [769.,  nan,   9.],
       [769.,  nan,   9.],
       [769.,  nan,   9.]])

Кроме того, длина должна быть 150, поскольку у меня есть сетка с координатами x, y (10x15), а длина на самом деле больше чем 1000

1 Ответ

0 голосов
/ 06 марта 2020

Я прочитал ваш код и заметил здесь проблему:

if min_time[k][1] == x and min_time[k][2] == y and min_time[k][0] > int(time):
    ...
elif min_time[k][1] == x and min_time[k][2] == y and min_time[k][0] < int(time):
    ...

Что если min_time[k][0] == int(time)? Эта дополнительная строка может исходить отсюда.

Однако даже после настройки здесь код ведет себя странно (я не уверен, что вы хотите сделать, и требуется дополнительная информация)


Надеюсь, я понимаю ваш код и что вы здесь делаете, ниже приведены некоторые советы или подсказки.

  1. Сделайте ваш код более элегантным и читабельным.

    # Yes
    min_time.append([time,x,y])
    
    # No
    arr = [time]
    arr.append(x)
    arr.append(y)
    min_time.append(arr)
    arr = []
    
    # Yes
    flight.append(Grid_frame2.loc[j,['timestamp','X','Y']])
    
    # No
    arr = [Grid_frame2.timestamp[j]]
    arr.append(Grid_frame2.X[j])
    arr.append(Grid_frame2.Y[j])
    flight = np.reshape(flight,(-1,3))
    flight = np.vstack((flight,arr))
    arr = []
    
  2. Вы найдете очарование и магию c из pandas после запуска этого (я думаю, вы можете захотеть сделать это):

    def get_flight_info(x):
        time = x['timestamp'].iloc[-1]-x['timestamp'].iloc[0]
        location = x[['X','Y']].iloc[0]
        return location.append(pd.Series([time],index=['min_time']))
    
    flight_info = Grid_frame2.groupby(['flightID']).apply(get_flight_info)
    min_time_in_location = flight_info.groupby(['X','Y'])['min_time'].min()
    
...