Как генерировать гистограммы из исторических данных о недельных потребностях - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть следующие данные - исторические еженедельные потребности, основанные на данных продаж за два года (104 недели) historical weekly demands based on two years (104 weeks) of sales data Я хочу сгенерировать гистограмму случайно сгенерированных точек данных и сравнить с исторической частотой ( Например: изображение на правой стороне является примером гистограммы, которую я хочу сгенерировать из заданных данных, а изображение на левой стороне - это примерное изображение случайных данных enter image description here

Может кто-нибудь исправить мой код ИЛИ дать мне знать, как сгенерировать две гистограммы?

Ниже приведены мой код и выходные данные, которые являются неправильными. Первая выходная диаграмма - это точечная диаграмма , которая должна быть гистограммой, а итоговая диаграмма выхода - это гистограмма, которая неверна, поскольку ось варьируется от отрицательной до положительной, а входные данные только положительные.

import pandas as pd
import datetime
import numpy as np
import math
import scipy
from matplotlib import style
from scipy.stats import norm
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

np.seterr(divide='ignore', invalid='ignore')
age=np.array([0,20,40,60,80,100])
q=np.array([0.0,0.08,0.03,0.21,0.4,0.32])
plt.hist(age,q)
plt.title('Cumulative Distribution Function for ages')
plt.xlabel('Age')
plt.ylabel('Cumulative probability of occurance')
plt.show()

#Find m and b for the piecewise linear interpolations q=mx+b
m=np.zeros((age.size))
b=np.zeros((age.size))
print('Intvl   m     b')
for i in np.arange(age.size-1):
    #print("size", age.size)
    m[i]=(q[i+1]-q[i])/(age[i+1]-age[i])
    b[i]=q[i]-(m[i]*age[i])
    print('{:1d}   {:4.2f}   {:4.1f}'.format(i+1, m[i], b[i]))

#My inverse functions will be x=(y-b)/m or x=minv*q+binv
minv=1.0/m
binv=-b/m
print('Intvl    minv     binv')
for i in np.arange(age.size-1):
    print('{:1d}   {:6.2f}  {:6.2f}'.format(i+1,minv[i],binv[i]))

#Next generate a bunch of random numbers. For each one, determine its interval then compute an age and store
N=1000
randompvals = np.random.uniform(size=N)
randomages=np.zeros((N))
#print('randomages', randomages)
for i in np.arange(N):
    p=randompvals[i]
    #print('p',p)

    #select the appropriate piecewise interval
    if 0 <= p < 0.1:
        intvl = 1
    elif 0.1 <= p < 0.2:
        intvl = 2
    elif 0.2 <= p < 0.4:
        intvl = 3
    elif 0.4 <= p < 0.7:
        intvl = 4
    elif 0.7 <= p < 0.9:
        intvl = 5
    else:
        intvl = 6

    #Use the inverse function for the selected interval
    randomages[i] = minv[intvl-1]*p + binv[intvl-1]
    #print('randomages[i] i',i, randomages[i])

plt.hist(randomages, bins=6)
plt.title('Random Demand for Bicylces')
plt.xlabel('Demand')
plt.ylabel('Occurances')
plt.show()

enter image description here

enter image description here

enter image description here

...