diff --git a/app/analysis/analysis.py b/app/analysis/analysis.py index b6b4121..1e48fb0 100644 --- a/app/analysis/analysis.py +++ b/app/analysis/analysis.py @@ -2,12 +2,16 @@ import os from collections import Counter import sys from datetime import datetime +from typing import List import jieba from app.DataBase import msg_db, MsgType from pyecharts import options as opts -from pyecharts.charts import WordCloud, Calendar, Bar, Line, Pie +from pyecharts.charts import WordCloud, Calendar, Bar, Line, Pie, Map + +from app.person import Contact +from app.util.region_conversion import conversion_province_to_chinese os.makedirs('./data/聊天统计/', exist_ok=True) @@ -415,6 +419,58 @@ def sender(wxid, time_range, my_name='', ta_name=''): } +def contacts_analysis(contacts): + man_contact_num = 0 + woman_contact_num = 0 + province_dict = { + '北京': '北京市', + '上海': '上海市', + '天津': '天津市', + '重庆': '重庆市', + '新疆': '新疆维吾尔族自治区', + '广西': '广西壮族自治区', + '内蒙古': '内蒙古自治区', + '宁夏': '宁夏回族自治区', + '西藏': '西藏自治区' + } + provinces = [] + for contact, num, text_length in contacts: + if contact.detail.get('gender') == 1: + man_contact_num += 1 + elif contact.detail.get('gender') == 2: + woman_contact_num += 1 + province_py = contact.detail.get('region') + if province_py: + province = province_py[1] + province = conversion_province_to_chinese(province) + if province: + if province in province_dict: + province = province_dict[province] + else: + province += '省' + provinces.append(province) + print(province, contact.detail) + data = Counter(provinces) + data = [[k, v] for k, v in data.items()] + print(data) + max_ = max(list(map(lambda x:x[1],data))) + c = ( + Map() + .add("分布", data, "china") + .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) + .set_global_opts( + title_opts=opts.TitleOpts(title="地区分布"), + visualmap_opts=opts.VisualMapOpts(max_=max_, is_piecewise=True), + legend_opts=opts.LegendOpts(is_show=False), + ) + ) + return { + 'woman_contact_num': woman_contact_num, + 'man_contact_num': man_contact_num, + 'contact_region_map': c.dump_options_with_quotes(), + } + + def my_message_counter(time_range, my_name=''): msg_data = msg_db.get_messages_all(time_range=time_range) types_count = {} diff --git a/app/person.py b/app/person.py index 8d6e826..d5edeef 100644 --- a/app/person.py +++ b/app/person.py @@ -25,6 +25,7 @@ class Person: self.avatar_path = None self.avatar = None self.avatar_path_qt = Icon.Default_avatar_path + self.detail = {} def set_avatar(self, img_bytes): if not img_bytes: @@ -55,6 +56,7 @@ class Person: @singleton class Me(Person): def __init__(self): + super().__init__() self.avatar = QPixmap(Icon.Default_avatar_path) self.avatar_path = ':/icons/icons/default_avatar.svg' self.wxid = '' @@ -68,6 +70,7 @@ class Me(Person): class Contact(Person): def __init__(self, contact_info: Dict): + super().__init__() self.wxid = contact_info.get('UserName') self.remark = contact_info.get('Remark') # Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl,bigHeadImgUrl @@ -81,7 +84,7 @@ class Contact(Person): self.avatar = QPixmap() self.avatar_path = Icon.Default_avatar_path self.is_chatroom = self.wxid.__contains__('@chatroom') - self.detail = contact_info.get('detail') + self.detail:Dict = contact_info.get('detail') self.label_name = contact_info.get('label_name') # 联系人的标签分类 """ @@ -97,6 +100,7 @@ class Contact(Person): class ContactDefault(Person): def __init__(self, wxid=""): + super().__init__() self.avatar = QPixmap(Icon.Default_avatar_path) self.avatar_path = ':/icons/icons/default_avatar.svg' self.wxid = wxid @@ -106,6 +110,7 @@ class ContactDefault(Person): self.smallHeadImgUrl = "" self.smallHeadImgBLOG = b'' self.is_chatroom = False + self.detail = {} class Contacts: diff --git a/app/util/region_conversion.py b/app/util/region_conversion.py index 0bf8d87..afbad63 100644 --- a/app/util/region_conversion.py +++ b/app/util/region_conversion.py @@ -40,6 +40,7 @@ province_mapping = { country_mapping = { 'CN': '中国大陆', 'TW': '中国台湾', + 'GB': "英国", } city_mapping = { "Beijing": "北京", @@ -326,12 +327,22 @@ city_mapping = { "Jingdezhen": "景德镇", "Xinyu": "新余", "Yichun": "宜春", - "Fuzhou": "抚州" + "Fuzhou": "抚州", + "Tin Shui": "天水" } +def conversion_province_to_chinese(province): + area = '' + if province in province_mapping: + area = f'{province_mapping[province]}' + return area + + def conversion_region_to_chinese(region: tuple): area = '' + if not region: + return area if region[2]: if region[2] in city_mapping: area = city_mapping[region[2]] diff --git a/app/web_ui/templates/index.html b/app/web_ui/templates/index.html index 83da95c..f7e46c9 100644 --- a/app/web_ui/templates/index.html +++ b/app/web_ui/templates/index.html @@ -8,6 +8,7 @@ + @@ -31,6 +32,13 @@ align-items: center; justify-content: center; } +.slide{ + margin: 0px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} #snow { position: fixed; top: 0; @@ -252,7 +260,7 @@ p { } .chart{ width: 800px; - height: 300px; + height: 500px; } .chart-container{ display: flex; @@ -264,7 +272,7 @@ p { @media screen and (max-width:480px){ .chart{ width: 300px; - height: 250px; + height: 400px; } .chart-container{ display:flex; @@ -310,10 +318,18 @@ p {
你一共给{{contact_num}}个联系人
发送了{{send_msg_num}}条消息
收到了{{receive_msg_num}}条消息
总计{{total_text_num}}字
男{{man_contact_num}}人 女{{woman_contact_num}}人
+ + + + +