Python Forum
Help to arrange correct input array structure
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Help to arrange correct input array structure
#1
Hi All...

I am trying to test out this script from Github.
https://github.com/TickTack-z/dynamic_pr..._demand.py

But I cant get the input structure correct Wall

The script below is my test script, but i think it might not the right approach.

Help is needed. ;-)

# -*- coding: utf-8 -*-
import numpy as np
import price_general_demand
from price_general_demand import p6

def priceEngine():
	comming_Sale1 = [1,0,0,1,1,0,0,1,1,0,0,1,0,1,2,0,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,0,1,1,0,0,1,0,1,2,0,0,0,1,1,0,0,1,0,0]
	comming_Sale2 = [0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,1,0,0]
	competatorPrice1 = [299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299]
	competatorPrice2 = [399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399]

	parameterdump = []
	demand_historical = []
	price1_historical = []
	price2_historical = []
	competator_Sale1 = []
	competator_Sale2 = []

	cnt = 0
	for i in range(len(comming_Sale1)):
		price_historical = []

		print ("------------------------------")
		print ("!!!!! Test Run :: %d !!!!!" % cnt)
		
		price1_historical.append(competatorPrice1[i])
		price2_historical.append(competatorPrice2[i])
		price_historical.extend([price1_historical, price2_historical])
		

		print ("## Debug Input ##")
		print (demand_historical)
		print (price_historical)
		print ("## Debug Input ##")
		print (" ")
	
		(popt, parameterdump) = p6(price_historical, demand_historical, parameterdump);

		demand_historical.append([comming_Sale1[i]])


		print (" ")
		print ("Output::")
		print (popt)
		print (parameterdump)

		cnt = cnt + 1

if __name__ == "__main__":
	priceEngine()
This script is from Github.
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 18 22:00:59 2017

