數據挖掘綜合案例-家用熱水器用戶行為分析與事件識別

文章目錄

    • 1. 背景與挖掘目標
    • 2. 分析方法與過程
    • 3. 數據分析
      • 3.1 數據探索分析
      • 3. 2 數據預處理
        • 1. 屬性約束
        • 2. 劃分用水事件
        • 3. 確定單次用水事件時長閾值
        • 4. 屬性構造
        • 5.篩選候選洗浴事件
      • 3.3 模型構建
      • 3.4 模型檢驗
    • 4. 思考總結

在這里插入圖片描述

1. 背景與挖掘目標

隨著國內大家電品牌的進入和國外品牌的涌入,電熱水器相關技術在過去20年間得到了快速發展,屢屢創新。

  • 首次提出封閉式電熱水器的概念到水電分離技術的研發。

  • 漏電保護技術的應用及出水斷電技術和防電墻技術專利的申請突破。

如今高效能技術顛覆了業內對電熱水器“高能耗”的認知。

  • 當下的熱水器行業也并非一片太平盛世,行業內正在上演一幕弱肉強食的“叢林法則”戲碼,市場份額逐步向龍頭企業集中,尤其是那些在資金、渠道和品牌影響力等方面擁有實力的綜合家電品類巨頭,正在不斷蠶食鯨吞市場蛋糕。

  • 要想在該行業立足,只能走產品差異化的路線,提升技術實力和產品質量,在功能賣點、外觀等方面做出自身特色。

  • 在熱水器用戶行為分析過程中,用水事件識別是最為關鍵的環節。根據該熱水器生產廠商提供的數據熱水器用戶用水事件劃分與識別項目的整體目標如下。

  1. 根據熱水器采集到的數據,劃分一次完整用水事件。

  2. 在劃分好的一次完整用水事件中,識別出洗浴事件。

2. 分析方法與過程

image-20240604104535431

1.對熱水用戶的歷史用水數據進行選擇性抽取,構建專家樣本。

2.對步驟1形成的數據集進行數據探索分析與預處理,包括探索水流量的分布情況,刪除冗余屬性,識別用水數據的缺失值,并對缺失值作處理,根據建模的需要進行屬性構造等。根據以上處理,對用水樣本數據建立用水事件時間間隔識別模型和劃分一次完整的用水事件模型,再在一次完整用水事件劃分結果的基礎上,剔除短暫用水事件縮小識別范圍等。

3.在步驟2得到的建模樣本數據基礎上,建立洗浴事件識別模型,對洗浴事件識別模型進行模型分析評價。

4.對步驟3形成的模型結果應用并對洗浴事件劃分進行優化。

5.調用洗浴事件識別模型,對實時監控的熱水器流水數據進行洗浴事件自動識別。

3. 數據分析

3.1 數據探索分析

1.在熱水器的使用過程中,熱水器的狀態會經常發生改變,比如開機和關機、由加熱轉到保溫、由無水流到有水流、水溫由50℃變為49℃等。而智能熱水器在狀態發生改變或者水流量非零時,每兩秒會采集一條狀態數據。由于數據的采集頻率較高,并且數據來自大量用戶,數據總量非常大。

2.對原始數據采用無放回隨機抽樣法抽取200家熱水器用戶從2014年1月1日至2014年12月31日的用水記錄作為原始建模數據。

3.由于用戶不僅使用熱水器來洗浴,而且包括了洗手、洗臉、刷牙、洗菜、做飯等用水行為,所以熱水器采集到的數據來自各種不同的用水事件。

熱水器采集的用水數據包含12個屬性:熱水器編碼,發生時間,開關機狀態,加熱中,保溫中,有無水流,實際溫度,熱水量,水流量,節能模式,加熱剩余時間和當前設置溫度。其解釋說明下表所示。

image-20240604105848327

探索分析熱水器的水流量狀況,其中有無水流和水流量屬性最能直觀體現熱水器的水流量情況,對這兩個屬性進行探索分析,得到不同水流狀態的記錄的條形圖,無水流狀態的記錄明顯比有水流狀態的記錄要多

