python Pandas重采样方法无法正常工作

wz3gfoph  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(90)

我一直在分析首尔自行车共享需求数据集,该数据集可在Seoul Bike Sharing Demand上获得。在我的分析过程中,我发现需要使用重采样方法。为了实现这一点,我将数据集加载到一个PandasDataFrame中,我将其命名为df。然后,我使用以下代码片段应用了所需的重采样方法:

label_encoders = {}
categorical_columns = list()
for column in df.columns:
    if df.dtypes[column] in [np.int64, np.float64]:
        pass
    else:
        if column != 'Date':
            categorical_columns.append(column)
            Label_encoder = LabelEncoder()
            label_encoders[column] = Label_encoder
            
            numerical_column = Label_encoder.fit_transform(df[column])
            df[column] = numerical_column
ndf = df.copy()
ndf.set_index('Date', inplace = True)

我想绘制假日和租用自行车数量之间的相关性。

Holiday = ndf[ndf['Holiday'] == 0].resample('D')['Rented Bike Count'].sum()

但我希望它不包括不是假日的日子,在这种情况下,他们的假日列不应该是1(0 ->假日,1 ->非假日)。但是当我运行这段代码时,结果是这样的:

Date
2017-12-22    7184
2017-12-23       0
2017-12-24    2014
2017-12-25    3966
2017-12-26       0
              ... 
2018-10-05       0
2018-10-06       0
2018-10-07       0
2018-10-08       0
2018-10-09       0
Freq: D, Name: Rented Bike Count, Length: 292, dtype: int64

例如,2017-12-23不是假日,但包含在结果中,其他日子如
2018-10-05.但是如果我运行代码,在非节假日做一个小的改变,它似乎工作正常

Holiday = ndf[ndf['Holiday'] == 1].resample('D')['Rented Bike Count'].sum()

而且它和预期的一样不包括在处理中的假日。我的意思是为什么会出现这个问题?在这种情况下我做错了什么?先谢谢你了

drnojrws

drnojrws1#

我的意思是为什么会出现这个问题?在这种情况下我做错了什么?
这不是问题,你没有做错任何事情:-)
重新采样时间序列时,将聚合同一时间片的值。在您的示例中,您将每小时的TS转换为每日的TS,并计算Rented Bike Count的总和。当您过滤数据框以仅保留假日时,您预计只有18天(假日=0 / 24小时时,有432条记录)
你是对的,但是请记住,你使用了resample,所以Pandas将返回一个DatetimeIndex,它从第一个日期(第一个假日)到最后一个日期(最后一个假日)的freq=D。因此,在您的情况下,2017年12月22日至2018年9月25日(278天)之间的所有日子:

m = ndf['Holiday'] == 0
start = ndf[m].index.min()
end = ndf[m].index.max()

# Output
>>> m.sum() / 24
18.0

>>> start
Timestamp('2017-12-22 00:00:00')  # the first holiday

>>> end
Timestamp('2018-09-25 00:00:00')  # the last holiday

>>> end - start + pd.Timedelta(days=1)  # not inclusive, add 1 day
Timedelta('278 days 00:00:00')

代码的输出是:

>>> ndf[ndf['Holiday'] == 0].resample('D')['Rented Bike Count'].sum()
Date
2017-12-22     7184  # first holiday
2017-12-23        0
2017-12-24     2014
2017-12-25     3966
2017-12-26        0
              ...  
2018-09-21        0
2018-09-22        0
2018-09-23    20060
2018-09-24    17259
2018-09-25    23350  # last holiday
Freq: D, Name: Rented Bike Count, Length: 278, dtype: int64
#     ^-- daily freq                       ^-- number of days

要只得到假日,你必须使用布尔掩码m

>>> ndf[ndf['Holiday'] == 0].resample('D')['Rented Bike Count'].sum()[m[m].index.unique()]

Date
2017-12-22     7184
2017-12-24     2014
2017-12-25     3966
2017-12-31     3423
2018-01-01     4290
2018-02-15     3484
2018-02-16     2593
2018-02-17     3118
2018-01-03     5132
2018-01-05    26820
2018-05-22    13790
2018-06-06    30498
2018-08-15    18565
2018-09-23    20060
2018-09-24    17259
2018-09-25    23350
2018-03-10    30349
2018-09-10        0
Name: Rented Bike Count, dtype: int64

注意:您应该按索引(日期)对数据框进行排序,以更好地理解。

相关问题