@author: LeiXiao
"""
import numpy as np
import random
import scipy.stats
from scipy.optimize import minimize

def p6(price_historical,demand_historical,parameterdump=None):
    cnt = 0
    price_historical=np.array(price_historical)
    demand_historical=np.array(demand_historical)
    def MLE(beta,price_matrix,demand,D,wl):
        n=price_matrix.shape[0]
        binom_parameter=np.exp(beta[0]-beta[1]*price_matrix[0])/(1+sum(np.exp(beta[0]-beta[1]*price_matrix[i]) for i in range(n)))    
        llh=[np.log(scipy.stats.binom.pmf(demand[j],D,binom_parameter[j])) for j in range(len(demand))]
        llh=np.array(llh)
        llh[llh==-np.inf]=-999999
        return -sum(wl*llh)  

    #day 1
    if demand_historical.size==0:
        print ('was here 1')
        popt=0
        
    #day 2
    if demand_historical.size==1:
        print ('was here 2')
        n=price_historical.shape[0]
        #create possible_D
        possible_D=[]
        i=1
        while i<=(n+1)*demand_historical:
            if i>=demand_historical:
                possible_D.append(i)
            i=2*i
        parameterdump=possible_D
        otherprice_last=price_historical[:,0][1:]
        popt=max(min(otherprice_last),1)
            
    #day 3 to day 10
    if demand_historical.size>1 and demand_historical.size<10:
        print ('was here 3')
        t=demand_historical.size
        n=price_historical.shape[0]
        print (t) 
        print (n) 

        #check violated D and append new D
        possible_D=parameterdump
        for D in possible_D:
            print (cnt) 
            cnt=cnt+1
            if demand_historical[-1]>D:
                possible_D.remove(D)
        if len(possible_D)==0:   
            i=1
            while i<=(n+1)*demand_historical[-1]:
                if i>=demand_historical[-1]:
                    possible_D.append(i)
                    i=2*i
        #continue track others
        parameterdump=possible_D
        otherprice_last=price_historical[:,t-1][1:]
        popt=max(min(otherprice_last),1)
    
    #day 11
    if demand_historical.size==10:        
        print ('was here 4')
        t=demand_historical.size
        n=price_historical.shape[0]
        #check violated D and append new D
        possible_D=parameterdump
        for D in possible_D:
            if demand_historical[-1]>D:
                possible_D.remove(D)
        if len(possible_D)==0:   
            i=1
            while i<=(n+1)*demand_historical[-1]:
                if i>=demand_historical[-1]:
                    possible_D.append(i)
                    i=2*i
        #using EM algorithm to estimate the demand model
        demand=np.round(demand_historical)            
        price_mx=price_historical
        K=len(possible_D)
        theta=[1.0/K for i in range(K)]
        parameter=[]
        for k in range(K):
            parameter.append([0,1])        
        prob={}
        wl={}
        judge=False      
        while judge==False:
            for k in range(K):
                binom_param=np.exp(parameter[k][0]-parameter[k][1]*price_mx[0])/(1+sum(np.exp(parameter[k][0]-parameter[k][1]*price_mx[i]) for i in range(n)))
                prob[k]=np.array([scipy.stats.binom.pmf(demand[j],possible_D[k],binom_param[j]) for j in range(len(demand))])

            for k in range(K):
                wl[k]=prob[k]*theta[k]/sum(theta[j]*prob[j] for j in range(K))
                wl[k][np.isnan(wl[k])]=theta[k]
            parameter_new=[]  
            for k in range(K):
                parameter_new.append(minimize(MLE,parameter[k],args=(price_mx,demand,possible_D[k],wl[k]),bounds=((-5,None),(0.005+0.005*2**k,10)),method='L-BFGS-B').x)
            theta_new=[np.mean(wl[j]) for j in range(K)]
            temp=[np.linalg.norm(parameter_new[k]-parameter[k])<0.01 for k in range(K)]
            if sum(temp)==K:
                judge=True
            for k in range(K):
                parameter[k]=parameter_new[k]
            theta=theta_new
            
        #fit multivariate normal distribution and generate SAA sample
        price_mx=price_historical#change it for other day!!!!!
        sortedlist=[[] for i in range(n-1)]
        for j in range(t):
            temp=[price_mx[i][j] for i in range(n)[1:]]
            for i in range(n-1):
                sortedlist[i].append(np.sort(temp)[i])
        corr_matrix=np.cov(sortedlist)
        normal_mean=[np.mean(sortedlist[i]) for i in range(n-1)]
        saa=np.random.multivariate_normal(normal_mean,corr_matrix,1000).T            
        #find optimal price            
        option=np.linspace(0.1,100,num=999,endpoint=False)
        revenue=[]
        for i in range(999):
            rev=0
            for k in range(K):
                param=np.exp(parameter[k][0]-parameter[k][1]*option[i])/(1+np.exp(parameter[k][0]-parameter[k][1]*option[i])+sum(np.exp(parameter[k][0]-parameter[k][1]*saa[j]) for j in range(n-1)))
                demand=theta[k]*possible_D[k]*param
                rev+=sum(demand*option[i])
            revenue.append(rev)
        choice=np.argmax(revenue)
        popt=option[choice]
        parameterdump={'possible_D':possible_D,'parameter':parameter,'theta':theta}
    
    #day 12 and so on                
    if demand_historical.size>10:
        print ('was here 5')
        t=demand_historical.size
        n=price_historical.shape[0]
        #check violated D and append new D
        possible_D=parameterdump['possible_D']
        theta=parameterdump['theta']
        parameter=parameterdump['parameter'] 
        K=len(possible_D)
        index=[]
        change=0
        for k in range(K):
            if demand_historical[-1]>possible_D[k]:
                index.append(k)
        if len(index)>0:
            change=1
            for j in index:
                possible_D.pop(j)
                parameter.pop(j)
                
        if len(possible_D)==0:   
            i=1
            while i<=(n+1)*demand_historical[-1]:
                if i>=demand_historical[-1]:
                    possible_D.append(i)
                    parameter.append([0,1])
                    i=2*i
        K=len(possible_D)
        #using EM algorithm to estimate the demand model
        demand=np.round(demand_historical)            
        price_mx=price_historical 
        prob={}
        wl={}
        judge=False      
        while judge==False:
            for k in range(K):
                binom_param=np.exp(parameter[k][0]-parameter[k][1]*price_mx[0])/(1+sum(np.exp(parameter[k][0]-parameter[k][1]*price_mx[i]) for i in range(n)))
                prob[k]=np.array([scipy.stats.binom.pmf(demand[j],possible_D[k],binom_param[j]) for j in range(len(demand))])

            for k in range(K):
                wl[k]=prob[k]*theta[k]/sum(theta[j]*prob[j] for j in range(K))
                wl[k][np.isnan(wl[k])]=theta[k]
            parameter_new=[]  
            for k in range(K):
                parameter_new.append(minimize(MLE,parameter[k],args=(price_mx,demand,possible_D[k],wl[k]),bounds=((-5,None),(0.005+0.005*2**k,10)),method='L-BFGS-B').x)
            theta_new=[np.mean(wl[j]) for j in range(K)]
            temp=[np.linalg.norm(parameter_new[k]-parameter[k])<0.0001 for k in range(K)]
            if sum(temp)==K:
                judge=True
            for k in range(K):
                parameter[k]=parameter_new[k]
            theta=theta_new
        #fit multivariate normal distribution and generate SAA sample
        price_mx=price_historical[0:,(t-min(t,100)):]
        sortedlist=[[] for i in range(n-1)]
        for j in range(price_mx.shape[1]):
            temp=[price_mx[i][j] for i in range(n)[1:]]
            for i in range(n-1):
                sortedlist[i].append(np.sort(temp)[i])
        corr_matrix=np.cov(sortedlist)
        normal_mean=[np.mean(sortedlist[i]) for i in range(n-1)]
        saa=np.random.multivariate_normal(normal_mean,corr_matrix,1000).T            
        #find optimal price            
        option=np.linspace(0.1,100,num=999,endpoint=False)
        revenue=[]
        for i in range(999):
            rev=0
            for k in range(K):
                param=np.exp(parameter[k][0]-parameter[k][1]*option[i])/(1+np.exp(parameter[k][0]-parameter[k][1]*option[i])+sum(np.exp(parameter[k][0]-parameter[k][1]*saa[j]) for j in range(n-1)))
                demand=theta[k]*possible_D[k]*param
                rev+=sum(demand*option[i])
            revenue.append(rev)
        choice=np.argmax(revenue)
        popt=option[choice]
        parameterdump={'possible_D':possible_D,'parameter':parameter,'theta':theta}
                      
    return (popt, parameterdump)
Reply
#2
Hello, can you post the output/result you get along with the desired one? Or error message in error tags, if this is what you get.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  How to get array fit/transform to be correct? Oliver 0 1,561 Jul-01-2021, 04:22 PM
Last Post: Oliver
  [pandas] How to re-arrange DataFrame columns SriMekala 8 4,910 Jun-22-2019, 12:55 AM
Last Post: scidam
  while creating a array using numpy.arrange, how to negate only the last 50 numbers? vicky53 1 2,680 Apr-06-2019, 11:52 AM
Last Post: scidam
  How to arrange the four pictures of a matplotlib.pyplot? vokoyo 0 2,771 Apr-04-2019, 10:58 PM
Last Post: vokoyo
  How to use pandas.rolling mean for 3D input array? Prv_Yadv 1 3,848 Mar-26-2019, 11:49 AM
Last Post: scidam
  ValueError: could not broadcast input array from shape (75) into shape (25) route2sabya 0 6,484 Mar-14-2019, 01:14 PM
Last Post: route2sabya
  [split] np.arrange error - no attribute gyan 2 6,978 Aug-19-2018, 05:38 PM
Last Post: micseydel
  Array input with time module (Python 3) alrm31015 4 3,443 Jul-26-2018, 08:52 PM
Last Post: alrm31015
  np.arrange error - no attribute pksherard 3 22,784 Aug-16-2017, 09:54 PM
Last Post: nilamo

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020