項目準備(flask+pyhon+MachineLearning)- 3

目錄

1.商品信息

2. 商品銷售預測

2.1 機器學習

2.2 預測功能

3. 模型評估


1.商品信息

@app.route('/products')
def products():"""商品分析頁面"""data = load_data()# 計算當前期間和上期間current_period = data[data['成交時間'] >= data['成交時間'].max() - timedelta(days=30)]previous_period = data[(data['成交時間'] < data['成交時間'].max() - timedelta(days=30)) & (data['成交時間'] >= data['成交時間'].max() - timedelta(days=60))]# 計算商品指標current_sales = current_period.groupby('商品ID').apply(lambda x: (x['銷量'] * x['單價']).sum())previous_sales = previous_period.groupby('商品ID').apply(lambda x: (x['銷量'] * x['單價']).sum())product_metrics = pd.DataFrame({'current_sales': current_sales,'previous_sales': previous_sales}).fillna(0)product_metrics['growth_rate'] = ((product_metrics['current_sales'] - product_metrics['previous_sales']) / product_metrics['previous_sales']).fillna(0)max_competitor_sales = product_metrics['current_sales'].max()product_metrics['market_share'] = (product_metrics['current_sales'] / max_competitor_sales)# BCG矩陣分類growth_rate_threshold = product_metrics['growth_rate'].median()market_share_threshold = product_metrics['market_share'].median()def classify_product(row):if row['growth_rate'] >= growth_rate_threshold:return '明星商品' if row['market_share'] >= market_share_threshold else '問題商品'else:return '現金牛' if row['market_share'] >= market_share_threshold else '瘦狗'product_metrics['category'] = product_metrics.apply(classify_product, axis=1)# 統計分類結果category_stats = product_metrics.groupby('category').agg({'current_sales': ['count', 'sum']})category_stats.columns = ['product_count', 'sales_amount']category_stats['sales_percentage'] = (category_stats['sales_amount'] / category_stats['sales_amount'].sum())return render_template('products.html',category_statistics=category_stats.to_dict('index'),growth_rate_threshold=float(growth_rate_threshold),market_share_threshold=float(market_share_threshold))

2. 商品銷售預測

2.1 機器學習

def prepare_features(data):"""準備特征數據"""# 刪除包含NaN的行data = data.dropna(subset=['銷量', '單價', '類別ID', '門店編號'])# 時間特征data['weekday'] = data['成交時間'].dt.weekdaydata['month'] = data['成交時間'].dt.monthdata['hour'] = data['成交時間'].dt.hour# 類別編碼le_category = LabelEncoder()le_store = LabelEncoder()# 擬合編碼器le_category.fit(data['類別ID'].astype(str))  # 將類別ID轉換為字符串le_store.fit(data['門店編號'].astype(str))# 轉換數據data['類別編碼'] = le_category.transform(data['類別ID'].astype(str))data['門店編碼'] = le_store.transform(data['門店編號'].astype(str))# 特征選擇features = ['類別編碼', '門店編碼', '單價', 'weekday', 'month', 'hour']target = '銷量'# 確保所有特征都是數值類型X = data[features].astype(float)y = data[target].astype(float)return X, y, le_category, le_store# 創建全局變量來存儲模型和編碼器
model = None
scaler = None
label_encoder_category = None
label_encoder_store = Nonedef initialize_model():"""初始化模型和編碼器"""global model, scaler, label_encoder_category, label_encoder_storetry:data = load_data()X, y, le_category, le_store = prepare_features(data)# 訓練模型X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 標準化特征scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)# 訓練決策樹模型model = DecisionTreeRegressor(random_state=42, max_depth=10)model.fit(X_train_scaled, y_train)# 保存編碼器label_encoder_category = le_categorylabel_encoder_store = le_storereturn Trueexcept Exception as e:print(f"模型初始化錯誤: {str(e)}")return False

2.2 預測功能

@app.route('/predict', methods=['POST'])
def predict():"""處理預測請求"""global model, scaler, label_encoder_category, label_encoder_storetry:# 如果模型未初始化,先初始化if model is None or scaler is None:if not initialize_model():return jsonify({'error': '模型初始化失敗'}), 500# 獲取表單數據category = request.form['category']store = request.form['store']price = float(request.form['price'])weekday = int(request.form['weekday'])month = int(request.form['month'])try:# 轉換類別編碼和門店編碼category_encoded = label_encoder_category.transform([str(category)])[0]store_encoded = label_encoder_store.transform([str(store)])[0]except ValueError as e:return jsonify({'error': f'無效的輸入數據: {str(e)}'}), 400# 準備預測數據pred_data = pd.DataFrame([[category_encoded,store_encoded,price,weekday,month,12  # 使用默認時間]], columns=['類別編碼', '門店編碼', '單價', 'weekday', 'month', 'hour'])# 標準化預測數據pred_data_scaled = scaler.transform(pred_data)# 預測prediction = model.predict(pred_data_scaled)[0]# 確保預測結果為正整數prediction = max(0, round(prediction))# 獲取門店信息store_info = STORE_INFO.get(store, {})store_name = store_info.get('name', f'門店{store}')# 加載歷史數據進行分析data = load_data()# 計算該類別的歷史平均銷量category_avg = data[data['類別ID'].astype(str) == str(category)]['銷量'].mean()# 計算該門店的歷史平均銷量store_avg = data[data['門店編號'].astype(str) == str(store)]['銷量'].mean()# 計算價格區間的平均銷量price_range = 0.1  # 價格范圍±10%price_lower = price * (1 - price_range)price_upper = price * (1 + price_range)price_avg = data[(data['單價'] >= price_lower) & (data['單價'] <= price_upper)]['銷量'].mean()# 計算同時段(星期幾和月份)的歷史平均銷量time_avg = data[(data['成交時間'].dt.weekday == weekday) & (data['成交時間'].dt.month == month)]['銷量'].mean()# 生成分析結果analysis = {'category_comparison': round((prediction / category_avg * 100) if category_avg > 0 else 100),'store_comparison': round((prediction / store_avg * 100) if store_avg > 0 else 100),'price_comparison': round((prediction / price_avg * 100) if price_avg > 0 else 100),'time_comparison': round((prediction / time_avg * 100) if time_avg > 0 else 100),'category_avg': round(category_avg if not pd.isna(category_avg) else 0),'store_avg': round(store_avg if not pd.isna(store_avg) else 0),'price_avg': round(price_avg if not pd.isna(price_avg) else 0),'time_avg': round(time_avg if not pd.isna(time_avg) else 0)}return jsonify({'prediction': int(prediction),'category': category,'category_name': CATEGORY_NAMES.get(category, f'類別{category}'),'store': store,'store_name': store_name,'price': price,'weekday': weekday,'month': month,'analysis': analysis})except Exception as e:print(f"預測錯誤: {str(e)}")return jsonify({'error': str(e)}), 400@app.route('/prediction')
def prediction_page():"""銷售預測頁面"""data = load_data()categories = sorted(data['類別ID'].astype(str).unique().tolist())stores = sorted(data['門店編號'].astype(str).unique().tolist())# 創建類別選項列表,包含ID和名稱category_options = [{'id': cat_id, 'name': CATEGORY_NAMES.get(cat_id, f'類別{cat_id}')} for cat_id in categories]# 創建門店選項列表store_options = [{'id': store_id, 'name': STORE_INFO.get(store_id, {}).get('name', f'門店{store_id}')}for store_id in stores]# 初始化模型(如果需要)global modelif model is None:initialize_model()return render_template('prediction.html', categories=category_options,stores=store_options)

3. 模型評估

@app.route('/model_evaluation')
def model_evaluation():"""模型評估頁面"""data = load_data()# 準備特征X, y, le_category, le_store = prepare_features(data)# 訓練模型并獲取評估結果_, _, metrics, feature_importance, scatter_data, residual_data, feature_names, importance_scores = train_models(X, y)return render_template('model_evaluation.html',metrics=metrics,feature_importance=feature_importance,scatter_data=scatter_data,residual_data=residual_data,feature_names=feature_names,importance_scores=importance_scores)

4. 訓練模型

