调查问卷,根据答案统计,数据库保存方式为json的字符串
需求:APP里面的调查问卷,已经正式运营一周,老板要一份调查问卷的统计,依据题目,答案统计数目和所占百分比
分析:数据保存方式,所有用户提交内容保存一个json的字符串,现在要对里面每个字段进行统计
数据如下:
方案一:利用PHP,获取jstext的结果集,根据题目,循环拼接,对应字段字符串,该字符串包含用户答案,根据答案查找出现次数,即为选择该答案的数量
public function testques(){
$res = Db::name('question')->field('jstext')->select();
$arr=[];
$age_1=0;
$age_2=0;
foreach ($res as $k=>$v){
$json = $v['jstext'];
$jsarr = json_decode($json,true);
if(!empty($jsarr)){
if($jsarr['age']==1){
$age_1+=1;
}else{
$age_2+=1;
}
//以此类推,将所有答案循环自增统计
}
}
echo $age_1;
echo $age_2;
}
方案二:利用python,直接读取数据库,将结果集中json的字符串,转为列表,json的字段名设置为df的列名
注意:pymysql得到的是元祖,需要将结果集遍历,区元祖的第一个值,转接为json。dataframe的列就是这个json的key,数据就是json的值的集合。另外,多选答案的统计,需要str.contains包含指定答案来统计。
import pandas as pd
import xlrd
import pymysql
import json
import xlwt
from datetime import datetime
import numpy as np
def getdata(sql='select a.jstext from fcxlt_question as a left join fcxlt_jjr_member as b on a.member_id=b.id where b.role>3'):
conn = pymysql.connect(host='127.0.0.1',user='root' ,passwd='root',db='cmf',port=3306,charset='utf8')
cur = conn.cursor()
cur.execute(sql)
result = cur.fetchall()
cur.close()
conn.close
return result
def radio(var,df):
size = df.groupby(var).size()
print(size)
for i in enumerate(size):
print(i/df[var].count())
def morecheck(var,df,str):
dfnew = df.copy()
dfnew[var].fillna('', inplace=True)
sa= dfnew[var].str.contains(str)
count = df.iloc[:,0].size
print("{}包含{}".format(var,str))
print(dfnew[sa].commonfun.count())
print(dfnew[sa].commonfun.count()/count)
def main():
# 获取结果集
s = getdata()
mylist = []
# 重组数据,设置df的行和列
for v in s:
vs = json.loads(v[0])#str转json
lst2 = list(vs.values())#获取json的值
mylist.append(lst2)#将所有json的值追加到mylist的列表组成df的行
colum = list(vs)#df的列,即为json的字段名
df = pd.DataFrame(mylist,columns=colum)
# count = df.iloc[:,0].size 总行数
# df = df.fillna('', inplace=True)
print(df.head())
#单选统计
radio('sex',df)
radio('age',df)
radio('year',df)
radio('frequency',df)
radio('feel',df)
print("*"*100)
morecheck('commonfun',df,'1,')
morecheck('commonfun',df,'2,')
morecheck('commonfun',df,'3,')
morecheck('commonfun',df,'4,')
morecheck('commonfun',df,'5,')
morecheck('commonfun',df,'6,')
morecheck('commonfun',df,'7,')
if __name__=='__main__':
main()
备注:导出详细数据,df.to_csv(‘detail.csv’)既可
结果: