Skip to content

Instantly share code, notes, and snippets.

@Ednaordinary
Created July 26, 2023 22:57
Show Gist options
  • Save Ednaordinary/c7980ffa11ee6adf9df7431d9e965bfe to your computer and use it in GitHub Desktop.
Save Ednaordinary/c7980ffa11ee6adf9df7431d9e965bfe to your computer and use it in GitHub Desktop.
Predict the next n numbers in a sequence of numbers
import math
def predict(*nums, n):
ognummap = [0] * (len(nums) - 1)
pos = 0
for i in range(len(nums)):
if pos >= len(nums) - 1: continue
ognummap[i] = nums[i + 1] - nums[i]
pos += 1
values = {}
for i in range(len(ognummap)):
values[i] = ognummap[:i + 1]
acc = {}
start = nums[0]
for r, nummap in values.items():
tmpacc = []
num = 0
for i in ognummap:
if i == nummap[num % len(nummap)]: tmpacc.append(1)
else: tmpacc.append(0)
num += 1
acc[r] = sum(tmpacc) / len(tmpacc)
best = [None, 0]
for r, tmpacc in tuple(acc.items())[::-1]:
if tmpacc >= best[1]: best = [r, tmpacc]
predict = [start] + [0] * (len(nums) + n)
for i in range(len(nums) + n):
predict[i+1] = predict[i] + values[best[0]][i % len(values[best[0]])]
return tuple(predict[-n-1:]), best[1], tuple(values[best[0]])
def getnumber(prompt):
while True:
try:
num = int(input(prompt))
break
except:
print("Please input an integer")
return num
while True:
insequence = getnumber("How many numbers are available?")
if insequence < 2: print("Please use a sequence with at least 2 values")
else: break
topredict = getnumber("How many numbers to predict?")
prefix = ("st", "nd", "rd")
numbers = [0] * insequence
for i in range(insequence):
try:
numbers[i] = getnumber(str(i + 1) + prefix[i] + " number>")
except:
numbers[i] = getnumber(str(i + 1) + "th number>")
values, accuracy, nummap = predict(*numbers, n=topredict)
print("Next " + str(topredict) + " values in sequence: " + str(values))
print(str(accuracy * 100) + "% confidence")
print("Number Map: " + str(nummap))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment