Omnet ++ / Данные в ячейке панд (список) и ряд панд (столбец) - PullRequest
0 голосов
/ 06 мая 2019

Поэтому я использую Omnet ++, симулятор сети с дискретным временем, для моделирования различных сетевых сценариев. В какой-то момент можно продолжить обработку выходной статистики Omnet ++ и сохранить ее в файле .csv.

Интересно, что для каждого времени (vectime) есть значение (vecvalue). Эти vectime / vecvalues ​​хранятся в одной ячейке такого CSV-файла. При импорте в Pandas Dataframe я получаю что-то вроде этого.

In [45]: df1[['module','vectime','vecvalue']]
Out[45]: 
              module                                            vectime                                           vecvalue
237  Tictoc13.tic[1]  [2.542245319062, 3.066965320033, 4.78723506093...  [0.334535581612, 0.390459633837, 0.50391696492...
249  Tictoc13.tic[4]  [2.649303071938, 6.02527384362, 21.42434044990...  [2.649303071938, 1.654927100273, 3.11051622577...
261  Tictoc13.tic[3]  [4.28876656608, 16.104821448604, 19.5989313700...  [2.245250432259, 3.201153958979, 2.39023520069...
277  Tictoc13.tic[2]  [13.884917126016, 21.467263378748, 29.59962616...  [0.411703261805, 0.764708518232, 0.83288346614...
289  Tictoc13.tic[5]  [14.146524815409, 14.349744576545, 24.95022463...  [1.732060647139, 8.66456377103, 2.275388282721...

Например, если мне нужно построить каждое значение vectime / vecvalue для каждого модуля, сегодня я делаю следующее ...

%pylab

def runningAvg(x):
    sigma_x = np.cumsum(x)
    sigma_n = np.arange(1,x.size + 1)
    return  sigma_x / sigma_n

for row in df1.itertuples():
    t = row.vectime
    x = row.vecvalue
    x = runningAvg(x)
    plot(t,x)

... чтобы получить это ...

enter image description here

Мой вопрос: что лучше с точки зрения производительности:

  • использовать данные как есть, то есть использовать эти массивы внутри каждой ячейки, проходя по DF для построения каждого массива;
  • преобразовать эти массивы в pd.Series. В этом случае, что было бы лучше, чтобы модуль по-прежнему оставался индексным?
  • выиграл бы я, если бы эти массивы были перенесены в pd.Series?

спасибо!

1 Ответ

0 голосов
/ 15 мая 2019

Что ж, я удивился, и кажется, что преобразование данных Omnet в pd.Series может оказаться не таким эффективным, как я думал.

Это два моих метода:

1) Используя данные Omnet как есть, списки внутри Pandas DF.

figure(1)

start = datetime.datetime.now()

for row in df1.itertuples():
    t = row.vectime
    x = row.vecvalue
    x = runningAvg(x)
    plot(t,x)

total = (datetime.datetime.now() - start).total_seconds()
print(total)

При выполнении вышеописанного total равно 0.026571.

2) Преобразование данных Omnet в pd.Series.

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

figure(2)

start = datetime.datetime.now()

t = df1.vectime
v = df1.vecvalue
t = t.apply(pd.Series) 
v = v.apply(pd.Series)
t = t.T
v = v.T

sigma_v = np.cumsum(v)
sigma_n = np.arange(1,v.shape[0]+1)
sigma   = sigma_v.T / sigma_n

plot(t,sigma.T)

total = (datetime.datetime.now() - start).total_seconds()
print(total)

Для более поздних версий total - это 0.57266.

Так что, похоже, я буду придерживаться метода 1, проходя по разным строкам.

...