深度学习Day-16:实现天气预测

 🍨 本文为:[🔗365天深度学习训练营] 中的学习记录博客
 🍖 原作者:[K同学啊 | 接辅导、项目定制]

要求:根据提供的数据集对RainTomorrow进行预测

一、 基础配置

  • 语言环境:Python3.7
  • 编译器选择:Pycharm
  • 深度学习环境:TensorFlow2.4.1
  • 数据集:私有数据集

二、 前期准备 

1.设置GPU

import tensorflow as tfgpus = tf.config.list_physical_devices("GPU")if gpus:tf.config.experimental.set_memory_growth(gpus[0], True)  #设置GPU显存用量按需使用tf.config.set_visible_devices([gpus[0]],"GPU")# 打印显卡信息,确认GPU可用
print(gpus)

根据个人设备情况,选择使用GPU/CPU进行训练,若GPU可用则输出:

[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

由于在设备上安装的CUDA版本与TensorFlow版本不一致,故这里直接安装了CPU版的TensorFlow,无上述输出。

2.导入数据

本项目所采用的数据集未收录于公开数据中,故需要自己在文件目录中导入相应数据集合,并设置对应文件目录,以供后续学习过程中使用。

运行下述代码:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Activation,Dropout
from tensorflow.keras.callbacks import EarlyStoppingdata = pd.read_csv("data/weatherAUS.csv")
df = data.copy()
print(data.head)

得到如下输出:

<bound method NDFrame.head of               Date Location  MinTemp  ...  Temp3pm  RainToday  RainTomorrow
0       2008-12-01   Albury     13.4  ...     21.8         No            No
1       2008-12-02   Albury      7.4  ...     24.3         No            No
2       2008-12-03   Albury     12.9  ...     23.2         No            No
3       2008-12-04   Albury      9.2  ...     26.5         No            No
4       2008-12-05   Albury     17.5  ...     29.7         No            No
...            ...      ...      ...  ...      ...        ...           ...
145455  2017-06-21    Uluru      2.8  ...     22.4         No            No
145456  2017-06-22    Uluru      3.6  ...     24.5         No            No
145457  2017-06-23    Uluru      5.4  ...     26.1         No            No
145458  2017-06-24    Uluru      7.8  ...     26.0         No            No
145459  2017-06-25    Uluru     14.9  ...     20.9         No           NaN[145460 rows x 23 columns]>

 接着,观察所给数据集的分布情况及数据类型:

dfdes = data.describe()
print(dfdes)
print(data.dtypes)

得到如下输出:

             MinTemp        MaxTemp  ...        Temp9am       Temp3pm
count  143975.000000  144199.000000  ...  143693.000000  141851.00000
mean       12.194034      23.221348  ...      16.990631      21.68339
std         6.398495       7.119049  ...       6.488753       6.93665
min        -8.500000      -4.800000  ...      -7.200000      -5.40000
25%         7.600000      17.900000  ...      12.300000      16.60000
50%        12.000000      22.600000  ...      16.700000      21.10000
75%        16.900000      28.200000  ...      21.600000      26.40000
max        33.900000      48.100000  ...      40.200000      46.70000[8 rows x 16 columns]
Date              object
Location          object
MinTemp          float64
MaxTemp          float64
Rainfall         float64
Evaporation      float64
Sunshine         float64
WindGustDir       object
WindGustSpeed    float64
WindDir9am        object
WindDir3pm        object
WindSpeed9am     float64
WindSpeed3pm     float64
Humidity9am      float64
Humidity3pm      float64
Pressure9am      float64
Pressure3pm      float64
Cloud9am         float64
Cloud3pm         float64
Temp9am          float64
Temp3pm          float64
RainToday         object
RainTomorrow      object
dtype: object

接着,我们对日期这个数据进行拆分,将其分为年、月、日三个数据特征:

首先,我们将data中的Date列转换为日期格式:

data['Date'] = pd.to_datetime(data['Date'])
print(data['Date'])

得到如下输出: 

0        2008-12-01
1        2008-12-02
2        2008-12-03
3        2008-12-04
4        2008-12-05...    
145455   2017-06-21
145456   2017-06-22
145457   2017-06-23
145458   2017-06-24
145459   2017-06-25
Name: Date, Length: 145460, dtype: datetime64[ns]

接着,我们在data中新增year、Month、及day列:

data['year'] = data['Date'].dt.year
data['Month'] = data['Date'].dt.month
data['day'] = data['Date'].dt.day
print(data.head)

 得到如下输出:

<bound method NDFrame.head of              Date Location  MinTemp  MaxTemp  ...  RainTomorrow  year  Month day
0      2008-12-01   Albury     13.4     22.9  ...            No  2008     12   1
1      2008-12-02   Albury      7.4     25.1  ...            No  2008     12   2
2      2008-12-03   Albury     12.9     25.7  ...            No  2008     12   3
3      2008-12-04   Albury      9.2     28.0  ...            No  2008     12   4
4      2008-12-05   Albury     17.5     32.3  ...            No  2008     12   5
...           ...      ...      ...      ...  ...           ...   ...    ...  ..
145455 2017-06-21    Uluru      2.8     23.4  ...            No  2017      6  21
145456 2017-06-22    Uluru      3.6     25.3  ...            No  2017      6  22
145457 2017-06-23    Uluru      5.4     26.9  ...            No  2017      6  23
145458 2017-06-24    Uluru      7.8     27.0  ...            No  2017      6  24
145459 2017-06-25    Uluru     14.9      NaN  ...           NaN  2017      6  25[145460 rows x 26 columns]>

之后,将data中Date列删除,并观察处理后的数据集:

data.drop('Date',axis=1,inplace=True)
print(data.columns)

得到如下输出:

Index(['Location', 'MinTemp', 'MaxTemp', 'Rainfall', 'Evaporation', 'Sunshine','WindGustDir', 'WindGustSpeed', 'WindDir9am', 'WindDir3pm','WindSpeed9am', 'WindSpeed3pm', 'Humidity9am', 'Humidity3pm','Pressure9am', 'Pressure3pm', 'Cloud9am', 'Cloud3pm', 'Temp9am','Temp3pm', 'RainToday', 'RainTomorrow', 'year', 'Month', 'day'],dtype='object')

 三、探索式数据分析(EDA)

1.数据相关性探索

通过下列代码:

plt.figure(figsize=(15,13))
ax = sns.heatmap(data.corr(),square=True,annot=True,fmt='.2f')
ax.set_xticklabels(ax.get_xticklabels(),rotation = 90)
plt.show()

得到如下输出: 

其中:

  • plt.figure(figsize=(15, 13)):创建一个新的图形窗口,并设置窗口大小为宽15英寸、高13英寸;
  • ax = sns.heatmap(data.corr(), square=True, annot=True, fmt='.2f'):使用Seaborn的heatmap函数,绘制了data数据集中各列之间的相关性热力图。data.corr()计算了数据集中各列的相关系数,square=True参数表示方形格子,annot=True参数表示在每个格子中显示相关系数值,fmt='.2f'表示相关系数值保留两位小数;
  • ax.set_xticklabels(ax.get_xticklabels(), rotation=90):设置x轴标签的旋转角度为90度,以便更好地展示标签;

2.探索是否会下雨 

通过下列代码:

sns.set(style = "darkgrid")
plt.figure(figsize=(8,7))
sns.countplot(x='RainTomorrow',data=data)
plt.show()

得到如下输出:

通过下列代码:

plt.figure(figsize=(8,7))
sns.countplot(x='RainToday',data=data)
plt.show()

 得到如下输出:

通过下列代码:

x = pd.crosstab(data['RainTomorrow'],data['RainToday'])
print(x)

这段代码的作用是统计data数据集中RainTomorrow和RainToday两列的不同取值组合下出现的频数,将结果存储在变量x中,并打印输出这个交叉表。

得到如下输出: 

RainToday        No    Yes
RainTomorrow              
No            92728  16858
Yes           16604  14597

通过下列代码:

y = x/x.transpose().sum().values.reshape(2,1)*100
print(y)

在这段代码中,首先对交叉表 x 进行了一系列操作。具体来说,它完成了以下几个步骤:

  • x.transpose():对交叉表进行转置操作,即行变成列,列变成行;
  • x.transpose().sum():对转置后的交叉表进行求和操作,得到每一列的总和;
  • .values.reshape(2, 1):将上一步得到的总和值进行形状变换,变为一个2行1列的二维数组;
  • x / x.transpose().sum().values.reshape(2, 1):将交叉表 x 中的每个元素都除以对应的列总和;
  • * 100:将上一步得到的结果乘以100,以得到百分比形式的结果;
RainToday            No        Yes
RainTomorrow                      
No            84.616648  15.383352
Yes           53.216243  46.783757

可以看出:

  • 如果今天不下雨 ,那么明天下雨的几率为:53.22%
  • 如果今天下雨 ,那么明天下雨的几率为:46.78%

通过下列代码:

y.plot(kind = "bar",figsize = (8,7),color = ['#006666','#d279a6'])
plt.show()

得到如下输出: 

3.探索地理位置与下雨的关系 

通过下列代码:

x = pd.crosstab(data['Location'],data['RainToday'])
y = x/x.transpose().sum().values.reshape(-1,1)*100
y = y.sort_values(by='Yes',ascending=True)color = ['#cc6699','#006699','#006666','#862d86','#ff9966']
y.Yes.plot(kind="barh",figsize=(15,20),color = color)
plt.show()

这段代码中:

  • 首先,通过pd.crosstab()函数创建了一个交叉表x,用于统计Location和RainToday两列之间的频数;
  • 接着,对交叉表进行归一化处理,将每个单元格的值转换为百分比形式,并按Yes列的值进行升序排序;
  • 然后,定义了一个颜色列表color,包含了用于条形图柱子颜色的几种颜色;
  • 最后,使用y.Yes.plot(kind="barh", figsize=(15, 20), color=color)绘制了水平条形图,其中kind="barh"表示创建水平条形图,figsize=(15, 20)设置了图形的大小为宽度15英寸、高度20英寸,color=color指定了条形的颜色;

得到如下输出:

可以看出:位置影响下雨,不同的地方,下雨时长不同。

4.探索湿度压力与下雨的关系

通过下列代码:

plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Pressure9am',y='Pressure3pm',hue='RainTomorrow')
plt.show()

得到如下输出:

通过下列代码:

plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Humidity9am',y='Humidity3pm',hue='RainTomorrow')
plt.show()

得到如下输出:

可以看出:低压及高适度对下雨有一定的影响。

5.探索气温与下雨的关系 

通过下列代码:

plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='MaxTemp',y='MinTemp',hue='RainTomorrow')
plt.show()

