首页 > 解决方案 > 请解释下面提到的这行代码

问题描述

首先,“clicks”数据帧通过函数“get_data_splits”传递,该函数返回 train、valid 和 test。此外,它通过训练模型传递。

clicks = clicks.join(interactions)
print("Score with interactions")
train, valid, test = get_data_splits(clicks)
_ = train_model(train, valid)

线索:您将创建的第一个特征是过去六个小时内来自同一 IP 的事件数。经常访问的人很可能会下载该应用程序。实现一个函数 count_past_events,该函数采用一系列点击时间(时间戳)并返回另一个带有过去一小时内事件数的系列。但我无法理解这些代码行。

def count_past_events(series, time_window='6H'):
    series = pd.Series(series.index, index=series)
    past_events = series.rolling(time_window).count() - 1
    return past_events

标签: pythonpandasmachine-learningdata-science

解决方案


尽管当前的答案提供了一个很好的解决方法,但它并没有真正解释问题中的代码是如何工作的:

def count_past_events(series, time_window='6H'):
    series = pd.Series(series.index, index=series)
    past_events = series.rolling(time_window).count() - 1
    return past_events

让我们从另一个问题创建一个玩具系列:

import pandas as pd
input_serie = pd.Series(["1/1/2016 12:00:20 AM",
                         "1/2/2016 5:03:20 AM",
                         "1/2/2016 5:06:20 AM",
                         "1/2/2016 5:07:20 AM",
                         "1/2/2016 6:06:20 AM",
                         "1/3/2016 00:00:20 AM"],
                         name='date',
                         dtype = 'datetime64[ns]'
                       ) 

它看起来像这样:

0   2016-01-01 00:00:20
1   2016-01-02 05:03:20
2   2016-01-02 05:06:20
3   2016-01-02 05:07:20
4   2016-01-02 06:06:20
5   2016-01-03 00:00:20
Name: date, dtype: datetime64[ns]

现在我们可以逐行打破它:

series = pd.Series(series.index, index=series)

给定一个输入Series对象,您构建一个新对象,使用输入序列的值作为新对象的索引。这是因为默认情况下滚动窗口适用于索引。

series看起来像这样:

date
2016-01-01 00:00:20    0
2016-01-02 05:03:20    1
2016-01-02 05:06:20    2
2016-01-02 05:07:20    3
2016-01-02 06:06:20    4
2016-01-03 00:00:20    5
dtype: int64

到下一行:

past_events = series.rolling(time_window).count() - 1

rolling函数是应用于您的 DataFrame/Series 的聚合,它仅考虑有限数量的行,或者在您的情况下是一个时间范围。现在您的系列索引是一个日期时间,您可以根据自己的选择(在您的情况下为 6 小时)应用rollingtime_windows,并且您希望该count()时间范围内的事件。'-1' 在这里只是为了避免计算当前事件,而只计算过去的事件。

返回的结果如下所示:

date
2016-01-01 00:00:20    0.0 --> No event before
2016-01-02 05:03:20    0.0 --> first event of the day
2016-01-02 05:06:20    1.0 --> one event in the past 6 h
2016-01-02 05:07:20    2.0 --> two events in the past 6 h
2016-01-02 06:06:20    3.0 --> three events in the past 6 h
2016-01-03 00:00:20    0.0 --> next day, no event in the past 6 h
dtype: float64

我希望你更清楚。


推荐阅读