mirror of
https://github.com/LC044/WeChatMsg
synced 2024-11-15 14:31:18 +08:00
165 lines
4.8 KiB
Python
165 lines
4.8 KiB
Python
|
import numpy as np
|
||
|
import pandas as pd
|
||
|
from pyecharts import options as opts
|
||
|
from pyecharts.charts import Line
|
||
|
|
||
|
from ....DataBase import data
|
||
|
|
||
|
|
||
|
def load_data(wxid):
|
||
|
message_data = data.get_text_by_num(wxid, 1)
|
||
|
df = pd.DataFrame(message_data, columns=['message', 'date'])
|
||
|
# print(df)
|
||
|
d = df.groupby('date')
|
||
|
for key, value in d:
|
||
|
yield key, value['message'].values
|
||
|
|
||
|
|
||
|
import snownlp
|
||
|
|
||
|
|
||
|
def emotion_analysis(wxid):
|
||
|
dates = []
|
||
|
emotions = []
|
||
|
for date, messages in load_data(wxid):
|
||
|
dates.append(date)
|
||
|
s = 0
|
||
|
for msg in messages:
|
||
|
val = snownlp.SnowNLP(msg).sentiments
|
||
|
s += val
|
||
|
emotions.append(s / len(messages))
|
||
|
emotions = np.array(emotions)
|
||
|
emotions = np.around(emotions, 3) * 100
|
||
|
return dates, emotions
|
||
|
|
||
|
|
||
|
def plot_emotion(wxid):
|
||
|
"""
|
||
|
画图
|
||
|
"""
|
||
|
datas, emotions = emotion_analysis(wxid) # 获取数据
|
||
|
max_ = max(emotions)
|
||
|
min_ = min(emotions)
|
||
|
c = (
|
||
|
Line()
|
||
|
.add_xaxis(
|
||
|
xaxis_data=datas,
|
||
|
)
|
||
|
.add_yaxis(
|
||
|
series_name="情感趋势",
|
||
|
is_smooth=True,
|
||
|
y_axis=emotions,
|
||
|
markpoint_opts=opts.MarkPointOpts(
|
||
|
data=[
|
||
|
opts.MarkPointItem(type_="max", name="最大值", value=int(max_ * 100) / 100),
|
||
|
opts.MarkPointItem(type_="min", name="最小值", value=int(min_ * 100) / 100),
|
||
|
]
|
||
|
),
|
||
|
markline_opts=opts.MarkLineOpts(
|
||
|
data=[opts.MarkLineItem(type_="average", name="平均值")]
|
||
|
),
|
||
|
)
|
||
|
.set_global_opts(
|
||
|
yaxis_opts=opts.AxisOpts(
|
||
|
max_=max_,
|
||
|
min_=min_,
|
||
|
),
|
||
|
xaxis_opts=opts.AxisOpts(
|
||
|
type_='time'
|
||
|
),
|
||
|
axispointer_opts=opts.AxisPointerOpts(
|
||
|
is_show=True, link=[{"xAxisIndex": "all"}]
|
||
|
),
|
||
|
)
|
||
|
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
|
||
|
.render("./data/聊天统计/emotion_chart.html")
|
||
|
)
|
||
|
|
||
|
|
||
|
from PyQt5.QtCore import *
|
||
|
from PyQt5.QtGui import *
|
||
|
from PyQt5.QtWebEngineWidgets import QWebEngineView
|
||
|
from PyQt5.QtWidgets import *
|
||
|
|
||
|
from . import emotionUi
|
||
|
|
||
|
|
||
|
class EmotionController(QWidget, emotionUi.Ui_Dialog):
|
||
|
def __init__(self, username, parent=None):
|
||
|
super().__init__(parent)
|
||
|
self.ta_username = username
|
||
|
|
||
|
# self.setStyleSheet('''QWidget{background-color:rgb(240, 240, 240);}''')
|
||
|
# 加载动画
|
||
|
self.center()
|
||
|
self.label_01()
|
||
|
# 防止卡死,新建线程处理数据
|
||
|
self.Thread = LoadData(username)
|
||
|
self.Thread.okSignal.connect(self.initUI)
|
||
|
self.Thread.start()
|
||
|
|
||
|
def center(self): # 定义一个函数使得窗口居中显示
|
||
|
# 获取屏幕坐标系
|
||
|
screen = QDesktopWidget().screenGeometry()
|
||
|
# 获取窗口坐标系
|
||
|
size = self.geometry()
|
||
|
newLeft = (screen.width() - size.width()) / 2
|
||
|
newTop = (screen.height() - size.height()) / 2
|
||
|
self.move(int(newLeft), int(newTop))
|
||
|
|
||
|
def label_01(self):
|
||
|
w = self.size().width()
|
||
|
h = self.size().height()
|
||
|
self.label = QLabel(self)
|
||
|
self.label.setGeometry(w // 2, h // 2, 100, 100)
|
||
|
self.label.setToolTip("这是一个标签")
|
||
|
self.m_movie()
|
||
|
|
||
|
def m_movie(self):
|
||
|
movie = QMovie("./app/data/bg.gif")
|
||
|
self.label.setMovie(movie)
|
||
|
movie.start()
|
||
|
|
||
|
def initUI(self):
|
||
|
self.label.setVisible(False)
|
||
|
# self.setStyleSheet('''QWidget{background-color:rgb(244, 244, 244);}''')
|
||
|
main_box = QHBoxLayout(self)
|
||
|
self.browser1 = QWebEngineView()
|
||
|
self.browser1.load(QUrl('file:///data/聊天统计/emotion_chart.html'))
|
||
|
# self.browser1.setStyleSheet('''QWidget{background-color:rgb(240, 240, 240);}''')
|
||
|
|
||
|
splitter1 = QSplitter(Qt.Vertical)
|
||
|
|
||
|
splitter1.addWidget(self.browser1)
|
||
|
main_box.addWidget(splitter1)
|
||
|
self.setLayout(main_box)
|
||
|
|
||
|
def setBackground(self):
|
||
|
palette = QPalette()
|
||
|
pix = QPixmap("./app/data/bg.png")
|
||
|
pix = pix.scaled(self.width(), self.height(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation) # 自适应图片大小
|
||
|
palette.setBrush(self.backgroundRole(), QBrush(pix)) # 设置背景图片
|
||
|
# palette.setColor(self.backgroundRole(), QColor(192, 253, 123)) # 设置背景颜色
|
||
|
self.setPalette(palette)
|
||
|
|
||
|
|
||
|
class LoadData(QThread):
|
||
|
"""
|
||
|
发送信息线程
|
||
|
"""
|
||
|
okSignal = pyqtSignal(int)
|
||
|
|
||
|
def __init__(self, ta_u, parent=None):
|
||
|
super().__init__(parent)
|
||
|
self.ta_username = ta_u
|
||
|
|
||
|
def run(self):
|
||
|
plot_emotion(self.ta_username)
|
||
|
self.okSignal.emit(10)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
# wxid = 'wxid_8piw6sb4hvfm22'
|
||
|
wxid = 'wxid_wt2vsktnu4z022'
|
||
|
load_data(wxid)
|