【项目实战】基于python+爬虫的电影数据分析及可视化系统
注意:该项目只展示部分功能,如需了解,文末咨询即可。
本文目录
- 1.开发环境
- 2 系统设计
- 2.1 设计背景
- 2.2 设计内容
- 3 系统页面展示
- 3.1 用户页面
- 3.2 后台页面
- 3.3 功能展示视频
- 4 更多推荐
- 5 部分功能代码
- 5.1 爬虫代码
- 5.2 电影信息代码
1.开发环境
开发语言:Python
技术框架:Flask、爬虫
数据库:MySQL
开发工具:PyCharm
2 系统设计
2.1 设计背景
在数字时代,大数据技术在各行各业得到广泛应用,尤其在影视行业,通过分析大量的数据可以帮助人们更好地了解市场趋势和用户偏好。然而传统的数据分析方法难以处理如此庞大和复杂的数据集,且结果的展示不够直观,这就迫切需要开发一个既能高效处理大数据又能直观展示分析结果的系统。通过实现这一系统,不仅能够为用户提供直观的数据分析结果,帮助他们快速了解影视作品的各种统计信息,而且能够为影视行业提供决策支持,比如电影推荐和评分预测等功能,有助于提升用户体验和满意度。本系统的开发展示了大数据技术和可视化技术在影视数据分析领域的应用价值,对促进该领域的技术进步和创新发展具有重要意义。
2.2 设计内容
本课题旨在开发一个基于python的电影数据分析及可视化,该系统利用Scrapy爬虫技术从“豆瓣网站”爬取相关电影数据,然后通过Python和Spark技术进行数据处理和清理,最终存储到MySQL数据库中。系统的核心功能包括电影标签、电影星际、电影评分区间、年代、数量、词云等。所有这些功能都通过Echarts可视化框架以图形的方式展现,同时,系统还提供用户管理和登录功能,为管理员和用户提供不同的操作权限和数据展示。
1. 系统架构
系统采用分层架构设计,主要包括以下几个层次:
数据采集层: 使用Scrapy爬虫框架
数据处理层: 使用Python进行数据清洗和处理
数据存储层: 使用MySQL数据库
数据分析层: 使用Python进行数据分析
数据可视化层: 使用Echarts框架
应用层: 提供用户界面和交互功能
2. 主要功能模块
2.1 数据采集模块
使用Scrapy框架爬取豆瓣网站的电影数据
设计爬虫规则,提取电影标题、评分、标签、上映年份等信息
实现数据的增量更新和定期爬取
2.2 数据处理模块
使用Python和Spark进行数据清洗,去除重复和无效数据
数据格式化,统一数据格式
数据转换,将原始数据转换为适合分析的结构
2.3 数据存储模块
设计MySQL数据库schema,包括电影信息表、用户表等
实现数据的批量导入和更新
优化数据库查询性能
2.4 数据分析模块
实现电影标签分析功能
开发电影评分区间统计功能
实现电影年代分布分析
电影数量统计分析
词云分析功能
2.5 数据可视化模块
使用Echarts框架实现各种图表展示
包括柱状图、饼图、折线图、词云图等
实现图表的交互功能,如数据筛选、缩放等
2.6 用户管理模块
实现用户注册、登录功能
用户权限管理,区分管理员和普通用户
根据用户权限展示不同的数据和功能
3. 系统流程
数据采集: Scrapy爬虫定期从豆瓣网站爬取电影数据
数据处理: 使用PySpark进行数据清洗和转换
数据存储: 将处理后的数据存入MySQL数据库
数据分析: 使用Python进行各种统计分析
数据可视化: 使用Echarts将分析结果以图表形式展示
用户交互: 用户通过Web界面查看分析结果,管理员可进行系统管理
3 系统页面展示
3.1 用户页面
3.2 后台页面
3.3 功能展示视频
基于python+爬虫的豆瓣电影数据分析及可视化系统
4 更多推荐
计算机毕设选题精选汇总
基于Hadoop大数据电商平台用户行为分析与可视化系统
Django+Python数据分析岗位招聘信息爬取与分析
基于python爬虫的商城商品比价数据分析
基于Python的网络小说榜单信息爬取与数据可视化系统
基于Spark大数据的餐饮外卖数据分析可视化系统
5 部分功能代码
5.1 爬虫代码
# # -*- coding: utf-8 -*-# 数据爬取文件import scrapy
import pymysql
import pymssql
from ..items import DianyingxinxiItem
import time
from datetime import datetime,timedelta
import datetime as formattime
import re
import random
import platform
import json
import os
import urllib
from urllib.parse import urlparse
import requests
import emoji
import numpy as np
import pandas as pd
from sqlalchemy import create_engine
from selenium.webdriver import ChromeOptions, ActionChains
from scrapy.http import TextResponse
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 电影信息
class DianyingxinxiSpider(scrapy.Spider):name = 'dianyingxinxiSpider'spiderUrl = 'https://m.douban.com/rexxar/api/v2/movie/recommend?refresh=0&start={}&count=20&selected_categories=%7B%22%E7%B1%BB%E5%9E%8B%22:%22%E5%96%9C%E5%89%A7%22%7D&uncollect=false&tags=%E5%96%9C%E5%89%A7&ck=IsFz'start_urls = spiderUrl.split(";")protocol = ''hostname = ''realtime = Falseheaders = {'Referer':'https://movie.douban.com/explore',
'Cookie':'用你的Cookie'}def __init__(self,realtime=False,*args, **kwargs):super().__init__(*args, **kwargs)self.realtime = realtime=='true'def start_requests(self):plat = platform.system().lower()if not self.realtime and (plat == 'linux' or plat == 'windows'):connect = self.db_connect()cursor = connect.cursor()if self.table_exists(cursor, 'c2xklu0u_dianyingxinxi') == 1:cursor.close()connect.close()self.temp_data()returnpageNum = 1 + 1for url in self.start_urls:if '{}' in url:for page in range(1, pageNum):next_link = url.format(page)yield scrapy.Request(url=next_link,headers=self.headers,callback=self.parse)else:yield scrapy.Request(url=url,headers=self.headers,callback=self.parse)# 列表解析def parse(self, response):_url = urlparse(self.spiderUrl)self.protocol = _url.schemeself.hostname = _url.netlocplat = platform.system().lower()if not self.realtime and (plat == 'linux' or plat == 'windows'):connect = self.db_connect()cursor = connect.cursor()if self.table_exists(cursor, 'c2xklu0u_dianyingxinxi') == 1:cursor.close()connect.close()self.temp_data()returndata = json.loads(response.body)try:list = data["items"]except:passfor item in list:fields = DianyingxinxiItem()try:fields["title"] = str( item["title"])except:passtry:fields["year"] = int( item["year"])except:passtry:fields["picture"] = str( item["pic"]["normal"])except:passtry:fields["ypxx"] = str( item["card_subtitle"])except:passtry:fields["pingfen"] = float( item["rating"]["value"])except:passtry:fields["pjs"] = int( item["rating"]["count"])except:passtry:fields["wxs"] = float( item["rating"]["star_count"])except:passtry:fields["tags"] = str( item["tags"][0]["name"])except:passtry:fields["plnr"] = str( item["comment"]["comment"])except:passtry:fields["uname"] = str( item["comment"]["user"]["name"])except:passtry:fields["xqdz"] = str('https://movie.douban.com/subject/'+ item["id"])except:passyield fields# 详情解析def detail_parse(self, response):fields = response.meta['fields']return fields# 数据清洗def pandas_filter(self):engine = create_engine('mysql+pymysql://root:123456@localhost/spiderc2xklu0u?charset=UTF8MB4')df = pd.read_sql('select * from dianyingxinxi limit 50', con = engine)# 重复数据过滤df.duplicated()df.drop_duplicates()#空数据过滤df.isnull()df.dropna()# 填充空数据df.fillna(value = '暂无')# 异常值过滤# 滤出 大于800 和 小于 100 的a = np.random.randint(0, 1000, size = 200)cond = (a<=800) & (a>=100)a[cond]# 过滤正态分布的异常值b = np.random.randn(100000)# 3σ过滤异常值,σ即是标准差cond = np.abs(b) > 3 * 1b[cond]# 正态分布数据df2 = pd.DataFrame(data = np.random.randn(10000,3))# 3σ过滤异常值,σ即是标准差cond = (df2 > 3*df2.std()).any(axis = 1)# 不满?条件的?索引index = df2[cond].index# 根据?索引,进?数据删除df2.drop(labels=index,axis = 0)# 去除多余html标签def remove_html(self, html):if html == None:return ''pattern = re.compile(r'<[^>]+>', re.S)return pattern.sub('', html).strip()# 数据库连接def db_connect(self):type = self.settings.get('TYPE', 'mysql')host = self.settings.get('HOST', 'localhost')port = int(self.settings.get('PORT', 3306))user = self.settings.get('USER', 'root')password = self.settings.get('PASSWORD', '123456')try:database = self.databaseNameexcept:database = self.settings.get('DATABASE', '')if type == 'mysql':connect = pymysql.connect(host=host, port=port, db=database, user=user, passwd=password, charset='utf8')else:connect = pymssql.connect(host=host, user=user, password=password, database=database)return connect# 断表是否存在def table_exists(self, cursor, table_name):cursor.execute("show tables;")tables = [cursor.fetchall()]table_list = re.findall('('.*?')',str(tables))table_list = [re.sub("'",'',each) for each in table_list]if table_name in table_list:return 1else:return 0# 数据缓存源def temp_data(self):connect = self.db_connect()cursor = connect.cursor()sql = '''insert into `dianyingxinxi`(id,title,year,picture,ypxx,pingfen,pjs,wxs,tags,plnr,uname,xqdz)selectid,title,year,picture,ypxx,pingfen,pjs,wxs,tags,plnr,uname,xqdzfrom `c2xklu0u_dianyingxinxi`where(not exists (selectid,title,year,picture,ypxx,pingfen,pjs,wxs,tags,plnr,uname,xqdzfrom `dianyingxinxi` where`dianyingxinxi`.id=`c2xklu0u_dianyingxinxi`.id))order by rand()limit 50;'''cursor.execute(sql)connect.commit()connect.close()
5.2 电影信息代码
# coding:utf-8
__author__ = "ila"import logging, os, json, configparser
import time
from datetime import datetimefrom flask import request, jsonify,session
from sqlalchemy.sql import func,and_,or_,case
from sqlalchemy import cast, Integer,Float
from api.models.brush_model import *
from . import main_bp
from utils.codes import *
from utils.jwt_auth import Auth
from configs import configs
from utils.helper import *
import random
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.header import Header
from utils.baidubce_api import BaiDuBce
from api.models.config_model import configfrom flask import current_app as app
from utils.spark_func import spark_read_mysql
from utils.hdfs_func import upload_to_hdfs
from utils.mapreduce1 import MRMySQLAvg# 注册接口
@main_bp.route("/python9532dr50/dianyingxinxi/register", methods=['POST'])
def python9532dr50_dianyingxinxi_register():if request.method == 'POST':msg = {'code': normal_code, 'message': 'success', 'data': [{}]}req_dict = session.get("req_dict")error = dianyingxinxi.createbyreq(dianyingxinxi, dianyingxinxi, req_dict)if error!=None:msg['code'] = crud_error_codemsg['msg'] = "注册用户已存在"return jsonify(msg)# 登录接口
@main_bp.route("/python9532dr50/dianyingxinxi/login", methods=['GET','POST'])
def python9532dr50_dianyingxinxi_login():if request.method == 'GET' or request.method == 'POST':msg = {"code": normal_code, "msg": "success", "data": {}}req_dict = session.get("req_dict")req_model = session.get("req_dict")try:del req_model['role']except:passdatas = dianyingxinxi.getbyparams(dianyingxinxi, dianyingxinxi, req_model)if not datas:msg['code'] = password_error_codemsg['msg']='密码错误或用户不存在'return jsonify(msg)req_dict['id'] = datas[0].get('id')try:del req_dict['mima']except:passreturn Auth.authenticate(Auth, dianyingxinxi, req_dict)# 登出接口
@main_bp.route("/python9532dr50/dianyingxinxi/logout", methods=['POST'])
def python9532dr50_dianyingxinxi_logout():if request.method == 'POST':msg = {"msg": "退出成功","code": 0}req_dict = session.get("req_dict")return jsonify(msg)# 重置密码接口
@main_bp.route("/python9532dr50/dianyingxinxi/resetPass", methods=['POST'])
def python9532dr50_dianyingxinxi_resetpass():''''''if request.method == 'POST':msg = {"code": normal_code, "msg": "success"}req_dict = session.get("req_dict")if req_dict.get('mima') != None:req_dict['mima'] = '123456'error = dianyingxinxi.updatebyparams(dianyingxinxi, dianyingxinxi, req_dict)if error != None:msg['code'] = crud_error_codemsg['msg'] = errorelse:msg['msg'] = '密码已重置为:123456'return jsonify(msg)# 获取会话信息接口
@main_bp.route("/python9532dr50/dianyingxinxi/session", methods=['GET'])
def python9532dr50_dianyingxinxi_session():''''''if request.method == 'GET':msg = {"code": normal_code, "data": {}}req_dict={"id":session.get('params').get("id")}msg['data'] = dianyingxinxi.getbyparams(dianyingxinxi, dianyingxinxi, req_dict)[0]return jsonify(msg)# 分类接口(后端)
@main_bp.route("/python9532dr50/dianyingxinxi/page", methods=['GET'])
def python9532dr50_dianyingxinxi_page():''''''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":10,"list":[]}}req_dict = session.get("req_dict")userinfo = session.get("params")try:__hasMessage__=dianyingxinxi.__hasMessage__except:__hasMessage__=Noneif __hasMessage__ and __hasMessage__!="否":tablename=session.get("tablename")if tablename!="users" and session.get("params")!=None and dianyingxinxi!='chat':req_dict["userid"]=session.get("params").get("id")tablename=session.get("tablename")if tablename=="users" :try:passexcept:passelse:mapping_str_to_object = {}for model in Base_model._decl_class_registry.values():if hasattr(model, '__tablename__'):mapping_str_to_object[model.__tablename__] = modeltry:__isAdmin__=mapping_str_to_object[tablename].__isAdmin__except:__isAdmin__=Nonetry:__authSeparate__ =mapping_str_to_object[tablename].__authSeparate__except:__authSeparate__ = Noneif __isAdmin__!="是" and __authSeparate__ == "是" and session.get("params")!=None:req_dict["userid"]=session.get("params").get("id")else:try:del req_dict["userid"]except:passclause_args = []or_clauses = or_(*clause_args)msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], msg['data']['pageSize'] = dianyingxinxi.page(dianyingxinxi, dianyingxinxi, req_dict, or_clauses)return jsonify(msg)# 排序接口
@main_bp.route("/python9532dr50/dianyingxinxi/autoSort", methods=['GET'])
def python9532dr50_dianyingxinxi_autosort():''''''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":10,"list":[]}}req_dict = session.get("req_dict")req_dict['sort']='clicktime'req_dict['order']='desc'try:__browseClick__= dianyingxinxi.__browseClick__except:__browseClick__=Noneif __browseClick__ =='是':req_dict['sort']='clicknum'elif __browseClick__ =='时长':req_dict['sort']='browseduration'else:req_dict['sort']='clicktime'msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], msg['data']['pageSize'] = dianyingxinxi.page(dianyingxinxi, dianyingxinxi, req_dict)return jsonify(msg)# 分页接口(前端)
@main_bp.route("/python9532dr50/dianyingxinxi/list", methods=['GET'])
def python9532dr50_dianyingxinxi_list():''''''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":10,"list":[]}}req_dict = session.get("req_dict")if req_dict.__contains__('vipread'):del req_dict['vipread']userinfo = session.get("params")try:__foreEndList__=dianyingxinxi.__foreEndList__except:__foreEndList__=Noneif __foreEndList__ and __foreEndList__!="否":tablename=session.get("tablename")if tablename!="users" and session.get("params")!=None:req_dict['userid']=session.get("params").get("id")try:__foreEndListAuth__=dianyingxinxi.__foreEndListAuth__except:__foreEndListAuth__=Noneif __foreEndListAuth__ and __foreEndListAuth__!="否":tablename=session.get("tablename")if tablename!="users" and session.get("params")!=None:req_dict['userid']=session.get("params").get("id")tablename=session.get("tablename")if tablename=="users" :try:del req_dict["userid"]except:passelse:mapping_str_to_object = {}for model in Base_model._decl_class_registry.values():if hasattr(model, '__tablename__'):mapping_str_to_object[model.__tablename__] = modeltry:__isAdmin__=mapping_str_to_object[tablename].__isAdmin__except:__isAdmin__=Noneif __isAdmin__!="是" and session.get("params")!=None:req_dict["userid"]=session.get("params").get("id")if 'luntan' in 'dianyingxinxi':if 'userid' in req_dict.keys():del req_dict["userid"]if 'discuss' in 'dianyingxinxi':if 'userid' in req_dict.keys():del req_dict["userid"]msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], msg['data']['pageSize'] = dianyingxinxi.page(dianyingxinxi, dianyingxinxi, req_dict)return jsonify(msg)# 保存接口(后端)
@main_bp.route("/python9532dr50/dianyingxinxi/save", methods=['POST'])
def python9532dr50_dianyingxinxi_save():''''''if request.method == 'POST':msg = {"code": normal_code, "msg": "success", "data": {}}req_dict = session.get("req_dict")for key in req_dict:if req_dict[key] == '':req_dict[key] = Noneerror= dianyingxinxi.createbyreq(dianyingxinxi, dianyingxinxi, req_dict)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn jsonify(msg)# 添加接口(前端)
@main_bp.route("/python9532dr50/dianyingxinxi/add", methods=['POST'])
def python9532dr50_dianyingxinxi_add():''''''if request.method == 'POST':msg = {"code": normal_code, "msg": "success", "data": {}}req_dict = session.get("req_dict")try:__foreEndListAuth__=dianyingxinxi.__foreEndListAuth__except:__foreEndListAuth__=Noneif __foreEndListAuth__ and __foreEndListAuth__!="否":tablename=session.get("tablename")if tablename!="users":req_dict['userid']=session.get("params").get("id")error= dianyingxinxi.createbyreq(dianyingxinxi, dianyingxinxi, req_dict)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn jsonify(msg)# 踩、赞接口
@main_bp.route("/python9532dr50/dianyingxinxi/thumbsup/<id_>", methods=['GET'])
def python9532dr50_dianyingxinxi_thumbsup(id_):''''''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": {}}req_dict = session.get("req_dict")id_=int(id_)type_=int(req_dict.get("type",0))rets=dianyingxinxi.getbyid(dianyingxinxi, dianyingxinxi,id_)update_dict={"id":id_,}if type_==1:#赞update_dict["thumbsupnum"]=int(rets[0].get('thumbsupnum'))+1elif type_==2:#踩update_dict["crazilynum"]=int(rets[0].get('crazilynum'))+1error = dianyingxinxi.updatebyparams(dianyingxinxi, dianyingxinxi, update_dict)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn jsonify(msg)# 获取详情信息(后端)
@main_bp.route("/python9532dr50/dianyingxinxi/info/<id_>", methods=['GET'])
def python9532dr50_dianyingxinxi_info(id_):''''''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": {}}data = dianyingxinxi.getbyid(dianyingxinxi, dianyingxinxi, int(id_))if len(data)>0:msg['data']=data[0]#浏览点击次数try:__browseClick__= dianyingxinxi.__browseClick__except:__browseClick__=Noneif __browseClick__ and "clicknum" in dianyingxinxi.__table__.columns:click_dict={"id":int(id_),"clicknum":str(int(data[0].get("clicknum") or 0)+1)}ret=dianyingxinxi.updatebyparams(dianyingxinxi,dianyingxinxi,click_dict)if ret!=None:msg['code'] = crud_error_codemsg['msg'] = retreturn jsonify(msg)# 获取详情信息(前端)
@main_bp.route("/python9532dr50/dianyingxinxi/detail/<id_>", methods=['GET'])
def python9532dr50_dianyingxinxi_detail(id_):''''''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": {}}data = dianyingxinxi.getbyid(dianyingxinxi, dianyingxinxi, int(id_))if len(data)>0:msg['data']=data[0]#浏览点击次数try:__browseClick__= dianyingxinxi.__browseClick__except:__browseClick__=Noneif __browseClick__ and "clicknum" in dianyingxinxi.__table__.columns:click_dict={"id":int(id_),"clicknum":str(int(data[0].get("clicknum") or 0)+1)}ret=dianyingxinxi.updatebyparams(dianyingxinxi,dianyingxinxi,click_dict)if ret!=None:msg['code'] = crud_error_codemsg['msg'] = retreturn jsonify(msg)# 更新接口
@main_bp.route("/python9532dr50/dianyingxinxi/update", methods=['POST'])
def python9532dr50_dianyingxinxi_update():''''''if request.method == 'POST':msg = {"code": normal_code, "msg": "success", "data": {}}req_dict = session.get("req_dict")if req_dict.get("mima") and "mima" not in dianyingxinxi.__table__.columns :del req_dict["mima"]if req_dict.get("password") and "password" not in dianyingxinxi.__table__.columns :del req_dict["password"]try:del req_dict["clicknum"]except:passerror = dianyingxinxi.updatebyparams(dianyingxinxi, dianyingxinxi, req_dict)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn jsonify(msg)# 删除接口
@main_bp.route("/python9532dr50/dianyingxinxi/delete", methods=['POST'])
def python9532dr50_dianyingxinxi_delete():''''''if request.method == 'POST':msg = {"code": normal_code, "msg": "success", "data": {}}req_dict = session.get("req_dict")error=dianyingxinxi.delete(dianyingxinxi,req_dict)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn jsonify(msg)# 投票接口
@main_bp.route("/python9532dr50/dianyingxinxi/vote/<int:id_>", methods=['POST'])
def python9532dr50_dianyingxinxi_vote(id_):''''''if request.method == 'POST':msg = {"code": normal_code, "msg": "success"}data= dianyingxinxi.getbyid(dianyingxinxi, dianyingxinxi, int(id_))for i in data:votenum=i.get('votenum')if votenum!=None:params={"id":int(id_),"votenum":votenum+1}error=dianyingxinxi.updatebyparams(dianyingxinxi,dianyingxinxi,params)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn jsonify(msg)@main_bp.route("/python9532dr50/dianyingxinxi/sectionStat/pingfen", methods=['GET'])
def python9532dr50_dianyingxinxi_sectionStat_pingfen():'''分段统计接口'''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": []}where = " where 1=1"tablename=session.get("tablename")sql = """SELECT '四分以下' as pingfen,case when t.四分以下 is null then 0 else t.四分以下 end totalfrom (selectsum(case when pingfen >= 0 and pingfen <= 4 then 1 else 0 end) as 四分以下, sum(case when pingfen >= 4.1 and pingfen <= 6 then 1 else 0 end) as 四分到六分, sum(case when pingfen >= 6.1 and pingfen <= 8 then 1 else 0 end) as 六分到八分, sum(case when pingfen >= 8.1 and pingfen <= 10 then 1 else 0 end) as 八到十分 from dianyingxinxi """ +where+""" ) t union all SELECT '四分到六分' as pingfen,case when t.四分到六分 is null then 0 else t.四分到六分 end totalfrom (selectsum(case when pingfen >= 0 and pingfen <= 4 then 1 else 0 end) as 四分以下, sum(case when pingfen >= 4.1 and pingfen <= 6 then 1 else 0 end) as 四分到六分, sum(case when pingfen >= 6.1 and pingfen <= 8 then 1 else 0 end) as 六分到八分, sum(case when pingfen >= 8.1 and pingfen <= 10 then 1 else 0 end) as 八到十分 from dianyingxinxi """ +where+""" ) t union all SELECT '六分到八分' as pingfen,case when t.六分到八分 is null then 0 else t.六分到八分 end totalfrom (selectsum(case when pingfen >= 0 and pingfen <= 4 then 1 else 0 end) as 四分以下, sum(case when pingfen >= 4.1 and pingfen <= 6 then 1 else 0 end) as 四分到六分, sum(case when pingfen >= 6.1 and pingfen <= 8 then 1 else 0 end) as 六分到八分, sum(case when pingfen >= 8.1 and pingfen <= 10 then 1 else 0 end) as 八到十分 from dianyingxinxi """ +where+""" ) t union all SELECT '八到十分' as pingfen,case when t.八到十分 is null then 0 else t.八到十分 end totalfrom (selectsum(case when pingfen >= 0 and pingfen <= 4 then 1 else 0 end) as 四分以下, sum(case when pingfen >= 4.1 and pingfen <= 6 then 1 else 0 end) as 四分到六分, sum(case when pingfen >= 6.1 and pingfen <= 8 then 1 else 0 end) as 六分到八分, sum(case when pingfen >= 8.1 and pingfen <= 10 then 1 else 0 end) as 八到十分 from dianyingxinxi """ +where+""" ) t """data = db.session.execute(sql)data = data.fetchall()results = []for i in range(len(data)):result = {'pingfen': decimalEncoder(data[i][0]),'total': decimalEncoder(data[i][1])}results.append(result)msg['data'] = resultsreturn jsonify(msg)
@main_bp.route("/python9532dr50/dianyingxinxi/sectionStat/wxs", methods=['GET'])
def python9532dr50_dianyingxinxi_sectionStat_wxs():'''分段统计接口'''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": []}where = " where 1=1"tablename=session.get("tablename")sql = """SELECT '二分以下' as wxs,case when t.二分以下 is null then 0 else t.二分以下 end totalfrom (selectsum(case when wxs >= 0 and wxs <= 2 then 1 else 0 end) as 二分以下, sum(case when wxs >= 2.1 and wxs <= 4 then 1 else 0 end) as 二到4分, sum(case when wxs >= 4.1 and wxs <= 5 then 1 else 0 end) as 四分到五分 from dianyingxinxi """ +where+""" ) t union all SELECT '二到4分' as wxs,case when t.二到4分 is null then 0 else t.二到4分 end totalfrom (selectsum(case when wxs >= 0 and wxs <= 2 then 1 else 0 end) as 二分以下, sum(case when wxs >= 2.1 and wxs <= 4 then 1 else 0 end) as 二到4分, sum(case when wxs >= 4.1 and wxs <= 5 then 1 else 0 end) as 四分到五分 from dianyingxinxi """ +where+""" ) t union all SELECT '四分到五分' as wxs,case when t.四分到五分 is null then 0 else t.四分到五分 end totalfrom (selectsum(case when wxs >= 0 and wxs <= 2 then 1 else 0 end) as 二分以下, sum(case when wxs >= 2.1 and wxs <= 4 then 1 else 0 end) as 二到4分, sum(case when wxs >= 4.1 and wxs <= 5 then 1 else 0 end) as 四分到五分 from dianyingxinxi """ +where+""" ) t """data = db.session.execute(sql)data = data.fetchall()results = []for i in range(len(data)):result = {'wxs': decimalEncoder(data[i][0]),'total': decimalEncoder(data[i][1])}results.append(result)msg['data'] = resultsreturn jsonify(msg)# 分组统计接口
@main_bp.route("/python9532dr50/dianyingxinxi/group/<columnName>", methods=['GET'])
def python9532dr50_dianyingxinxi_group(columnName):'''分组统计接口'''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": {}}req_dict = session.get("req_dict")userinfo = session.get("params")msg['data'] = dianyingxinxi.groupbycolumnname(dianyingxinxi,dianyingxinxi,columnName,req_dict)msg['data'] = msg['data'][:10]msg['data'] = [ {**i,columnName:str(i[columnName])} if columnName in i else i for i in msg['data']]json_filename='dianyingxinxi'+f'_group_{columnName}.json'where = ' where 1 = 1 'sql = "SELECT COUNT(*) AS total, " + columnName + " FROM dianyingxinxi " + where + " GROUP BY " + columnNamewith open(json_filename, 'w', encoding='utf-8') as f:f.write(json.dumps(msg['data'], indent=4, ensure_ascii=False))app.executor.submit(upload_to_hdfs, json_filename)app.executor.submit(MRMySQLAvg.run)return jsonify(msg)# 按值统计接口
@main_bp.route("/python9532dr50/dianyingxinxi/value/<xColumnName>/<yColumnName>", methods=['GET'])
def python9532dr50_dianyingxinxi_value(xColumnName, yColumnName):'''按值统计接口,{"code": 0,"data": [{"total": 10.0,"shangpinleibie": "aa"},{"total": 20.0,"shangpinleibie": "bb"},{"total": 15.0,"shangpinleibie": "cc"}]}'''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": {}}req_dict = session.get("req_dict")userinfo = session.get("params")msg['data'] = dianyingxinxi.getvaluebyxycolumnname(dianyingxinxi,dianyingxinxi,xColumnName,yColumnName,req_dict)msg['data'] = msg['data'][:10]return jsonify(msg)# 按日期统计接口
@main_bp.route("/python9532dr50/dianyingxinxi/value/<xColumnName>/<yColumnName>/<timeStatType>", methods=['GET'])
def python9532dr50_dianyingxinxi_value_riqi(xColumnName, yColumnName, timeStatType):'''按日期统计接口'''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": {}}userinfo = session.get("params")where = ' where 1 = 1 'sql = ''if timeStatType == '日':sql = "SELECT DATE_FORMAT({0}, '%Y-%m-%d') {0}, sum({1}) total FROM dianyingxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y-%m-%d')".format(xColumnName, yColumnName, where, '%Y-%m-%d')if timeStatType == '月':sql = "SELECT DATE_FORMAT({0}, '%Y-%m') {0}, sum({1}) total FROM dianyingxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y-%m')".format(xColumnName, yColumnName, where, '%Y-%m')if timeStatType == '年':sql = "SELECT DATE_FORMAT({0}, '%Y') {0}, sum({1}) total FROM dianyingxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y')".format(xColumnName, yColumnName, where, '%Y')data = db.session.execute(sql)data = data.fetchall()results = []for i in range(len(data)):result = {xColumnName: decimalEncoder(data[i][0]),'total': decimalEncoder(data[i][1])}results.append(result)msg['data'] = resultsjson_filename='dianyingxinxi'+f'_value_{xColumnName}_{yColumnName}.json'with open(json_filename, 'w', encoding='utf-8') as f:f.write(json.dumps(results, indent=4, ensure_ascii=False))app.executor.submit(upload_to_hdfs, json_filename)app.executor.submit(MRMySQLAvg.run)return jsonify(msg)# 按值统计(多)
@main_bp.route("/python9532dr50/dianyingxinxi/valueMul/<xColumnName>", methods=['GET'])
def python9532dr50_dianyingxinxi_valueMul(xColumnName):if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": []}req_dict = session.get("req_dict")userinfo = session.get("params")where = ' where 1 = 1 'for item in req_dict['yColumnNameMul'].split(','):sql = "SELECT {0}, sum({1}) AS total FROM dianyingxinxi {2} GROUP BY {0} LIMIT 10".format(xColumnName, item, where)L = []data = db.session.execute(sql)data = data.fetchall() for i in range(len(data)):result = {xColumnName: decimalEncoder(data[i][0]),'total': decimalEncoder(data[i][1])}L.append(result)msg['data'].append(L)return jsonify(msg)# 按值统计(多)
@main_bp.route("/python9532dr50/dianyingxinxi/valueMul/<xColumnName>/<timeStatType>", methods=['GET'])
def python9532dr50_dianyingxinxi_valueMul_time(xColumnName):if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": []}req_dict = session.get("req_dict")userinfo = session.get("params")timeStatType = req_dict['timeStatType']where = ' where 1 = 1 'for item in req_dict['yColumnNameMul'].split(','):sql = ''if timeStatType == '日':sql = "SELECT DATE_FORMAT({0}, '%Y-%m-%d') {0}, sum({1}) total FROM dianyingxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y-%m-%d') LIMIT 10".format(xColumnName, item, where, '%Y-%m-%d')if timeStatType == '月':sql = "SELECT DATE_FORMAT({0}, '%Y-%m') {0}, sum({1}) total FROM dianyingxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y-%m') LIMIT 10".format(xColumnName, item, where, '%Y-%m')if timeStatType == '年':sql = "SELECT DATE_FORMAT({0}, '%Y') {0}, sum({1}) total FROM dianyingxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y') LIMIT 10".format(xColumnName, item, where, '%Y')L = []data = db.session.execute(sql)data = data.fetchall() for i in range(len(data)):result = {xColumnName: decimalEncoder(data[i][0]),'total': decimalEncoder(data[i][1])}L.append(result)msg['data'].append(L)return jsonify(msg)import math
def cosine_similarity(a, b):numerator = sum([a[key] * b[key] for key in a if key in b])denominator = math.sqrt(sum([a[key]**2 for key in a])) * math.sqrt(sum([b[key]**2 for key in b]))return numerator / denominator#收藏协同算法
@main_bp.route("/python9532dr50/dianyingxinxi/autoSort2", methods=['GET'])
def python9532dr50_dianyingxinxi_autoSort2():if request.method == 'GET':user_ratings = {}req_dict = session.get("req_dict")userinfo = session.get("params")sql = "select * from storeup where type = 1 and tablename = 'dianyingxinxi' order by addtime desc"data = db.session.execute(sql)data_dict = [dict(zip(result.keys(), result)) for result in data.fetchall()]for item in data_dict:if user_ratings.__contains__(item["userid"]):ratings_dict = user_ratings[item["userid"]]if ratings_dict.__contains__(item["refid"]):ratings_dict[str(item["refid"])]+=1else:ratings_dict[str(item["refid"])] =1else:user_ratings[item["userid"]] = {str(item["refid"]):1}sorted_recommended_goods=[]try:# 计算目标用户与其他用户的相似度similarities = {other_user: cosine_similarity(user_ratings[userinfo.get("id")], user_ratings[other_user])for other_user in user_ratings if other_user != userinfo.get("id")}# 找到与目标用户最相似的用户most_similar_user = sorted(similarities, key=similarities.get, reverse=True)[0]# 找到最相似但目标用户未购买过的商品recommended_goods = {goods: rating for goods, rating in user_ratings[most_similar_user].items() ifgoods not in user_ratings[userinfo.get("id")]}# 按评分降序排列推荐sorted_recommended_goods = sorted(recommended_goods, key=recommended_goods.get, reverse=True)except:passL = []where = " AND ".join([f"{key} = '{value}'" for key, value in req_dict.items() if key!="page" and key!="limit" and key!="order"and key!="sort"])if where:sql = f'''SELECT * FROM (SELECT * FROM dianyingxinxi WHERE {where}) AS table1 WHERE id IN ('{"','".join(sorted_recommended_goods)}') union all SELECT * FROM (SELECT * FROM dianyingxinxi WHERE {where}) AS table1 WHERE id NOT IN ('{"','".join(sorted_recommended_goods)}')'''else:sql ="select * from dianyingxinxi where id in ('%s"%("','").join(sorted_recommended_goods)+"') union all select * from dianyingxinxi where id not in('%s"%("','").join(sorted_recommended_goods)+"')"data = db.session.execute(sql)data_dict = [dict(zip(result.keys(), result)) for result in data.fetchall()]for online_dict in data_dict:for key in online_dict:if 'datetime.datetime' in str(type(online_dict[key])):online_dict[key] = online_dict[key].strftime("%Y-%m-%d %H:%M:%S")elif 'datetime' in str(type(online_dict[key])):online_dict[key] = online_dict[key].strftime("%Y-%m-%d %H:%M:%S")else:passL.append(online_dict)return jsonify({"code": 0, "msg": '', "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":5,"list": L[0:int(req_dict['limit'])]}})# 总数量
@main_bp.route("/python9532dr50/dianyingxinxi/count", methods=['GET'])
def python9532dr50_dianyingxinxi_count():''''''if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": 0}req_dict = session.get("req_dict")userinfo = session.get("params")msg['data'] = dianyingxinxi.count(dianyingxinxi, dianyingxinxi, req_dict)return jsonify(msg)# 统计接口
@main_bp.route("/python9532dr50/dianyingxinxi/remind/<columnName>/<type>", methods=['GET']) #
def python9532dr50_dianyingxinxi_remind(columnName,type):''''''if request.method == 'GET':msg = {"code": normal_code, 'count': 0}# 组合查询参数params = session.get("req_dict")remindstart = 0remindend =9999990if int(type)==1:#数字if params.get('remindstart') == None and params.get('remindend') != None:remindstart = 0remindend = int(params['remindend'])elif params.get('remindstart') != None and params.get('remindend') == None:remindstart = int(params['remindstart'])remindend = 999999elif params.get('remindstart') == None and params.get('remindend') == None:remindstart = 0remindend = 999999else:remindstart = params.get('remindstart')remindend = params.get('remindend')elif int(type)==2:#日期current_time=int(time.time())if params.get('remindstart') == None and params.get('remindend') != None:starttime=current_time-60*60*24*365*2params['remindstart'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(starttime))endtime=current_time+60*60*24*params.get('remindend')params['remindend'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(endtime))elif params.get('remindstart') != None and params.get('remindend') == None:starttime= current_time - 60 * 60 * 24 * params.get('remindstart')params['remindstart']=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(starttime))endtime=current_time+60*60*24*365*2params['remindend'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(endtime))elif params.get('remindstart') == None and params.get('remindend') == None:starttime = current_time - 60 * 60 * 24 * 365 * 2params['remindstart'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(starttime))endtime = current_time + 60 * 60 * 24 * 365 * 2params['remindend'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(endtime))data = dianyingxinxi.getbetweenparams(dianyingxinxi,dianyingxinxi,columnName,{"remindStart": remindstart,"remindEnd": remindend})msg['count'] = len(data)return jsonify(msg)#分类列表
@main_bp.route("/python9532dr50/dianyingxinxi/lists", methods=['GET'])
def python9532dr50_dianyingxinxi_lists():if request.method == 'GET':msg = {"code": normal_code, "msg": "success", "data": []}list,_,_,_,_ = dianyingxinxi.page(dianyingxinxi,dianyingxinxi,{})msg['data'] = listreturn jsonify(msg)
源码项目、定制开发、文档报告、PPT、代码答疑
希望和大家多多交流!!
相关文章:
【项目实战】基于python+爬虫的电影数据分析及可视化系统
注意:该项目只展示部分功能,如需了解,文末咨询即可。 本文目录 1.开发环境2 系统设计 2.1 设计背景2.2 设计内容 3 系统页面展示 3.1 用户页面3.2 后台页面3.3 功能展示视频 4 更多推荐5 部分功能代码 5.1 爬虫代码5.2 电影信息代码 1.开发环…...
K8S命令部署后端(流水线全自动化部署)
前言 本文为链接: 云效流水线k8s半自动部署java(保姆级)的补充,本文起初的目的是为了补充完善k8s流水线的全自动化部署,但是也适用于k8s的一键重启,因为使用k8s的web页面容易出现漏点的情况,因此也可以把代码保存为shell脚本,同样可以实现一键重启。关于…...
GPS北斗卫星授时服务器功能是什么?应用是什么?
GPS北斗卫星授时服务器功能是什么?应用是什么? GPS北斗卫星授时服务器功能是什么?应用是什么? 摘 要:首先对计算机网络时间同步相关技术进行了介绍,然后阐述了时间同步技术在现代计算机网络中的应用与发展,最后指出时间同步网络…...
学习笔记064——如何手动将jar包导入到maven本地库
文章目录 1、背景:2、方法 1、背景: 有时网络慢的情况, 本地maven库需要导入外部下载的jar包。 以便于在项目的pom文件中,直接写dependency写导入依赖。 2、方法 在Windows终端中,输入: mvn install:in…...
未来趋势系列 篇二:HBM题材解析和股票梳理
文章目录 系列文章HBM题材解析环氧塑封电镀液PSPI(光敏性聚酰亚胺)前驱体封装基板其他材料TSV技术封装测试股票梳理系列文章 未来趋势系列 篇一:AI题材解析和股票梳理 HBM HBM(High Bandwidth Memory,高带宽内存)是一种专为高效能运算设计的新兴高速内存接口技术。它通…...
网卡驱动测试
以下是网卡驱动不同测试类型的具体方法和命令: 1. 功能性测试 驱动加载/卸载测试: 方法:加载/卸载网卡驱动,观察日志是否报错。命令: modprobe <driver_name> # 加载驱动 rmmod <driver_name> # 卸载驱动…...
DDR的跨4K问题
参考视频:【深入理解FPGA底层逻辑】、4k边界和outsdanding_哔哩哔哩_bilibili 1、AXI4_FULL突发写一个字节是一个地址, 2、协议规定,把AXI4从机的地址区间从0进行到了4095....每4K进行一次分配 所以突发长度的计算如下: 另外AX…...
数据结构---栈(Stack)
1. 简介 栈(Stack)是计算机科学中的一种抽象数据类型,它遵循特定的操作顺序,即后进先出(Last In First Out,LIFO)。这意味着最后添加到栈中的元素将是第一个被移除的。栈的基本操作通常包括&am…...
【JavaWeb后端学习笔记】Java上传文件到阿里云对象存储服务
阿里云对象存储 1、创建阿里云对象存储节点2、上传文件2.1 修改项目配置文件2.2 定义一个Properties类获取配置信息2.3 准备一个alioss工具类2.4 创建注册类,将AliOssUtil 注册成Bean2.5 使用AliOssUtil 工具类上传文件2.6 注意事项 使用阿里云对象存储服务分为以下…...
Unity3D RPG战斗系统详解
前言 设计一个RPG(角色扮演游戏)的战斗系统是游戏开发中的关键环节,它决定了游戏的乐趣和挑战性。在Unity3D中,可以通过多种技术和工具来实现一个功能完善的战斗系统。以下是对RPG战斗系统的技术详解以及代码实现。 对惹&#x…...
Spark架构及运行流程
Spark架构图 Driver: 解析用户的应用程序代码,转化为作业(job)。创建SparkContext上下文对象,其负责与资源管理器(ClusterManager)通信,进行资源的申请、任务的分配和监控等。跟踪Executor的执行情况。可通过UI界面查询运行情况。…...
SpringBoot3整合MyBatis
一、MyBatis整合步骤: (1).导入依赖:在Spring Boot项目的构建文件(如pom.xml)中添加MyBatis和数据库驱动的相关依赖。例如,如果使用MySQL数据库,您需要添加MyBatis和MySQL驱动的依赖。 (2).配置数据源:在application.properties或application.yml中配置…...
【计网笔记】习题
物理层 不属于物理层接口规范定义范畴的是(C) A. 接口形状 B. 引脚功能 C. 物理地址 D. 信号电平 【2023-912】光网络只能通过导向型介质传播。() 【2017-408】若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB条件下的…...
力扣56.合并区间
题目描述 题目链接56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: …...
【oracle】大数据删除插入
文章目录 引言本文目标 Oracle大数据插入操作插入操作的场景和需求使用并行查询进行数据插入示例代码:创建新表并插入数据解释代码中的关键点 性能优化建议 Oracle大数据删除操作删除操作的场景和需求使用游标和批量处理进行数据删除示例代码:批量删除数…...
mysql 双1设置
MySQL 的"双1"设置通常指的是两个配置参数:innodb_flush_log_at_trx_commit 和 sync_binlog。这两个参数都与 MySQL 的数据安全和性能有关。 innodb_flush_log_at_trx_commit:这个参数控制了 InnoDB 引擎中事务日志的刷新频率。它有三个可能的…...
《C++ 赋能 K-Means 聚类算法:开启智能数据分类之旅》
在当今数字化浪潮汹涌澎湃的时代,人工智能无疑是引领科技变革的核心驱动力之一。而在人工智能的广袤天地中,数据分类与聚类作为挖掘数据内在价值、揭示数据潜在规律的关键技术手段,正发挥着前所未有的重要作用。K-Means 聚类算法,…...
用Python开发一个经典贪吃蛇小游戏
Python 是开发小游戏的绝佳工具,借助第三方库,如 pygame,我们可以快速开发一个经典的贪吃蛇游戏。本篇将介绍如何用 Python 实现一个完整的贪吃蛇小游戏。 一、游戏设计 1.1 游戏规则 玩家通过方向键控制贪吃蛇移动。贪吃蛇吃到食物后会变长,同时得分增加。如果贪吃蛇撞到…...
《大宋豪侠传》客户端源码 + 服务端源码 + 工具源码 + 资源,大小16.3G
《大宋豪侠传》客户端源码 服务端源码 工具源码 资源,大小16.3G 下载地址: 通过网盘分享的文件:【源码】《大宋豪侠传》客户端源码 服务端源码 工具源码 资源,大小16.3G 链接: https://pan.baidu.com/s/1lUf84LzXKB3iM7L-1P…...
使用vue-seamless-scroll实现echarts图表大屏滚动,出现空白间隔的解决方案
一、背景介绍 最近的业务开发需求,想要实现echarts图表大屏滚动,小编首先采用vue-seamless-scroll进行实现,结果发现第二屏出现空白间隔,尝试了多种解决方案均不生效,最终选择换一个方案。 二、封装的ScrollList组件…...
zsh配置
zsh配置 https://zhuanlan.zhihu.com/p/58073103 $ cat .zshrc If you come from bash you might have to change your $PATH. export PATH H O M E / b i n : / u s r / l o c a l / b i n : HOME/bin:/usr/local/bin: HOME/bin:/usr/local/bin:PATH Path to your oh-my-zs…...
Brain.js(八):RNNTimeStep 实战教程 - 股票价格预测 - 实操需警慎
前置声明,个人浅度炒股,但计划将基金转入股市。然后 股市有风险,不是技术可以完全预测的,但是在无头绪的时候,用技术指标做个参考也不错。 本文涉及到的股票预测,只是代码简单示例,实操需警慎&a…...
Python+requests实现接口自动化测试
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传…...
java------------常用API preiod duration 计算时间差
1,preiod 如果末天数比初天数小,需要进一位 package API;import java.time.LocalDate; import java.time.Period;public class preiod {public static void main(String[] args) {// 计算时间差// LocalDate获取对象其中的一个方法LocalDate d1 LocalD…...
Android水波纹效果
Android水波纹效果 需要到水波纹效果的场景还蛮少的。万一刚好你需要呢 一、思路: 自定义组件SpreadView 二、效果图: 看视频更直观点: Android轮子分享-水波纹效果 三、关键代码: public class SpreadView extends View {pr…...
yolov8 转华为昇腾om脚本
目录 yolov8 转华为昇腾 om脚本 测试ok 推理demo: yolov8 转华为昇腾 om脚本 测试ok import sys import osos.chdir(os.path.dirname(os.path.abspath(__file__)))import torchcurrent_dir = os.path.dirname(os.path.abspath(__file__))paths = [os.path.abspath(__file__)…...
【人工智能】从基础到实践:用Python和PyTorch实现深度学习图像分割模型
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 图像分割是计算机视觉中的核心任务之一,旨在将图像划分为具有语义意义的区域,在自动驾驶、医疗影像分析等领域有广泛应用。本篇文章将从图像分割的基础知识出发,详细讲解分割任务的目标、评价指标以及常…...
AI绘画设计实战-Day2
Stable Diffusion 提示词前缀 FF,(masterpiece:1.2),best quality,highres,extremely detailed CG,perfect lighting,8k wallpaper,anime,comic,game CG, FF,(杰作:1.2),最高质量,高分辨率,极其…...
详解LeetCode地下城游戏(动态规划)——区分两种状态表示形式
地下城游戏 题目链接:174. 地下城游戏 状态表示: 按照以往题的表示,dp[i][j]表示:从起点(0,0)位置到达(i,j)位置时,所需的最小初始健康值。但是…...
CV(3)--噪声滤波和特征
前言 仅记录学习过程,有问题欢迎讨论 图像噪声(需要主动干扰的场景): 添加高斯噪声:概率密度函数服从高斯分布的一类噪声 通过设置sigma和mean生成符合高斯分布的随机数,然后计算输出像素,放缩…...
[C++]常对象、常对象成员、指向对象的常指针、指向常对象的指针变量以及对象的常引用
一、 常对象 1.定义: 一个常对象就是声明为常量的对象。我们不能改变这个对象的任何成员数据。具体来说,它是通过const关键字来声明的。 2.语法格式: const 类名 对象名;3.代码示例: class MyClass { public:int x;void setX…...
Spring Boot微服务应用实战:构建高效、可扩展的服务架构
在当今的软件开发领域,微服务架构凭借其高度的灵活性、可扩展性和可靠性,已成为众多企业的首选。而Spring Boot,作为Spring框架的一个子项目,以其简洁的API、快速的应用启动以及内嵌的Servlet容器等特点,成为了构建微服…...
如何通过 Windows 自带的启动管理功能优化电脑启动程序
在日常使用电脑的过程中,您可能注意到开机后某些程序会自动运行。这些程序被称为“自启动”或“启动项”,它们可以在系统启动时自动加载并开始运行,有时甚至在后台默默工作。虽然一些启动项可能是必要的(如杀毒软件)&a…...
力扣每日一题 - 1812. 判断国际象棋棋盘中一个格子的颜色
题目 还需要你前往力扣官网查看详细的题目要求 地址 1.给你一个坐标 coordinates ,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。2.如果所给格子的颜色是白色,请你返回 true,如果是黑色ÿ…...
Python subprocess.run 使用注意事项,避免出现list index out of range
在执行iOS UI 自动化专项测试的时候,在运行第一遍的时候遇到了这样的错误: 2024-12-04 20:22:27 ERROR conftest pytest_runtest_makereport 106 Test test_open_stream.py::TestOpenStream::test_xxx_open_stream[iPhoneX-xxx-1-250] failed with err…...
UI自动化测试框架:PO模式+数据驱动
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1. PO 设计模式简介 什么是 PO 模式? PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Pa…...
第四十六篇 Vision Transformer论文翻译
论文连接:https://arxiv.org/abs/2010.11929 GitHub:https://github.com/google-research/vision_transformer 摘要 虽然Transformer架构已成为自然语言处理任务的实际标准,但其在计算机视觉中的应用仍然有限。在计算机视觉中,注意力机制要么与卷积网络结合使用,要么在保…...
如何在Ubuntu中利用repo和git地址下载获取imx6ull的BSP
01-设置git的用户名和邮箱 git config --global user.name "suwenhao" git config --global user.email "2487872782qq.com"这里不设置的话后面在第5步的repo配置中还是会要求输入,而且以后进行相关操作都要输入,不妨现在就进行配置…...
redis数据结构和内部编码及单线程架构
博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. 数据结构和内部编码 Redis会在合适的场景选择合适的内部编码 我们可以通过objectencoding命令查询内部编码 : 2. 单线程架构 …...
2412d,d的6月会议
信息:gtkD的文档位置 原文 总结 DMDARM后端 Razvan问Walter他对DMD的ARM后端的分发,并想知道他是否考虑过其他选择,如整合DMD前端与LDC后端. Walter说,人们写信告诉他,他们喜欢使用DMD,因为它体积小,速度快.多年来,就要求他实现ARM后端. 有的人想写一个,但后来因为太难或太耗…...
提升网站流量的关键:AI在SEO关键词优化中的应用
内容概要 在当今数字时代,提升网站流量已成为每个网站管理员的首要任务。而人工智能的技术进步,为搜索引擎优化(SEO)提供了强有力的支持,尤其是在关键词优化方面。关键词是连接用户需求与网站内容的桥梁,其…...
【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!
在这个人工智能迅猛发展的时代,AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水?每款AI都有其独特的魅力与优势,那么,究竟哪一款AI聊天助手最适合你呢?本文将带…...
利润表在Zebra BI 中的应用(一)
效果如图。本案例采用极简式对比 需要注意的是:如原始数据是一维的,则需要确保比较的各年份所含项目一致,缺失的也要占位,否则会出错! 2022% of Revenue(占收入%) DIVIDE( [值_2022], CALCULA…...
12.09 C++作业2
利用函数重载,实现对整形数组的冒泡排序,对浮点型数组的冒泡排序 #include <iostream>using namespace std;int maopao(int(&ra)[10]) {//求数组长度int len sizeof(ra)/sizeof(ra[0]);int i,j,t;for(int i0;i<len;i){cin >>ra[i];}…...
MongoDB性能监控工具
mongostat mongostat是MongoDB自带的监控工具,其可以提供数据库节点或者整个集群当前的状态视图。该功能的设计非常类似于Linux系统中的vmstat命令,可以呈现出实时的状态变化。不同的是,mongostat所监视的对象是数据库进程。mongostat常用于…...
如何防范顶级应用程序安全威胁
如今的网络攻击数量是五年前的两倍多。因此,掌握最新的应用程序安全威胁对于防止数据泄露、经济损失和声誉受损至关重要。您还需要实施强大的安全实践,以保护应用程序免受最常见和最危险的威胁。 顶级应用程序安全威胁......以及如何防范这些威胁 1. 注…...
Java版-图论-拓扑排序与有向无环图
拓扑排序 拓扑排序说明 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列…...
汽车一键启动开关 、一键启动按键 、一键启动按钮
汽车一键启动按钮是智能汽车的重要部分,通常用于启动和关闭引擎。 具体功能: 启动引擎:在许多现代汽车中,一键启动按键取代了传统的钥匙启动方式。只需轻轻按下一键启动按钮,车辆电源即被接通,…...
SWIRL:有望成为2025年顶级AI搜索引擎
现在几乎每家公司都会有内部文档系统,如阿里的语雀、钉钉,字节的飞书,Confluence,印象笔记等等都可以提供给B端在局域网部署。因此,如果能把搜索功能做得高效,就能提高自家产品的竞争力。 想象一下…...
QT requested database does not belong to the calling thread.线程中查询数据报错
QT requested database does not belong to the calling thread.线程中查询数据报错 QString name "ttx"; QSqlQueryModel* sql_model; QString sql_comm QString("select * from dssb_moddve_loddt_tab where name%1").arg(name); sql_model->set…...