得到如下输出:

可以看出:当最高气温和最低气温接近时,下雨概率会增加。

 四、数据预处理

1.处理缺失值

首先,需要观察不同数据项的缺失情况:

datanull = data.isnull().sum()/data.shape[0]*100
print(datanull)

得到如下输出:

Location          0.000000
MinTemp           1.020899
MaxTemp           0.866905
Rainfall          2.241853
Evaporation      43.166506
Sunshine         48.009762
WindGustDir       7.098859
WindGustSpeed     7.055548
WindDir9am        7.263853
WindDir3pm        2.906641
WindSpeed9am      1.214767
WindSpeed3pm      2.105046
Humidity9am       1.824557
Humidity3pm       3.098446
Pressure9am      10.356799
Pressure3pm      10.331363
Cloud9am         38.421559
Cloud3pm         40.807095
Temp9am           1.214767
Temp3pm           2.481094
RainToday         2.241853
RainTomorrow      2.245978
year              0.000000
Month             0.000000
day               0.000000
dtype: float64

通过下列代码:

lst = ['Evaporation','Sunshine','Cloud9am','Cloud3pm']
for col in lst:fill_list = data[col].dropna()data[col] = data[col].fillna(pd.Series(np.random.choice(fill_list,size=len(data.index))))s = (data.dtypes =="object")
object_cols = list(s[s].index)
print(object_cols)

这段代码中:

  • 首先,定义了一个列表lst,其中包含了需要处理缺失值的列名:'Evaporation', 'Sunshine', 'Cloud9am', 'Cloud3pm;
  • 然后,通过循环遍历lst列表中的每个列名,对缺失值进行填充。对于每列,首先创建一个非空值列表fill_list,然后使用np.random.choice()函数从fill_list中随机选择值来填充缺失值,确保填充值来自原始数据中的实际观测值;
  • 最后,通过检查数据框中每列的数据类型是否为对象(字符串类型),将结果存储在Series s中。然后,从布尔Series s中提取出数据类型为对象的列名,形成一个列名列表object_cols,并打印输出该列表;

得到如下输出:

['Location', 'WindGustDir', 'WindDir9am', 'WindDir3pm', 'RainToday', 'RainTomorrow']

通过下列代码:

for i in object_cols:data[i].fillna(data[i].mode()[0],inplace=True)t = (data.dtypes == "float64")
num_cols = list(t[t].index)
print(num_cols)

这段代码中:

  • 首先,通过for循环遍历object_cols列表中的每个列名;
  • 对于每个列,使用data[i]选择该列的数据,并使用data[i].mode()[0]找到该列的众数(出现频率最高的值),并将缺失值填充为该众数。fillna()函数的inplace=True参数表示在原始数据上进行就地修改;
  • 接下来,通过检查数据框中每列的数据类型是否为浮点数(float64),将结果存储在布尔Series t中;
  • 最后,从布尔Series t中提取出数据类型为浮点数的列名,形成一个列名列表num_cols,并打印输出该列表;

得到如下输出:

['MinTemp', 'MaxTemp', 'Rainfall', 'Evaporation', 'Sunshine', 'WindGustSpeed', 'WindSpeed9am', 'WindSpeed3pm', 'Humidity9am', 'Humidity3pm', 'Pressure9am', 'Pressure3pm', 'Cloud9am', 'Cloud3pm', 'Temp9am', 'Temp3pm']

通过下列代码:

for i in num_cols:data[i].fillna(data[i].median(),inplace = True)datanull = data.isnull().sum()
print(datanull)

得到如下输出:

Location         0
MinTemp          0
MaxTemp          0
Rainfall         0
Evaporation      0
Sunshine         0
WindGustDir      0
WindGustSpeed    0
WindDir9am       0
WindDir3pm       0
WindSpeed9am     0
WindSpeed3pm     0
Humidity9am      0
Humidity3pm      0
Pressure9am      0
Pressure3pm      0
Cloud9am         0
Cloud3pm         0
Temp9am          0
Temp3pm          0
RainToday        0
RainTomorrow     0
year             0
Month            0
day              0
dtype: int64

2.构建数据集 

通过下列代码:

from sklearn.preprocessing import LabelEncoderlabel_enconder = LabelEncoder()
for i in object_cols:data[i] = label_enconder.fit_transform(data[i])X = data.drop(['RainTomorrow','day'],axis =1).values
y = data['RainTomorrow'].valuesX_train,X_test,y_train,y_test = train_test_split(X,y,test_size= 0.25 , random_state= 101)scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

这段代码中:

  • 首先,创建一个LabelEncoder对象label_encoder,用于将对象类型的列进行编码;
  • 通过循环遍历object_cols列表中的每个列名,将每列中的对象类型数据转换为相应的数值编码;
  • 接着,从数据集中提取特征矩阵X和目标变量y。这里将除了'RainTomorrow'和'day'列之外的所有列作为特征,并将'RainTomorrow'列作为目标变量;

除此之外,实现对数据集的划分,具体内容在之前文章中已经阐述,这里不做详细解释。

五、神经网络

1.模型搭建

model = Sequential()
model.add(Dense(units=24,activation='tanh'))
model.add(Dense(units=18,activation='tanh'))
model.add(Dense(units=23,activation='tanh'))
model.add(Dropout(0.5))
model.add(Dense(units=12,activation='tanh'))
model.add(Dropout(0.2))
model.add(Dense(units=1,activation='sigmoid'))optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4)model.compile(loss='binary_crossentropy',optimizer=optimizer,metrics="accuracy")early_stop = EarlyStopping(monitor='val_loss',mode='min',min_delta=0.001,verbose=1,patience=25,restore_best_weights=True)

2.模型训练

history = model.fit(X_train,y_train,validation_data=(X_test,y_test),batch_size=32,epochs=10,verbose = 1)

运行得到如下输出: 

Epoch 1/10
3410/3410 [==============================] - 3s 788us/step - loss: 0.4984 - accuracy: 0.7723 - val_loss: 0.3883 - val_accuracy: 0.8310
Epoch 2/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.4041 - accuracy: 0.8283 - val_loss: 0.3766 - val_accuracy: 0.8365
Epoch 3/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3902 - accuracy: 0.8347 - val_loss: 0.3751 - val_accuracy: 0.8382
Epoch 4/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3859 - accuracy: 0.8368 - val_loss: 0.3729 - val_accuracy: 0.8384
Epoch 5/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3857 - accuracy: 0.8361 - val_loss: 0.3717 - val_accuracy: 0.8386
Epoch 6/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3831 - accuracy: 0.8371 - val_loss: 0.3709 - val_accuracy: 0.8392
Epoch 7/10
3410/3410 [==============================] - 4s 1ms/step - loss: 0.3791 - accuracy: 0.8372 - val_loss: 0.3700 - val_accuracy: 0.8401
Epoch 8/10
3410/3410 [==============================] - 3s 968us/step - loss: 0.3803 - accuracy: 0.8381 - val_loss: 0.3700 - val_accuracy: 0.8387
Epoch 9/10
3410/3410 [==============================] - 2s 592us/step - loss: 0.3792 - accuracy: 0.8375 - val_loss: 0.3687 - val_accuracy: 0.8398
Epoch 10/10
3410/3410 [==============================] - 2s 578us/step - loss: 0.3818 - accuracy: 0.8385 - val_loss: 0.3682 - val_accuracy: 0.8404Process finished with exit code 0

模型训练结果为:val_accuracy = 84.04%

六、 模型评估

1.Loss与Accuracy图

import matplotlib.pyplot as pltacc = history.history['accuracy']
val_acc = history.history['val_accuracy']loss = history.history['loss']
val_loss = history.history['val_loss']epochs_range = range(10)plt.figure(figsize=(14, 4))
plt.subplot(1, 2, 1)plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')plt.show()

得到的可视化结果:

七、个人理解

本项目目标为实现天气预测,需要根据给定的CSV文件来实现该目标。由于CSV为表格类文件,故可能存在数据缺失的情况,因此在进入网络模型训练前需要针对表格中的数据做一定的处理。与之前的项目相比,今天学习到了更多的数据分析理论及数据可视化方法,数据可视化能够更加直观的观察到数据分布情况,使得特征选取的可解释性得到进一步的加强。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3019048.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

yolov8任务之目标检测

对象检测 对象检测是一项涉及识别图像或视频流中对象的位置和类别的任务。对象检测器的输出是一组包围图像中对象的边界框&#xff0c;以及每个框的类标签和置信度分数。当您需要识别场景中感兴趣的对象&#xff0c;但不需要确切知道对象在哪里或其确切形状时&#xff0c;对象检…

