计算机毕设 大数据二手房数据爬取与分析可视化 -python 数据分析 可视化
# 1 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 基于大数据招聘岗位数据分析与可视化系统
🥇学长这里给一个题目综合评分(每项满分5分)
-
难度系数:3分
-
工作量:3分
-
创新点:5分
1 课题背景
首先通过爬虫采集链家网上所有二手房的房源数据,并对采集到的数据进行清洗;然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的规律;最后,采用一个聚类算法对所有二手房数据进行聚类分析,并根据聚类分析的结果,将这些房源大致分类,以对所有数据的概括总结。通过上述分析,我们可以了解到目前市面上二手房各项基本特征及房源分布情况,帮助我们进行购房决策。
2 实现效果
整体数据文件词云
各区域二手房房源数量折线图
二手房房屋用途水平柱状图
二手房基本信息可视化分析
各区域二手房平均单价柱状图
各区域二手房单价和总价箱线图
二手房单价最高Top20
二手房单价和总价热力图
二手房单价热力图
二手房总价小于200万的分布图
二手房建筑面积分析
二手房建筑面积分布区间柱状图
二手房房屋属性可视化分析
二手房房屋户型占比情况
从二手房房屋户型饼状图中可以看出,2室1厅与2室2厅作为标准配置,一共占比接近一半。其中3室2厅和3室1厅的房源也占比不少,其他房屋户型的房源占比就比较少了。
二手房房屋装修情况
二手房房屋朝向分布情况
二手房建筑类型占比情况
3 数据采集
该部分通过网络爬虫程序抓取链家网上所有二手房的数据,收集原始数据,作为整个数据分析的基石。
链家网网站结构分析
链家网二手房主页界面如下图,主页上面红色方框位置显示目前二手房在售房源的各区域位置名称,中间红色方框位置显示了房源的总数量,下面红色方框显示了二手房房源信息缩略图,该红色方框区域包含了二手房房源页面的URL地址标签。图2下面红色方框显示了二手房主页上房源的页数。
链家网二手房主页截图上半部分:
二手房房源信息页面如下图。我们需要采集的目标数据就在该页面,包括基本信息、房屋属性和交易属性三大类。各类信息包括的数据项如下:
1)基本信息:小区名称、所在区域、总价、单价。
2)房屋属性:房屋户型、所在楼层、建筑面积、户型结构、套内面积、建筑类型、房屋朝向、建筑结构、装修情况、梯户比例、配备电梯、产权年限。
3)交易属性:挂牌时间、交易权属、上次交易、房屋用途、房屋年限、产权所属、抵押信息、房本备件。
网络爬虫程序关键问题说明
1)问题1:链家网二手房主页最多只显示100页的房源数据,所以在收集二手房房源信息页面URL地址时会收集不全,导致最后只能采集到部分数据。
解决措施:将所有二手房数据分区域地进行爬取,100页最多能够显示3000套房,该区域房源少于3000套时可以直接爬取,如果该区域房源超过3000套可以再分成更小的区域。
2)问题2:爬虫程序如果运行过快,会在采集到两、三千条数据时触发链家网的反爬虫机制,所有的请求会被重定向到链家的人机鉴定页面,从而会导致后面的爬取失败。
解决措施:①为程序中每次http请求构造header并且每次变换http请求header信息头中USER_AGENTS数据项的值,让请求信息看起来像是从不同浏览器发出的访问请求。②爬虫程序每处理完一次http请求和响应后,随机睡眠1-3秒,每请求2500次后,程序睡眠20分钟,控制程序的请求速度。
4 数据清洗
对于爬虫程序采集得到的数据并不能直接分析,需要先去掉一些“脏”数据,修正一些错误数据,统一所有数据字段的格式,将这些零散的数据规整成统一的结构化数据。
原始数据主要需要清洗的部分
主要需要清洗的数据部分如下:
1)将杂乱的记录的数据项对齐
2)清洗一些数据项格式
3)缺失值处理
3.2.3 数据清洗结果
数据清洗前原始数据如下图,
清洗后的数据如下图,可以看出清洗后数据已经规整了许多。
5 数据聚类分析
该阶段采用聚类算法中的k-means算法对所有二手房数据进行聚类分析,根据聚类的结果和经验,将这些房源大致分类,已达到对数据概括总结的目的。在聚类过程中,我们选择了面积、总价和单价这三个数值型变量作为样本点的聚类属性。
k-means算法原理
基本原理
k-Means算法是一种使用最普遍的聚类算法,它是一种无监督学习算法,目的是将相似的对象归到同一个簇中。簇内的对象越相似,聚类的效果就越好。该算法不适合处理离散型属性,但对于连续型属性具有较好的聚类效果。
聚类效果判定标准
使各个样本点与所在簇的质心的误差平方和达到最小,这是评价k-means算法最后聚类效果的评价标准。
算法实现步骤
1)选定k值
2)创建k个点作为k个簇的起始质心。
3)分别计算剩下的元素到k个簇的质心的距离,将这些元素分别划归到距离最小的簇。
4)根据聚类结果,重新计算k个簇各自的新的质心,即取簇中全部元素各自维度下的算术平均值。
5)将全部元素按照新的质心重新聚类。
6)重复第5步,直到聚类结果不再变化。
7)最后,输出聚类结果。
算法缺点
虽然K-Means算法原理简单,但是有自身的缺陷:
1)聚类的簇数k值需在聚类前给出,但在很多时候中k值的选定是十分难以估计的,很多情况我们聚类前并不清楚给出的数据集应当分成多少类才最恰当。
2)k-means需要人为地确定初始质心,不一样的初始质心可能会得出差别很大的聚类结果,无法保证k-means算法收敛于全局最优解。
3)对离群点敏感。
4)结果不稳定(受输入顺序影响)。
5)时间复杂度高O(nkt),其中n是对象总数,k是簇数,t是迭代次数。
算法实现关键问题说明
K值的选定说明
根据聚类原则:组内差距要小,组间差距要大。我们先算出不同k值下各个SSE(Sum of
squared
errors)值,然后绘制出折线图来比较,从中选定最优解。从图中,我们可以看出k值到达5以后,SSE变化趋于平缓,所以我们选定5作为k值。
初始的K个质心选定说明
初始的k个质心选定是采用的随机法。从各列数值最大值和最小值中间按正太分布随机选取k个质心。
关于离群点
离群点就是远离整体的,非常异常、非常特殊的数据点。因为k-means算法对离群点十分敏感,所以在聚类之前应该将这些“极大”、“极小”之类的离群数据都去掉,否则会对于聚类的结果有影响。离群点的判定标准是根据前面数据可视化分析过程的散点图和箱线图进行判定。根据散点图和箱线图,需要去除离散值的范围如下:
1)单价:基本都在100000以内,没有特别的异常值。
2)总价:基本都集中在3000以内,这里我们需要去除3000外的异常值。
3)建筑面积:基本都集中在500以内,这里我们需要去除500外的异常值。
数据的标准化
因为总价的单位为万元,单价的单位为元/平米,建筑面积的单位为平米,所以数据点计算出欧几里德距离的单位是没有意义的。同时,总价都是3000以内的数,建筑面积都是500以内的数,但单价基本都是20000以上的数,在计算距离时单价起到的作用就比总价大,总价和单价的作用都远大于建筑面积,这样聚类出来的结果是有问题的。这样的情况下,我们需要将数据标准化,即将数据按比例缩放,使之都落入一个特定区间内。去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行计算和比较。
我们将单价、总价和面积都映射到500,因为面积本身就都在500以内,不要特别处理。单价在计算距离时,需要先乘以映射比例0.005,总价需要乘以映射比例0.16。进行数据标准化前和进行数据标准化后的聚类效果对比如下:图32、图33是没有数据标准化前的聚类效果散点图;图34、图35是数据标准化后的聚类效果散点图。
数据标准化前的单价与建筑面积聚类效果散点图:
聚类结果分析
聚类结果如下
1)聚类结果统计信息如下:
2)聚类后的单价与建筑面积散点图和总价与建筑面积散点图。
3)聚类结果分组0、1、2、3、4的区域分布图如下实例。
聚类结果分组0的区域分布图如下:
6 部分核心代码
# -*- coding: utf-8 -*-
"""
Created on Tue Feb 23 10:09:15 2016
K-means cluster
@author: liudiwei
"""import numpy as npclass KMeansClassifier():"this is a k-means classifier"def __init__(self, k=3, initCent='random', max_iter=5000):"""构造函数,初始化相关属性"""self._k = kself._initCent = initCent#初始中心self._max_iter = max_iter#最大迭代#一个m*2的二维矩阵,矩阵第一列存储样本点所属的族的索引值,#第二列存储该点与所属族的质心的平方误差self._clusterAssment = None#样本点聚类结结构矩阵self._labels = Noneself._sse = None#SSE(Sum of squared errors)平方误差和def _calEDist(self, arrA, arrB):"""功能:欧拉距离距离计算输入:两个一维数组"""arrA_temp = arrA.copy()arrB_temp = arrB.copy()arrA_temp[0] = arrA_temp[0]*0.16arrA_temp[1] = arrA_temp[1]*0.005arrB_temp[0] = arrB_temp[0]*0.16arrB_temp[1] = arrB_temp[1]*0.005return np.math.sqrt(sum(np.power(arrA_temp - arrB_temp, 2)))def _calMDist(self, arrA, arrB):"""功能:曼哈顿距离距离计算输入:两个一维数组"""return sum(np.abs(arrA-arrB))def _randCent(self, data_X, k):"""功能:随机选取k个质心输出:centroids #返回一个m*n的质心矩阵"""n = data_X.shape[1] - 3 #获取特征值的维数(要删除一个用于标记的id列和经纬度值)centroids = np.empty((k,n)) #使用numpy生成一个k*n的矩阵,用于存储质心for j in range(n):minJ = min(data_X[:,j+1])rangeJ = max(data_X[:,j+1] - minJ)#使用flatten拉平嵌套列表(nested list)centroids[:, j] = (minJ + rangeJ * np.random.rand(k, 1)).flatten()return centroids def fit(self, data_X):"""输入:一个m*n维的矩阵"""if not isinstance(data_X, np.ndarray) or \isinstance(data_X, np.matrixlib.defmatrix.matrix):try:data_X = np.asarray(data_X)except:raise TypeError("numpy.ndarray resuired for data_X")m = data_X.shape[0] #获取样本的个数#一个m*2的二维矩阵,矩阵第一列存储样本点所属的族的编号,#第二列存储该点与所属族的质心的平方误差self._clusterAssment = np.zeros((m,2)) #创建k个点,作为起始质心if self._initCent == 'random':self._centroids = self._randCent(data_X, self._k)clusterChanged = True#循环最大迭代次数for _ in range(self._max_iter): #使用"_"主要是因为后面没有用到这个值clusterChanged = Falsefor i in range(m): #将每个样本点分配到离它最近的质心所属的族minDist = np.inf #首先将minDist置为一个无穷大的数minIndex = -1 #将最近质心的下标置为-1for j in range(self._k): #次迭代用于寻找元素最近的质心arrA = self._centroids[j,:]arrB = data_X[i,1:4]distJI = self._calEDist(arrA, arrB) #计算距离if distJI < minDist:minDist = distJIminIndex = jif self._clusterAssment[i, 0] != minIndex or self._clusterAssment[i, 1] > minDist**2:clusterChanged = Trueself._clusterAssment[i,:] = minIndex, minDist**2if not clusterChanged:#若所有样本点所属的族都不改变,则已收敛,结束迭代breakfor i in range(self._k):#更新质心,将每个族中的点的均值作为质心index_all = self._clusterAssment[:,0] #取出样本所属簇的编号value = np.nonzero(index_all==i) #取出所有属于第i个簇的索引值ptsInClust = data_X[value[0]] #取出属于第i个簇的所有样本点self._centroids[i,:] = np.mean(ptsInClust[:,1:4], axis=0) #计算均值,赋予新的质心self._labels = self._clusterAssment[:,0]self._sse = sum(self._clusterAssment[:,1])def predict(self, X):#根据聚类结果,预测新输入数据所属的族#类型检查if not isinstance(X,np.ndarray):try:X = np.asarray(X)except:raise TypeError("numpy.ndarray required for X")m = X.shape[0]#m代表样本数量preds = np.empty((m,))for i in range(m):#将每个样本点分配到离它最近的质心所属的族minDist = np.inffor j in range(self._k):distJI = self._calEDist(self._centroids[j,:], X[i,:])if distJI < minDist:minDist = distJIpreds[i] = jreturn predsclass biKMeansClassifier():"this is a binary k-means classifier"def __init__(self, k=3):self._k = kself._centroids = Noneself._clusterAssment = Noneself._labels = Noneself._sse = Nonedef _calEDist(self, arrA, arrB):"""功能:欧拉距离距离计算输入:两个一维数组"""return np.math.sqrt(sum(np.power(arrA-arrB, 2)))def fit(self, X):m = X.shape[0]self._clusterAssment = np.zeros((m,2))centroid0 = np.mean(X, axis=0).tolist()centList =[centroid0]for j in range(m):#计算每个样本点与质心之间初始的平方误差self._clusterAssment[j,1] = self._calEDist(np.asarray(centroid0), \X[j,:])**2while (len(centList) < self._k):lowestSSE = np.inf#尝试划分每一族,选取使得误差最小的那个族进行划分for i in range(len(centList)):index_all = self._clusterAssment[:,0] #取出样本所属簇的索引值value = np.nonzero(index_all==i) #取出所有属于第i个簇的索引值ptsInCurrCluster = X[value[0],:] #取出属于第i个簇的所有样本点clf = KMeansClassifier(k=2)clf.fit(ptsInCurrCluster)#划分该族后,所得到的质心、分配结果及误差矩阵centroidMat, splitClustAss = clf._centroids, clf._clusterAssmentsseSplit = sum(splitClustAss[:,1])index_all = self._clusterAssment[:,0] value = np.nonzero(index_all==i)sseNotSplit = sum(self._clusterAssment[value[0],1])if (sseSplit + sseNotSplit) < lowestSSE:bestCentToSplit = ibestNewCents = centroidMatbestClustAss = splitClustAss.copy()lowestSSE = sseSplit + sseNotSplit#该族被划分成两个子族后,其中一个子族的索引变为原族的索引#另一个子族的索引变为len(centList),然后存入centListbestClustAss[np.nonzero(bestClustAss[:,0]==1)[0],0]=len(centList)bestClustAss[np.nonzero(bestClustAss[:,0]==0)[0],0]=bestCentToSplitcentList[bestCentToSplit] = bestNewCents[0,:].tolist()centList.append(bestNewCents[1,:].tolist())self._clusterAssment[np.nonzero(self._clusterAssment[:,0] == \bestCentToSplit)[0],:]= bestClustAss self._labels = self._clusterAssment[:,0] self._sse = sum(self._clusterAssment[:,1])self._centroids = np.asarray(centList)def predict(self, X):#根据聚类结果,预测新输入数据所属的族#类型检查if not isinstance(X,np.ndarray):try:X = np.asarray(X)except:raise TypeError("numpy.ndarray required for X")m = X.shape[0]#m代表样本数量preds = np.empty((m,))for i in range(m):#将每个样本点分配到离它最近的质心所属的族minDist = np.inffor j in range(self._k):distJI = self._calEDist(self._centroids[j,:],X[i,:])if distJI < minDist:minDist = distJIpreds[i] = jreturn preds
7 最后
相关文章:

计算机毕设 大数据二手房数据爬取与分析可视化 -python 数据分析 可视化
# 1 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通…...

【转载】 Bytedance火山引擎智能拥塞控制算法 VICC
BytedanceTechBlog : 火山引擎实时、低延时拥塞控制算法的优化实践 火山引擎 网站如何利用播放器节省20%点播成本点击下面的链接进入原文:原创 翟强俊、唐辉 字节跳动技术团队 2023-10-18 11:59 发表于北京 一些专利摘要 火山引擎智能拥塞控制算法 VICC(Volcano Intelligent…...

Postman如何测试WebService接口
前言: 由于工作所需,需要使用Postman测试工具,对基于ws规范的WebService接口进行测试.在经过多种尝试后,终于找到了正确的测试方法.下面我便详细记录测试步骤,以便以后再次测试时可以拿来主义. 第一步:确保WebService服务端正常启动(注意服务端各个接口发布的url地址) 第二步…...

微服务-Eureka
文章目录 提供者与消费者Eureka注册中心搭建EurekaServer服务注册服务发现项目结构 提供者与消费者 Eureka注册中心 服务消费者该如何获取服务提供者的地址信息? 服务提供者启动时向eureka注册自己的信息 eureka保存这些信息 消费者根据服务名称向eureka拉取提供者信…...

超声电机工作原理
超声波电机的工作原理 在压电陶瓷振子上加高频交流电压时,利用逆压电效应或电致伸缩效应使定子产生微观机械振动。并将这种振动通过共振放大和摩擦耦合变换成旋转或直线型运动。 超声波驱动有两个前提条件: 需在定子表面激励出稳态的质点椭圆运动轨迹…...

基于人工蜂鸟优化的BP神经网络(分类应用) - 附代码
基于人工蜂鸟优化的BP神经网络(分类应用) - 附代码 文章目录 基于人工蜂鸟优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.人工蜂鸟优化BP神经网络3.1 BP神经网络参数设置3.2 人工蜂鸟算法应用 4.测试结果…...

两个list中存放相同的对象,一个是页面导入,一个是从数据库查询,外部传入一个集合存放的是对象的属性名称,根据属性名称处理两个list
需求:两个list中存放相同的对象,一个是页面导入,一个是从数据库查询,外部传入一个集合存放的是对象的属性名称.要求根据传入的属性(多个)判断两个list中是否有重复的对象, 如果重复则删除数据库的list, 然后合并两个list. /*** 处理导入和数据库重复数据* param list* param l…...

为什么C++能搜到的框架介绍都好抽象?
为什么C能搜到的框架介绍都好抽象? 那是因为c每次都要自建生态 随便一个库发展到一定阶段,它就开始跨界,做得又大又全 结果就是,虽然都叫c,但其实是由一大堆不同生态组成的统称 c跟c的差异,比java跟c的差…...

人工智能(6):机器学习基础环境安装与使用
1 库的安装 整个机器学习基础阶段会用到Matplotlib、Numpy、Pandas等库,为了统一版本号在环境中使用,将所有的库及其版本放到了文件requirements.txt当中,然后统一安装 新建一个用于人工智能环境的虚拟环境 mkvirtualenv ai matplotlib3.8…...

电力巡检/电力抢修行业解决方案:AI+视频技术助力解决巡检监管难题
一、行业背景 随着国民经济的蓬勃发展,工业用电和居民用电需求迅速增加,电厂、变电站、输电线路高负荷运转,一旦某个节点发生故障,对生产、生活造成巨大的影响。目前电力行业生产现场人员、设备较多,而生产监督员有限…...

区块链轻节点的问答
EOS的nodeos并没有获取merkle proof的功能,那应该怎样获取merkle proof nodeos(EOS区块链节点软件)本身并不提供Merkle Proof的功能,而是全节点或其他数据源通常提供Merkle Proof。获取Merkle Proof的过程通常需要与全节点或区块浏…...

常用Web安全扫描工具汇整
漏洞扫描是一种安全检测行为,更是一类重要的网络安全技术,它能够有效提高网络的安全性,而且漏洞扫描属于主动的防范措施,可以很好地避免黑客攻击行为,做到防患于未然。 1、AWVS Acunetix Web Vulnerability Scanner&a…...

查看当前cmake版本支持哪些版本的Visual Studio
不同版本的的cmake对Visual Studio的版本支持不同,以下图示展示了如何查看当前安装的cmake支持哪些版本的Visual Studio。 1.打开cmake-gui 2.查看cmake支持哪些版本的Visual Studio...

岩土工程桥梁监测中智能振弦传感器的应用方案
岩土工程桥梁监测中智能振弦传感器的应用方案 岩土工程桥梁监测是重要的安全保障措施,而智能振弦传感器是其中一种有效的监测手段。它可以通过测量桥梁振动的频率和幅值,监测桥梁的健康状态,预测可能出现的问题,并及时采取措施进…...

上云容灾如何实现碳中和-万博智云受邀参加1024程序员节数据技术论坛并发表演讲
近日,2023长沙中国1024程序员节在长沙召开。 长沙中国1024程序员节继2020年后已成功连续举办三届,逐步成为 IT 行业引领技术前沿、推动应用创新发展的高影响力年度盛会。是 IT 领域新技术、新产品、新服务的重要发布平台。 万博智云CEO Michael受邀参加…...

蓝桥杯每日一题2023.10.26
测试次数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 对于本题我们可以使用动态规划来分析 dp[i][j]代表剩余i层,j台手机的情况下对应的测试数量 分类进行讨论一下: 1.当只剩下一台手机的时候,只能从第一层一层一层往上尝试,…...

[已解决]安装的明明是pytorch-gpu,但是condalist却显示cpu版本,而且torch.cuda.is_available 也是flase
问题; 安装了gpu版本的pytorch,但是显示的torch.cuda.is_available()却是flase。 conda list查看 版本显示只有cpuonly 在网上找了半天,也没有解决办法。 仔细看了一下,发现,有个单独的包叫cpuonly,不知道…...

[数据分析与可视化] 基于Python绘制简单动图
动画是一种高效的可视化工具,能够提升用户的吸引力和视觉体验,有助于以富有意义的方式呈现数据可视化。本文的主要介绍在Python中两种简单制作动图的方法。其中一种方法是使用matplotlib的Animations模块绘制动图,另一种方法是基于Pillow生成…...

MySQL基础入门教程(InsCode AI 创作助手)
MySQL基础入门教程:从安装到查询 MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了强大的数据存储和查询功能。无论是新手还是有经验的开发人员,本篇技术博客将带深入了解MySQL的基础知识,包括安装、配置、数据库操作和查…...

【Linux】 rpm安装包保存到本地并批量安装
目录 一、开启rpm安装包缓存到本地仓库 1. 修改yum.conf文件 2. 清理yum缓存 3. yum命令安装软件包 二、如何将rpm安装包保存到指定目录 方法一:yumdownloader 1. 安装yum-utils 2. yumdownloader命令参数说明 3. yumdownloader安装示例 方法二ÿ…...

数据分析案例-某公司员工数据信息可视化(文末送书)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...

浅谈wheel滚轮事件
<divonWheel{(ee) > {// new WheelEvent(自定义,e) 获取 e[wheelDelta],e[deltaY] 判断滚轮方向var e new WheelEvent(syntheticWheel,ee)console.log(滚动触发事件, e,ee);console.log(滚动触发事件e.wheelDelta, e[wheelDelta],e[deltaY]);console.log(滚动触发事件e.…...

FTP服务器操作手册
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。FTP协议是File Transfer Protocol(文件传输协议),专门用来传输文件的协议。FTP服务器是企业里经常用到的服务器,今天就介绍一…...

Android使用Glide类加载服务器中的图片
Glide类用于从服务器中获取图片并加载进ImageView。 一、添加依赖 Glide为第三方框架,使用时需添加依赖: 在 Gradle Scripts / build.gradle(Module:app) / dependencies方法 中添加 implementation com.github.bumptech.glide:glide:4.12.0 添加后…...

【打靶】vulhub打靶复现系列3---Chronos
【打靶】vulhub打靶复现系列3---Chronos 一、主机探测 结合之前的方法(arp探测、ping检测),因为我们的靶机和攻击机都在第二层,所以打靶时候我们更依赖arp协议 tips:我在运行期间发现,netdiscover窗口没关…...

基于Java的新闻发布管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

CRM系统如何选型?
不少企业都想要使用CRM客户管理系统,但往往在CRM选型阶段就被折腾的五迷三道。CRM系统选型难在哪里?下面我们从企业用户和CRM厂商两方面进行分析,来说说关于CRM系统选型的那些事。 企业自身原因: 1、认知偏差 看到一个观点&…...

山东大学开发可解释深度学习算法 RetroExplainer,4 步识别有机物的逆合成路线
逆合成旨在找到一系列合适的反应物,以高效合成目标产物。这是解决有机合成路线的重要方法,也是有机合成路线设计的最简单、最基本的方法。 早期的逆合成研究多依赖编程,随后这一工作被 AI 接替。然而,现有的逆合成方法多关注单步逆…...

使用antv x6注册vue组件报错,TypeError: Object(...) is not a function (teleport.js:3:23)
typeError: Object(…) is not a function at …/…/…/node_modules/.pnpm/antvx6-vue-shape2.1.1_antvx62.15.2vue2.7.10/node_modules/antv/x6-vue-shape/es/teleport.js (teleport.js:3:23) 点击定位到报错的位置为 reactive应该是vue 2.7.*版本才有的 由于项目在index.ht…...

Python开发利器KeymouseGo,开源的就是香
1、介绍 在日常工作中,经常会遇到一些重复性的工作,不管是点击某个按钮、写文字,打印,还是复制粘贴拷贝资料之类的,需要进行大量的重复操作。按键精灵大家想必都听说过,传统的方式,可以下载个按…...