Pandas subampling

У меня есть некоторые данные о событиях, которые измеряются во времени, поэтому формат данных выглядит

Time(s)    Pressure    Humidity
0             10            5 
0             9.9           5.1
0             10.1          5
1             10            4.9
2             11            6

Здесь первый столбец - Время, прошедшее с начала эксперимента, в секундах. Два других столбца - это некоторые наблюдения. Строка создается, когда определенные условия выполняются, эти условия выходят за рамки обсуждения здесь. Каждый набор из 3 чисел, разделенных точкой с запятой, представляет собой строку данных. Поскольку самая низкая гранулярность разрешения по времени здесь составляет всего несколько секунд, у вас может быть две строки с одной и той же отметкой времени, но с разными наблюдениями. По сути, это были два разных события, которые время не могло различить.

Теперь моя проблема состоит в том, чтобы свернуть ряд данных, сэмплируя его, скажем, каждые 10 или 100 секунд, или 1000 секунд. Итак, я хочу получить серию данных с уменьшенным размером из исходного ряда данных с более высокой гранулярностью. Есть несколько способов решить, какую строку вы будете использовать, например, сказать, что вы выполняете субсэмплирование каждые 10 секунд, а по истечении 10 секунд вы можете иметь несколько строк с отметкой времени 10 секунд. Вы могли бы либо взять

1) first row
2) mean of all rows with the same timestamp of 10
3) some other technique

Я собираюсь сделать это в пандах, любые идеи или способ начать будут очень благодарны. Благодарю.

1 ответ

Решение

Вот простой пример, который показывает, как выполнять операции, запрошенные с пандами.

Один использует объединение данных для группировки выборок и повторной выборки данных.

import pandas as pd

# Creation of the dataframe
df = pd.DataFrame({\
'Time(s)':[0 ,0 ,0 ,1 ,2],\
'Pressure':[10, 9.9, 10.1, 10, 11],\
'Humidity':[5 ,5.1 ,5 ,4.9 ,6]})

# Select time increment
delta_t = 1

timeCol = 'Time(s)'
# Creation of the time sampling
v = xrange(df[timeCol].min()-delta_t,df[timeCol].max()+delta_t,delta_t)
# Pandas magic instructions with cut and groupby
df_binned = df.groupby(pd.cut(df[timeCol],v))
# Display the first element
dfFirst = df_binned.head(1)
# Evaluate the mean of each group
dfMean = df_binned.mean()
# Evaluate the median of each group
dfMedian = df_binned.median()
# Find the max of each group
dfMax = df_binned.max()
# Find the min of each group
dfMin = df_binned.min()

Результат будет выглядеть так dfFirst

           Humidity  Pressure  Time(s)
Time(s)
(-1, 0] 0       5.0        10        0
(0, 1]  3       4.9        10        1
(1, 2]  4       6.0        11        2    

Результат будет выглядеть так dfMean

         Humidity  Pressure  Time(s)
Time(s)
(-1, 0]  5.033333        10        0
(0, 1]   4.900000        10        1
(1, 2]   6.000000        11        2 
Другие вопросы по тегам