短视频矩阵系统源码saas开发--可视化剪辑、矩阵托管、多功能合一开发

短视频矩阵系统源码saas开发&#xff08;可视化剪辑、矩阵托管、智能私信聚合、线索转化、数据看板、seo关键词、子账号等多个板块开发&#xff09; 短视频矩阵系统是一种集成了多种功能的系统&#xff0c;旨在帮助用户在短视频平台上进行高效的内容创作、管理和发布。根据您提…

3. 分布式链路追踪的链路日志设计

前言 分布式链路追踪的客户端实现中&#xff0c;我们会通过各种手段和规则得到一个又一个的Span&#xff0c;得到这些Span后&#xff0c;需要在分布式链路追踪的服务端这边汇总这些Span并拼接出一条请求链路&#xff0c;那么这里就存在一个问题&#xff0c;客户端得到的Span如…

Qt跨平台开发demo(适用萌新)

最近需要参与一款Qt跨平台的软件开发&#xff0c;在此之前&#xff0c;特把基础信息做学习和梳理&#xff0c;仅供参考。 所使用的技术和版本情况如下&#xff1a; 虚拟机&#xff1a;VMware 16.2.5操作系统&#xff1a;ubuntu-20.04.6-desktop-amd64&#xff1a;Mysql数据库…

机器人系统仿真

0、何为仿真 通过计算机对实体机器人系统进行模拟的技术。 1、为何仿真 低成本&#xff1a; 机器人实体一般价格昂贵&#xff0c;为降低机器人学习、调试的成本&#xff1b;高效&#xff1a; 搭建的环境更为多样且灵活&#xff0c;可以提高测试效率以及测试覆盖率&#xff1b…

MS86235运算放大器可Pin to Pin兼容OPA2835

MS8635/MS86235是一款低功耗的单/双通道低噪声、轨到轨输出、高速运算放大器&#xff0c;可由2.7V至5V范围内的单电源或者1.35V至2.5V范围内的双电源供电运行。可Pin to Pin兼容OPA2835。每通道仅消耗630μA的电流&#xff0c;单位增益带宽为66MHz&#xff0c;在节能模式下&…

从几个方面判断代理IP的质量?

代理IP的质量对于网络活动至关重要&#xff0c;它直接影响到用户的隐私保护、访问速度、稳定性以及整体的网络体验。以下是从几个关键方面来判断代理IP质量的详细分析&#xff1a; 第一点稳定性&#xff1a;稳定性是评估代理IP质量的首要因素。一个优质的代理IP应该具备高稳定…

LINUX 入门 8

LINUX 入门 8 day10 20240507 耗时&#xff1a;90min 有点到倦怠期了 课程链接地址 第8章 TCP服务器 1 TCP服务器的介绍 开始讲服务器端&#xff0c;之前是客户端DNShttps请求 基础&#xff1a;网络编程并发服务器&#xff1a;多客户端 一请求&#xff0c;一线程 veryold…

武汉星起航:亚马逊:跨境电商领军平台,中国卖家全球拓展的首选

2015年&#xff0c;亚马逊全球开店业务正式进入中国&#xff0c;为中国卖家带来了全新的跨境电商机遇。如今&#xff0c;亚马逊已在全球拥有包括美国、加拿大、墨西哥、英国、法国、德国等在内的17大海外站点&#xff0c;为中国卖家提供了广阔的销售市场。武汉星起航将详细探讨…

2024年北京服贸会媒体邀约资源有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 2024年北京服贸会&#xff08;中国国际服务贸易交易会&#xff0c;简称CIFTIS&#xff09;作为中国重要的国际性服务贸易盛会&#xff0c;会吸引众多媒体的关注和参与。媒体邀约资源通常…

Linux中每当执行‘mount’命令(或其他命令)时,自动激活执行脚本:输入密码,才可以执行mount

