opexcel.py
import xlrd
import xlwt
from xlutils.copy import copy
class Operatingexcel():
def get_excel_dic(self,filename,sheetname):
# filename 文件名
# sheetname 表單名
# 返回字典格式
dic = {}
data = xlrd.open_workbook(filename, 'r', encoding_override='utf-8')
table = data.sheet_by_name(sheetname)
for i in range(1, table.nrows):
for y in range(len(table.row_values(0))):
if table.row_values(i)[y] != "":
dic.setdefault(table.row_values(0)[y], []).append(table.row_values(i)[y])
return dic
def get_excel_list(self,filename,sheetname):
# filename 文件名
# sheetname 表單名
# 返回列表格式
list = []
data = xlrd.open_workbook(filename, 'r', encoding_override='utf-8')
table = data.sheet_by_name(sheetname)
for y in range(table.nrows):
for x in range(len(table.row_values(0))):
if table.row_values(y)[x] != "":
list.append(table.row_values(y)[x])
return list
def set_excel_dic(self,dic,filename,sheet_index,start_r):
# filename 文件名
# sheet_index第幾個工作表格
# start_r那一列
x = start_r
for k in dic.keys():
list = []
list.append(k)
for v in dic[k]:
list.append(v)
self.set_excel_list(list,filename,sheet_index,x)
x = x + 1
def set_excel_list(self,list,filename,sheet_index,start_r):
# filename 文件名
# sheet_index第幾個工作表格
# start_r那一列
# 讀取excel文件
r_xls = xlrd.open_workbook(filename)
# 將xlrd的對象轉化爲xlwt的對象
excel = copy(r_xls)
table = excel.get_sheet(sheet_index)
for y in range(len(list)):
table.write(y,start_r,str(list[y]))
excel.save(filename)
Draw.py
from pyecharts.charts import Pie
from pyecharts import options as opts
from pyecharts.charts import Line
class Draw():
def drawpie(attr,value,name):
list1 = [list(z) for z in zip(attr,value)]
# 圖表初始化配置
init_opts = opts.InitOpts(page_title=name)
pie = Pie(init_opts=init_opts)
# 標題配置
title = opts.TitleOpts(title=name,
pos_left='center')
# 圖例配置
legend_opts = opts.LegendOpts(orient="vertical",
pos_top="20%",
pos_left="15%")
# 工具箱配置
# feature = opts.ToolBoxFeatureOpts(save_as_image=True, restore=True, data_view=True, data_zoom=True)
# 工具箱配置
toolbox_opts = opts.ToolboxOpts(orient="vertical",
pos_top="25%",
pos_right="15%"
)
pie.set_global_opts(title_opts=title,
legend_opts=legend_opts,
toolbox_opts=toolbox_opts
)
# 標籤配置項
pie.add("",
list1,
radius=[30, 75],
center=['50%', '70%'],
rosetype="area",
label_opts=opts.LabelOpts(
position="outside",
formatter="{b|{b}: }{c} {per|{d}%} ",
background_color="#eee",
border_color="#aaa",
border_width=1,
border_radius=4,
rich={
"a": {"color": "#999", "lineHeight": 22, "align": "center"},
"abg": {
"backgroundColor": "#e3e3e3",
"width": "100%",
"align": "right",
"height": 22,
"borderRadius": [4, 4, 0, 0],
},
"hr": {
"borderColor": "#aaa",
"width": "100%",
"borderWidth": 0.5,
"height": 0,
},
"b": {"fontSize": 16, "lineHeight": 33},
"per": {
"color": "#eee",
"backgroundColor": "#334455",
"padding": [2, 4],
"borderRadius": 2,
},
},
),
)
pie.render('{0}.html'.format(name))
# 趨勢圖
def drawline(list1,list4,name):
# 圖表初始化配置
init_opts = opts.InitOpts(page_title=name)
line = Line(init_opts=init_opts)
# 標題配置
title = opts.TitleOpts(title=name,
pos_left="10%")
# 圖例配置
legend_opts = opts.LegendOpts(orient="horizontal",
pos_top="5%",
pos_right="15%")
# 工具箱配置
# feature = opts.ToolBoxFeatureOpts(save_as_image=True, restore=True, data_view=True, data_zoom=True)
# 工具箱配置
toolbox_opts = opts.ToolboxOpts(orient="vertical",
pos_bottom="15%",
pos_left="90%",
)
line.set_global_opts(title_opts=title,
legend_opts=legend_opts,
toolbox_opts=toolbox_opts,
yaxis_opts=opts.AxisOpts(name="單位:歲",
# axislabel_opts=opts.LabelOpts(formatter="{value}例",
),
xaxis_opts=opts.AxisOpts(name="日期"),
datazoom_opts = opts.DataZoomOpts(orient="vertical"),
)
line.add_xaxis(list4, )
line.add_yaxis(name, list1, is_smooth=True, linestyle_opts=opts.LineStyleOpts(color="#E83132", width="4"))
line.render('{0}.html'.format(name))
統計人臉.py
"""
author:魏振東
date:20200331
func:騰訊優圖人臉識別
"""
import TencentYoutuyun
import os
from tencent.Draw import Draw
from opdata.opexcel import Operatingexcel
# 輸入路徑返回有效數據
def youtu(image_path):
appid = '10151047'
secret_id = 'AKID59AA4pi1Sis5GIS2tdCe1b7W2T2asTjr'
secret_key = 'N5mMxsiO6zjIk7Kj3DIPPLG4mOvOjvpk'
userid = '924271966'
end_point = TencentYoutuyun.conf.API_YOUTU_END_POINT # 優圖開放平臺
youtu = TencentYoutuyun.YouTu(appid, secret_id, secret_key, userid, end_point)
req = youtu.DetectFace(image_path=image_path, mode=0, data_type=0)
return req
# 以字典形式返回有效數據,以及所有圖片的長度
def youtu_face():
# 獲取所有文件名稱
imgs = os.listdir("img")
dic_face = {}
# 分析人臉,並把人臉數據存儲到字典中
for i in imgs:
path = "img/{0}".format(i)
req = youtu(path)
if req["face"] != [] and req["face"][0] != {}:
dic_face.setdefault("人臉", []).append(req)
return dic_face["人臉"],len(imgs)
# gender Int 性別[0/(female)~100(male)]
def data_gender(list):
female = 0
male = 0
for i in list:
if int(i)>=50:
male = male + 1
else:
female = female + 1
return female,male
# glasses Int 眼鏡[0不戴眼鏡 1戴眼鏡 2戴墨鏡] 注:替代原glass(Bool)字段
def data_glasses(list):
glasses0 = 0
glasses1 = 0
glasses2 = 0
for i in list:
if int(i)==0:
glasses0 = glasses0 + 1
elif int(i)==0:
glasses1 = glasses1 + 1
else:
glasses2 = glasses2 + 1
return glasses0,glasses1,glasses2
if __name__ == '__main__':
d = Draw
og = Operatingexcel()
dic_face,len_img = youtu_face()
""""下載一些圖片,包括人像,動物,花朵還有你自己的相片,編程實現識別識別人像,統計人像圖片的個數,用餅狀圖表示佔比。"""
attr = ['人像', '非人像']
value = [len(dic_face), len_img-len(dic_face)]
d.drawpie(attr, value,"人像比例")
# 因爲每次分析數據比較麻煩,所以吧數據保存到excel中
# dict = {}
# for i in dic_face:
# dict.setdefault("性別", []).append(i["face"][0]["gender"])
# dict.setdefault("年齡", []).append(i["face"][0]["age"])
# dict.setdefault("微笑", []).append(i["face"][0]["expression"])
# dict.setdefault("魅力", []).append(i["face"][0]["beauty"])
# dict.setdefault("眼鏡", []).append(i["face"][0]["glasses"])
# print(dict)
# 保存到文件中
# og.set_excel_dic(dict, "統計信息.xlsx", 0, 0)
""""對文件夾中的人像圖片,測顏值、是否帶帽子、戴眼鏡等屬性並輸出。"""
dicc = og.get_excel_dic("統計信息.xlsx", "Sheet1")
"""性別比例餅狀圖"""
female,male = data_gender(dicc["性別"])
attr = ['female', 'male']
value = [female, male]
d.drawpie(attr, value,"男女比例餅狀圖")
""""年齡折線圖"""
l = [str(x) for x in range(len(dicc["年齡"]))]
d.drawline(list1=dicc["年齡"],list4=l,name="年齡折線圖")
"""微笑人數餅圖"""
female,male = data_gender(dicc["微笑"])
attr = ['笑', '不笑']
value = [female, male]
d.drawpie(attr, value,"微笑人數餅圖")
"""魅力值折線圖"""
l = [str(x) for x in range(len(dicc["魅力"]))]
d.drawline(list1=dicc["魅力"],list4=l,name="魅力值")
""""眼鏡餅狀圖"""
glasses0,glasses1,glasses2 = data_glasses(dicc["眼鏡"])
attr = ['不戴眼鏡', '戴眼鏡', '戴墨鏡']
value = [glasses0,glasses1,glasses2]
d.drawpie(attr, value,"眼鏡餅狀圖")