Advertisement
Guest User

Untitled

a guest
Oct 9th, 2020
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.39 KB | None | 0 0
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "code",
  5. "execution_count": 1,
  6. "metadata": {},
  7. "outputs": [],
  8. "source": [
  9. "open System\n",
  10. "open System.Collections.Generic"
  11. ]
  12. },
  13. {
  14. "cell_type": "code",
  15. "execution_count": 2,
  16. "metadata": {},
  17. "outputs": [],
  18. "source": [
  19. "module PriceMovingAverage =\n",
  20. "\n",
  21. " type PriceRecord =\n",
  22. " {\n",
  23. " Timestamp : DateTime\n",
  24. " Price: float\n",
  25. " }\n",
  26. "\n",
  27. " // queue duration\n",
  28. " let queueDuration = TimeSpan.FromHours(1.)\n",
  29. "\n",
  30. " // moving average queue\n",
  31. " let private priceQueue = Queue<PriceRecord>()\n",
  32. "\n",
  33. " // update moving average\n",
  34. " let updateMovingAverage timestamp price =\n",
  35. "\n",
  36. " // add the new price\n",
  37. " priceQueue.Enqueue({ Timestamp = timestamp; Price = price})\n",
  38. "\n",
  39. " // remove the items older than the price base period\n",
  40. " let rec dequeueLoop () =\n",
  41. " let p = priceQueue.Peek()\n",
  42. " if p.Timestamp + queueDuration < timestamp then\n",
  43. " priceQueue.Dequeue() |> ignore\n",
  44. " dequeueLoop()\n",
  45. "\n",
  46. " dequeueLoop()\n",
  47. "\n",
  48. "\n",
  49. " // get the moving average\n",
  50. " let getPrice fromTimestamp =\n",
  51. " try\n",
  52. " Some (\n",
  53. " priceQueue\n",
  54. " |> Seq.toList\n",
  55. " |> List.skipWhile (fun t -> t.Timestamp < fromTimestamp)\n",
  56. " |> List.averageBy (fun t -> t.Price)\n",
  57. " |> decimal\n",
  58. " )\n",
  59. " with _ ->\n",
  60. " None\n"
  61. ]
  62. },
  63. {
  64. "cell_type": "markdown",
  65. "metadata": {},
  66. "source": [
  67. "add some data"
  68. ]
  69. },
  70. {
  71. "cell_type": "code",
  72. "execution_count": 3,
  73. "metadata": {},
  74. "outputs": [],
  75. "source": [
  76. "let mutable price = 100.\n",
  77. "let mutable date = DateTime(2020, 10, 1)\n",
  78. "let r = Random()\n",
  79. "\n",
  80. "for i in 0..20000 do\n",
  81. " PriceMovingAverage.updateMovingAverage date price\n",
  82. "\n",
  83. " price <- price + 0.5 - r.NextDouble()\n",
  84. " date <- date.AddSeconds(10. * r.NextDouble())\n"
  85. ]
  86. },
  87. {
  88. "cell_type": "markdown",
  89. "metadata": {},
  90. "source": [
  91. "get the data back"
  92. ]
  93. },
  94. {
  95. "cell_type": "code",
  96. "execution_count": 4,
  97. "metadata": {},
  98. "outputs": [
  99. {
  100. "data": {
  101. "text/plain": [
  102. "Some 93.5840892957842M"
  103. ]
  104. },
  105. "execution_count": 4,
  106. "metadata": {},
  107. "output_type": "execute_result"
  108. }
  109. ],
  110. "source": [
  111. "let dateFrom = DateTime(2020, 10, 1, 1, 0, 0)\n",
  112. "PriceMovingAverage.getPrice dateFrom"
  113. ]
  114. },
  115. {
  116. "cell_type": "code",
  117. "execution_count": null,
  118. "metadata": {},
  119. "outputs": [],
  120. "source": []
  121. }
  122. ],
  123. "metadata": {
  124. "kernelspec": {
  125. "display_name": "F#",
  126. "language": "fsharp",
  127. "name": "ifsharp"
  128. },
  129. "language": "fsharp",
  130. "language_info": {
  131. "codemirror_mode": "",
  132. "file_extension": ".fs",
  133. "mimetype": "text/x-fsharp",
  134. "name": "fsharp",
  135. "nbconvert_exporter": "",
  136. "pygments_lexer": "",
  137. "version": "4.3.1.0"
  138. }
  139. },
  140. "nbformat": 4,
  141. "nbformat_minor": 2
  142. }
  143.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement