第R3/4周:天气预测

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

一、前言

这周的任务添加了探索式数据分析(EDA),什么是探索式数据分析呢?

探索性数据分析(Exploratory Data Analysis,简称EDA)是一种数据处理方法,用于在数据建模之前对数据进行初步的观察和分析。通过可视化、总结统计量和数据变换等技术,探索性数据分析帮助研究者理解数据的特征、分布和潜在的关系,为后续的数据分析和建模提供指导。

二、导入数据

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 EarlyStopping
from tensorflow.keras.layers import Dropout
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.metrics import r2_score
from sklearn.metrics import mean_absolute_error , mean_absolute_percentage_error , mean_squared_error
data = pd.read_csv("weatherAUS.csv")
df = data.copy()
data.head()
  1. pd.read_csv("weatherAUS.csv"):
    • read_csv 是Pandas库中的一个函数,用于读取以逗号分隔的值(CSV)文件格式的数据。它将CSV文件读取为一个DataFrame对象。
    • "weatherAUS.csv" 是传递给read_csv函数的参数,它指定了要读取的CSV文件的路径。如果文件位于当前工作目录中,则只需提供文件名即可。
  2. df = data.copy():
    • copy() 是DataFrame对象的一个方法,用于创建DataFrame的一个副本。
    • df = data.copy()read_csv函数读取的DataFrame对象data复制一份,并将其赋值给变量df。这样做的原因可能是不希望对原始数据进行修改,保留一个原始数据的备份。
  3. data.head():
    • head() 是DataFrame对象的一个方法,用于获取DataFrame的前几行数据。
    • 默认情况下,head()返回DataFrame的前5行,但它也可以接受一个参数来指定返回的行数。这通常用于快速查看数据集的前几行,以了解数据的结构和内容。

输出
在这里插入图片描述

data.describe()

data.describe() 是Pandas库中DataFrame对象的一个方法,它用于生成数据的快速统计摘要。这个方法会返回一个新的DataFrame,其中包含以下统计信息:

  • count:非空值的数量。
  • mean:平均值。
  • std:标准差。
  • min:最小值。
  • 25%:第一四分位数(Q1),即数据中所有数值由小到大排列后,位于25%位置的数值。
  • 50%:中位数(Q2),即数据中所有数值由小到大排列后,位于中间位置的数值。
  • 75%:第三四分位数(Q3),即数据中所有数值由小到大排列后,位于75%位置的数值。
  • max:最大值。

对于数值型的列(整数或浮点数),describe()会计算上述所有统计量。对于非数值型的列(如字符串或对象),describe()默认情况下只计算countunique(唯一值的数量)、top(出现频率最高的值)和freq(最高频率)。
以下是一个示例输出,展示了describe()方法的结果:

             Column1     Column2
count   1000.000000  1000.000000
mean      50.546020    25.678947
std       15.432721     7.891234
min        1.000000     5.000000
25%       25.000000    20.000000
50%       50.000000    25.000000
75%       75.000000    30.000000
max      100.000000    50.000000

在这个例子中,Column1Column2是数据集中的两个数值型列,describe()为每列提供了统计摘要。
需要注意的是,describe()默认不包括NaN值,如果需要包括NaN值,可以设置参数include='all'。此外,可以通过参数percentiles来指定特定的百分位数,或者通过参数exclude来排除某些列。

在这里插入图片描述

data.dtypes

输出
在这里插入图片描述

以上输出显示了data DataFrame中每一列的数据类型。以下是每个部分的含义:

  • 列名:每一行左侧的名称代表DataFrame中的一列。例如,DateLocationMinTemp等。

  • 数据类型:每一行右侧的值表示相应列的数据类型。以下是常见的数据类型及其含义:

    • object:通常用于存储字符串(文本)数据,也可以用于存储混合数据类型(如包含不同类型的数据的列表)。
    • float64:表示浮点数,通常用于存储小数和实数。
    • int64:表示整数,但在这个输出中没有显示。如果有整数类型的列,它们会显示为int64
      具体到这个输出:
  • DateLocation 列的数据类型是 object,这意味着这两列包含文本数据。通常,Date 列可能需要转换为日期时间格式(datetime)以进行更有效的处理。

  • MinTempMaxTempRainfallEvaporationSunshineWindGustSpeedWindSpeed9amWindSpeed3pmHumidity9amHumidity3pmPressure9amPressure3pmCloud9amCloud3pmTemp9amTemp3pm 列的数据类型是 float64,这表明这些列包含浮点数,可能是与天气相关的测量值。

  • WindGustDirWindDir9amWindDir3pmRainTodayRainTomorrow 列的数据类型是 object,这些列可能包含分类数据,例如风向或是否下雨的指示。

这个信息对于数据预处理非常重要,因为不同类型的数据可能需要不同的处理方法。例如,数值型数据可以进行数学运算,而文本数据可能需要转换为数值编码或进行其他形式的预处理。

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

输出
在这里插入图片描述
这行代码的含义是:

  • 它将DataFrame data 中 ‘Date’ 列的数据类型从 object(通常是字符串)转换为 datetime64 类型。
  • 这样做的好处是,转换后的日期时间数据可以进行更复杂的时间序列操作,例如日期的加减、日期范围的选择、时间序列的重采样等。
  • 此外,datetime对象在数据分析和可视化中通常更容易处理,因为它们可以自动按照时间顺序排序,并且可以方便地提取日期的各个组成部分(如年、月、日等)。
data['year'] = data['Date'].dt.year
data['Month'] = data['Date'].dt.month
data['day'] = data['Date'].dt.day

这三行代码分别从data DataFrame中名为Date的列(该列已经转换为datetime类型)提取年份、月份和日期,并将它们作为新的列添加到DataFrame中。
以下是每行代码的解释:

  1. data['year'] = data['Date'].dt.year
    • data['Date'].dt 访问Date列的datetime访问器,它允许你调用各种与日期和时间相关的属性和方法。
    • .year 是一个属性,它返回Date列中每个datetime对象的年份部分。
  2. data['Month'] = data['Date'].dt.month
    • 同样,.month 是一个属性,它返回Date列中每个datetime对象的月份部分。
  3. data['day'] = data['Date'].dt.day
    • .day 是一个属性,它返回Date列中每个datetime对象的日期部分(即月份中的某一天)。
      执行完这三行代码后,DataFrame data 将包含三个新的列:yearMonthday,它们分别表示原始Date列中的年份、月份和日期。这些新列可以用于进一步的数据分析和特征工程,例如根据年份或月份进行分组分析,或者创建新的时间相关的特征。
data.head()

输出

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

这段代码由两行组成,每行的功能和目的如下:

  1. data.drop('Date', axis=1, inplace=True)
    • drop 是Pandas DataFrame对象的一个方法,用于删除指定的行或列。
    • axis=1 参数指定操作是在列(水平轴)上进行的。在Pandas中,axis=0 代表操作是在行(垂直轴)上进行的,而 axis=1 代表操作是在列上进行的。
    • inplace=True 是一个布尔参数,当设置为True时,表示直接在原始的DataFrame上进行修改,而不是返回一个新的DataFrame。这意味着删除操作会改变data DataFrame本身,而不是创建一个新的DataFrame来保存结果。
  2. data.columns
    • columns 是DataFrame对象的一个属性,它返回DataFrame中所有列的名称。
    • 这行代码执行后,将返回一个包含data DataFrame所有列名称的Index对象。

结合这两行代码,第一行删除了名为Date的列,第二行则返回了删除操作后DataFrame中剩余的所有列的名称。这通常用于确认列删除操作是否成功,或者用于查看DataFrame的最新结构。

输出
在这里插入图片描述

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

1、数据相关性搜索

plt.figure(figsize=(15,13))
# data.corr()表示了data中的两个变量之间的相关性
ax = sns.heatmap(data.corr(), square=True, annot=True, fmt='2f')
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
plt.show()

