我的随机时间序列算法——Ashutosh Malgaonkar
[## 每当 Ashutosh Malgaonkar 发布时收到电子邮件。
medium.com](https://medium.com/subscribe/@ashu.malgaonkar)
Github 链接到我的代码:
a.数据帧的输入
b.幅度编程
c.编程方向概率
d.随机预测编程
不及物动词制图(https://www . geeks forgeeks . org/how-to-plot-time series-based-charts-using-pandas/)
我用 Kaggle API 访问了数据。这部分代码来自 StackOverflow,作者分享了访问 Kaggle 数据的一般步骤。我引用了他的代码的链接,但我也将在本文中详细介绍它。这些步骤对于任何数据集来说都很正常。
[https://colab.research.google.com/drive/1DofKEdQYaXmDWBzuResXWWvxhLgDeVyl](https://colab.research.google.com/drive/1DofKEdQYaXmDWBzuResXWWvxhLgDeVyl)
现在,让我们预演一下这个项目是如何发生的:
首先,去 kaggle.com,进入你的账户页面。向下滚动到 API 部分,如下图所示。单击“创建新的 API 令牌”。这会将一个名为 kaggle.json 的文件下载到您的计算机上。
接下来,转到您的协作笔记本:
from google.colab import files
files.upload()
运行上面的代码块。这里也有一张图片:
当你运行它时,你会得到一个选择文件的选项,通过它,你可以选择上面刚刚下载到你电脑上的 kaggle.json 文件。
一旦你这样做了,它就会像上图一样说 100%,现在你就连接上 kaggle 了。
接下来,运行这个代码块,看看是否有一个文件。
现在已经检测到 kaggle.json 文件,请在下一个块中键入:
!pip install -q kaggle
接下来,我们必须使用 mkdir 移动该文件,并按照引用的教程中所述进行权限更改:
# The Kaggle API client expects this file to be in ~/.kaggle,# so move it there.!mkdir -p ~/.kaggle!cp kaggle.json ~/.kaggle/# This permissions change avoids a warning on Kaggle tool startup.!chmod 600 ~/.kaggle/kaggle.json
现在你将被连接。现在,您可以使用下面的命令列出所有 kaggle 数据集,以便查看它们:
# List available datasets.!kaggle datasets list
它看起来会像这样:
接下来进入https://www . ka ggle . com/datasets/ternary realm/airlines-passenger-data
接下来,将其粘贴到:
!kaggle datasets download -d chirag19/air-passengers
运行后,我们可以使用!ls 列出文件:
!ls
使用以下方法解压缩数据:
! unzip /content/air-passengers.zip -d /content/
现在,我们可以开始了…
现在,数据已经在 google collab 中,我们将把它放入一个数据框架中进行处理:
import pandas as pddf = pd.read_csv('AirPassengers.csv')
让我们来看看这些数据是否正确:
df.head()
以上是前五行,看起来像我们想要的那样。
穿越时间的东西有两个属性:
单向
2 级
在这种情况下,幅度是随着月份的变化而变化的步长。让我们对它进行编程:
首先,我将把第 2 列转换成如下所示的列表:
a = list(df['#Passengers'])print(a)
然后,我写了这个算法,通过数据计算步长:
让我们浏览一下上面的代码来理解发生了什么。
首先,我初始化了一个值为 0 的列表。这是因为,底部的第一个单元格没有步长,它是起始值,之前没有值,所以直到它的变化幅度为 0。
接下来,我初始化了一个变量 i=0。这样做是为了在遍历列表时以索引值 0 开始循环。
然后,我开始一个 while 循环来计算列表中的步长,直到它到达 len(a)-1
在循环内部,我计算特定 I 指数的步长。步长就是下一个值减去循环当前的值。
step = a[i+1]-a[i]
下一部分,我陈述了一些逻辑,如果步长的值为 0,那么将它设置为 0.1。我这样做的原因是我在计算中使用了调和平均值。调和平均值不能使用 0 值,在这里,因为步长的大小通常远离 0,所以我可以将其设置为 0.1 这样的低值,而不会对算法产生太大影响。
我在这里所做的基本上是将步骤添加到空列表 b 中,随着循环的进行,它会变得更长。最后是 i+=1,它将循环向前推到终点。
之后,让我们将它放回数据帧中,然后检查前几行:
df['stepsize']=bdf.head()
现在,我们可以在一列中看到步长。
接下来,我将把列表 b(步长列表)中的值转换成绝对值:
同样,这样做的原因是为了确保我可以计算调和平均值:
#make an absolute value list:
c=[]
for i in b:
c.append(abs(i))
现在,我编写了另一个 while 循环算法,使调和平均值在序列中传播:
首先,我导入了统计包,然后用 0,0 创建了一个列表,以跳过数据集的第一行和第二行。然后我做了两个指针 I 和 j,我会保持在 1,j 会遍历这个序列,并把它添加到我用两个 0 初始化的 harmean 列表中。为了向前移动循环,注意我只是向前移动 j 指针,保持 I 指针不动。
为了向前移动循环,注意我只是向前移动 j 指针,保持 I 指针不动。
让我们把它扔回到数据框架中:
df['harmean of magnitude'] = harmean
以上是看起来的样子。
现在,是时候通过计算先验概率来引入随机性了。然而,在这里我们将不得不再次编写一个向前传播的算法:
让我们看看我是如何通过实现上面的算法来解决这个挑战的。
首先,我通过初始化变量 j = 1 来设置一个指针。接下来,我建立了两个列表。第一个名为 countofup,当步长为正数(向上)时将被附加 1,当步长为负数时将被附加-1。我要开始的另一个列表是概率。这将在前 n 步中附加上概率 up。
df['probabilityofup'] = probabilityofup
接下来,我创建了这个随机算法来输出预测:
首先,我提取三列作为列表。我从 dataframe #passengers 中提取 actuals 列,并将其放入列表 a。然后,在列表 b 中,我存储幅度列的谐波平均值(前面显示的算法)。接下来,在列表 c 中,我放置 up 列的概率(前面显示的算法)。
然后我创建了一个有两个零的列表,叫做 pred。
我在 i = 1 处启动一个指针,这是预测输出中的第一个值。公式是:
**Prior actual value + (harmonic mean of previous magnitues * (if a random number between 0 and 1 is greater than the prior probability of up then -1 else 1))**
while 循环算法将此公式传播到数据的最后一行。
一旦循环结束,我们将把它放入 pred,然后输出 df。
绘制预测和实际图表的代码基于 geeksforgeeks→https://www . geeksforgeeks . org/how-to-plot-time series-based-charts-using-pandas/的这个页面
下面是我如何实现 geeksforgeeks 代码的:
接下来,我们将在每一行用这个来计算 MAPE。本质上,该公式计算实际值和预测值之间的绝对差值,然后除以实际值。将它乘以 100,我们得到每行的绝对百分比误差。MAPE 是每行误差百分比的平均值。
#MAPEnew_df['abspercent diff'] = (abs(new_df['#Passengers']-new_df['prediction'])/new_df['#Passengers']) * 100
现在,我们将计算 MAPE,并使用以下代码将其打印出来:
mape = "The mape is"print("The mape is " + str(new_df['abspercent diff'].mean()) + " %")
运行这个程序后,我们看到 MAPE 大约为 10.48%。
感谢您阅读我的作品。
引用:
- https://colab . research . Google . com/drive/1 dofkedqyaxmdbzuresxwwvxhlgdevyl
- https://www . geeks forgeeks . org/how-to-plot-time series-based-charts-using-pandas/
- https://www . ka ggle . com/datasets/ternary realm/airlines-passenger-data
再次链接到我的 GitHub: