当前位置: 首页 > news >正文

【人工智能】—基于成都市各区(市)县租房价格预测建模研究

引言

随着城市化进程的加速,人口流动日益频繁,租房市场作为城市生活的重要组成部分,其价格波动对居民生活质量和城市经济发展具有显著影响。成都市,作为中国西部地区的经济、文化、交通和科技中心,近年来吸引了大量人才和企业,租房需求持续增长。然而,租房价格的不确定性给租户和房东带来了诸多不便。为了更好地理解租房市场的动态,预测租房价格成为一项重要的研究课题。

研究方法

本文将采用多种数据分析方法,包括统计分析、机器学习等,以确保模型的准确性和可靠性。

研究目标

本文旨在通过构建基于成都市各区(市)县的租房价格预测模型,分析影响租房价格的关键因素。

数据信息

数据源自某租房平台网站,数据为公开数据,通过整合形成表格,本数据需要进行清洗,没有国外数据好用。

过程……

读入数据:

import matplotlib.pylab as plt
import re
import numpy as np
import seaborn as sns
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False   #解决符号无法显示
import warnings
warnings.filterwarnings('ignore')
# 导入plotly库,这是一个基于Web的交互式图表库,允许创建丰富的、交互式的数据可视化图表。  
import plotly as py    
# 导入cufflinks库,这是一个用于Pandas DataFrame的Plotly绘图接口,可以让Pandas DataFrame直接通过cufflinks的API绘制Plotly图表。  
import plotly.express as px
import plotly.graph_objects as go  df = pd.read_csv('成都.csv')
df.tail()

原始数据长下面这样,显示后5行:
在这里插入图片描述
我们先看下数据信息、重复值、缺失值情况:
在这里插入图片。描述有4列存在缺失值情况,181行数据重复。

# 删除缺失值
df.dropna(inplace=True)
# 删除重复值
df.drop_duplicates(inplace=True)
df.shape

删完剩余2786行, 8列。

数据清洗:

# 定义一个函数,用于从字符串中提取括号前的中文部分  
def extract_chinese_before_brackets(s):  # 检查传入的参数s是否为字符串类型  if isinstance(s, str):  # 使用正则表达式搜索字符串s,查找从开头到第一个全角左括号(之前的所有内容  match = re.search(r'^(.*?)(', s)  # 如果找到了匹配项  if match:  # 返回匹配到的内容(即括号前的所有字符)  return match.group(1)  else:  # 如果没有找到匹配项(即没有括号或括号前没有内容),返回空字符串  return ''  else:  # 如果传入的参数s不是字符串类型,直接返回空字符串  return ''  # 应用上面定义的函数到DataFrame的'楼层'列  
# 使用apply方法,将函数应用于'楼层'列的每一个元素  
# 并将函数的返回值(即每个元素括号前的中文部分)存储在新的列'楼层类型'中  
df['楼层类型'] = df['楼层'].apply(extract_chinese_before_brackets)  df.tail()

上面定义一个函数,用于提取“楼层”列最左边的中文文字,存储于新建列“楼层类型”列并显示后5行,详见下图:
在这里插入图片描述

# 使用str.extract方法从'楼层'列的每个字符串中提取括号内的数字(\d+)  
# 这里的正则表达式'((\d+)层)'用于匹配全角左括号'('后跟着一个或多个数字'\d+',然后是全角右括号和'层'字  
# 提取的数字(即括号内的内容)将被存储在新的列'楼房层数'中  
df['楼房层数'] = df['楼层'].str.extract(r'((\d+)层)')    
# 使用drop方法删除原始的'楼层'列  
# 参数columns='楼层'指定了要删除的列名  
# inplace=True表示在原地修改DataFrame,而不是返回一个新的DataFrame  
df.drop(columns='楼层', inplace=True)    
# 使用head方法查看修改后的DataFrame的前几行(默认是前5行)  
# 这有助于验证'楼房层数'列是否已正确添加,并且'楼层'列是否已被删除  
df.head()

再利用正则表达式,提取出括号内的数字,也就是楼层并存储于新列,显示前5行数据,详见下图:
在这里插入图片描述

# 提取的结果将被分配到新的列'卧室间数'、'客厅间数'和'卫生间数'
df[['卧室间数', '客厅间数', '卫生间数']] = df['户型'].str.extract(r'(\d+)室(\d+)厅(\d+)卫', expand=True)  
df.drop(columns='户型', inplace=True)
df.head()

新建三列’卧室间数’, ‘客厅间数’, '卫生间数’用于存储户型内的如“3室1厅2卫 ”便于后续的机器学习,还是利用正则表达式提取,详见下图:
在这里插入图片描述

df[['区(市)县', '地域', '楼盘名称']] = df['位置'].str.split('-', expand=True, n=2)
df.drop(columns='位置', inplace=True)
df.head()

新建’区(市)县’, ‘地域’, '楼盘名称’三列,用于存储“位置”列如“青羊-外光华-凯德风尚 ”用于后续的数据分析,详见下图:
在这里插入图片描述
现在我们来看看“朝向”列有哪些不重复的唯一值:
在这里插入图片描述可以看到国内的数据很乱,现在要做的是有“东”或“西”字眼的我们统一把他替换为“东西”,有“南”或“北”字眼的我们统一把他替换为“南北”。继续写个函数来处理数据。

# 定义转换函数  
def transform_direction(direction):  if pd.isna(direction):  # 检查是否为 NaN  return np.nan  # 或者你可以选择返回其他默认值,如 '未知'  if isinstance(direction, str):  # 确保是字符串类型  if '东' in direction or '西' in direction:  return '东西'  elif '南' in direction or '北' in direction:  return '南北'  else:  return direction  # 返回原始字符串(这里可能包含'未知'等)  else:  return np.nan  # 如果不是字符串类型,返回 NaN(或其他默认值)  # 将 '朝向' 列转换为字符串类型,并处理 NaN 值  
df['朝向'] = df['朝向'].astype(str)    
# 应用转换函数到 Series 的每个元素  
df['朝向'] = df['朝向'].apply(transform_direction)  
df.tail()

处理完成,显示后5行,详见下图:

在这里插入图片描述再看下其他列有没有问题:
在这里插入图片描述没啥问题,现在将数字类型的列转为相对应的类型:

df = df.astype({'金额': 'int','楼房层数': 'int','卧室间数': 'int','客厅间数': 'int','卫生间数': 'int'}) # 指定字段转指定类型
df.info()

在这里插入图片描述
搞定,进入下一阶段内容。

探索性分析(EDA)

# 使用Plotly绘制箱型图  
fig = go.Figure(data=[go.Box(  y=df['金额'],  # 这里y轴对应你的租金数据  name='房屋租金'    # 图例名称  
)])  # 自定义图表标题和轴标签  
fig.update_layout(title='房屋租金——箱型图',  yaxis_title='租金',  xaxis_title='')  # 箱型图通常不需要x轴标题,除非你有多个箱型图并列  # 显示图表  
fig.show()

在这里插入图片描述
从上图可以看出,大部分房屋月租金都比较集中,成都市最高的租金为45000元/月,最小的为500元/月,中位数为2500元/月,还有四分位距、决策边界等内容。

# 对DataFrame按'区(市)县'进行分组,并获取每个组的'房屋租金'数据  
grouped = df.groupby('区(市)县')['金额']  # 创建一个空的图表对象  
fig = go.Figure()  # 遍历每个组,为每个组添加一个箱型图轨迹  
for name, group in grouped:  fig.add_trace(go.Box(  y=group,  name=name,  boxpoints='all',  # 显示所有点  jitter=0.3,       # 点的抖动量,以防重叠  pointpos=-1.8      # 点的位置  ))  # 自定义图表布局  
fig.update_layout(  title='按区(市)县分组的房屋租金——箱型图',  yaxis_title='租金',  xaxis_title='',  xaxis=dict(  type='category',  # 设置x轴为类别轴  categoryorder='array',  # 自定义类别顺序  categoryarray=list(grouped.groups.keys())  # 将dict_keys转换为列表  )  
)  # 显示图表  
fig.show()

在这里插入图片描述分区县绘制的箱型图,我们重点关注一下“三遗”之城都江堰,最高的房租为6000元/月。

from scipy.stats import gaussian_kde  # 假设df是你的DataFrame,且包含'房屋面积'列  # 提取房屋面积数据  
x = df['房子大小'].values  # 计算KDE  
kde = gaussian_kde(x)  
# 生成KDE曲线的x轴数据点(这里假设你想要覆盖的范围是x的最小值到最大值,步长为0.1)  
x_kde = np.linspace(x.min(), x.max(), 300)  
# 计算KDE曲线在这些点上的y值  
y_kde = kde(x_kde)  # 绘制直方图  
fig = go.Figure()  
fig.add_trace(go.Histogram(  x=x,  histnorm='probability density',  # 使得直方图的面积等于1,与KDE曲线可比较  name='直方图'  
))  # 绘制KDE曲线  
fig.add_trace(go.Scatter(  x=x_kde,  y=y_kde,  mode='lines',  name='KDE曲线'  
))  # 自定义图表布局  
fig.update_layout(  title='房屋面积分布(直方图+KDE)',  xaxis_title='房屋面积',  yaxis_title='概率密度'  
)  # 显示图表  
fig.show()

在这里插入图片描述要解读这种图表,需要观察直方图中条形的高度和KDE曲线的形状。如果直方图的条形较高,表示在相应的面积区间内房屋较多;KDE曲线的峰值则表示最可能的房屋面积。通过比较直方图和KDE曲线,可以分析房屋面积的分布模式,例如是否存在一个或多个常见的面积区间,或者面积分布是否均匀。

# 创建一个散点图  
fig = go.Figure(data=go.Scatter(  x=df['房子大小'],  y=df['金额'],  mode='markers',  # 设置为散点图  marker=dict(  size=10,     # 散点大小  color='blue',# 散点颜色  opacity=0.8  # 散点透明度  )  
))  # 自定义图表布局  
fig.update_layout(  title='房屋面积与租金——散点图',  xaxis_title='房屋面积',  yaxis_title='房屋租金'  
)  # 显示图表  
fig.show()

在这里插入图片描述
散点图主要是解释相关性的图表,不懂的可以点击链接转到我的博客详细查看。蓝色框框内左边的数字是面积,右边是房租。
上图实际就是一个坐标轴,分x和y轴,每个点代表每个数值,单个数据叫标量,一组数据叫向量,坐标轴内可以视作向量空间。

# 计算每个出租方式的计数  
value_counts = df['类型'].value_counts()  # 创建饼图数据  
labels = value_counts.index.tolist()  # 获取标签(出租方式)  
values = value_counts.values.tolist()  # 获取计数  # 绘制饼图  
fig = go.Figure(data=[go.Pie(labels=labels, values=values, hole=0.3, textinfo='label+percent', insidetextorientation='radial')])  # 自定义图表布局  
fig.update_layout(  title='出租方式分布——饼图',  font_size=12,  # 你可以根据需要调整字体大小  legend_title_text='出租方式'  # 如果你需要图例(对于饼图通常不需要,但这里作为示例)  
)  # 注意:饼图通常不需要图例,因为每个切片都直接标记了标签和百分比  
# 如果你确实需要图例(尽管这在饼图中不常见),你可能需要以一种不同的方式来实现它  # 显示图表  
fig.show()

在这里插入图片描述从上图可以看出,整租占比达到80.7%。

# 创建箱形图数据  
fig = go.Figure()  # 遍历'出租方式'的唯一值,为每个类别绘制一个箱形图  
for category in df['类型'].unique():  subset = df[df['类型'] == category]  fig.add_trace(go.Box(  y=subset['金额'],  name=category,  marker=dict(  color='rgb(0, 0, 0)',  # 箱体的颜色  outliercolor='rgba(219, 64, 82, 0.6)',  # 异常值的颜色  line=dict(  color='rgb(0,0,0)',  width=1.5  )  ),  boxmean='sd'  # 'sd'表示使用标准差标记平均值,你也可以设置为'mean'来直接使用平均值  ))  # 自定义图表布局  
fig.update_layout(  title='按出租方式分组的房屋租金——箱形图',  yaxis_title='房屋租金',  xaxis_title='出租方式',  boxmode='group'  # 箱形图的显示模式,'group'表示每个类别的箱形图并排显示  
)  # 显示图表  
fig.show()

在这里插入图片描述从上图可以看出,整租的租金浮动较大,而合租的租金区间很小。合租的租金价格在2100元/月以下区间,仅有1个房屋租金是2100元/月,其余都往下在走。

sns.barplot(data=df,x='朝向',y='金额')
plt.show()

在这里插入图片描述南北朝向的房子明显租金更高。

# 计算每个楼层的计数  
floor_counts = df['楼层类型'].value_counts()  # 创建饼图数据  
fig = go.Figure(data=[go.Pie(  labels=floor_counts.index,  # 标签是楼层的唯一值  values=floor_counts.values,  # 值是每个楼层的计数  hole=0.3,  # 设置饼图的中心空洞大小  textinfo='label+percent',  # 在饼图上显示标签和百分比  insidetextorientation='radial'  # 文本方向为径向  
)])  # 更新图表的布局  
fig.update_layout(  title='楼层分布——饼图',  # 设置图表的标题  annotations=[dict(text=str(round(value, 2))+'%', x=0.5, y=0.5,  xref='paper', yref='paper',  showarrow=False, font=dict(size=10),  textangle=0 if i == 0 else i*360/len(floor_counts))  for i, value in enumerate(floor_counts.values)],  # 注释文本的位置需要手动调整,这里使用了一种简单的方法,但可能需要根据实际情况调整  
)  # 显示图表  
fig.show()  

在这里插入图片描述
上图展示了成都市楼层分布情况。

sns.barplot(data=df,x='楼层类型',y='金额')
plt.show()

在这里插入图片描述低楼层租金略微高于中楼层,中楼层租金略微高于高楼层。

# 相关性分析
numeric_columns_simplified = df.select_dtypes(include='number')
sns.heatmap(numeric_columns_simplified.corr(),vmax=1,annot=True,linewidths=0.5,cbar=False,cmap='YlGnBu',annot_kws={'fontsize':12})
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.title('房屋特征皮尔逊相关系数矩阵——热力图',fontsize=17)
plt.show()

在这里插入图片描述跟房租最相关的是他自己,1也就是100%相关,第二相关的是房子大小68%,需要注意的是楼房层数是负相关,也就是楼层越高房屋租金越低。

from wordcloud import WordCloud  
# 将'楼层信息'列中的所有文本合并成一个长字符串  
text = ' '.join(df['楼盘名称'].astype(str))  font_path = '/Library/Fonts/Arial Unicode.ttf'  # macOS上的示例路径  # 创建词云对象,并指定中文字体  
wordcloud = WordCloud(width=800, height=400, background_color='black', font_path=font_path).generate(text)  # 使用matplotlib显示词云  
plt.figure(figsize=(10, 5))  
plt.imshow(wordcloud, interpolation='bilinear')  
plt.axis('off')  # 不显示坐标轴  
plt.show()

在这里插入图片描述
根据楼盘名称绘制的词云图,可以看出,“保利天悦”出现的频率很高。

机器学习

特征工程:

# 特征筛选
new_df = df[['金额', '区(市)县', '类型', '朝向', '楼层类型', '房子大小',  '楼房层数', '卧室间数', '客厅间数', '卫生间数']]
new_df = new_df.astype('str')
new_df

选取以下内容作为特征:

在这里插入图片描述很多中文,我们需要把他转为数字,变成计算机熟悉的分类数据:

from sklearn.preprocessing import LabelEncoder  # 定义一个函数,用于对pandas Series进行标签编码  
def label_encode(series):  # 创建一个LabelEncoder实例  le = LabelEncoder()  # 使用LabelEncoder的fit_transform方法对Series进行拟合和转换  # 这将Series中的类别(通常是字符串)转换为从0到n_classes-1的整数  transformed_series = le.fit_transform(series)  # 返回转换后的Series  return transformed_series  # 假设new_df是一个已经存在的DataFrame  
# 使用apply函数将label_encode函数应用到DataFrame的每一列上  
# axis=0表示函数沿着列(垂直方向)应用,即每一列被视为一个Series进行处理  
# 注意:这里直接使用apply可能会导致一些问题,特别是如果DataFrame包含非对象类型的列  
# 因为LabelEncoder只能用于对象类型(如字符串)的列  
# 但为了注释的目的,我们假设所有列都是对象类型  
new_df = new_df.apply(label_encode, axis=0)
new_df

在这里插入图片描述

上图已经全部为了数字。

划分训练集和测试集:

from sklearn.model_selection import train_test_split
# 准备数据
X = new_df.drop('金额',axis=1)
y = new_df['金额']
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
print('训练集大小:',X_train.shape[0])
print('测试集大小:',X_test.shape[0])

在这里插入图片描述

定义模型评估函数:

from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error  
# 导入sklearn库中用于评估模型性能的三个指标:R^2分数、平均绝对误差(MAE)、均方误差(MSE)  # 定义一个训练模型并输出模型的评估指标的函数  
def train_model(ml_model):  # 打印传入的模型类型或实例  print("模型名称: ", ml_model)        # 使用训练数据拟合模型。这里假设X_train和y_train是全局变量或已在此函数外部定义  model = ml_model.fit(X_train, y_train)        # 在训练数据上评估模型的性能(这一步主要用于调试或查看过拟合情况,通常不用训练集评估模型最终性能)  print("模型预测准确率: ", model.score(X_train, y_train))        # 使用训练好的模型对测试集进行预测  predictions = model.predict(X_test)        # 计算并打印R^2分数,评估模型的预测性能  r2score = r2_score(y_test, predictions)  print("R方: ", r2score)        # 计算并打印平均绝对误差(MAE),衡量预测值与真实值之间差异的平均绝对值  print('平均绝对误差(MAE):', mean_absolute_error(y_test,predictions))        # 计算并打印均方误差(MSE),衡量预测值与真实值之间差异的平方的平均值  print('均方误差(MSE):', mean_squared_error(y_test,predictions))        # 计算并打印均方根误差(RMSE),是MSE的平方根,与预测值的尺度相同,便于理解  print('均方根误差(RMSE):', np.sqrt(mean_squared_error(y_test,predictions)))  # 真实值和预测值的差值(绘制残差分布图)sns.distplot(y_test - predictions)

构建线性回归模型:

# 导入LinearRegression类  
from sklearn.linear_model import LinearRegression    
# 创建LinearRegression的实例  
lg = LinearRegression()    
# 调用train_model函数,传入LinearRegression实例作为参数  
train_model(lg)

在这里插入图片描述

构建决策树模型:

# 构建决策树回归
from sklearn.tree import DecisionTreeRegressor
# 初始化DecisionTreeRegressor并设置防止过拟合的参数  
tree = DecisionTreeRegressor()  
train_model(tree)

在这里插入图片描述

构建xgboost模型:

# 构建xgboost回归模型
from xgboost import XGBRegressor
xgb = XGBRegressor(learning_rate=1.4, n_estimators=1000) 
train_model(xgb)

在这里插入图片描述

计算各特征重要程度:

# 首先,定义特征标签列表,这里假设X_train是一个DataFrame,其列名即为特征名  
feat_labels = X_train.columns[0:]  # 获取X_train的所有列名作为特征标签    
# 注意:这里假设xgb是一个已经训练好的XGBoost模型实例,该模型具有feature_importances_属性  
# feature_importances_属性包含了模型中每个特征的重要性评分  
# importances = xgb.feature_importances_  
importances = tree.feature_importances_  
# 使用argsort函数对重要性评分进行排序,并通过[::-1]反转数组,以得到重要性从高到低的索引  
# 这样,indices数组中的第一个索引对应最重要的特征  
indices = np.argsort(importances)[::-1]  # 初始化两个列表,用于存储特征和它们对应的重要性评分  
index_list = []  
value_list = []  # 遍历排序后的索引和特征数量(X_train.shape[1]),将特征和重要性评分添加到列表中  
# 注意:range(X_train.shape[1])实际上生成的是从0到特征数-1的索引,但在这里我们将其与indices结合使用  
# 并在打印时添加了1,以便特征编号从1开始显示(如果偏好从0开始,则可以去掉f+1)  
for f, j in zip(range(X_train.shape[1]), indices):  index_list.append(feat_labels[j])  # 将特征名添加到index_list  value_list.append(importances[j])  # 将重要性评分添加到value_list  print(f + 1, feat_labels[j], importances[j])  # 打印特征编号、名称和重要性评分  # 使用matplotlib的pyplot模块创建一个图形  
plt.figure(figsize=(10,6))  # 设置图形的大小为10x6英寸  # 绘制水平条形图,展示特征的重要性评分  
# 注意:这里使用了[::-1]来反转列表,因为matplotlib默认是从下到上绘制条形图  
# 但我们想要从最重要的特征开始,即从图形顶部开始绘制  
plt.barh(index_list[::-1], value_list[::-1])  # 设置y轴刻度标签的字体大小  
plt.yticks(fontsize=12)  # 设置图形的标题和字体大小  
plt.title('各特征重要程度排序', fontsize=14)  # 显示图形  
plt.show()

从下图可以看出,影响房屋租金特征排序最高的是房子大小,接着是楼房层数,详见下图:

在这里插入图片描述

# 模型预测
y_pred = tree.predict(X_test)
result_df = pd.DataFrame()
result_df['真实值'] = y_test
result_df['预测值'] = y_pred
result_df.sample(2)

随机选择两个真实值和预测值对比,对了1个,感觉模型有些过拟合了,想要再准点,还需要对模型调超参数,由于比较复杂,今天就不展示了。

还有一个知识点需要给大家讲,下面其实是一个错误示范,之前中文转数字对数据进行了标准化,但在预测时未对y_pred进行相应的逆变换,预测值看起来比原始数据(房屋租金)小了很多,所以下面的数值是标准化后的数值,并不是原始数据。
在这里插入图片描述

数据可视化(真实值和预测值对比):

# 创建一个新的图形,并设置其大小为10x6英寸  
plt.figure(figsize=(10,6))      
# 绘制预测值。这里只取前200个预测值(y_pred[:200])和对应的索引(range(len(y_test))[:200])  
# 使用蓝色('b')线条表示预测值,并设置图例标签为'predict'  
plt.plot(range(len(y_test))[:200], y_pred[:200], 'b', label='预测值')    
# 绘制测试集的真实值。同样只取前200个真实值(y_test[:200])和对应的索引  
# 使用红色('r')线条表示真实值,并设置图例标签为'test'  
plt.plot(range(len(y_test))[:200], y_test[:200], 'r', label='真实值')    
# 添加图例,并设置其位置在图形的右上角,字体大小为15  
plt.legend(loc='upper right', fontsize=15)    
# 设置x轴的标签为'the number of house',并通过fontdict字典设置其字体权重和大小  
plt.xlabel('the number of house', fontdict={'weight': 'normal', 'size': 15})    
# 设置y轴的标签为'value of Price',同样通过fontdict字典设置其字体权重和大小  
plt.ylabel('value of Price', fontdict={'weight': 'normal', 'size': 15})    
# 显示图形  
plt.show()

在这里插入图片描述
本文数据集可以点击本文上方下载,创作不易,点赞、评论、收藏是我创作的动力!

相关文章:

【人工智能】—基于成都市各区(市)县租房价格预测建模研究

引言 随着城市化进程的加速,人口流动日益频繁,租房市场作为城市生活的重要组成部分,其价格波动对居民生活质量和城市经济发展具有显著影响。成都市,作为中国西部地区的经济、文化、交通和科技中心,近年来吸引了大量人…...

3213. 最小代价构造字符串

Powered by:NEFU AB-IN Link 文章目录 3213. 最小代价构造字符串题意思路代码 3213. 最小代价构造字符串 题意 给你一个字符串 target、一个字符串数组 words 以及一个整数数组 costs,这两个数组长度相同。 设想一个空字符串 s。 你可以执行以下操作任意次数&a…...

提取重复数据

直接上控制台代码: Module Module1Sub Main()Console.WriteLine("请输入数据,以"",""相隔:")Dim str As String Console.ReadLineDim result From x In str.Split(",")Group By x Int…...

Go语言标准库之log和三方库zap

一、Log 1.1 logger基本使用 Go语言内置的log包实现了简单的日志服务。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|Panicf|Panicln)来…...

Linux:进程终止和进程替换

Linux:Linux:进程终止和进程替换 一、进程终止1.1 进程退出场景和创建退出方式 1.2 exit 和 _exit区别二、进程程序替换2.1 进程替换函数2.2 函数解释及命名解释函数解释命名解释 2.3 单进程程序替换(无子进程)2.3.1 带l函数进程替…...

使用Java实现异步消息处理与队列消费

使用Java实现异步消息处理与队列消费 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代软件系统中,处理异步消息和队列消费是常见的需求。通过…...

使用C++实现ATM系统,谈谈思路及代码实现

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…...

相机光学(二十四)——CRA角度

CRA角度 0.参考资料1.什么是CRA角度2.为什么 CRA 会导致luma shading3.为什么 CRA 会导致color shading4.CRA相差过大的具体表现5.CRA Matching6.怎样选择sensor的CRA 0.参考资料 1.芯片CRA角度与镜头的匹配关系(一)   2.芯片CRA角度与镜头选型的匹配关…...

python函数和c的区别有哪些

Python有很多内置函数(build in function),不需要写头文件,Python还有很多强大的模块,需要时导入便可。C语言在这一点上远不及Python,大多时候都需要自己手动实现。 C语言中的函数,有着严格的顺…...

速看!这主食冻干评测极可能被商家恶意举报~PR、希喂和SC真实测评

我是一名专注于宠物健康的营养师,日常大部分时间都在与猫咪和狗狗为伴,对它们入店时的身体状况往往能迅速做出初步判断。当前,多数家养猫咪面临的肥胖和肝损伤问题尤为突出,尽管医疗干预能缓解病情,但要从根本上解决还…...

股票数据分析(K线图、均值图、MACD图、RSI图)--股票日数据

数据 数据是上证指数日行情数据,股票代码000002.sz,原始数据shdata示例如下: 读取数据: import numpy as np import pandas as pd import mplfinance as mpf import matplotlib.pyplot as plt from datetime import datetime imp…...

重写equals()方法为什么同时要重写hashcode()

equals()方法 equals()方法是Object类中的一个方法,在Object类中,equals等同于。 在不同的类中,往往会对equals()按需求进行重写。重写的目的都是:用于比较两个对象是否 "相等"。如果两个对象的内容相同,那…...

安全及应用(更新)

一、账号安全 1.1系统帐号清理 #查看/sbin/nologin结尾的文件并统计 [rootrootlocalhost ~]# grep /sbin/nologin$ /etc/passwd |wc -l 40#查看apache登录的shell [rootrootlocalhost ~]# grep apache /etc/passwd apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin#改变…...

Hadoop权威指南-读书笔记-03-Hadoop分布式文件系统

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 还是老样子~挑重点记录哈😁有兴趣的小伙伴可以去看看原著😊 第三章 Hadoop分布式文件系统 当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分…...

Rust入门实战 编写Minecraft启动器#2建立资源模型

首发于Enaium的个人博客 我们需要声明几个结构体来存储游戏的资源信息,之后我们需要将json文件解析成这几个结构体,所以我们需要添加serde依赖。 serde { version "1.0", features ["derive"] }资源相关asset.rs use serde::De…...

小白学C++(第一天)基础入门

温馨提醒:本篇文章,请各位c基础不行的童鞋不要贸然观看 C的第一个程序 第一个关键字namespace namespace 是定义空间的名字的关键字,使用格式格式如下: namespace 空间名 { } 其中{ }内的命名空间的成员,可以定义…...

谷歌正在试行人脸识别办公室安全系统

内容提要: 🧿据美国消费者新闻与商业频道 CNBC 获悉,谷歌正在为其企业园区安全测试面部追踪技术。 🧿测试最初在华盛顿州柯克兰的一间办公室进行。 🧿一份内部文件称,谷歌的安全和弹性服务 (GSRS) 团队将…...

【CSS01】CSS概述,使用样式的必要性,CSS语法及选择器

文章目录 一、什么是样式二、使用样式的必要性三、使用样式的几种方式四、CSS基本语法:五、CSS的注释六、CSS选择器——重点相关单词 一、什么是样式 概念: Cascade [kˈskeɪd] Style Sheet [ʃiːt] 级联样式单/表,层叠样式表 CSS有化腐…...

PostgreSQL的pg_bulkload工具

PostgreSQL的pg_bulkload工具 pg_bulkload 是一个针对 PostgreSQL 提供高性能批量数据加载的工具。相较于内置的 COPY 命令,pg_bulkload 更加灵活并且在许多情况下性能更高。它支持数据的强制加载、数据过滤、数据转换以及错误处理等多种功能,非常适合需…...

【Java伴学笔记】Day-01 命令行|环境|编译解释运行|Java的相关分支|Java的特性|字面量

一、关于命令行 图形化界面的缺点 需要加载图片等一系列资源 效率较低 命令行 CMDMicrosoft Learn-CMDWindows CMD常用命令大全(值得收藏) 二、环境 什么是JDK JDK是Java Development Kit的缩写,意为Java开发工具包。它是一个用于开发Java应用…...

如何使用Vue3创建在线三维模型展示?

本文由ScriptEcho平台提供技术支持 项目地址:传送门 代码相关的技术博客 代码应用场景介绍 本段代码使用 RoughJS 库在 HTML5 Canvas 上创建了手绘风格的图像,展示了 RoughJS 库的强大功能,可用于创建具有有机手绘外观的图形。 代码基本…...

使用ndoe实现自动化完成增删改查接口

使用ndoe实现自动化完成增删改查接口 最近工作内容比较繁琐,手里需要开发的项目需求比较多,常常在多个项目之间来回切换,有时候某些分支都不知道自己开发了什么、做了哪些需求, 使用手写笔记的方式去记录分支到头来也是眼花缭乱&a…...

排序 -- 手撕归并排序(递归和非递归写法)

一、基本思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有…...

防火墙基础及登录(华为)

目录 防火墙概述防火墙发展进程包过滤防火墙代理防火墙状态检测防火墙UTM下一代防火墙(NGFW) 防火墙分类按物理特性划分软件防火墙硬件防火墙 按性能划分百兆级别和千兆级别 按防火墙结构划分单一主机防火墙路由集成式防火墙分布式防火墙 华为防火墙利用…...

【Vue】使用html、css实现鱼骨组件

文章目录 预览图组件测试案例 预览图 组件 <template><div class"context"><div class"top"><div class"label-context"><div class"label" v-for"(item, index) in value" :key"index&qu…...

Python的多态

在 Python 中&#xff0c;多态&#xff08;Polymorphism&#xff09;是指不同的对象可以对相同的消息&#xff08;方法调用&#xff09;做出不同的响应。 简单来说&#xff0c;多态允许使用一个统一的接口来操作不同类型的对象&#xff0c;而这些对象会根据自身的类型来执行相应…...

001uboot体验

1.uboot的作用&#xff1a; 上电->uboot启动->关闭看门狗、初始化时钟、sdram、uart等外设->把内核文件从flash读取到SDRAM->引导内核启动->挂载根文件系统->启动根文件系统的应用程序 2.uboot编译 uboot是一个通用的裸机程序&#xff0c;为了适应各种芯片&…...

Flask之电子邮件

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、使用Flask-Mail发送电子邮件 1.1、配置Flask-Mail 1.2、构建邮件数据 1.3、发送邮件 二、使用事务邮件服务SendGrid 2.1、注册SendGr…...

Vue 2 与 ECharts:结合使用实现动态数据可视化

在现代前端开发中&#xff0c;数据可视化变得越来越重要。ECharts 是一个强大的数据可视化库&#xff0c;而 Vue 2 则是一个流行的前端框架。本文将介绍如何将 Vue 2 和 ECharts 结合使用&#xff0c;以实现动态数据可视化。 安装与配置 首先&#xff0c;确保你的项目中已经安…...

.net core Redis 使用有序集合实现延迟队列

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的&#xf…...