python - 请解释下面提到的这行代码
问题描述
首先,“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
解决方案
尽管当前的答案提供了一个很好的解决方法,但它并没有真正解释问题中的代码是如何工作的:
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 小时)应用rolling
它time_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
我希望你更清楚。
推荐阅读
- javascript - 调度程序在接收反应本机的参数之前发送请求
- c# - 如何在c#中正确使用soap webservice客户端
- c++ - 此类设置是否违反 Liskov 替换原则
- php - Algolia 在本地工作,但不在使用 laravel 的实时服务器上工作
- swift - 如何将 ARKit 捕获帧的 CVPixelBuffer 颜色空间转换为 RGB
- legend - dc.js 复合图表切换图例在过滤时失去半透明
- macos - nanotime 在 MacOS 上做了什么?
- c++ - C++根据条件初始化变量
- npm - 无法使用超级账本作曲家启动超级账本结构网络
- mysql - 将数据插入表中,如果特定列的值不存在,则应输入零