image-20240604110109044

不同水流狀態的記錄的箱線圖,箱體貼近0,說明無水流量的記錄較多,水流量的分布與水流狀態的分布一致

image-20240604110134247

image-20240604110006847

用水停頓時間間隔定義為一條水流量不為0的流水記錄同下一條水流量不為0的流水記錄之間的時間間隔。

根據現場實驗統計,兩次用水的過程的用水停頓的間隔時長一般在不大于4分鐘。

為了探究用戶真實用水停頓時間間隔的分布情況,統計用水停頓的時間間隔并做頻率分布表。

通過頻率分布表分析用戶用水停頓時間間隔的規律性,具體的數據如下表所示。

image-20240604111552174

停頓時間間隔為00.3分鐘的頻率很高,根據日常用水經驗可以判斷其為一次用水時間中的停頓;停頓時間間隔為613分鐘的頻率較低,分析其為兩次用水事件之間的停頓間隔。

兩次用水事件的停頓時間間隔分布在3~7分鐘。根據現場實驗統計用水停頓的時間間隔近似。

3. 2 數據預處理

1. 屬性約束

由于熱水器采集的用水數據屬性較多,做以下處理,因分析的主要對象為用戶,分析的主要目標為用戶的洗浴行為的一般規律,所以“熱水器編號”屬性可以去除;因熱水器采集的數據中,“有無水流”屬性可以通過“水流量”屬性反應,“節能模式”屬性取值相同均為“關”,對分析無作用,可以去除。

刪除冗余屬性“熱水器編號”“有無水流”“節能模式”,刪除冗余屬性后得到用來建模的屬性如下表所示。

image-20240604111608473

image-20240604111651874

2. 劃分用水事件

用水狀態記錄中,水流量不為0表明用戶正在使用熱水;而水流量為0時用戶用熱水發生停頓或者用熱水結束。對于任一個用水記錄,如果它的向前時差超過閾值 ,則將它記為事件的開始編號;如果向后時差超過閾值 ,則將其記為事件的結束編號。劃分模型的符號說明如下表所示。

image-20240604111735220

一次完整用水事件的劃分步驟如下。

(1) 讀取數據記錄,識別到所有水流量不為0的狀態記錄,將它們的發生時間記為序列t1。

(2) 對序列t1構建其向前時差列和向后時差列,并分別與閾值進行比較。向前時差超過閾值T,則將它記為新的用水事件的開始編號;如果向后時差超過閾值T,則將其記為用水事件的結束編號。

循環執行步驟(2)直到向前時差列和向后時差列與均值比較完畢,結束事件劃分。

對用戶的用水數據進行劃分結果如下表所示。

image-20240604111826128

image-20240604111842892

3. 確定單次用水事件時長閾值

對某熱水器用戶的數據根據不同的閾值劃分用水事件,得到了相應的事件個數,閾值變化與劃分得到事件個數如下表所示。

image-20240604112007918

閾值與劃分事件個數關系如下圖所示。

image-20240604112024537

上圖為閾值與劃分事件個數的散點圖,圖中某段閾值范圍內,下降趨勢明顯,說明在該段閾值范圍內,用戶的停頓習慣比較集中。如果趨勢比較平緩,則說明用戶的停頓熱水的習慣趨于穩定,所以取該段時間開始的時間點作為閾值,既不會將短的用水事件合并,又不會將長的用水事件拆開。

用戶停頓熱水的習慣在方框的位置趨于穩定,說明熱水器用戶的用水的停頓習慣用方框開始的時間點作為劃分閾值會有一個好的效果。

曲線在上圖(散點圖)中方框趨于穩定時,其方框開始的點的斜率趨于一個較小的值。為了用程序來識別這一特征,將這一特征提取為規則。根據用水停頓時間間隔頻數分布表說明如何識別上圖中的方框中起始的時間。

image-20240604112630303

每個閾值對應一個點,給每個閾值計算得到一個斜率指標,如上圖所示,其中A點是要計算的斜率指標點。為了直觀的展示,如下表所示。

image-20240604112118007

image-20240604112133559

image-20240604112140155

image-20240604112644648

4. 屬性構造

1.構建用水時長與頻率屬性

不同用水事件的用水時長是基礎特征之一。根據用水時長這一特征可以構建下表所示的事件開始時間、事件結束時間、洗浴時間點、用水時長、總用水時長和用水時長/總用水時長這6個特征。

image-20240604112751820

構建用水開始時間或結束的時間兩個特征時分別減去或加上了發送閾值(發送閾值是指熱水器傳輸數據的頻率的大小)。其原因如下,取平均值會導致很大的偏差。

綜合分析構建“用水開始時間”為起始數據的時間減去“發送閾值”的一半。

image-20240604113338935

用水時長相關的特征只能夠區分出一部分用水事件,不同用水事件的用水停頓和頻率也不同。

image-20240604113406811

# 轉換時間格式
data["發生時間"] = pd.to_datetime(data["發生時間"],format="%Y%m%d%H%M%S")# 構造特征:總用水時長
timeDel = pd.Timedelta("0.5 sec")
sj["事件開始時間"] = data.iloc[sj["事件起始編號"]-1,0].values- timeDel
sj["事件結束時間"] = data.iloc[sj["事件終止編號"]-1,0].values + timeDel
sj['洗浴時間點'] = [i.hour for i in sj["事件開始時間"]]
sj["總用水時長"] = np.int64(sj["事件結束時間"] - sj["事件開始時間"])/1000000000 + 1# 構造用水停頓事件
# 構造特征“停頓開始時間”、“停頓結束時間”
# 停頓開始時間指從有水流到無水流,停頓結束時間指從無水流到有水流
for i in range(len(data)-1):if (data.loc[i,"水流量"] != 0) & (data.loc[i + 1,"水流量"] == 0) :data.loc[i + 1,"停頓開始時間"] = data.loc[i +1, "發生時間"] - timeDelif (data.loc[i,"水流量"] == 0) & (data.loc[i + 1,"水流量"] != 0) :data.loc[i,"停頓結束時間"] = data.loc[i , "發生時間"] + timeDel# 提取停頓開始時間與結束時間所對應行號,放在數據框Stop中
indStopStart = data.index[data["停頓開始時間"].notnull()]+1
indStopEnd = data.index[data["停頓結束時間"].notnull()]+1
Stop = pd.DataFrame(data={"停頓開始編號":indStopStart[:-1],"停頓結束編號":indStopEnd[1:]}) 
# 計算停頓時長,并放在數據框stop中,停頓時長=停頓結束時間-停頓結束時間
Stop["停頓時長"] = np.int64(data.loc[indStopEnd[1:]-1,"停頓結束時間"].values-data.loc[indStopStart[:-1]-1,"停頓開始時間"].values)/1000000000
# 將每次停頓與事件匹配,停頓的開始時間要大于事件的開始時間,
# 且停頓的結束時間要小于事件的結束時間
for i in range(len(sj)):Stop.loc[(Stop["停頓開始編號"] > sj.loc[i,"事件起始編號"]) & (Stop["停頓結束編號"] < sj.loc[i,"事件終止編號"]),"停頓歸屬事件"]=i+1# 刪除停頓次數為0的事件
Stop = Stop[Stop["停頓歸屬事件"].notnull()]# 構造特征 用水事件停頓總時長、停頓次數、停頓平均時長、
# 用水時長,用水/總時長
stopAgg =  Stop.groupby("停頓歸屬事件").agg({"停頓時長":sum,"停頓開始編號":len})
sj.loc[stopAgg.index - 1,"總停頓時長"] = stopAgg.loc[:,"停頓時長"].values
sj.loc[stopAgg.index-1,"停頓次數"] = stopAgg.loc[:,"停頓開始編號"].values
sj.fillna(0,inplace=True)  # 對缺失值用0插補
stopNo0 = sj["停頓次數"] != 0  # 判斷用水事件是否存在停頓
sj.loc[stopNo0,"平均停頓時長"] = sj.loc[stopNo0,"總停頓時長"]/sj.loc[stopNo0,"停頓次數"] 
sj.fillna(0,inplace=True)  # 對缺失值用0插補
sj["用水時長"] = sj["總用水時長"] - sj["總停頓時長"]  # 定義特征用水時長
sj["用水/總時長"] = sj["用水時長"] / sj["總用水時長"]  # 定義特征 用水/總時長
print('用水事件用水時長與頻率特征構造完成后數據的特征為:\n',sj.columns)
print('用水事件用水時長與頻率特征構造完成后數據的前5行5列特征為:\n',sj.iloc[:5,:5])

2.構建用水量與波動屬性

除了用水時長,停頓和頻率外,用水量也是識別該事件是否為洗浴事件的重要特征。可以構建出下表所示的兩個用水量特征。

image-20240604113427151

同時用水波動也是區分不同用水事件的關鍵。根據不同用水事件的這一特征可以構建下表所示的水流量波動和停頓時長波動兩個特征。

image-20240604113444602

data["水流量"] = data["水流量"] / 60 # 原單位L/min,現轉換為L/sec
sj["總用水量"] = 0 # 給總用水量賦一個初始值0
for i in range(len(sj)):Start = sj.loc[i,"事件起始編號"]-1End = sj.loc[i,"事件終止編號"]-1if Start != End:for j in range(Start,End):if data.loc[j,"水流量"] != 0:sj.loc[i,"總用水量"] = (data.loc[j + 1,"發生時間"] - data.loc[j,"發生時間"]).seconds* \data.loc[j,"水流量"] + sj.loc[i,"總用水量"]sj.loc[i,"總用水量"] = sj.loc[i,"總用水量"] + data.loc[End,"水流量"] * 2else:sj.loc[i,"總用水量"] = data.loc[Start,"水流量"] * 2sj["平均水流量"] = sj["總用水量"] / sj["用水時長"] # 定義特征 平均水流量
# 構造特征:水流量波動
# 水流量波動=∑(((單次水流的值-平均水流量)^2)*持續時間)/用水時長
sj["水流量波動"] = 0 # 給水流量波動賦一個初始值0
for i in range(len(sj)):Start = sj.loc[i,"事件起始編號"] - 1End = sj.loc[i,"事件終止編號"] - 1for j in range(Start,End + 1):if data.loc[j,"水流量"] != 0:slbd = (data.loc[j,"水流量"] - sj.loc[i,"平均水流量"])**2slsj = (data.loc[j + 1,"發生時間"] - data.loc[j,"發生時間"]).secondssj.loc[i,"水流量波動"] = slbd * slsj + sj.loc[i,"水流量波動"]sj.loc[i,"水流量波動"] = sj.loc[i,"水流量波動"] / sj.loc[i,"用水時長"]   # 構造特征:停頓時長波動
# 停頓時長波動=∑(((單次停頓時長-平均停頓時長)^2)*持續時間)/總停頓時長
sj["停頓時長波動"] = 0 # 給停頓時長波動賦一個初始值0
for i in range(len(sj)):if sj.loc[i,"停頓次數"] > 1: # 當停頓次數為0或1時,停頓時長波動值為0,故排除for j in Stop.loc[Stop["停頓歸屬事件"] == (i+1),"停頓時長"].values:sj.loc[i,"停頓時長波動"] = ((j - sj.loc[i,"平均停頓時長"])**2) * j + \sj.loc[i,"停頓時長波動"]sj.loc[i,"停頓時長波動"] = sj.loc[i,"停頓時長波動"] / sj.loc[i,"總停頓時長"]print('用水量和波動特征構造完成后數據的特征為:\n',sj.columns)
print('用水量和波動特征構造完成后數據的前5行5列特征為:\n',sj.iloc[:5,:5])
5.篩選候選洗浴事件

洗浴事件的識別是建立在一次用水事件識別的基礎上,也就是從已經劃分好的一次用水事件中識別出哪些一次用水事件是洗浴事件。

可以使用3個比較寬松的條件篩選掉那些非常短暫的用水事件,確定不可能為洗浴事件的數據去除掉,剩余的事件稱為“候選洗浴事件”。這三個條件是“或”的關系,也就是說,只要一次完整的用水事件滿足任意一個條件,就被判定為短暫用水事件,即會被篩選掉。3個篩選條件如下:

1.一次用水事件中總用水量小于5升。

2.用水時長小于100秒。

3.總用水時長小于120秒。

image-20240604113754759

篩選前用水事件數目總共172個,經過篩選后,余下75個用水事件。結合日志,最終用于建模的屬性的總數為11個,其基本狀況

image-20240604113734736

3.3 模型構建

根據建模樣本數據建立BP神經網絡模型識別洗浴事件。由于洗浴事件與普通用水事件在特征上存在不同,而且這些不同的特征在特征上被體現出來。于是,根據用戶提供的用水日志,將其中洗浴事件的數據狀態記錄作為訓練樣本訓練BP神經網絡。然后根據訓練好的網絡來檢驗新采集到的數據,具體過程如下圖所示。

image-20240604114110051

在訓練神經網絡的時候,選取了“候選洗浴事件”的11個屬性作為網絡的輸入,分別為:洗浴時間點,總用水時長,總停頓時長,平均停頓時長,停頓次數,用水時長,用水時長/總用水時長,總用水量,平均水流量,水流量波動和停頓時長波動。

訓練BP網絡時給定的輸出(教師信號)為1與0,其中1代表該次事件為洗浴事件,0表示該次事件不是洗浴事件。是否為洗浴事件的標簽是根據熱水器的用水記錄日志得到。

構建神經網絡模型需要注意數據本身屬性之間的存在量級差異,因此需要進行標準化,消除量級差異。另外,為了便于后續應用模型,可以用joblib.dump函數保存模型。

image-20240604114200360

在訓練BP神經網絡時,對神經網絡的參數進行了尋優,發現含2個隱層的神經網絡訓練效果較好,其中2個隱層的隱節點數分別為17和10時訓練的效果較好。

根據樣本,得到訓練好的神經網絡后,就可以用來識別對應的用戶家的洗浴事件,其中待檢測的樣本的11個屬性作為輸入,輸出層輸出一個值在[-1,1]范圍內,如果該值小于0,則該事件不是洗浴事件,如果該值大于0,則該事件是洗浴事件。某熱水器用戶記錄了兩周的熱水器用水日志,將前一周的數據作為訓練數據,后一周的數據作為測試數據,代入上述模型進行測試。

3.4 模型檢驗

結合模型評價相關的知識,使用精確率(precision)、召回率(recall)和f1值來做模型評價的效果先顧地較為客觀、準確。同時結合ROC曲線,可以進一步更加直觀地評價模型的效果,得到模型的ROC曲線如下圖所示, ROC曲線覆蓋的面積較大,說明模型的識別效果較好。

from sklearn.metrics import classification_report
from sklearn.metrics import roc_curve
from sklearn.externals import joblib
import matplotlib.pyplot as pltbpnn = joblib.load('../tmp/water_heater_nnet.m')  # 加載模型
y_pred = bpnn.predict(x_stdtest)  # 返回預測結果
print('神經網絡預測結果評價報告:\n',classification_report(y_test,y_pred))
# 繪制roc曲線圖
plt.rcParams['font.sans-serif'] = 'SimHei'  # 顯示中文
plt.rcParams['axes.unicode_minus'] = False  # 顯示負號
fpr, tpr, thresholds = roc_curve(y_pred,y_test)  # 求出TPR和FPR
plt.figure(figsize=(6,4))  # 創建畫布
plt.plot(fpr,tpr)  # 繪制曲線
plt.title('用戶用水事件識別ROC曲線')  # 標題
plt.xlabel('FPR')  # x軸標簽
plt.ylabel('TPR')  # y軸標簽
plt.savefig('../tmp/用戶用水事件識別ROC曲線.png')  # 保存圖片
plt.show()  # 顯示圖形

image-20240604114258221

根據該熱水器用戶提供的用水日志判斷事件是否為洗浴與多層神經網絡模型識別結果報告,如下表所示。

image-20240604114352586

根據模型評估報告表可以看出,在洗浴事件的識別上精確率(precision)非常高,達到了96%,同時召回率(recall)也達到了70%以上。綜合上述結果,可以確定此次創建的模型是有效并且效果良好的能夠用于實際的洗浴事件的識別中。

4. 思考總結

根據模型劃分的結果,發現有時候會將兩次(或多次)洗浴劃分為一次洗浴,因為在實際情況中,存在著一個人洗完澡后,另一個人馬上洗的情況,這中間過渡期間的停頓間隔小于閾值。針對兩次(或多次)洗浴事件被合并為一次洗浴事件的情況,需要進行優化,對連續洗浴事件作識別,提高模型識別精確度。

連續洗浴識別法如下:

1.對每次用水事件,建立一個連續洗浴判別指標。連續洗浴判別指標初始值為0,每當有一個屬性超過設定的閾值,就給該指標加上相應的值,最后判別連續洗浴指標是否超過給定的閾值,如果超過給定的閾值,認為該次用水事件為連續洗浴事件。

2.選取5個前面提取得到的屬性,做為判別連續洗浴事件的特征屬性,5個屬性分別為:總用水時長、停頓次數、用水時長/總用水時長、總用水量、停頓時長波動。詳細的說明如下。

(1) 總用水時長的閾值為900秒,如果超過900秒,就認為可能是連續洗浴,對于每超出的一秒,在該事件的連續洗浴判別指標上加上0.005,詳情見表 10 21。

(2) 停頓次數的閾值為10次,如果超過10次,就認為可能是連續洗浴,對于每超出的一次,在該事件的連續洗浴判別指標上加上0.5,詳情見表 10 21。

(3) 用水時長/總用水時長的閾值為0.5,如果小于0.5,就認為可能是連續洗浴,對于每少一個單位在該事件的連續洗浴判別指標上加上0.2,詳情見表 10 21。

(4) 總用水量的閾值為30L次,如果超過30L,就認為可能是連續洗浴,對于每超出的1L,在該事件的連續洗浴判別指標上加上0.2,詳情見表 10 21。

(5) 停頓時長波動的閾值為1000,如果超過1000,就認為可能是連續洗浴,對于每超出一個單位,在該事件的連續洗浴判別指標上加上0.002,詳細見下表。

image-20240604114531048

建立優化模型

image-20240604114606966

其中S是連續洗浴判別指標。

連續洗浴事件的劃分模型如下:

(1) 當用水事件的連續洗浴判別指標 大于5時,確定為連續洗浴事件或一次洗浴事件加一次短暫用水事件,取中間停頓時間最長的停頓,劃分為兩次事件。

(2) 如果 不大于5,確定為一次洗浴事件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22131.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22131.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

了解CAN功能

了解CAN功能&#xff0c;學習CAN功能&#xff0c;理解CAN和串口的區別&#xff0c;以及它和RS485的相似之處。 1、“多主機”特性 在CAN網絡通訊中&#xff0c;無需其它設備同意&#xff0c;每個CAN設備都可以主動向外發送數據&#xff0c;且所有設備都會收到數據&#xff0c…

【面試干貨】 非關系型數據庫(NoSQL)與 關系型數據庫(RDBMS)的比較

【面試干貨】 非關系型數據庫&#xff08;NoSQL&#xff09;與 關系型數據庫&#xff08;RDBMS&#xff09;的比較 一、引言二、非關系型數據庫&#xff08;NoSQL&#xff09;2.1 優勢 三、關系型數據庫&#xff08;RDBMS&#xff09;3.1 優勢 四、結論 &#x1f496;The Begin…

孵化器補貼政策提問模板

對于一些需要創業的人來說&#xff0c;找場地是非常非常難的&#xff0c;一個好的場地能夠提高創業的成功率&#xff0c;下面這些內容對于孵化器產業園的政策有一個好的提問&#xff0c;可以幫助你們了解這個孵化器合不合適。需要創業的人可以收藏 某孵化器政策示例 提問模板 …

源代碼先轉字節碼,再轉機器碼的過程

編程語言分類 1. 機器語言 直接使用 (101010) 二進制指令去編寫程序, 等于 直接操作硬件優點 : 最底層, 離計算機最近, 執行速度快缺點 : 復雜難記, 開發效率最低, 2. 匯編語言 用英文標簽代替一組二進制指令, 本質上仍然是 直接操作硬件優點 : 比較底層, 執行速度最快缺點 …

【競技寶】歐洲杯:德國被烏克蘭逼平,27腳射門仍難得分!

歐洲杯前的熱身賽已經全面開啟,東道主德國隊算是打響了熱身賽的第一槍,只可惜他們在主場0比0被烏克蘭逼平。整場比賽,德國隊都占據明顯優勢,全場比賽轟出27腳射門,可是卻無法實現破門。這個時候德國球迷似乎回想到了前兩屆世界大賽,球隊被“鋒無力”支配的恐懼。 本場比賽德國隊…

如何制作Peppol文件?

Peppol (Pan-European Public Procurement Online) 是一種用于跨境電子采購的標準協議和網絡。它允許企業和政府機構以電子方式交換文件&#xff0c;如電子發票、訂單和發貨單。如果你需要制作Peppol文件&#xff0c;可以參考如下步驟&#xff1a; 準備必要工具和資源 1.Pepp…

Serif Affinity 2.5 (macOS, Windows) - 專業創意軟件

Serif Affinity 2.5 (macOS, Windows) - 專業創意軟件 Affinity Designer 2, Affinity Photo 2, Affinity Publisher 2 請訪問原文鏈接&#xff1a;Serif Affinity 2.5 (macOS, Windows) - 專業創意軟件&#xff0c;查看最新版。原創作品&#xff0c;轉載請保留出處。 作者主…

C語言什么打開?件后要及時關閉?

一、問題 對?件讀寫之前&#xff0c;需要使? fopen( ) 函數打開該?件&#xff1a;在使?完?件后&#xff0c;需要及時關閉?件。那么&#xff0c;為什么要及時關閉?件呢&#xff1f; 二、解答 ?件打開的過程是將存放在磁盤等外部設備上的?件讀?到內存中&#xff0c;以…

【第二節】C/C++數據結構之線性表

目錄 一、線性表基本說明 1.1 基本概念 1.2 抽象數據類型 1.3 存儲結構 1.4 插入與刪除的區別 1.5 順序存儲和鏈式存儲的優缺點 二、鏈表 2.1 基本概念 2.2 抽象數據類型 2.3 單鏈表的定義 2.4 單鏈表的基本操作 2.5 單鏈表模板形式的類定義與實現 三、單向循環鏈…

項目迭代中新老邏輯切換入口

前言 ? 日常我們在項目開發中經常會進行項目迭代&#xff0c;比如說開發初期設定的代碼邏輯根據功能需求迭代逐漸發現越來越難用&#xff0c;或者改動是對整體較大時&#xff0c;往往會進行專項處理&#xff0c;對這個邏輯進行改造。 ? 那么就會涉及到原先被調用方切換接口…

成功解決“ModuleNotFoundError: No module named ‘tensorflow_datasets‘”錯誤的全面指南

成功解決“ModuleNotFoundError: No module named ‘tensorflow_datasets’”錯誤的全面指南 在Python編程和深度學習項目中&#xff0c;tensorflow_datasets&#xff08;通常簡稱為tfds&#xff09;是一個非常重要的庫&#xff0c;它提供了大量現成的數據集&#xff0c;方便…