要实现这个功能&#xff0c;可以通过创建一个自定义的mount命令的包装器&#xff08;wrapper&#xff09;来完成。这个包装器脚本会首先提示用户输入密码&#xff0c;如果密码正确&#xff0c;则执行实际的mount命令。以下是创建这样一个包装器的步骤&#xff1a; 创建一个名为…

【强训笔记】day14

NO.1 思路&#xff1a;用一个哈希表&#xff0c;先遍历s1&#xff0c;统计哈希表内的字符个数&#xff0c;在遍历s2&#xff0c;s2中的字符在哈希表中减去&#xff0c;如果哈希表中的字符个数小于0那么就输出No。 代码实现&#xff1a; #include <iostream> #include&…

有没有国内个人可用的GPT平替?推荐5个AI工具

随着AI技术的快速发展&#xff0c;AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头&#xff0c;国内很多小伙伴往往望而却步&#xff0c;究其原因&#xff0c;就是它的使用门槛高&#xff0c;还有成本的考量。 不过&#xff0c;随着GPT技术的火热&#xff0c;国内也涌…

【Windows】VB项目运行报错Run-time error ‘339‘

【Windows】VB项目运行报错Run-time error 339 1.背景描述2.解决办法 1.背景描述 高压电源厂家用vb写了一个上位机软件&#xff0c;到用户windows计算机上运行后&#xff0c; 连接串口报错&#xff1a; Component MSCOMM32.OCX or one of its dependencies not correctly reg…

实现左上角的固定视口但是网格以图片中心放大缩小

仅仅修改了showbk&#xff08;&#xff09; 函数部分&#xff0c;增加bkv4 直接采样&#xff0c;然后粘贴到左上角&#xff0c;实现多余部分裁剪&#xff0c;形成视口内放大缩小 // 程序&#xff1a;2D RPG 地图编辑器与摄像机追随 // 作者&#xff1a;bilibili 民用级脑的研发…

iPhone 数据恢复软件 – 恢复丢失的 iPhone 数据

恢复丢失的 iPhone 数据&#xff0c;奇客数据恢复iPhone版。如今的 iPhone 用户在他们的设备上存储了大量数据&#xff0c;从照片和与亲人的文本对话到商业和医疗信息。其中一些是保密的&#xff1b;其中大部分内容都是非常个人化的&#xff1b;而且大多数一旦丢失就无法替代。…

禅道20.0.stable发布啦,重构底层PHP和UI框架,用户体验全新升级

禅道20.0.stable版本终于正式发布啦&#xff01; 自2023年4月启动以来&#xff0c;经过一年多的努力&#xff0c;我们动员了全公司的产研力量&#xff0c;致力于为用户提供全新的用户体验。 本次版本升级主要包括两个方面&#xff1a;一是用户体验全新升级&#xff0c;二是整体…

软胶囊弹性检测:确保药品质量与患者安全的关键步骤

软胶囊弹性检测&#xff1a;确保药品质量与患者安全的关键步骤 在医药领域&#xff0c;软胶囊作为一种常见的药物载体&#xff0c;其质量的优劣直接关系到药物的有效性和患者的安全。软胶囊的弹性作为其质量评估的重要指标之一&#xff0c;不仅影响其储存和运输的稳定性&#x…

【odoo bug排查】psycopg2.InterfaceError: Cursor already closed

错误日志 Traceback (most recent call last):File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/api.py", line 983, in getcache_value field_cache[record._ids[0]] KeyError: 3During handling of the above exception, another exception occur…

一分钟教你学浪app视频怎么缓存

你是否在学浪app上苦苦寻找如何缓存视频的方法&#xff1f;你是否想快速、轻松地观看自己喜欢的视频内容&#xff1f;那么&#xff0c;让我们一起探索一分钟教你如何缓存学浪app视频的技巧吧&#xff01; 学浪下载工具我已经打包好了&#xff0c;有需要的自己下载一下 学浪下…