Вычисление значений из последовательных строк панды

Я начинаю python, пытаясь предварительно обрабатывать данные таймсерии, чтобы я мог вычислить некоторые изменения, поскольку объект перемещается по ряду узлов и ребер, чтобы я мог рассчитывать остановки, объединять их в маршруты и понимать поведение по маршруту. Первоначально данные поступают в виде двух файлов CSV (вход, Typedoc = 0 и разрешение, Typedoc = 1, каждая около 85 тыс. Строк / 19 МБ), которые я объединил в 1 файл и выполнил некоторое уменьшение размерности. Мне удалось превратить его в мультииндексный фрейм. Вот фрагмент:

In [1]: movements.head() Out[1]: Typedoc Port NRT GRT Draft Vessname ECDate 400 L 2012-01-19 0 2394 2328 7762 4.166667 2012-07-22 1 2394 2328 7762 17.000000 2012-10-29 0 2395 2328 7762 6.000000 A 397 2012-05-27 1 3315 2928 2928 18.833333 2012-06-01 0 3315 2928 2928 5.250000 

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

  stops_dict = {'400 L':[ ['2012-01-19', 0, 2394, 4.166667], ['2012-07-22', 1, 2394, 17.000000], ['2012-10-29', 0, 2395, 6.000000] ] } 

Если значения вложенных списков:

  [ECDate, Typedoc, Port, Draft] 

Если i = 0, то значения, которые меня интересуют, – это время ожидания и транзита, а также изменение проекта, рассчитанное как:

  t_dwell = stops_dict['400 L'][i+1][0] - stops_dict['400 L'][i][0] d_draft = stops_dict['400 L'][i+1][3] - stops_dict['400 L'][i][3] i += 1 

а также

  t_transit = stops_dict['400 L'][i+1][0] - stops_dict['400 L'][i][0] 

если все типы dtypes верны (большое, если, поскольку я не освоил получение панд, чтобы анализировать мои даты). Затем я собираюсь извлечь ссылки в виде:

  link = str(stops_dict['400 L'][i][2])+'->'+str(stops_dict['400 L'][i+1][2]),t_transit,d_draft 

Значения t_transit и d_draft как веса кромки. Узлы – это список уникальных значений порта, которым присваиваются значения «400 L»: [t_dwell, NRT, GRT] k, v (как-то). Я не понял этого точно, но я не думаю, что мне нужна помощь в этом процессе.

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

  with open(filename,'sb) as csvfile: datareader = csv.reader(csvfile, delimiter=",") next(datareader, None) <FLOW CONTROL> #based on Typedoc and ECDate values 

Функция добавляет к пустому словарю:

  stops_dict = {} def createStopsDict(row): #this reads each row in a csv file, #creates a dict entry from row[0]: Vessname if not in dict #or appends things after row[0] to the dict entry if Vessname in dict ves = row[0] if ves in stops_dict: stops_dict[ves].append(row[1:]) else: stops_dict[ves]=[row[1:]] return 

Это неэффективный способ делать что-то … Я мог бы использовать iterrows вместо csv-ридера … Я искал расплав и неустойчивость, и я не думаю, что это правильно … Это похоже на groupby, но мне не удалось реализовать это правильно из-за мультииндекса …

Есть ли более простой, смелый, я говорю «элегантный» способ сопоставить строки данных данных на основе значения нескольких индексов непосредственно в многократно используемой структуре данных (прямо сейчас словарь stop_dict).

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

Благодаря!

ОБНОВЛЕНИЕ 2: Я думаю, что у меня это в основном выяснено … Начиная с моих исходных движений фреймов данных:

  movements.reset_index().apply( lambda x: makeRoute(x.Vessname, [x.ECDate, x.Typedoc, x.Port, x.NRT, x.GRT, x.Draft]), axis=1 ) 

где:

  routemap = {} def makeRoute(Vessname, info): if Vessname in routemap: route = routemap[Vessname] route.append(info) else: routemap[Vessname] = [info] return 

возвращает словарь, связанный с Vessname в структуре, которую мне нужно вычислить, вызывая элементы списка.