Группируйте мультииндексные кадры данных по меткам для расчета среднего - PullRequest
0 голосов
/ 03 января 2019

У меня есть случайный алгоритм, который создает файлы .csv. Содержимое файлов выглядит следующим образом:

module, coverage, timestamp
examples.monkey, 32.142857142857146, 1546513589.59586
examples.monkey, 35.714285714285715, 1546513589.609822
examples.monkey, 35.714285714285715, 1546513589.617172
...
util.container, 27.586206896551722 ,1546513594.559889
util.container, 27.586206896551722 ,1546513594.579989
util.container, 27.586206896551722 ,1546513594.598491

У меня от 30 до 100 таких файлов, средняя длина которых составляет пару тысяч строк.

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

До сих пор я читал все файлы .csv и объединял их в новый фрейм данных.

allFiles = glob.glob("out/*.csv")
dfs = []

for file_ in allFiles:
    df = pd.read_csv(file_, index_col=None, header=0)
    dfs.append(df)

keys = ["Run " + str(i) for i in range(len(dfs))]
glued = pd.concat(dfs, axis=1, keys=keys)

В результате получается кадр данных, который выглядит следующим образом:

             Run 0                 ...           Run 4              
            module   coverage      ...        coverage     timestamp
0  examples.monkey  32.142857      ...       32.142857  1.546514e+09
1  examples.monkey  35.714286      ...       32.142857  1.546514e+09
2  examples.monkey  35.714286      ...       32.142857  1.546514e+09
3  examples.monkey  35.714286      ...       35.714286  1.546514e+09
4  examples.monkey  35.714286      ...       35.714286  1.546514e+09

Теперь моя первоначальная идея состояла в том, чтобы просто группировать по всем прогонам, группируя по модулям и временным меткам на уровне = 1, по оси = 1. Как это

grouped = glued.groupby(by=["module", "timestamp"], level=1, axis=1)

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

Так, как мне лучше всего получить среднее покрытие на модуль и временную метку для нескольких файлов?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вы можете использовать concat на axis=0, что является параметром по умолчанию, поэтому его следует удалить, затем преобразовать первый уровень в столбец Run и агрегировать mean:

allFiles = glob.glob("out/*.csv")

#instead loop list comprehension, but your solution working nice too
dfs = [pd.read_csv(fp,skipinitialspace=True) for fp in allFiles]
keys = ["Run " + str(i) for i in range(len(dfs))]

glued = pd.concat(dfs, keys=keys).reset_index(level=0).rename(columns={'level_0':'Run'})
#convert float column to datetimes 
glued['timestamp'] = pd.to_datetime(glued['timestamp'], unit='s')
#print (glued)

#specify columns what need 
grouped = glued.groupby(by=["Run","module", "timestamp"], as_index=False).mean()
#print (grouped)

grouped1 = glued.groupby(by=["module", "timestamp"], as_index=False).mean()
#print (grouped1)
0 голосов
/ 03 января 2019

Я не уверен, почему ваш ответ не работает, я не очень знаком с groubpy в многоуровневом столбце.Я могу предложить ответ, который должен работать.Как отметил @jezrael в своих комментариях, вы объединяете свой фрейм данных, добавляя новые столбцы вместо конкатенации в строках.Если вы сделаете:

glued = pd.concat(dfs)
grouped = glued.groupby(["module", "timestamp"])
mean_by_group = grouped.mean() 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...