def train_models(X, y):"""訓練模型"""# 數據分割X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 標準化特征scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)# 訓練決策樹模型dt_model = DecisionTreeRegressor(random_state=42, max_depth=10)dt_model.fit(X_train_scaled, y_train)# 預測y_pred = dt_model.predict(X_test_scaled)# 計算模型指標metrics = {'r2_score': r2_score(y_test, y_pred),'mse': mean_squared_error(y_test, y_pred),'mae': mean_absolute_error(y_test, y_pred),'rmse': np.sqrt(mean_squared_error(y_test, y_pred))}# 特征重要性feature_importance = []for name, importance in zip(X.columns, dt_model.feature_importances_):correlation = np.corrcoef(X[name], y)[0, 1]feature_importance.append({'name': name,'importance': importance,'correlation': correlation})# 準備圖表數據scatter_data = [[float(actual), float(pred)] for actual, pred in zip(y_test, y_pred)]residuals = y_test - y_predresidual_data = [[float(pred), float(residual)] for pred, residual in zip(y_pred, residuals)]return dt_model, scaler, metrics, feature_importance, scatter_data, residual_data, X.columns.tolist(), dt_model.feature_importances_.tolist()

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

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

相關文章

FPGA開發,使用Deepseek V3還是R1(3):系統級與RTL級

以下都是Deepseek生成的答案 FPGA開發&#xff0c;使用Deepseek V3還是R1&#xff08;1&#xff09;&#xff1a;應用場景 FPGA開發&#xff0c;使用Deepseek V3還是R1&#xff08;2&#xff09;&#xff1a;V3和R1的區別 FPGA開發&#xff0c;使用Deepseek V3還是R1&#x…

實現 Leaflet 多類型點位標記與聚合功能的實戰經驗分享

在現代的地理信息系統&#xff08;GIS&#xff09;應用中&#xff0c;地圖功能是不可或缺的一部分。無論是展示商業網點、旅游景點還是公共服務設施&#xff0c;地圖都能以直觀的方式呈現數據。然而&#xff0c;當數據量較大時&#xff0c;地圖上可能會出現大量的標記點&#x…

企微審批中MySQL字段TEXT類型被截斷的排查與修復實踐

在MySQL中&#xff0c;TEXT類型字段常用于存儲較大的文本數據&#xff0c;但在一些應用場景中&#xff0c;當文本內容較大時&#xff0c;TEXT類型字段可能無法滿足需求&#xff0c;導致數據截斷或插入失敗。為了避免這種問題&#xff0c;了解不同文本類型&#xff08;如TEXT、M…

【常見BUG】Spring Boot 和 Springfox(Swagger)版本兼容問題

???歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學習,不斷總結,共同進步,活到老學到老…

HTTP 協議的發展歷程:從 HTTP/1.0 到 HTTP/2.0

HTTP 協議的發展歷程&#xff1a;從 HTTP/1.0 到 HTTP/2.0 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是 Web 的基礎協議&#xff0c;用于客戶端和服務器之間的通信。從 HTTP/1.0 到 HTTP/2.0&#xff0c;HTTP 協議經歷了多次重大改…

apload-lab打靶場

1.提示顯示所以關閉js 上傳<?php phpinfo(); ?>的png形式 抓包&#xff0c;將png改為php 然后放包上傳成功 2.提示說檢查數據類型 抓包 將數據類型改成 image/jpeg 上傳成功 3.提示 可以用phtml&#xff0c;php5&#xff0c;php3 4.先上傳.htaccess文件&#xff0…

金融支付行業技術側重點

1. 合規問題 第三方支付系統的平穩運營&#xff0c;嚴格遵循《非銀行支付機構監督管理條例》的各項條款是基礎與前提&#xff0c;其中第十八條的規定堪稱重中之重&#xff0c;是支付機構必須牢牢把握的關鍵準則。 第十八條明確指出&#xff0c;非銀行支付機構需構建起必要且獨…

Cherry Studio + 火山引擎 構建個人AI智能知識庫

&#x1f349;在信息化時代&#xff0c;個人知識庫的構建對于提高工作效率、知識管理和信息提取尤為重要。尤其是當這些知識庫能結合人工智能來智能化地整理、分類和管理數據時&#xff0c;效果更為顯著。我最近嘗試通過 Cherry Studio 和 火山引擎 來搭建個人智能知識庫&#…

LeetCode 2 - 兩數相加

LeetCode 2 - 兩數相加 是一道經典鏈表操作問題&#xff0c;經常作為面試中基礎題的變體被考察。掌握多種解法及其變體&#xff0c;并熟悉其核心思路和模板代碼&#xff0c;可以快速備戰相關鏈表或大數計算問題。 題目描述 給定兩個非空鏈表&#xff0c;它們代表兩個非負整數&…

Qt之QStateMachine等待

在項目中經常需要等待&#xff0c;我們模擬0-30的數&#xff0c;假如我們其中5&#xff0c; 25的數需要進行等待&#xff0c;等待用戶處理完自己事情后&#xff0c;按下按鈕繼續&#xff0c;找Qt的項目中有一個 QStateMachineqstatemmachine類提供了一個分層有限狀態機。 QSta…

elpis全棧課程學習之elpis-core學習總結

elpis全棧課程學習之elpis-core學習總結 核心原理 elpis-core是全棧框架elpis的服務端內核&#xff0c;主要應用于服務端接口的開發以及頁面的SSR渲染&#xff0c;elpis-core基于約定優于配置的原理&#xff0c;通過一系列的loader來加載對應的文件&#xff0c;大大節約用戶的…

ChatGPT與DeepSeek:開源與閉源的AI模型之爭

目錄 一、模型架構與技術原理 二、性能能力與應用場景 三、用戶體驗與部署靈活性 四、成本與商業模式 五、未來展望與市場影響 六、總結 隨著人工智能技術的飛速發展&#xff0c;ChatGPT和DeepSeek作為兩大領先的AI語言模型&#xff0c;成為了行業內外關注的焦點。它們在…

在筆記本電腦上用DeepSeek搭建個人知識庫

最近DeepSeek爆火&#xff0c;試用DeepSeek的企業和個人越來越多。最常見的應用場景就是知識庫和知識問答。所以本人也試用了一下&#xff0c;在筆記本電腦上部署DeepSeek并使用開源工具搭建一套知識庫&#xff0c;實現完全在本地環境下使用本地文檔搭建個人知識庫。操作過程共…

DeepSeek蒸餾TinyLSTM實操指南

一、硬件準備 階段推薦配置最低要求訓練階段NVIDIA A100 80GB 4RTX 3090 24GB 1量化階段Intel Xeon Gold 6248R CPUi7-12700K + 64GB RAM部署階段Jetson Xavier NX開發套件Raspberry Pi 4B 8GB二、軟件環境搭建 # 創建Python虛擬環境 conda create -n distil python=3.9 conda…

Linux ls 命令

Linux ls&#xff08;英文全拼&#xff1a; list directory contents&#xff09;命令用于顯示指定工作目錄下之內容&#xff08;列出目前工作目錄所含的文件及子目錄)。 語法 ls [-alrtAFR] [name...] 參數 : -a 顯示所有文件及目錄 (. 開頭的隱藏文件也會列出)-d 只列出目…

LeetCode 熱題 100 53. 最大子數組和

LeetCode 熱題 100 | 53. 最大子數組和 大家好&#xff0c;今天我們來解決一道經典的算法題——最大子數組和。這道題在 LeetCode 上被標記為中等難度&#xff0c;要求我們找出一個具有最大和的連續子數組&#xff0c;并返回其最大和。下面我將詳細講解解題思路&#xff0c;并…

【計算機網絡入門】初學計算機網絡(九)

目錄 1.令牌傳遞協議 2. 局域網&IEEE802 2.1 局域網基本概念和體系結構 3. 以太網&IEEE802.3 3.1 MAC層標準 3.1.1 以太網V2標準 ?編輯 3.2 單播廣播 3.3 沖突域廣播域 4. 虛擬局域網VLAN 1.令牌傳遞協議 先回顧一下令牌環網技術&#xff0c;多個主機形成…

Java 大視界 -- Java 大數據中的時間序列數據異常檢測算法對比與實踐(103)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

Android Activity棧關系解析

在 Android 系統中&#xff0c;這些類共同構成了 Activity 任務棧管理的核心架構。它們的關系可以類比為一棟大樓的管理體系&#xff0c;每個類負責不同層級的任務。以下是它們的詳細解釋和實際場景示例&#xff1a; 1. ActivityRecord&#xff08;活動記錄&#xff09; 是什么…

【0011】HTML其他文本格式化標簽詳解(em標簽、strong標簽、b標簽、i標簽、sup標簽、sub標簽......)

如果你覺得我的文章寫的不錯&#xff0c;請關注我喲&#xff0c;請點贊、評論&#xff0c;收藏此文章&#xff0c;謝謝&#xff01; 本文內容體系結構如下&#xff1a; 本文旨在深入探討HTML中其他的文本格式化標簽&#xff0c;主要有<em> 標簽、<strong> 標簽、…