終于來啦!Stable Diffusion 3將在6月12日正式開源

6月3日晚&#xff0c;著名開源大模型平臺Stability AI的聯合首席執行官Christian Laforte&#xff0c;在AMD的產品發布會上宣布&#xff0c;文生圖模型 Stable Diffusion 3將于6月12日在Hugging Face開源權重。 本次開源的是Stable Diffusion 3的Medium模型&#xff0c;有20億…

武漢盛勢啟創科技攜手三品軟件 EDM系統助力企業圖文檔數字化

客戶簡介 武漢盛勢啟創科技有限公司&#xff08;以下簡稱“盛世啟創”&#xff09;是一家專注于新能源汽車零部件領域的科技型企業&#xff0c;其主要業務涵蓋新能源汽車三電系統智能傳感器、智能座艙及線控底盤控制器的芯片開發、硬件設計、嵌入式系統開發。以及相關產品的生產…

C++第二十三彈---深入理解STL中list的使用

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】【C詳解】 目錄 1、list的介紹 2、list的使用 2.1、構造函數 2.2、賦值操作符重載 2.3、迭代器使用 2.4、容量操作 2.5、元素訪問 2.6、修改操作 2.7、其…

從0開始學人工智能測試節選:Spark -- 結構化數據領域中測試人員的萬金油技術(三)

分布式計算原理 分布式計算的原理總結一句話就是&#xff1a;分而治之。 把數據分片&#xff0c;存在不同的機器中&#xff0c;解決數據存儲的壓力。客戶端和服務端之間通過相關協議來自動的完成在不同的機器之間進行數據的存取&#xff0c;用戶并不感知數據的物理存儲結構。 用…

UIKit之App界面Demo

需求 實現簡單的APP界面 功能&#xff1a; 實現滾動實現上層、下層橫欄滾動時穿透效果&#xff08;永遠浮在表面&#xff0c;不跟著滾動&#xff09;。暫用UIView代替&#xff0c;還沒學Bar。 分析&#xff1a; 知識點&#xff1a; 實現鼠標拖動的上下滾動&#xff1a;當…

小紅書前端2輪面試期望22K,全程問低代碼設計

一面&#xff08;通過&#xff09; 1、好&#xff0c;那我們開始把&#xff0c;先簡單介紹一下自己的一個經歷&#xff0c;以及自己有亮點的項目&#xff1f;balabala 2、你可以這樣介紹&#xff1a;在這里邊主要負責哪幾個項目&#xff0c;哪些項目是比較有亮點的&#xff0…

python用PyPDF2函數庫方法對pdf文件切割

煩透了那些軟件動不動就要收費&#xff0c;于是自己嘗試碼程序處理pdf分割。 由于PyPDF2更新到了3.0之后&#xff0c;之前網上的舊代碼無法使用&#xff0c;查了半天沒出準譜&#xff0c;結果百度AI生成了代碼&#xff0c;一試&#xff0c;成了&#xff01; 果然&#xff0c;…

代碼隨想錄-算法訓練營day60【單調棧03:柱狀圖中最大的矩形】

代碼隨想錄-035期-算法訓練營【博客筆記匯總表】-CSDN博客 第十章 單調棧part03有了之前單調棧的鋪墊,這道題目就不難了。 ● 84.柱狀圖中最大的矩形https://programmercarl.com/0084.%E6%9F%B1%E7%8A%B6%E5%9B%BE%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E7%9F%A9%E5%BD%A2.htm…

智享直播(三代)2024年:打造24/7實景無人直播,引領年輕資產創業新紀元!

在21世紀的數字化浪潮中&#xff0c;直播行業以其獨特的魅力和無限的可能性&#xff0c;正在全球范圍內掀起一場前所未有的( keJ0277 )創業革命。而在這場革命中&#xff0c;智享直播&#xff08;三代&#xff09;以其創新的技術理念和前瞻的戰略布局&#xff0c;立志于2024年打…