簡體   English   中英

如何在重采樣時間序列上使用 mode()?

[英]How to use mode() on resampling timeseries?

我有一個具有時間序列的 dataframe,每個數據對應一個 day_of_week(周一至周日)

我很想知道我的時間序列何時轉換為每月,每個月出現頻率最高的 day_of_week 是什么,我使用以下內容:

bike['days_of_the_week'].resample('M').mode()

但這給了我錯誤

AttributeError: 'DatetimeIndexResampler' object 沒有屬性 'mode'

所以“模式”不適用於時間序列? 那么在重新采樣后找出“模式”問題的最佳方法是什么?

根據pd.DataFrame.resample的文檔,您可以使用apply來傳遞自定義重采樣器。 SciPy 有一個您可以使用的實現scipy.stats.mode ,並進行了一些調整。

import scipy.stats

def mode(xs):
    return scipy.stats.mode(xs)[0][0]

這是一個例子:

import pandas as pd

days = pd.date_range('2019-01-01', '2019-12-31')
bike = pd.DataFrame({'days_of_the_week': days.weekday_name}, index=days) 

bike['days_of_the_week'].resample('M').apply(mode)
# 2019-01-31    Thursday
# 2019-02-28      Friday
# 2019-03-31      Friday
# 2019-04-30      Monday
# 2019-05-31      Friday
# 2019-06-30    Saturday
# 2019-07-31      Monday
# 2019-08-31      Friday
# 2019-09-30      Monday
# 2019-10-31    Thursday
# 2019-11-30      Friday
# 2019-12-31      Monday
# Freq: M, Name: days_of_the_week, dtype: object

@mcskinner 的答案在大多數情況下都有效,但我建議在 dataframe 不連續以避免 IndexError 的情況下捕獲錯誤

from scipy import stats
def mode(xs):
    try:
        return stats.mode(xs)[0][0]
    except IndexError:
        return np.nan

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM