Python 資料分析預測商品銷售額_其它 - 程式人生

文章推薦指數: 80 %
投票人數:10人

一、選題的背景選擇此題: 題目來源於Kaglge競賽平臺,具有一定的學習意義。

可以更好的理解機器學習和資料分析的券過程。

目標:根據商店的銷售資料預測 ... 程式人生>實用技巧>其它>Python資料分析預測商品銷售額 Python資料分析預測商品銷售額 阿新•來源:網路•發佈:2021-06-21 一、選題的背景  選擇此題:題目來源於Kaglge競賽平臺,具有一定的學習意義。

可以更好的理解機器學習和資料分析的券過程。

目標:根據商店的銷售資料預測商品的銷售額 社會:通過機器學習幫助商店老闆做出決策,可以提供貨物的資源利用率,促進社會經濟發展。

經濟:通過對銷售額的預測,可以更好的幫助老闆進貨和銷售,提高商店的收益。

技術:通過這一次的專案的學習,可以學到機器學習,資料探勘的全部流程。

從資料獲取,到資料處理,特徵選擇,模型建立各個方面全面掌握機器學習的流程。

可以更深入對機器學習總迴歸任務的理解。

二、大資料分析設計方案 1.資料集描述:訓練集樣本個數:8523,測試集樣本個數:5681。

資料集欄位說明:訓練集共11個特徵,1個標籤;測試集只有11個特徵,沒有標籤。

其中Item_Identifier,Item_Fat_Content等8個特徵的原始資料都是字串型別,其餘特徵是浮點數型別。

(具體特徵如下圖所示) 2.專案實現的主要思路 (1)觀察資料集各個特徵,ᨀ出猜想,結果可能和哪些因素有關 (2)檢查各個特徵的資料型別,將其轉化為樹枝型別方便計算 (3)觀察資料的缺失值,確定缺失值處理方法 (4)觀察訓練集和測試集的特徵分佈規律,看看有沒有需要刪除的 (5)樣本資料的標準化(歸到0-1之間) (6)建模處理訓練集的異常值 (7)構建多個模型,分別使用交叉驗證和網格搜尋選出最有的引數 (8)使用融合的方法,對多個模型的結果加權求和 三、資料分析步驟 1.資料來源 資料來源https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/ 2.資料清洗 非數值型別對映為數值型別 (1)統計Item_Weight特徵所有的變數,結果如下圖所示(圖片左邊一列表示該列出現的類別,右邊是計數。

如第一行LowFat5089表示Item_Weigh特徵所在列共有5089個樣本的特徵值為LowFat),雖然統計發現有四個欄位,但是發現LF,lowfat,LowFat都表示低脂,可以合為一項,用數字0代替。

Regular和reg都表示正常可合為一項,用數字1代替; (2)統計Outlet_Size特徵所有的變數,結果如下圖所示,商店大小有三種類型,按如下規則:Small:用數值1代替;Medium:用數值2代替;High:用數值3代替 (3)統計Outlet_Location_Type特徵所有的變數,結果如下圖,商店地域有三種類型,按如下規則:Tier1:用數值1代替;Tier2:用數值2代替;Tier3:用數值3代替 (4)統計Item_Type特徵所有的變數,結果如下圖,發現有16種類型的變數,我們第一次嘗試將這16種類型對映到1-16共16個整數上,後來參考網上的其他人的做法,將這16種劃分為3大類,食物(FruitsandVegetables,SnackFoods,Meat,BakingGoods,Bread,Breakfast,FrozenFoods,Dairy,StarchyFoods),日用品(Household,Others,HealthandHygiene)酒水(SoftDrinks,HardDrinks)。

處理完的特徵較原來的特徵模型分數有所提高 1importpandasaspd 2importnumpyasnp 3importmatplotlib.pyplotasplt 4importseabornassns 5 6frommathimportsqrt 7fromsklearn.metricsimportmean_squared_error#計算均方誤差 8fromsklearn.metricsimportmake_scorer 9fromsklearn.model_selectionimporttrain_test_split 10 11fromsklearn.model_selectionimportGridSearchCV,RepeatedKFold,cross_val_score,cross_val_predict,KFold 12fromsklearn.ensembleimportRandomForestRegressor,GradientBoostingRegressor,AdaBoostRegressor 13fromsklearn.linear_modelimportLinearRegression,Lasso,Ridge,ElasticNet 14 15importwarnings 16warnings.filterwarnings("ignore") 17%matplotlibinline 18%configInlineBackend.figure_format='svg' 匯入資料集 1train_data=pd.read_csv("train_data.csv") 2test_data=pd.read_csv("test_data.csv") 3train_data.head() 4#len(test_data) 資料數值化操作 1defsmall_class_num(data): 2try: 3#Item_Fat_Content 4Item_Fat_Content={'LowFat':0,'Regular':1,"LF":0,"reg":1,"lowfat":0,} 5data["Item_Fat_Content"]=data["Item_Fat_Content"].apply(lambdax:Item_Fat_Content[x]) 6#Outlet_Size 7#Outlet_Size={'Small':1,'Medium':2,'High':3,'NONE':4} 8#data["Outlet_Size"].fillna("NONE",inplace=True)#填充缺失值 9#data["Outlet_Size"]=data["Outlet_Size"].apply(lambdax:Outlet_Size[x]) 10data["Outlet_Size"].replace({"Small":1,"Medium":2,"High":3},inplace=True) 11#Outlet_Location_Type 12Outlet_Location_Type={'Tier3':3,'Tier2':2,'Tier1':1} 13data["Outlet_Location_Type"]=data["Outlet_Location_Type"].apply(lambdax:Outlet_Location_Type[x]) 14#Outlet_Type 15Outlet_Type={'SupermarketType1':1,'SupermarketType2':2,'SupermarketType3':3,'GroceryStore':4,} 16data["Outlet_Type"]=data["Outlet_Type"].apply(lambdax:Outlet_Type[x]) 17except: 18print("數值化已經完成過,切勿重複操作") 19 20small_class_num(train_data) 21small_class_num(test_data) 1defitem_type_num(data): 2try: 3data["Item_Type"].replace({"FruitsandVegetables":"FD","Meat":"FD","Dairy":"FD","Breakfast":"FD"},inplace=True) 4data["Item_Type"].replace({"SnackFoods":"FD","FrozenFoods":"FD","Canned":"FD"},inplace=True) 5data["Item_Type"].replace({"BakingGoods":"FD","Breads":"FD","Canned":"FD","Seafood":"FD","StarchyFoods":"FD"},inplace=True) 6data["Item_Type"].replace({"Household":"NC","HealthandHygiene":"NC","Others":"NC"},inplace=True) 7data["Item_Type"].replace({"SoftDrinks":"DR","HardDrinks":"DR",},inplace=True) 8data["Item_Type"].value_counts() 9data["Item_Type"].replace({"FD":1,"NC":2,"DR":3},inplace=True) 10except: 11print("數值化已經完成過,切勿重複操作") 12item_type_num(train_data) 13item_type_num(test_data) 1train_data.isnull().sum() 缺失值處理 1defItem_Weight_filna(data): 2""" 3根據商品ID填充,沒有則填充平均值 4""" 5data[data.isnull().values==True]##檢視空行 6Item_Weight_Missing=data[data["Item_Weight"].isnull()].index.tolist() 7Item_Weight_Missing_ID=data["Item_Identifier"][Item_Weight_Missing].tolist() 8data["Item_Weight"]=data["Item_Weight"].fillna(-1) 9data_dict=data.groupby('Item_Identifier').Item_Weight.apply(list).to_dict() 10foritemindata_dict: 11a=data_dict[item] 12while-1.0ina: 13a.remove(-1.0) 14b=[] 15foriteminItem_Weight_Missing_ID: 16try: 17b.append(data_dict[item][0]) 18except: 19b.append(data["Item_Weight"].mean()) 20data["Item_Weight"][Item_Weight_Missing]=b 21 22Item_Weight_filna(train_data) 23Item_Weight_filna(test_data) 數值型別特徵歸一化處理 (1)對於連續性變數(Item_Weight,Item_Visibility,Item_MRP,),發現有的特徵值特別大,有的特徵值很小,所以我們將連續型數值標準化。

使用min-max標準化方法。

(2)其中,對於商店成立的年份(Outlet_Establishment_Year),我們改用商店成立的時間,用當前年份減去成立時間可得。

這樣可以減小模型的計算量。

(3)商店ID(IOutlet_Identifier)和商品ID(tem_Identifier,)看上去無用,暫時不做處理。

資料缺失值處理 (1)對資料集進行統計可知,資料集(包括測試集和訓練集)都存在缺失值,兩個資料集的確實值主要集中在Item_Weight和Outlet_Size上。

其中訓練集Item_Weight缺失1463個,Outlet_Size缺失2410個;測試集Item_Weight缺失976個,Outlet_Size缺失1606個 (2)對Outlet_Size的缺失值進行處理。

我們通過計算所有特徵兩兩間的皮爾遜係數,得出了特徵間的關係矩陣。

將其畫成熱力圖可以很明顯的看出,Outlet_Size和Outlet_Location_Type之間的關係最為密切。

所以,我們採用了隨機森林的演算法,對已有Outlet_Size的書籍構建了模型,然後去預測缺失值。

(特徵關係矩陣如下圖所示) 1matrix=train_data.corr()#相關係數矩陣 2f,ax=plt.subplots(figsize=(8,8)) 3sns.heatmap(matrix,vmax=.8,square=True,cmap="BuPu",annot=True) (3)對Item_Weight的缺失值進行處理。

發現商品的Item_Weight和商品的ID有關係,我們可以根據已有重量的商品ID去填充其他的缺失值。

(如下圖所示) 銷售額分佈曲線 預測結果之因變數分析:我們觀察了銷售金額的頻率分佈圖,發現銷售額主要集中在0–4000之間 1g=sns.kdeplot(train_data["Item_Outlet_Sales"],color="Red",shade=True) 2g.set_xlabel("Item_Outlet_Sales") 3g.set_ylabel("Frequency") 3.大資料分析過程及採用的演算法 使用隨機森林進行缺失值填充 1fromsklearn.ensembleimportRandomForestClassifier 2defOutlet_Size_filna(train_data): 3""" 4上述方法失效,使用隨機森林進行填充 5""" 6try: 7train_data["Outlet_Size"].fillna(-1,inplace=True)#填充缺失值 8fc=RandomForestClassifier() 9Outlet_Size_Miss=train_data.loc[train_data["Outlet_Size"]==-1] 10Outlet_Size_Train=train_data.loc[train_data["Outlet_Size"]!=-1] 11Train_P=Outlet_Size_Train[["Outlet_Location_Type"]] 12Train_L=Outlet_Size_Train["Outlet_Size"] 13fc=RandomForestClassifier() 14fc.fit(Train_P,Train_L) 15c=Outlet_Size_Miss["Outlet_Location_Type"].values.reshape(-1,1) 16d=fc.predict(c) 17train_data.loc[train_data["Outlet_Size"]==-1,"Outlet_Size"]=d 18except: 19print("缺失值填充完畢,請勿重複操作!!!") 20 21Outlet_Size_filna(train_data) 22Outlet_Size_filna(test_data) 各個特徵與結果的關係 1defdraw_feature_result(feature,x=10,y=4): 2fig,(ax1,ax2)=plt.subplots(1,2,figsize=(x,y)) 3sns.barplot(x=feature,y="Item_Outlet_Sales",data=train_data,ax=ax1) 4 5feature_1=train_data['Item_Outlet_Sales'].groupby(train_data[feature]).sum() 6dict_feature_1={feature:feature_1.index,'Item_Outlet_Sales':feature_1.values} 7dict_feature_1=pd.DataFrame(dict_feature_1) 8sns.barplot(x=feature,y="Item_Outlet_Sales",data=dict_feature_1,ax=ax2) 9 10draw_feature_result("Item_Fat_Content") 特徵選擇之商品種類和結果的關係:通過圖表(如下圖左)我們可以得出各個型別平均每一樣物品的銷售額差不多,但是不同類別的銷售總額差別比較大(如下圖右)。

可以看出,食物類的商品銷售總額最多,說明商品種類和銷售金額是存在一定的關係的,故該特徵保留。

1draw_feature_result("Item_Type") 特徵選擇之商店大小和結果的關係:通過圖表(如下圖左)我們可以得出各個商店平均每一樣物品的銷售額差不多,但是不同大小的商店的銷售總額差別比較大(如下圖右)。

可以看出,大超市銷售總額最多,說明商店大小和銷售金額是存在一定的關係的,故該特徵保留。

1draw_feature_result("Outlet_Size") 特徵選擇之商店所在地和結果的關係:通過圖表(如下圖左)我們可以得出各個地區商店平均每一樣物品的銷售額差不多,但是不同地區的商店的銷售總額差別比較大(如下圖右)。

說明商店所在地和銷售金額是存在一定的關係的,故該特徵保留 1draw_feature_result("Outlet_Location_Type",x=10,y=3) 特徵選擇之商店型別和結果的關係:通過圖表(如下圖左)我們可以得出各個地區商店平均每一樣物品的銷售額相差比較大,不同地區的商店的銷售總額差別也比較大(如下圖右)。

說明商店型別和銷售金額是存在一定的關係的,故該特徵保留 1draw_feature_result("Outlet_Type") 訓練集特徵分佈規律和測試集特徵分佈規律對比 通過對比訓練集和測試集的特徵分佈規律,我們可以看刪除一些分佈規律明顯不同的特徵,這裡我們做了對比後發現,訓練集和測試集特徵的分佈的規律幾乎一致,所以不做特徵的刪除或選擇工作。

(分佈規律如下圖所示,橫軸表示特徵,縱軸表示頻率) 1train_data["oringin"]="train" 2test_data["oringin"]="test" 3all_data=pd.concat([train_data,test_data],axis=0,ignore_index=True) 4target=all_data['Item_Outlet_Sales'] 5delall_data["Item_Identifier"] 6delall_data["Outlet_Identifier"] 7delall_data["Item_Outlet_Sales"] 8all_data["Item_Outlet_Sales"]=target 1forcolumninall_data.columns[0:-2]: 2g=sns.kdeplot(all_data[column][(all_data["oringin"]=="train")],color="Red",shade=True) 3g=sns.kdeplot(all_data[column][(all_data["oringin"]=="test")],ax=g,color="Blue",shade=True) 4g.set_xlabel(column) 5g.set_ylabel("Frequency") 6g=g.legend(["train","test"]) 7#plt.savefig(column+"distri.svg") 8plt.show() 年份處理和浮點數標準化 1all_data["Outlet_Establishment_Year"]=2013-all_data["Outlet_Establishment_Year"] 2continus_value=["Item_Weight","Item_Visibility","Item_MRP",] 3defnornomalize(train_data,continus_value): 4forvlaueincontinus_value: 5train_data[vlaue]=(train_data[vlaue]-train_data[vlaue].min())/(train_data[vlaue].max()-train_data[vlaue].min()) 6nornomalize(all_data,continus_value) 區分測試集和訓練集 1defget_training_data(): 2""" 3獲取訓練資料 4""" 5df_train=all_data[all_data["oringin"]=="train"] 6y=df_train.Item_Outlet_Sales 7X=df_train.drop(["oringin","Item_Outlet_Sales"],axis=1) 8X_train,X_valid,y_train,y_valid=train_test_split(X,y,test_size=0.3,random_state=100) 9returnX_train,X_valid,y_train,y_valid 10 11defget_test_data(): 12""" 13獲取測試資料 14""" 15df_test=all_data[all_data["oringin"]=="test"].reset_index(drop=True) 16returndf_test.drop(["oringin","Item_Outlet_Sales"],axis=1) 評價標準rmse和mse,用make_scorer方便帶入cv驗證 1defrmse(y_true,y_pred): 2""" 3評價標準1 4""" 5returnsqrt(mean_squared_error(y_true,y_pred)) 6 7 8defmse(y_ture,y_pred): 9""" 10評價標準2 11""" 12returnmean_squared_error(y_ture,y_pred) 13 14rmse_scorer=make_scorer(rmse,greater_is_better=False) 15mse_scorer=make_scorer(mse,greater_is_better=False) 離群的檢查 1deffind_outliers(model,X,y,sigma=3): 2""" 3根據模型找出異常點 4model:預測模型 5X:資料特徵 6y:資料標籤 7sigma:離群點閥值 8""" 9try: 10y_pred=pd.Series(model.predict(X),index=y.index) 11except: 12model.fit(X,y) 13y_pred=pd.Series(model.predict(X),index=y.index) 14 15resid=y-y_pred#計算結果差值 16mean_resid=resid.mean()#結果差的均值 17std_resid=resid.std()#結果的標準方差 18 19z=(resid-mean_resid)/std_resid#標準化 20outliers=z[abs(z)>sigma].index 21 22print('rmse=',rmse(y,y_pred)) 23print("mse=",mean_squared_error(y,y_pred)) 24print('---------------------------------------') 25 26print('meanofresiduals:',mean_resid) 27print('stdofresiduals:',std_resid) 28print('---------------------------------------') 29 30print(len(outliers),'outliers:') 31print(outliers.tolist()) 32 33plt.figure(figsize=(20,4)) 34ax_131=plt.subplot(1,3,1) 35plt.plot(y,y_pred,'.') 36plt.plot(y.loc[outliers],y_pred.loc[outliers],'ro') 37plt.legend(['Accepted','Outlier']) 38plt.xlabel('y') 39plt.ylabel('y_pred'); 40 41ax_132=plt.subplot(1,3,2) 42plt.plot(y,y-y_pred,'.') 43plt.plot(y.loc[outliers],y.loc[outliers]-y_pred.loc[outliers],'ro') 44plt.legend(['Accepted','Outlier']) 45plt.xlabel('y') 46plt.ylabel('y-y_pred'); 47 48ax_133=plt.subplot(1,3,3) 49z.plot.hist(bins=50,ax=ax_133) 50z.loc[outliers].plot.hist(color='r',bins=50,ax=ax_133) 51plt.legend(['Accepted','Outlier']) 52plt.xlabel('z') 53 54plt.savefig('outliers.png') 55 56returnoutliers 利用梯度提升演算法對找出訓練集的異常點 通過模型預測的結果與實際結果進行對比,發現異常點。

對預測結果與實際的差做標準化處理,值大於某個數(圖中sigma取值為3)則判斷為異常點,在接下來的模型訓練中要將其刪除(如下圖所示,左圖,縱軸為預測的值,右圖縱軸為預測和實際的差) 1fromsklearn.model_selectionimporttrain_test_split 2X_train,X_valid,y_train,y_valid=get_training_data() 3test=get_test_data() 4outliers=find_outliers(GradientBoostingRegressor(),X_train,y_train) 交叉驗證 梯度提升演算法建模預測結果梯度提升演算法,採用網格搜尋調參,10次10折交叉驗證得出最優的引數為n_estimators=70,max_depth=3,訓練集最好的rmse=951.7399,驗證集測試的結果為1078.8195。

(預測結果的相關係數如下圖左所示,標準差如下圖右所示) 1fromsklearn.preprocessingimportStandardScaler 2deftrain_model(model,param_grid=[],X=[],y=[],splits=5,repeats=5): 3""" 4使用K折交叉驗證 5 6""" 7rkfold=RepeatedKFold(n_splits=splits,n_repeats=repeats) 8 9gsearch=GridSearchCV(model,param_grid,cv=rkfold,scoring="neg_mean_squared_error",verbose=1,return_train_score=True) 10gsearch.fit(X,y) 11model=gsearch.best_estimator_#選擇最好的模型 12best_idx=gsearch.best_index_ 13 14grid_results=pd.DataFrame(gsearch.cv_results_)#CV模型 15cv_mean=abs(grid_results.loc[best_idx,'mean_test_score']) 16cv_std=grid_results.loc[best_idx,'std_test_score'] 17cv_score=pd.Series({'mean':cv_mean,'std':cv_std}) 18y_pred=model.predict(X) 19print('----------------------') 20print(model) 21print('----------------------') 22print('rmse=',rmse(y,y_pred)) 23print('mse=',mse(y,y_pred)) 24print('cross_val:mean=',cv_mean,',std=',cv_std) 25 26y_pred=pd.Series(y_pred,index=y.index) 27resid=y-y_pred 28mean_resid=resid.mean() 29std_resid=resid.std() 30z=(resid-mean_resid)/std_resid 31n_outliers=sum(abs(z)>3) 32 33plt.figure(figsize=(20,4)) 34ax_131=plt.subplot(1,3,1) 35plt.plot(y,y_pred,'.') 36plt.xlabel('y') 37plt.ylabel('y_pred'); 38plt.title('corr={:.3f}'.format(np.corrcoef(y,y_pred)[0][1]))#相關係數 39ax_132=plt.subplot(1,3,2) 40plt.plot(y,y-y_pred,'.') 41plt.xlabel('y') 42plt.ylabel('y-y_pred'); 43plt.title('stdresid={:.3f}'.format(std_resid)) 44 45ax_133=plt.subplot(1,3,3) 46z.plot.hist(bins=50,ax=ax_133) 47plt.xlabel('z') 48plt.title('{:.0f}samplesareoutliers'.format(n_outliers)) 49 50returnmodel,cv_score,grid_results 梯度提升演算法建模預測結果 梯度提升演算法,採用網格搜尋調參,10次10折交叉驗證得出最優的引數為n_estimators=70,max_depth=3,訓練集分數rmse=581.3993,測試集rmse=1089.5227。

(如下圖所示) Xgboost演算法,採用網格搜尋調參,10次10折交叉驗證得出最優的引數為n_estimators=70,max_depth=3,訓練集最好的rmse=954.4746,驗證集測試的結果為1077.1127。

(預測結果的相關係數如下圖左所示,標準差如下圖右所示) 1fromxgboostimportXGBRegressor 2param_grid_xg={'n_estimators':[70,75,80],'max_depth':[1,2,3]}#xgboost 3model_xg,cv_score_xg,grid_results_xg=train_model(XGBRegressor(),param_grid_xg,X1,y1,splits=10,repeats=10) 4submit_xg=model_xg.predict(get_test_data()) 嶺迴歸Ridge演算法建模預測結果 隨機森林演算法,採用網格搜尋調參,10次10折交叉驗證得出最優的引數為alpha=0.75,訓練集最好的rmse=1199.7880,驗證集測試的結果為1282.5769 1alph_range=np.arange(0.25,6,0.25)#嶺迴歸 2param_grid_ridge={'alpha':alph_range} 3model_ridge,cv_score_ridge,grid_results_ridge=train_model(Ridge(),param_grid_ridge,X1,y1,splits=10,repeats=10) 4submit_ridge=model_ridge.predict(get_test_data()) 1final_1=0.4*(submit_xg+submit_gbdt)+0.1*(submit_ridge+submit_rf)#1162.9265 2final_2=0.5*submit_xg+0.3*submit_gbdt+0.1*submit_ridge+0.1*submit_rf#1162.6200 3final_3=0.8*submit_xg+0.1*submit_gbdt+0.05*submit_ridge+0.05*submit_rf#1157.9485 4final_4=0.2*submit_xg+0.6*submit_gbdt+0.1*submit_ridge+0.1*submit_rf#1163.5908 5final_5=0.8*submit_xg+0.1*submit_ridge+0.1*submit_rf#1161.8037 6final_6=0.8*submit_xg+0.2*submit_gbdt#1155.1319 7final_7=0.9*submit_xg+0.1*submit_gbdt#1154.9201 1defresult_submit(filename,submit): 2""" 3func:結果提交函式 4""" 5df=pd.read_csv(filename) 6df["Item_Outlet_Sales"]=submit 7df.to_csv("1.csv",index=False) 8 9 10result_submit("SampleSubmission_TmnO39y.csv",final_7) 四、總結 1.有益的結論: (1)商品銷售額與各種因素有關,比如說商店位置等 (2)特徵分析很重要,好的特徵能提高準確率 (3)模型選擇很重要,模型的整合往往能帶來更好的結果 達到了預期的目標 2.通過完成此設計過程中,我收穫了,數值的替換都可以用replace,資料分析常用模組有三個:numpy:矩陣計算等數學計算,pandas:基於numpy的資料分析工具,使用資料框對錶結構的資料進行分析,matplotlib:資料視覺化,本次課程主要學習前兩者。

numpy一維陣列與列表的區別:一維陣列提供了很多統計功能,一維陣列可以向量化運算,一維陣列全是相同的資料型別。

pandas的Series有index,我們可以在使用的時候指定這些index。

iloc根據位置獲取元素的值,loc方法根據index索引值獲取元素的值。

querySer篩選這裡要仔細理解,涉及到行和列的變化。

要理解【行,列】這裡的控制變數的問題,前面是對於行的篩選,後面是對於列的篩選。

leetcode386.字典序排數 «上一篇 python入門指南_26-異常 下一篇» 相關推薦 C++passfunctionandargumentsasparameterviafunctionaddress*symbolAtCoderBeginnerContest250A-E題解20192423楊斯凌2021-2022-2《網路與系統攻防技術》實驗六實驗報告基於Tablestore打造億量級訂單管理解決方案Vue回爐重造之圖片載入效能優化8.日誌9.分頁查詢科協python講座摸魚 搜尋 熱門文章 C++passfunctionandargumentsasparameterviafunctionaddress*symbol 2022-05-13 AtCoderBeginnerContest250A-E題解 2022-05-13 20192423楊斯凌2021-2022-2《網路與系統攻防技術》實驗六實驗報告 2022-05-13 ADS 基礎教學 Mysql入門 Sql入門 Android入門 Docker入門 Go語言入門 Ruby程式入門 Python入門 Python進階 Django入門 Python爬蟲入門 ADS 人氣文章 C++passfunctionandargumentsasparameterviafunctionaddress*symbol 2022-05-13 AtCoderBeginnerContest250A-E題解 2022-05-13 20192423楊斯凌2021-2022-2《網路與系統攻防技術》實驗六實驗報告 2022-05-13 基於Tablestore打造億量級訂單管理解決方案 2022-05-13 Vue回爐重造之圖片載入效能優化 2022-05-13 8.日誌 2022-05-13 9.分頁查詢 2022-05-13 科協python講座摸魚 2022-05-13 5.配置解析 2022-05-13 設計模式之行為型模式--責任鏈模式、直譯器模式 2022-05-13 熱門標籤 Java基礎資料結構與演算法經驗分享劍指offer其他題解圖論程式人生每日一題安卓微控制器PAT演算法&資料結構PTAPython學習leetcode刷題java學習筆記演算法與資料結構reactjspython基礎 ADS



請為這篇文章評分?