2014-10-13 3 views
3

из данных моделирования с переменной timestep У меня есть нерегулярный вектор времени в качестве индекса для моих значений, они хранятся в pandas.DataFrame.Создайте средневзвешенное значение для нерегулярных временных рядов в пандах

Рассмотрим упрощенный тестовый пример:

import pandas as pd 
import datetime 
time_vec = [datetime.time(0,0),datetime.time(0,0),datetime.time(0,5),datetime.time(0,7),datetime.time(0,10)] 
df = pd.DataFrame([1,2,4,3,6],index = time_vec) 

Используя обычный df.mean() -функции приведет к ответу 3.2, который будет только справедливо, если время вектор будет равноудалена.

Я думаю, что правильный результат будет 3,55, что и для первого временного интервала (с нулевым числом секунд), среднее значение равно 1,5, для второго временного интервала среднее значение равно 3 (пять минут) и т. Д., Это приводит к:

1.5 * 0 + 3*5 + 3.5 * 2 + 4.5 * 3 = 35.5 

, в результате чего получается среднее значение 3.55 (35.5/(0 + 5 + 2 + 3)).

Есть ли эффективный способ сделать это с помощью панд?

Это должно, наконец, привести к чему-то вроде

df.resample('15M',how = 'This very Method I am looking for') 

создать средние значения с равноудаленной времени вектора.

ответ

2

Ну, я понял, как решить мою проблему. Я не знаю, если это хорошее решение, но оно работает.

Я изменил исходный код в вопросе путем обмена datetime.time по datetime.datetime, в противном случае он не будет работать (нет метода total_seconds() для datetime.time-Objects). Мне также пришлось импортировать numpy, чтобы иметь возможность использовать numpy.average.

Так что теперь код будет:

import datetime 
import numpy as np 
import pandas as pd 
time_vec =  [datetime.datetime(2007,1,1,0,0) 
       ,datetime.datetime(2007,1,1,0,0) 
       ,datetime.datetime(2007,1,1,0,5)  
       ,datetime.datetime(2007,1,1,0,7) 
       ,datetime.datetime(2007,1,1,0,10)] 
df = pd.DataFrame([1,2,4,3,6],index = time_vec) 

Эта маленькая функция решить мою проблему:

def time_based_weighted_mean(tv_df): 
    time_delta = [(x-y).total_seconds() for x,y in zip(df.index[1:],df.index[:-1])] 
    weights = [x+y for x,y in zip([0]+ time_delta,time_delta+[0])] 
    res = np.average(df[0],weights = weights) 
    return res 
print time_based_weighted_mean(df[0]) 

я первый пытался использовать pd.index.diff() вычислить TIME_DELTA-массив, но это привело к numpy.datetime64 Серия, где я не знал, как преобразовать их в поплавки, так как np.average требует поплавков в качестве входного типа для весов.

Я благодарен за любые предложения по улучшению кода.

Смежные вопросы