Reputation: 261
I have to select those symptoms which is in the dictionary with the symptoms already posted.It works fine.But for some symptoms typeError is showing in command prompt and also all are getting printed in command prompt but not in html page. Here is my code
views.py
def predict(request):
sym=request.POST.getlist('symptoms[]')
sym=list(map(int,sym))
diseaseArray=[]
diseaseArray=np.array(diseaseArray,dtype=int)
dictArray=[]
for dicti in dictionary:
if (set(sym)<= set(dicti['symptoms']) and len(sym)!= 0) or [x for x in sym if x in dicti['primary']]:
diseaseArray=np.append(diseaseArray,dicti['primary'])
diseaseArray=np.append(diseaseArray,dicti['symptoms'])
diseaseArray=list(set(diseaseArray))
print(diseaseArray)
for i in diseaseArray:
if i not in sym:
dict={'id':i}
dictArray.append(dict)
print(dictArray)
for j in dictArray:
symptoms=Symptom.objects.get(syd=j['id'])
j['name']=symptoms.symptoms
print(j['name'])
print(len(dictArray))
return JsonResponse(dictArray,safe=False)
template
$('.js-example-basic-multiple').change(function(){
$('#suggestion-list').html('');
$('#suggestion').removeClass('invisible');
$.ajax({
url:"/predict",
method:"post",
data:{
symptoms: $('.js-example-basic-multiple').val(),
},
success: function(data){
data.forEach(function(disease){
console.log(disease.name)
$('#suggestion-list').append('<li>'+disease.name+'<li>')
$('#suggestion-list').removeClass('invisible');
});
}
});
Upvotes: 14
Views: 47633
Reputation: 1688
Instead of manually casting the values to ints as the accepted answer suggests, you can usually let numpy do that for you.
Instead of calling
diseaseArray=list(set(diseaseArray))
You can call
diseaseArray=diseaseArray.unique().tolist()
This should automatically convert any numpy-specific datatypes in the array to normal Python datatypes. In this case it will cast int32 to int, but it also supports other conversions.
Additionally, using numpys .unique()
might give some speedup for large datasets.
Upvotes: 8
Reputation: 23054
The type of each element in diseaseArray
is a np.int32
as defined by the line:
diseaseArray=np.array(diseaseArray,dtype=int) # Elements are int32
int32
cannot be serialized to JSON by the JsonResponse
being returned from the view.
To fix, convert the id value to a regular int
:
def predict(request):
...
for i in diseaseArray:
if i not in sym:
dict={'id': int(i)} # Convert the id to a regular int
dictArray.append(dict)
print(dictArray)
...
Upvotes: 12
Reputation: 660
You seem to be trying to save non JSON serializable objects. If you want to save specific objects for later use I'd recommend you to use pickle. https://docs.python.org/3/library/pickle.html
Upvotes: 0