首页 > 解决方案 > 将短周期的到达数据转换为生成器函数

问题描述

我有一个包含 24 小时窗口的到达时间的数据集。通过绘制数据,我注意到它似乎大致是线性的。我想把它转换成python中的生成器。

绘制数据:https ://i.imgur.com/i2CJhtY.png

Arrival data in min of day:
287.73
302.17
318.03
357.66
389.87
392.82
395.99
406.47
446.29
466.47
...
1341.88
1342.17
1348.14
1348.76
1369.15
1384.69
1390.71
Day ends at 1440mins

如何将此 24 小时数据转换为生成器函数,以便我每次调用该函数时都可以生成下一个到达时间,甚至超过原来的 24 小时周期?它不需要是线性函数,也可能是指数函数。

我正在考虑将数据外推到一个大的 df 集中,但这在内存上似乎相当低效,我也不确定如何以这种方式外推。

def generator(df):
    for index, row in df.iterrows():
        yield row['time']

标签: pythonpandas

解决方案


(编辑:改进的生成器输出格式)

您可能希望对此进行线性回归。

这个想法是在你的数据集上训练一个模型来学习函数。这称为“拟合”模型。然后您可以使用此模型来预测未来的到达时间。

这是一个例子:

我将假设您的数据框如下所示:

    0
0   20.130714
1   37.598029
2   46.015164
3   52.042456
4   64.218346
5   58.528393
....
145 1296.520794
146 1320.282179
147 1327.387859
148 1326.318235
149 1337.973246

其中第一列是索引,第二列是到达时间。

from sklearn.linear_model import LinearRegression

def generator(df):
    X = df.index.values.reshape(-1,1)
    y = df.values

    reg = LinearRegression().fit(X,y)

    i=1
    while True:
        yield np.asscalar(reg.predict(X[-1].reshape(1,-1)+i))
        i+=1

测试:

for i,v in enumerate(generator(df)):
    print(i,v)
    if i == 10:
        break

产量:

0 1358.2313994853853
1 1367.2216112477986
2 1376.2118230102114
3 1385.2020347726243
4 1394.1922465350372
5 1403.1824582974505
6 1412.1726700598633
7 1421.1628818222762
8 1430.1530935846895
9 1439.1433053471023
10 1448.1335171095152

推荐阅读