这里我直接提取发现有报错,数据不能转化

错误信息 “could not convert string to float: ‘Albury’” 表示在尝试进行数值计算时,代码遇到了一个不能转换为浮点数的字符串 ‘Albury’。

随后将其修改

# 确定数值列
numerical_data = data.select_dtypes(include=[np.number])

# 计算数值列的相关性矩阵
corr_matrix = numerical_data.corr()

# 绘制热力图
plt.figure(figsize=(15, 13))
ax = sns.heatmap(corr_matrix, square=True, annot=True, fmt='2f')
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
plt.show()

select_dtypes(include=[np.number]) 用于选择所有数值类型的列。这样,在计算相关性时,只会考虑数值数据,从而避免类型转换错误
这段代码用于生成一个热力图(heatmap),显示变量之间的相关性。以下是代码中每个函数和参数的解释:

  1. plt.figure(figsize=(30, 26))
    • plt.figure():这是matplotlib库中的一个函数,用于创建一个新的图形窗口。
    • figsize=(30, 26):这是一个参数,用于设置图形窗口的大小,单位通常是英寸。这里设置为宽30英寸,高26英寸。
  2. ax = sns.heatmap(corr_matrix, square=True, annot=True, fmt='2f')
    • sns.heatmap():这是seaborn库中的一个函数,用于绘制热力图,显示矩阵中数值的大小,通常用于展示相关性矩阵。
    • corr_matrix:这是传递给heatmap函数的第一个参数,它代表一个矩阵,通常是DataFrame的相关性矩阵,计算变量之间的皮尔逊相关系数。
    • square=True:这是一个布尔参数,当设置为True时,确保热力图中的每个单元格都是正方形。
    • annot=True:这是一个布尔参数,当设置为True时,在每个单元格上显示数值(这里是相关系数)。
    • fmt='2f':这是一个字符串参数,用于指定单元格内数值的格式。'2f'表示以两位小数的形式显示浮点数。
  3. ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
    • ax.set_xticklabels():这是matplotlib坐标轴对象的一个方法,用于设置x轴刻度标签的文本。
    • ax.get_xticklabels():这是matplotlib坐标轴对象的一个方法,用于获取x轴当前的刻度标签。
    • rotation=90:这是一个参数,用于设置x轴刻度标签的旋转角度,这里设置为90度,即水平显示。

输出
在这里插入图片描述

2.是否会下雨

sns.set(style="darkgrid")
plt.figure(figsize=(4,3))
sns.countplot(x='RainTomorrow', data=data)

这段代码使用了Seaborn和Matplotlib库来设置绘图风格并绘制一个计数图。

  1. sns.set(style="darkgrid")
    • sns.set():这是Seaborn库中的一个函数,用于设置图表的样式。
    • style="darkgrid":这是一个参数,用于指定绘图的整体风格。"darkgrid"是Seaborn提供的一种风格,它为图表添加了一个深色背景和网格线,这使得图表元素更加清晰。
  2. plt.figure(figsize=(4,3))
    • plt.figure():这是Matplotlib库中的一个函数,用于创建一个新的图形。
    • figsize=(4,3):这是一个参数,用于设置图形的大小,这里的单位通常是英寸。这里设置图形的宽度为4英寸,高度为3英寸。
  3. sns.countplot(x='RainTomorrow', data=data)
    • sns.countplot():这是Seaborn库中的一个函数,用于绘制计数图,它显示每个类别的数量。
    • x='RainTomorrow':这是一个参数,指定了计数图要绘制的数据列。这里指定了data DataFrame中的'RainTomorrow'列。
    • data=data:这是一个参数,指定了要绘制的数据源。这里指定了变量data,它应该是一个Pandas DataFrame。

总的来说,这段代码的目的是设置绘图风格为深色网格,创建一个新图形,并绘制一个计数图来显示data DataFrame中'RainTomorrow'列每个类别的数量。计数图通常用于显示分类变量的分布情况,在这里它显示了数据集中明天是否会下雨的分布。

输出
在这里插入图片描述

plt.figure(figsize=(4,3))
sns.countplot(x='RainToday', data=data)

输出
在这里插入图片描述

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

输出
在这里插入图片描述

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

这段代码是Python中的一个表达式,用于计算每列数据的百分比,并将结果存储在一个新的DataFrame中。

  1. x=pd.crosstab(data['RainTomorrow'],data['RainToday']):
    • pd.crosstab():这是Pandas库中的一个函数,用于创建交叉表。
    • data['RainTomorrow']data['RainToday']:这是从data DataFrame中选择名为'RainTomorrow''RainToday'的列。
    • crosstab函数计算了'RainTomorrow'列的每个类别(例如,‘Yes’ 或 ‘No’)与'RainToday'列的每个类别(例如,‘Yes’ 或 ‘No’)的交叉频数。
  2. y=x/x.transpose().sum().values.reshape(2,1)*100:
    • x.transpose():将x转换为行数据。
    • .sum():计算每行的总和,因为x是交叉表,所以这里的总和实际上是每个类别组合出现的次数。
    • .values.reshape(2,1):将结果转换为一个2行1列的数组。由于x的列数是2,所以这里将结果转换为2行1列的数组。
    • *100:将每个值转换为百分比形式。
  3. y:
    • 最终,这个表达式返回了一个新列y,它包含了'RainTomorrow'列的每个类别与'RainToday'列的每个类别组合出现的百分比。

这段代码的正确性取决于'RainTomorrow''RainToday'列中的数据类型和值。如果这两个列都是分类变量,并且它们的数据类型是可以进行数学运算的,那么这段代码将正确地计算每个类别组合出现的百分比。

输出
在这里插入图片描述

如果今天不下雨,那么明天下雨的机会=53.22%
如果今天下雨明天下雨的机会=46.78%

y.plot(kind="bar",figsize=(4,3),color=['#006666','#d279a6']);

这段代码是Python中的一个表达式,用于绘制一个条形图。以下是代码的每个部分的解释:

  1. y.plot(kind="bar",figsize=(4,3),color=['#006666','#d279a6']):
    • y:这是之前计算得到的DataFrame中的新列,它包含了'RainTomorrow'列的每个类别与'RainToday'列的每个类别组合出现的百分比。
    • plot():这是Pandas DataFrame对象的一个方法,用于绘制图表。
    • kind="bar":这是一个参数,用于指定要绘制的图表类型。在这里,它指定了要绘制一个条形图。
    • figsize=(4,3):这是一个参数,用于设置图表的大小。这里的单位通常是英寸。这里设置图形的宽度为4英寸,高度为3英寸。
    • color=['#006666','#d279a6']:这是一个参数,用于指定图表中条形的颜色。这里指定了两种颜色,分别用于表示两个不同的类别。

输出
在这里插入图片描述

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)

这段代码使用了Pandas库中的crosstab函数来创建一个交叉表,并使用Seaborn库中的plot函数来绘制一个水平条形图,以展示每个城市下雨天数和非下雨天数的百分比。以下是代码的每个部分的解释:

  1. x=pd.crosstab(data['Location'],data['RainToday']):
    • pd.crosstab():这是Pandas库中的一个函数,用于创建交叉表。
    • data['Location']data['RainToday']:这是从data DataFrame中选择名为'Location''RainToday'的列。
    • crosstab函数计算了'Location'列的每个城市与'RainToday'列的每个类别(例如,‘Yes’ 或 ‘No’)的交叉频数。
  2. y=x/x.transpose().sum().values.reshape(-1, 1)*100:
    • x.transpose():将x转换为行数据。
    • .sum():计算每行的总和,因为x是交叉表,所以这里的总和实际上是每个类别组合出现的次数。
    • .values.reshape(-1, 1):将结果转换为一个列向量,这里使用-1来指定列数,因为x的行数是2(一个类别组合),所以结果是一个1行2列的数组。
    • *100:将每个值转换为百分比形式。
  3. y=y.sort_values(by='Yes',ascending=True):
    • y.sort_values():这是Pandas DataFrame对象的一个方法,用于对DataFrame中的数据进行排序。
    • by='Yes':这是一个参数,用于指定排序的列。在这里,它指定了要根据'Yes'列进行排序。
    • ascending=True:这是一个参数,用于指定排序的方向。在这里,它指定了升序排序。
  4. color=['#cc6699','#006699','#006666','#862d86','#ff9966']:
    • 这行代码定义了一个颜色列表,用于在条形图中为每个城市设置不同的颜色。
  5. y.Yes.plot(kind="barh",figsize=(15,20),color=color):
    • y.Yes:这是y DataFrame中的'Yes'列,它包含了每个城市下雨天数的百分比。
    • plot():这是Seaborn库中的一个函数,用于绘制图表。
    • kind="barh":这是一个参数,用于指定要绘制的图表类型。在这里,它指定了要绘制一个水平条形图。
    • figsize=(15,20):这是一个参数,用于设置图表的大小。这里的单位通常是英寸。这里设置图形的宽度为15英寸,高度为20英寸。
    • color=color:这是一个参数,用于指定图表中条形的颜色。这里指定了之前定义的颜色列表。

输出
在这里插入图片描述

4.湿度和压力对下雨的影响

data. columns

输出
在这里插入图片描述

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

输出
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

# 每列中缺失数据的百分比
data.isnull().sum() / data.shape[0] * 100

这段代码是Python中的一个表达式,用于计算DataFrame中每列缺失值的百分比。

  1. data.isnull().sum():
    • data.isnull():这是Pandas DataFrame对象的一个方法,用于生成一个布尔DataFrame,其中True表示缺失值,False表示非缺失值。
    • .sum():这是对布尔DataFrame应用sum方法,它会计算True值的总数,即每列中缺失值的数量。
  2. data.shape[0]:
    • data.shape:这是Pandas DataFrame对象的一个属性,用于获取DataFrame的形状,即行数和列数。
    • [0]:这是对形状数组取索引,这里取的是索引0,即行数。
  3. data.isnull().sum() / data.shape[0] * 100:
    • 这一步是将每列中缺失值的数量除以DataFrame的总行数,得到每列缺失值的百分比。
    • * 100:这是将结果乘以100,以便将结果转换为百分比形式。
      最终,这段代码的目的是计算DataFramedata中每列缺失值的百分比,并将结果存储在一个新的DataFrame中。这样,您可以轻松地查看和比较每列中缺失值的百分比,以确定是否需要进行缺失值处理。

在这里插入图片描述

# 在该列中随机选择数进行填充
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))))

np.random.choice(fill_list, size=len(data.index)): 这个表达式使用了 NumPy 库的 random.choice() 函数,它从 fill_list 中随机选择值。size=len(data.index) 指定了选择的值的数量,它等于 DataFrame 的行数。这样,对于每个 NaN 值,都有一个从 fill_list 中随机选择的值作为填充。

pd.Series(…): np.random.choice() 返回一个 NumPy 数组,为了使其与 DataFrame 的列兼容,我们需要将其转换为一个 pandas Series。因此,pd.Series() 用于创建一个 Series 对象,它将用于填充 NaN 值。

data[col].fillna(…): 最后,fillna() 方法用于将 data[col] 中的所有 NaN 值替换为前面生成的随机选择的值。

整个代码段的目的就是将 data DataFrame 中指定列的所有 NaN 值用该列非 NaN 值的随机样本替换。这种方法通常用于在不破坏数据分布的情况下处理缺失数据,但它也有可能引入随机性,从而影响数据分析的结果。因此,在使用这种方法之前,应该仔细考虑其对数据分析的影响。

s = (data.dtypes == "object")  
object_cols = list(s[s].index)  
print(object_cols)

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

# .median(),中位数
for i in num_cols:
    data[i].fillna(data[i].median(), inplace=True)
data.isnull().sum()

在这里插入图片描述

from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
for i in object_cols:
    data[i] = label_encoder.fit_transform(data[i])
x = data.drop(['RainTomorrow', 'day'],axis=1).values
y = data['RainTomorrow'].values
x_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.transform(x_train)  
x_test = scaler.transform(x_test) 
from tensorflow.keras.optimizers import Adam  
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=2e-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)
model.fit(x=x_train,
          y=y_train,
          validation_data=(x_test, y_test), verbose=1,
          callbacks=[early_stop],
          epochs = 10,
          batch_size = 32
          )

在这里插入图片描述

import matplotlib.pyplot as plt  
acc = model.history.history['accuracy']
val_acc = model.history.history['val_accuracy']
loss = model.history.history['loss']
val_loss = model.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()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux 双网卡服务器突然断电后网卡单通故障解决

某台linux 双网卡服务器突然断电后网卡单通故障解决 故障现象:断电后重启服务器,主用网卡IP只能同网段访问,其他网段无法访问,备用网卡则正常; 解决方案:route -n查询路由信息,发现主网卡路由…

第二期: 第11节, uboot 命令的使用

问题:如果你只想控制一个led 灯,并且不想去写驱动。 那么可以直接 使用uboot 的命令,去改写内存。 uboot 命令的解析: 读命令, md[.b, .w. .l] address 注意: 这里的 .w 指的是两个字节,…

探索Python的Excel世界:openpyxl的魔法之旅

文章目录 探索Python的Excel世界:openpyxl的魔法之旅背景:为什么选择openpyxl?什么是openpyxl?如何安装openpyxl?简单的库函数使用方法场景应用:openpyxl在实际工作中的应用常见bug及解决方案总结 探索Pyth…

Spring高手之路23——AOP触发机制与代理逻辑的执行

文章目录 1. 从整体视角学习Bean是如何被AOP代理的2. AOP代理的触发机制2.1 postProcessAfterInitialization方法源码分析2.2 wrapIfNecessary方法源码分析2.3 时序图演示触发机制 3. AOP代理逻辑的执行3.1 AOP代理如何使用拦截器3.2 proceed方法源码分析3.3 时序图 1. 从整体视…

特价电影票对接接口平台推荐?微客云影票

特价电影票对接接口平台推荐 一、常见的较好平台 微客云影票与全国 12000 多家影院建立了合作,覆盖范围广,其提供的电影票价格普遍低于市场价,平均每张票能省下不少钱,在万达、CGV 等大型影院优惠更为显著。 二、判断平台好坏的…

【Qt】Qt C++ Widget中嵌入qml

1. 效果 2. 方法 使用QQuickWidget方式 QQuickWidget *view new QQuickWidget;view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));view->show();除了QQuickWidget方式还可以使用QQuickView方式,请自行查阅资料 3. 代码 3.1 工程目录 3.2 …

Weblogic部署

要安装weblogic,首先要有java环境,因此需要先安装jdk。 这里需要注意,weblogic版本不同,对应的jdk版本也不同,我在这里就踩了很多坑,我这里下载的是fmw_12.2.1.4.0_wls_lite_generic.jar对应的是jdk-8u333…

visual prompt tuning和visual instruction tuning

visual prompt tuning:作为一种微调手段,其目的是节省参数量,训练时需要优化的参数量小。 输入:视觉信息image token可学习的prompt token 处理任务:比如常见的分类任务 visual prompt tuning visual instruction tu…

唯徳知识产权管理系统 DownloadFileWordTemplate 文件读取漏洞复现

0x01 产品简介 唯徳知识产权管理系统,由深圳市唯德科创信息有限公司精心打造,旨在为企业及代理机构提供全方位、高效、安全的知识产权管理解决方案。该系统集成了专利、商标、版权等知识产权的全面管理功能,并通过云平台实现远程在线办公,提升工作效率。是一款集知识产权申…

客户说了算!精益产品开发,让中小企业精准触达用户需求!——张驰咨询

随着全球经济环境的波动,特别是疫情后经济复苏进程的反复,很多中小制造企业面临产品滞销、同质化严重和内卷竞争加剧的困境。市场饱和、利润微薄,还在新产品开发上遇到了研发人才不足、资金短缺等问题。许多企业在这场市场博弈中徘徊在生死边…

IP协议及相关特性

IP协议负责地址管理和路由选择。它的组成为: 接下来我们将对其中较重要的部分进行介绍。 4位版本:这里的四位版本只有两个取值 分别为IPv4和IPv6,这两个额分别为不同的IP协议,但是现在主流的还是IPv4但是近年来IPv6在中国的普及率…

关于报表新入职及进阶培训入口教程

关于报表新入职及进阶培训入口教程 一、网站二、登陆三、报名入口四、缴费及注意事项1. 报名2. 注意事项 五、学习1.在首页时,可以点个人中心进入学习。2.进入后,可以进入如下步骤。 六、完 一、网站 教育事业统计在线培训 二、登陆 注:如果…

C++速通LeetCode简单第17题-爬楼梯(全网最简单)

思路要点:将问题转化为求斐波那契数列的第n项,然后迭代。 思路分析:最后一次爬的阶数不是1就是2,假设爬n阶的方法数是f(n),假设最后一次爬1阶,那么爬前面的 n-1阶的方法数是f(n-1);假设最后一次…

20240911泰山杯初赛--temp

Wireshark打开temp.pcap流量包,发现有很多ICMP协议包。 一些ICMP数据包较大,且可发现,明显在传输HTTP协议数据内容: 右键,【显示分组字节】,进一步分析这些HTTP数据: GET /test.html HTTP/1.…

C盘清理不能偷懒!用这方法快速清理10G以上垃圾 操作简单又安全

C盘清理不能偷懒!用这方法快速清理10G以上垃圾 操作简单又安全。到现在为止,还有很多的人不知道怎么清理C盘,主要是因为Windows操作系统相对复杂,其文件管理和存储结构对于非专业人士来说可能难以理解。许多用户可能不清楚哪些文件…

重磅!WOS、Scopus数据库相继更新,多本期刊被剔除(附下载)

关注GZH【欧亚科睿学术】,一键获取最新期刊目录列表 节后首天,科睿唯安及爱思唯尔相继更新了数据库,小编给大家总结了各数据库的期刊变动情况,供大家参考。详情如下: 01 SCIE/SSCI目录更新 2024年9月17日&#xff0c…

计算机毕业设计公交站点线路查询网站登录注册搜索站点线路车次/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

选题背景‌: 随着城市化进程的加快,公共交通成为城市居民出行的重要方式。然而,传统的公交站点线路查询方式往往依赖于纸质地图或简单的电子显示屏,查询效率低下且信息更新不及时。因此,开发一个功能全面、易于使用的…

【SQL】百题计划:SQL对于空值的比较判断。

[SQL]百题计划 方法&#xff1a; 使用 <> (!) 和 IS NULL [Accepted] 想法 有的人也许会非常直观地想到如下解法。 SELECT name FROM customer WHERE referee_Id <> 2;然而&#xff0c;这个查询只会返回一个结果&#xff1a;Zach&#xff0c;尽管事实上有 4 个…

MAGDA:多智能体指南驱动的诊断助手

MAGDA&#xff1a;多智能体指南驱动的诊断助手 秒懂大纲提出背景精细拆解输入输出全流程创意视角中文意译 论文&#xff1a;MAGDA: Multi-agent guideline-driven diagnostic assistance 秒懂大纲 ├── MAGDA: Multi-agent guideline-driven diagnostic assistance【研究主…

DockerLinux安装DockerDocker基础

Linux软件安装 yum命令安装 通过yum命令安装软件,是直接把软件安装到Linux系统中 安装和卸载都比较麻烦,因为软件和系统是强关联的 Docker docker是一种容器技术,可以解决软件和系统强关联关系,使得软件的安装和卸载更方便,它可以将我们的应用以及依赖进行打包,制作出一个镜…