Получение среднего значения из фрейма данных, состоящего из метки времени pandas

У меня есть две серии панд, closedDate и createdDate, это элементы временных меток панд, class 'pandas._libs.tslib.Timestampclass 'pandas._libs.tslib.Timestamp.

Я вычел эти две серии панд, чтобы составить список age из панд timedelta.

closedDate = data.iloc[:,1]
createdDate = data.iloc[:,2]
age = [x-y for x,y in zip(closedDate, createdDate)]

Теперь я хочу получить среднее значение age, но с моей строкой кода я получаю сообщение об ошибке.

In: average_age = functools.reduce(lambda x, y: x + y, age) / len(age)

Вышел: OverflowError: int too big to convert

Как я могу это исправить??

Спасибо!


person cool_beans    schedule 21.05.2018    source источник


Ответы (2)


Вы можете и должны стремиться использовать векторизованные функции для этой задачи.

В этом примере вы можете вычесть один pd.Series из другого. Затем вы можете использовать метод mean для расчета среднего значения.

data = pd.DataFrame({'createdDate': [pd.Timestamp('2018-01-01'),
                                     pd.Timestamp('2018-05-01')],
                     'closedDate': [pd.Timestamp('2018-02-01'),
                                    pd.Timestamp('2018-07-01')]})

closedDate = data['closedDate']
createdDate = data['createdDate']

ages = closedDate - createdDate

print(ages)

# 0   31 days
# 1   61 days
# dtype: timedelta64[ns]

res = ages.mean()

print(res)

# 46 days 00:00:00

Есть две основные причины, по которым в этом случае лучше использовать векторизованные функции:

  1. В основе pd.Timestamp лежат числовые массивы (источник).
  2. zip для массивов хуже, чем zip для списков (источник).
person jpp    schedule 21.05.2018

Вы должны сделать это с такими сериалами, как предложенный jpp, но за исключением этого, вот как вы можете сделать это с предоставленным вами списком.

average_age = sum(age, timedelta()) / len(age)
person M Sandler    schedule 21.05.2018