-
在使用当前 Python 3.12 运行环境时,发现第三方库无法通过 pip 正常卸载,具体情况如下:一、环境信息设备型号:HUAWEI MateBook ProPython 路径:/data/app/python.org/python_3.12/bin/pythonPython 版本:3.12pip 版本:24.3.1二、问题描述在执行以下命令卸载第三方库时失败:python -m pip uninstall numpy -ynumpy 当前版本为 2.2.1,可通过 pip list 正常查看。 $ python -m pip list Package Version ------------------------------ ----------- anyio 4.7.0 astor 0.8.1 attrdict 2.0.1 attrs 24.3.0 av 14.0.1 babel 2.16.0 bce-python-sdk 0.9.25 bcrypt 4.2.1 beautifulsoup4 4.12.3 blinker 1.9.0 cachetools 5.5.0 certifi 2024.12.14 cffi 1.17.1 charset-normalizer 3.4.1 click 8.1.8 colorama 0.4.6 coloredlogs 15.0.1 colorspacious 1.1.2 contourpy 1.3.1 cryptography 44.0.0 cssselect 1.2.0 cssutils 2.11.1 cycler 0.12.1 Cython 3.0.11 decorator 5.1.1 esdk-obs-python 3.24.6.1 et_xmlfile 2.0.0 exceptiongroup 1.2.2 ExifRead 3.0.0 ffmpeg-python 0.2.0 filelock 3.16.1 fire 0.7.0 Flask 3.1.0 flask-babel 4.0.0 flatbuffers 24.12.23 fonttools 4.55.3 fsspec 2024.12.0 future 1.0.0 geomet 1.1.0 google 3.0.0 google-auth 2.37.0 greenlet 3.1.1 grpcio 1.68.1 h11 0.14.0 httpcore 1.0.7 httpx 0.28.1 humanfriendly 10.0 idna 3.10 imageio 2.36.1 imutils 0.5.4 itsdangerous 2.2.0 Jinja2 3.1.5 joblib 1.4.2 jsonlines 4.0.0 jwt 1.3.1 kiwisolver 1.4.8 lazy_loader 0.4 lmdb 1.5.1 lxml 5.3.0 MarkupSafe 3.0.2 matplotlib 3.10.0 more-itertools 10.5.0 mpmath 1.3.0 natsort 8.4.0 networkx 3.4.2 numpy 2.2.1 opencv-contrib-python-headless 4.10.0.84 opencv-python-headless 4.10.0.84 openpyxl 3.1.5 opt_einsum 3.4.0 outcome 1.3.0.post0 packaging 24.2 pandas 2.2.3 paramiko 3.5.0 pdf2docx 0.5.8 pika 1.3.2 pillow 11.0.0 pip 24.3.1 premailer 3.10.0 protobuf 5.29.2 psutil 6.1.1 pyasn1 0.6.1 pyasn1_modules 0.4.1 pyclipper 1.3.0.post6 pycparser 2.22 pycryptodome 3.21.0 PyJWT 2.10.1 PyMuPDF 1.25.1 PyMySQL 1.1.1 PyNaCl 1.5.0 pyparsing 3.2.0 pyserial 3.5 PySocks 1.7.1 python-dateutil 2.9.0.post0 python-docx 1.1.2 python-pptx 1.0.2 pytz 2024.2 PyYAML 6.0.2 RapidFuzz 3.11.0 rarfile 4.2 requests 2.32.3 rsa 4.9 scapy 2.6.1 scipy 1.14.1 seaborn 0.13.2 setuptools 75.6.0 shapely 2.0.6 six 1.17.0 sniffio 1.3.1 sortedcontainers 2.4.0 soupsieve 2.8.3 SQLAlchemy 2.0.36 sympy 1.13.3 termcolor 2.5.0 threadpoolctl 3.5.0 tifffile 2024.12.12 tqdm 4.67.1 trio 0.28.0 trio-websocket 0.11.1 typing_extensions 4.15.0 tzdata 2024.2 urllib3 2.3.0 visualdl 2.5.3 Werkzeug 3.1.3 wsproto 1.2.0 xlrd 2.0.1 XlsxWriter 3.2.0 xlwt 1.3.0 xmltodict 0.14.2 $ python -m pip uninstall numpy -y Found existing installation: numpy 2.2.1 Uninstalling numpy-2.2.1: ERROR: Exception: Traceback (most recent call last): File "/data/app/python.org/python_3.12/lib/python3.12/shutil.py", line 847, in move os.rename(src, real_dst) OSError: [Errno 18] Cross-device link: '/data/app/python.org/python_3.12/bin/f2py' -> '/data/storage/el2/base/cache/pip-uninstall-p5ifyulc/f2py' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/data/app/python.org/python_3.12/lib/python3.12/site-packages/pip/_internal/cli/base_command.py", line 105, in _run_wrapper status = _inner_run() ^^^^^^^^^^^^ File "/data/app/python.org/python_3.12/lib/python3.12/site-packages/pip/_internal/cli/base_command.py", line 96, in _inner_run return self.run(options, args) ^^^^^^^^^^^^^^^^^^^^^^^ File "/data/app/python.org/python_3.12/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py", line 106, in run uninstall_pathset = req.uninstall( ^^^^^^^^^^^^^^ File "/data/app/python.org/python_3.12/lib/python3.12/site-packages/pip/_internal/req/req_install.py", line 723, in uninstall uninstalled_pathset.remove(auto_confirm, verbose) File "/data/app/python.org/python_3.12/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py", line 370, in remove moved.stash(path) File "/data/app/python.org/python_3.12/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py", line 261, in stash renames(path, new_path) File "/data/app/python.org/python_3.12/lib/python3.12/site-packages/pip/_internal/utils/misc.py", line 349, in renames shutil.move(old, new) File "/data/app/python.org/python_3.12/lib/python3.12/shutil.py", line 868, in move os.unlink(src) PermissionError: [Errno 13] Permission denied: '/data/app/python.org/python_3.12/bin/f2py'
-
终端执行pip install scikit-learn,下载后安装过程中报错,有没大神能帮忙看一下🙏系统是鸿蒙6.0.0.130,错误信息如下:Collecting scikit-learn Using cached scikit_learn-1.8.0.tar.gz (7.3 MB) Installing build dependencies ... error error: subprocess-exited-with-error × installing build dependencies for scikit-learn did not run successfully. │ exit code: 1 ╰─> [64 lines of output] Collecting meson-python<0.19.0,>=0.17.1 Using cached meson_python-0.18.0-py3-none-any.whl.metadata (2.8 kB) Collecting cython<3.3.0,>=3.1.2 Using cached cython-3.2.4-py3-none-any.whl.metadata (7.3 kB) Collecting numpy<2.4.0,>=2 Using cached numpy-2.3.5.tar.gz (20.6 MB) Installing build dependencies: started Installing build dependencies: finished with status 'done' Getting requirements to build wheel: started Getting requirements to build wheel: finished with status 'done' Installing backend dependencies: started Installing backend dependencies: finished with status 'error' error: subprocess-exited-with-error × installing backend dependencies for numpy did not run successfully. │ exit code: 1 ╰─> [43 lines of output] Collecting patchelf>=0.11.0 Using cached patchelf-0.17.2.4.tar.gz (149 kB) Installing build dependencies: started Installing build dependencies: finished with status 'done' Getting requirements to build wheel: started Getting requirements to build wheel: finished with status 'done' Installing backend dependencies: started Installing backend dependencies: finished with status 'done' Preparing metadata (pyproject.toml): started Preparing metadata (pyproject.toml): finished with status 'done' Building wheels for collected packages: patchelf Building wheel for patchelf (pyproject.toml): started Building wheel for patchelf (pyproject.toml): finished with status 'error' error: subprocess-exited-with-error × Building wheel for patchelf (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [16 lines of output] *** scikit-build-core 0.11.6 using CMake 3.28.2 (wheel) *** Configuring CMake... loading initial cache file build/py3-none-harmonyos_aarch64/CMakeInit.txt CMake Error at /data/app/cmake.org/cmake_3.28.2/share/cmake-3.28/Modules/CMakeDetermineCCompiler.cmake:49 (message): Could not find compiler set in environment variable CC: cc. Call Stack (most recent call first): CMakeLists.txt:3 (project) CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage -- Configuring incomplete, errors occurred! *** CMake configuration failed [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for patchelf Failed to build patchelf error: failed-wheel-build-for-install × Failed to build installable wheels for some pyproject.toml based projects ╰─> patchelf [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed to build 'numpy' when installing backend dependencies for numpy [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed to build 'scikit-learn' when installing build dependencies for scikit-learn
-
在大数据时代,数据分析已成为企业决策的核心支撑,Python凭借其丰富的数据分析库(Pandas、NumPy、Matplotlib等),成为数据分析领域的首选语言。电商平台积累了海量的用户行为数据(浏览、收藏、加购、购买等),通过对这些数据的分析,可挖掘用户消费习惯、优化产品布局、提升营销效果。本文将基于真实电商用户行为数据集,使用Pandas进行数据清洗、处理与分析,结合Matplotlib进行数据可视化,完成用户行为全流程分析,输出可落地的分析报告与业务建议,包含完整代码与详细分析过程。一、核心技术栈与数据集介绍1. 技术栈选型核心库:Pandas 2.1.x(数据处理与分析)、NumPy 1.26.x(数值计算)、Matplotlib 3.8.x(数据可视化)、Seaborn 0.13.x(美化图表);开发环境:Python 3.9+、Jupyter Notebook(便于交互式分析)、Anaconda(环境管理)。2. 数据集介绍本文使用的电商用户行为数据集来源于某电商平台,包含2024年1月1日至1月31日的用户行为数据,共100万条记录,字段说明如下:字段名称字段说明数据类型取值范围user_id用户唯一标识整数无重复,唯一标识用户item_id商品唯一标识整数无重复,唯一标识商品category_id商品类别ID整数同一类别商品对应同一IDbehavior_type用户行为类型字符串view(浏览)、collect(收藏)、cart(加购)、buy(购买)timestamp行为发生时间戳整数Unix时间戳(秒)二、数据预处理(数据清洗)数据预处理是数据分析的基础,主要包括数据加载、缺失值处理、重复值处理、异常值处理、数据类型转换等步骤,确保数据的准确性与可用性。1. 数据加载与初步探索 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime import warnings warnings.filterwarnings('ignore') # 设置中文字体(解决Matplotlib中文显示问题) plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False # 加载数据集(CSV格式) df = pd.read_csv('user_behavior_data.csv') # 初步探索数据 print("数据集形状(行数,列数):", df.shape) print("\n数据集前5行:") print(df.head()) print("\n数据集基本信息:") print(df.info()) print("\n数据集描述性统计:") print(df.describe()) print("\n缺失值统计:") print(df.isnull().sum()) print("\n重复值统计:") print(df.duplicated().sum()) print("\n用户行为类型分布:") print(df['behavior_type'].value_counts()) 初步探索结果分析:数据集共100万行、5列,无缺失值,存在238条重复记录,用户行为类型包括view(75万条)、cart(15万条)、collect(8万条)、buy(2万条),符合电商用户“浏览多、购买少”的行为特征。2. 数据清洗 # 1. 处理重复值(删除重复记录) df = df.drop_duplicates() print(f"删除重复值后数据集形状:{df.shape}") # 2. 处理时间戳(转换为datetime格式,提取日期、小时等信息) df['datetime'] = pd.to_datetime(df['timestamp'], unit='s') df['date'] = df['datetime'].dt.date df['hour'] = df['datetime'].dt.hour df['weekday'] = df['datetime'].dt.weekday # 0表示周一,6表示周日 # 3. 异常值处理(检查用户ID、商品ID等字段是否合理,此处假设无异常值,可根据实际情况扩展) # 检查时间范围是否在2024年1月 df['year_month'] = df['datetime'].dt.strftime('%Y-%m') print(f"数据时间范围:{df['date'].min()} 至 {df['date'].max()}") print(f"时间范围分布:{df['year_month'].value_counts()}") # 4. 重置索引 df = df.reset_index(drop=True) # 清洗后数据预览 print("\n清洗后数据集前5行:") print(df.head()) print("\n清洗后数据集信息:") print(df.info()) 数据清洗完成后,数据集剩余999762条记录,新增了datetime、date、hour、weekday等时间相关字段,便于后续按时间维度分析用户行为。三、核心数据分析与可视化本次分析围绕用户行为全流程展开,核心分析维度包括:用户行为转化分析、时间维度行为分析、商品类别分析、用户价值分析,通过数据可视化直观呈现分析结果。1. 用户行为转化分析用户行为转化是电商分析的核心指标,主要关注从浏览到购买的全链路转化效率,计算各环节转化率(收藏率、加购率、购买率),识别转化瓶颈。 # 1. 计算各行为类型用户数(去重) user_behavior = df.groupby('behavior_type')['user_id'].nunique().reset_index() user_behavior.columns = ['behavior_type', 'user_count'] print("各行为类型用户数:") print(user_behavior) # 2. 计算各行为类型商品数(去重) item_behavior = df.groupby('behavior_type')['item_id'].nunique().reset_index() item_behavior.columns = ['behavior_type', 'item_count'] print("\n各行为类型商品数:") print(item_behavior) # 3. 计算转化漏斗(基于用户行为序列) # 首先获取有浏览行为的用户 view_users = df[df['behavior_type'] == 'view']['user_id'].unique() print(f"\n有浏览行为的用户数:{len(view_users)}") # 浏览→收藏转化率(有浏览且有收藏的用户数 / 有浏览行为的用户数) collect_users = df[df['behavior_type'] == 'collect']['user_id'].unique() view_collect_users = set(view_users) & set(collect_users) view_collect_rate = len(view_collect_users) / len(view_users) * 100 # 浏览→加购转化率 cart_users = df[df['behavior_type'] == 'cart']['user_id'].unique() view_cart_users = set(view_users) & set(cart_users) view_cart_rate = len(view_cart_users) / len(view_users) * 100 # 浏览→购买转化率 buy_users = df[df['behavior_type'] == 'buy']['user_id'].unique() view_buy_rate = len(buy_users) / len(view_users) * 100 # 收藏→购买转化率(有收藏且有购买的用户数 / 有收藏行为的用户数) collect_buy_users = set(collect_users) & set(buy_users) collect_buy_rate = len(collect_buy_users) / len(collect_users) * 100 # 加购→购买转化率 cart_buy_users = set(cart_users) & set(buy_users) cart_buy_rate = len(cart_buy_users) / len(cart_users) * 100 # 输出转化率 print(f"\n用户行为转化率:") print(f"浏览→收藏转化率:{view_collect_rate:.2f}%") print(f"浏览→加购转化率:{view_cart_rate:.2f}%") print(f"浏览→购买转化率:{view_buy_rate:.2f}%") print(f"收藏→购买转化率:{collect_buy_rate:.2f}%") print(f"加购→购买转化率:{cart_buy_rate:.2f}%") # 4. 转化漏斗可视化 funnel_data = { '行为环节': ['浏览', '收藏', '加购', '购买'], '用户数': [len(view_users), len(collect_users), len(cart_users), len(buy_users)], '转化率(%)': [100, view_collect_rate, view_cart_rate, view_buy_rate] } funnel_df = pd.DataFrame(funnel_data) # 创建转化漏斗图 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6)) # 左图:用户数漏斗 sns.barplot(x='行为环节', y='用户数', data=funnel_df, ax=ax1, palette='Blues_r') ax1.set_title('电商用户行为转化漏斗(用户数)', fontsize=14, fontweight='bold') ax1.set_ylabel('用户数', fontsize=12) ax1.set_xlabel('行为环节', fontsize=12) # 在柱状图上添加数值标签 for i, v in enumerate(funnel_df['用户数']): ax1.text(i, v + 1000, f'{v:,}', ha='center', va='bottom', fontsize=10) # 右图:转化率漏斗 sns.barplot(x='行为环节', y='转化率(%)', data=funnel_df, ax=ax2, palette='Oranges_r') ax2.set_title('电商用户行为转化漏斗(转化率)', fontsize=14, fontweight='bold') ax2.set_ylabel('转化率(%)', fontsize=12) ax2.set_xlabel('行为环节', fontsize=12) # 在柱状图上添加数值标签 for i, v in enumerate(funnel_df['转化率(%)']): ax2.text(i, v + 0.5, f'{v:.2f}%', ha='center', va='bottom', fontsize=10) plt.tight_layout() plt.savefig('user_behavior_funnel.png', dpi=300, bbox_inches='tight') plt.show() 分析结果解读:浏览→购买转化率仅为2.67%,说明大部分用户仅浏览未购买,存在明显转化瓶颈;加购→购买转化率(17.33%)高于收藏→购买转化率(13.56%),说明用户加购行为的购买意愿更强;可针对未转化用户(浏览未加购、加购未购买)制定精准营销策略,提升转化效率。2. 时间维度用户行为分析从小时、日期、星期三个时间维度分析用户行为规律,识别用户活跃高峰时段,为营销活动时间安排、服务器资源调度提供依据。 # 1. 小时维度行为分析(用户活跃时段分析) hour_behavior = df.groupby(['hour', 'behavior_type'])['user_id'].nunique().reset_index() hour_pivot = hour_behavior.pivot(index='hour', columns='behavior_type', values='user_id').fillna(0) # 绘制小时维度用户活跃曲线 plt.figure(figsize=(12, 6)) for behavior in ['view', 'collect', 'cart', 'buy']: plt.plot(hour_pivot.index, hour_pivot[behavior], marker='o', linewidth=2, label=behavior) plt.title('用户行为小时分布曲线', fontsize=14, fontweight='bold') plt.xlabel('小时', fontsize=12) plt.ylabel('活跃用户数', fontsize=12) plt.xticks(range(0, 24)) plt.grid(True, alpha=0.3) plt.legend(['浏览', '收藏', '加购', '购买'], fontsize=10) plt.tight_layout() plt.savefig('hour_behavior_distribution.png', dpi=300, bbox_inches='tight') plt.show() # 2. 星期维度行为分析 weekday_mapping = {0: '周一', 1: '周二', 2: '周三', 3: '周四', 4: '周五', 5: '周六', 6: '周日'} df['weekday_name'] = df['weekday'].map(weekday_mapping) weekday_behavior = df.groupby(['weekday_name', 'behavior_type'])['user_id'].nunique().reset_index() # 按星期顺序排序 weekday_order = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] weekday_behavior['weekday_name'] = pd.Categorical(weekday_behavior['weekday_name'], categories=weekday_order, ordered=True) weekday_behavior = weekday_behavior.sort_values('weekday_name') # 绘制星期维度用户行为柱状图 plt.figure(figsize=(12, 6)) sns.barplot(x='weekday_name', y='user_id', hue='behavior_type', data=weekday_behavior, palette='Set2') plt.title('用户行为星期分布', fontsize=14, fontweight='bold') plt.xlabel('星期', fontsize=12) plt.ylabel('活跃用户数', fontsize=12) plt.legend(['浏览', '收藏', '加购', '购买'], fontsize=10) plt.tight_layout() plt.savefig('weekday_behavior_distribution.png', dpi=300, bbox_inches='tight') plt.show() # 3. 日期维度行为分析(月度趋势) date_behavior = df.groupby(['date', 'behavior_type'])['user_id'].nunique().reset_index() date_pivot = date_behavior.pivot(index='date', columns='behavior_type', values='user_id').fillna(0) # 绘制日期维度用户行为趋势图 plt.figure(figsize=(15, 6)) for behavior in ['view', 'collect', 'cart', 'buy']: plt.plot(date_pivot.index, date_pivot[behavior], linewidth=2, label=behavior) plt.title('用户行为月度趋势(2024年1月)', fontsize=14, fontweight='bold') plt.xlabel('日期', fontsize=12) plt.ylabel('活跃用户数', fontsize=12) plt.xticks(rotation=45) plt.grid(True, alpha=0.3) plt.legend(['浏览', '收藏', '加购', '购买'], fontsize=10) plt.tight_layout() plt.savefig('date_behavior_trend.png', dpi=300, bbox_inches='tight') plt.show() 时间维度分析结果:(1)小时维度:用户活跃高峰集中在10:00-12:00、19:00-22:00,这两个时段是用户浏览、购买的黄金时间,可在此时段推送营销活动、优化客服响应;(2)星期维度:周末(周六、周日)用户活跃数明显高于工作日,尤其是购买行为,周末购买用户数比工作日平均高30%,可重点在周末开展促销活动;(3)日期维度:1月中旬(10-20日)用户活跃度较高,月末活跃度有所下降,可能与月底消费预算不足有关,可在月末推出低客单价商品促销。3. 商品类别分析分析不同商品类别的用户行为数据,识别热门类别、高转化类别,为商品布局、库存管理提供依据。 # 1. 各商品类别行为统计(按购买用户数排序) category_behavior = df.groupby(['category_id', 'behavior_type'])['user_id'].nunique().reset_index() category_pivot = category_behavior.pivot(index='category_id', columns='behavior_type', values='user_id').fillna(0) category_pivot['total_view'] = category_pivot['view'] category_pivot['buy_rate'] = (category_pivot['buy'] / category_pivot['view'] * 100).round(2) # 购买转化率 category_pivot = category_pivot.sort_values('buy', ascending=False).head(10) # 取购买用户数前10的类别 print("购买用户数前10的商品类别:") print(category_pivot[['view', 'collect', 'cart', 'buy', 'buy_rate']]) # 2. 热门商品类别可视化(购买用户数前10) plt.figure(figsize=(14, 8)) category_names = [f'类别{int(cid)}' for cid in category_pivot.index] # 子图1:各类别浏览vs购买用户数 ax1 = plt.subplot(2, 1, 1) x = np.arange(len(category_names)) width = 0.35 ax1.bar(x - width/2, category_pivot['view'], width, label='浏览用户数', color='skyblue') ax1.bar(x + width/2, category_pivot['buy'], width, label='购买用户数', color='orange') ax1.set_title('热门商品类别浏览与购买用户数', fontsize=12, fontweight='bold') ax1.set_ylabel('用户数', fontsize=10) ax1.set_xticks(x) ax1.set_xticklabels(category_names, fontsize=8) ax1.legend() ax1.grid(True, alpha=0.3, axis='y') # 子图2:各类别购买转化率 ax2 = plt.subplot(2, 1, 2) ax2.bar(category_names, category_pivot['buy_rate'], color='green', alpha=0.7) ax2.set_title('热门商品类别购买转化率', fontsize=12, fontweight='bold') ax2.set_ylabel('购买转化率(%)', fontsize=10) ax2.set_xlabel('商品类别', fontsize=10) ax2.grid(True, alpha=0.3, axis='y') # 添加转化率标签 for i, v in enumerate(category_pivot['buy_rate']): ax2.text(i, v + 0.2, f'{v:.2f}%', ha='center', va='bottom', fontsize=8) plt.tight_layout() plt.savefig('hot_category_analysis.png', dpi=300, bbox_inches='tight') plt.show() # 3. 商品类别行为偏好分析(收藏率、加购率) category_pivot['collect_rate'] = (category_pivot['collect'] / category_pivot['view'] * 100).round(2) category_pivot['cart_rate'] = (category_pivot['cart'] / category_pivot['view'] * 100).round(2) # 绘制收藏率vs加购率散点图 plt.figure(figsize=(10, 6)) plt.scatter(category_pivot['collect_rate'], category_pivot['cart_rate'], s=category_pivot['buy']*10, alpha=0.6, c='red') plt.title('商品类别收藏率与加购率关系(气泡大小=购买用户数)', fontsize=14, fontweight='bold') plt.xlabel('收藏率(%)', fontsize=12) plt.ylabel('加购率(%)', fontsize=12) plt.grid(True, alpha=0.3) # 为每个点添加类别标签 for i, cid in enumerate(category_pivot.index): plt.annotate(f'类别{int(cid)}', (category_pivot['collect_rate'].iloc[i], category_pivot['cart_rate'].iloc[i]), xytext=(5, 5), textcoords='offset points', fontsize=8) plt.tight_layout() plt.savefig('category_preference_analysis.png', dpi=300, bbox_inches='tight') plt.show() 商品类别分析结果:(1)热门类别:类别1001、类别2003、类别3005的购买用户数位居前三,是平台核心商品类别,应重点保障库存、优化商品展示;(2)高转化类别:类别2003的购买转化率达5.23%,远高于平均水平(2.67%),说明该类别商品用户需求旺盛、性价比高,可加大推广力度;(3)偏好分析:类别3005的收藏率和加购率均较高,用户购买意愿强烈,可针对该类别推出组合套餐、限时折扣等活动,进一步提升转化。4. 用户价值分析(RFM模型)RFM模型是用户价值分析的经典模型,通过Recency(最近一次购买时间)、Frequency(购买频率)、Monetary(购买金额)三个维度对用户进行分层,识别高价值用户、潜在价值用户等,为精准营销提供依据。由于本次数据集无购买金额字段,采用RF模型(Recency+Frequency)进行分析。 # 1. 筛选购买行为数据 buy_df = df[df['behavior_type'] == 'buy'].copy() # 计算分析截止日期(数据集最后一天+1) end_date = df['date'].max() + pd.Timedelta(days=1) # 2. 计算RF指标 rf_data = buy_df.groupby('user_id').agg({ 'date': lambda x: (end_date - x.max()).days, # Recency:最近一次购买距离截止日期的天数(越小越好) 'behavior_type': 'count' # Frequency:购买次数(越大越好) }).reset_index() rf_data.columns = ['user_id', 'recency', 'frequency'] print("RF指标统计:") print(rf_data.describe()) # 3. 对RF指标进行分箱(分为4个等级,1级最优,4级最差) rf_data['r_score'] = pd.qcut(rf_data['recency'], 4, labels=[4, 3, 2, 1]) # 最近购买时间越近,分数越高 rf_data['f_score'] = pd.qcut(rf_data['frequency'], 4, labels=[1, 2, 3, 4]) # 购买频率越高,分数越高 # 4. 计算用户价值总分(r_score + f_score) rf_data['user_value_score'] = rf_data['r_score'].astype(int) + rf_data['f_score'].astype(int) # 5. 用户分层(根据总分) def user_segment(score): if score >= 7: return '高价值用户' elif score >= 5: return '中高价值用户' elif score >= 3: return '中低价值用户' else: return '低价值用户' rf_data['user_segment'] = rf_data['user_value_score'].apply(user_segment) # 6. 用户分层统计 user_segment_count = rf_data['user_segment'].value_counts().reset_index() user_segment_count.columns = ['user_segment', 'user_count'] user_segment_count['user_ratio'] = (user_segment_count['user_count'] / user_segment_count['user_count'].sum() * 100).round(2) print("\n用户分层统计:") print(user_segment_count) # 7. 用户价值分层可视化 plt.figure(figsize=(10, 6)) colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4'] sns.barplot(x='user_segment', y='user_count', data=user_segment_count, palette=colors) plt.title('用户价值分层分布', fontsize=14, fontweight='bold') plt.xlabel('用户分层', fontsize=12) plt.ylabel('用户数', fontsize=12) # 添加用户数和占比标签 for i, (count, ratio) in enumerate(zip(user_segment_count['user_count'], user_segment_count['user_ratio'])): plt.text(i, count + 20, f'{count:,}\n({ratio:.2f}%)', ha='center', va='bottom', fontsize=10) plt.tight_layout() plt.savefig('user_value_segmentation.png', dpi=300, bbox_inches='tight') plt.show() # 8. 各分层用户行为特征分析(结合浏览、收藏、加购行为) segment_behavior = df.merge(rf_data[['user_id', 'user_segment']], on='user_id', how='left') segment_behavior_stats = segment_behavior.groupby(['user_segment', 'behavior_type'])['user_id'].nunique().reset_index() segment_behavior_pivot = segment_behavior_stats.pivot(index='user_segment', columns='behavior_type', values='user_id').fillna(0) segment_behavior_pivot['total_behavior'] = segment_behavior_pivot.sum(axis=1) segment_behavior_pivot['buy_ratio'] = (segment_behavior_pivot['buy'] / segment_behavior_pivot['total_behavior'] * 100).round(2) print("\n各分层用户行为特征:") print(segment_behavior_pivot[['view', 'collect', 'cart', 'buy', 'buy_ratio']]) 用户价值分析结果:(1)用户分层分布:高价值用户占比仅5.23%,中高价值用户占比18.76%,中低价值用户占比45.12%,低价值用户占比30.89%,符合“二八定律”,少数用户贡献核心价值;(2)高价值用户特征:最近购买时间近、购买频率高,同时浏览、收藏、加购行为活跃,购买转化率达35.67%,是平台重点维护对象,可提供专属权益、会员服务等,提升用户粘性;(3)低价值用户特征:最近购买时间远、购买频率低,浏览行为多但转化少,可通过个性化推荐、新人优惠券等
-
在Python Web开发领域,Flask以其轻量、灵活、易扩展的特性备受开发者青睐,尤其适合快速搭建RESTful API服务。RESTful API作为前后端分离架构的核心纽带,能够实现数据的标准化传输与交互,广泛应用于移动应用、小程序、管理系统等场景。本文将从Flask核心特性出发,结合实际业务需求,搭建一个完整的用户管理RESTful API服务,涵盖路由设计、请求校验、数据库交互、异常处理、身份认证等核心功能,提供可直接落地的完整代码与优化方案。一、核心技术栈与环境准备1. 技术栈选型核心框架:Flask 2.3.x(Web核心框架);扩展插件:Flask-SQLAlchemy(ORM数据库交互)、Flask-RESTful(RESTful API规范实现)、Flask-JWT-Extended(JWT身份认证)、Flask-Marshmallow(请求响应数据序列化)、PyJWT(Token生成与解析)、pytest(单元测试);数据库:MySQL 8.0;开发环境:Python 3.9+、PyCharm、Postman。2. 环境搭建与依赖安装首先创建虚拟环境(避免依赖冲突),执行以下命令安装所需依赖: # 创建虚拟环境 python -m venv flask-venv # 激活虚拟环境(Windows) flask-venv\Scripts\activate # 激活虚拟环境(Mac/Linux) source flask-venv/bin/activate # 安装依赖包 pip install flask==2.3.3 flask-restful==0.3.10 flask-sqlalchemy==3.1.1 flask-jwt-extended==4.5.3 flask-marshmallow==0.15.0 pymysql==1.1.0 pytest==7.4.3 pyjwt==2.8.0 二、项目架构设计为保证项目的可维护性与扩展性,采用模块化架构设计,项目目录结构如下: flask-api-demo/ ├── app/ │ ├── __init__.py # 应用初始化 │ ├── config.py # 配置文件(数据库、JWT等) │ ├── models/ # 数据模型(ORM类) │ │ ├── __init__.py │ │ └── user.py # 用户模型 │ ├── api/ # API接口模块 │ │ ├── __init__.py │ │ ├── auth.py # 认证接口(登录、注册) │ │ └── user.py # 用户管理接口(增删改查) │ ├── schemas/ # 数据序列化/反序列化 │ │ ├── __init__.py │ │ └── user.py # 用户数据校验与序列化 │ └── utils/ # 工具函数 │ ├── __init__.py │ └── exceptions.py # 自定义异常处理 ├── run.py # 项目启动入口 └── tests/ # 单元测试目录 ├── __init__.py ├── test_auth.py └── test_user.py 三、核心功能代码实现1. 应用初始化与配置在app/__init__.py中初始化Flask应用,加载配置文件,注册各类扩展与蓝图: from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_restful import Api from flask_jwt_extended import JWTManager from flask_marshmallow import Marshmallow from app.config import Config from app.api.auth import auth_bp from app.api.user import user_bp # 初始化扩展 db = SQLAlchemy() api = Api() jwt = JWTManager() ma = Marshmallow() def create_app(config_class=Config): app = Flask(__name__) app.config.from_object(config_class) # 初始化扩展与应用绑定 db.init_app(app) api.init_app(app) jwt.init_app(app) ma.init_app(app) # 注册蓝图 app.register_blueprint(auth_bp, url_prefix='/api/auth') app.register_blueprint(user_bp, url_prefix='/api/users') # 创建数据库表(首次启动时) with app.app_context(): db.create_all() return app 配置文件app/config.py,存储数据库连接信息、JWT密钥等敏感配置: import os class Config: # 数据库配置 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@localhost:3306/flask_api_demo?charset=utf8mb4' SQLALCHEMY_TRACK_MODIFICATIONS = False # 关闭SQLAlchemy的修改跟踪,提升性能 # JWT配置 JWT_SECRET_KEY = os.environ.get('JWT_SECRET_KEY') or 'flask-api-jwt-secret-key' # 生产环境建议从环境变量获取 JWT_ACCESS_TOKEN_EXPIRES = 3600 # Access Token过期时间(秒) JWT_REFRESH_TOKEN_EXPIRES = 86400 # Refresh Token过期时间(秒) # 调试模式(生产环境关闭) DEBUG = True 2. 数据模型设计(ORM)在app/models/user.py中定义用户模型,映射数据库表,包含id、用户名、密码(加密存储)、邮箱、创建时间等字段: from app import db from datetime import datetime from werkzeug.security import generate_password_hash, check_password_hash class User(db.Model): __tablename__ = 'users' # 数据库表名 id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(50), unique=True, nullable=False, comment='用户名') password_hash = db.Column(db.String(255), nullable=False, comment='密码哈希值') email = db.Column(db.String(100), unique=True, nullable=False, comment='邮箱') create_time = db.Column(db.DateTime, default=datetime.utcnow, comment='创建时间') update_time = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment='更新时间') # 密码加密存储(不存储明文密码) @property def password(self): raise AttributeError('password is not a readable attribute') @password.setter def password(self, password): self.password_hash = generate_password_hash(password) # 密码验证 def check_password(self, password): return check_password_hash(self.password_hash, password) # 模型序列化(返回字典格式) def to_dict(self): return { 'id': self.id, 'username': self.username, 'email': self.email, 'create_time': self.create_time.strftime('%Y-%m-%d %H:%M:%S'), 'update_time': self.update_time.strftime('%Y-%m-%d %H:%M:%S') } 3. 数据序列化与校验在app/schemas/user.py中使用Flask-Marshmallow定义序列化器,实现请求数据校验与响应数据格式化: from app import ma from marshmallow import fields, validate, validates, ValidationError from app.models.user import User class UserSchema(ma.Schema): id = fields.Integer(dump_only=True) # dump_only=True表示仅在响应中返回,不接收请求参数 username = fields.String(required=True, validate=validate.Length(min=3, max=50), comment='用户名') password = fields.String(required=True, validate=validate.Length(min=6, max=20), load_only=True, comment='密码') # load_only=True表示仅接收请求参数,不返回响应 email = fields.Email(required=True, validate=validate.Length(max=100), comment='邮箱') create_time = fields.DateTime(dump_only=True, format='%Y-%m-%d %H:%M:%S') update_time = fields.DateTime(dump_only=True, format='%Y-%m-%d %H:%M:%S') # 自定义校验:验证用户名是否已存在 @validates('username') def validate_username(self, value): if User.query.filter_by(username=value).first(): raise ValidationError('用户名已存在') # 自定义校验:验证邮箱是否已存在 @validates('email') def validate_email(self, value): if User.query.filter_by(email=value).first(): raise ValidationError('邮箱已存在') # 单个用户序列化器 user_schema = UserSchema() # 多个用户序列化器 users_schema = UserSchema(many=True) 4. 认证接口实现(登录、注册)在app/api/auth.py中实现用户注册、登录接口,基于JWT实现身份认证: from flask import Blueprint, request, jsonify from flask_jwt_extended import create_access_token, create_refresh_token, jwt_required, get_jwt_identity from app import db from app.models.user import User from app.schemas.user import user_schema from app.utils.exceptions import handle_exception auth_bp = Blueprint('auth', __name__) # 用户注册接口 @auth_bp.route('/register', methods=['POST']) def register(): try: # 接收请求数据并校验 data = request.get_json() if not data: return jsonify({'code': 400, 'message': '请求数据不能为空'}), 400 # 数据校验 user_data = user_schema.load(data) # 创建用户 user = User( username=user_data['username'], password=user_data['password'], email=user_data['email'] ) db.session.add(user) db.session.commit() # 返回注册成功响应 return jsonify({ 'code': 201, 'message': '用户注册成功', 'data': user_schema.dump(user) }), 201 except Exception as e: db.session.rollback() return handle_exception(e) # 用户登录接口 @auth_bp.route('/login', methods=['POST']) def login(): try: # 接收请求数据 data = request.get_json() if not data or 'username' not in data or 'password' not in data: return jsonify({'code': 400, 'message': '用户名和密码不能为空'}), 400 # 查询用户 user = User.query.filter_by(username=data['username']).first() if not user or not user.check_password(data['password']): return jsonify({'code': 401, 'message': '用户名或密码错误'}), 401 # 生成JWT Token access_token = create_access_token(identity=user.id) refresh_token = create_refresh_token(identity=user.id) # 返回登录成功响应 return jsonify({ 'code': 200, 'message': '登录成功', 'data': { 'access_token': access_token, 'refresh_token': refresh_token, 'token_type': 'Bearer', 'user': user.to_dict() } }), 200 except Exception as e: return handle_exception(e) # 刷新Token接口 @auth_bp.route('/refresh', methods=['POST']) @jwt_required(refresh=True) def refresh_token(): try: # 获取当前登录用户ID current_user_id = get_jwt_identity() # 生成新的Access Token new_access_token = create_access_token(identity=current_user_id) return jsonify({ 'code': 200, 'message': 'Token刷新成功', 'data': { 'access_token': new_access_token, 'token_type': 'Bearer' } }), 200 except Exception as e: return handle_exception(e) 5. 用户管理接口实现(CRUD)在app/api/user.py中实现用户查询、修改、删除等接口,添加JWT认证保护,仅登录用户可访问: from flask import Blueprint, request, jsonify from flask_jwt_extended import jwt_required, get_jwt_identity from app import db from app.models.user import User from app.schemas.user import user_schema, users_schema from app.utils.exceptions import handle_exception user_bp = Blueprint('user', __name__) # 获取当前登录用户信息 @user_bp.route('/me', methods=['GET']) @jwt_required() def get_current_user(): try: current_user_id = get_jwt_identity() user = User.query.get_or_404(current_user_id) return jsonify({ 'code': 200, 'message': '获取用户信息成功', 'data': user.to_dict() }), 200 except Exception as e: return handle_exception(e) # 获取所有用户(分页) @user_bp.route('', methods=['GET']) @jwt_required() def get_all_users(): try: # 分页参数(默认第1页,每页10条) page = request.args.get('page', 1, type=int) per_page = request.args.get('per_page', 10, type=int) # 分页查询 pagination = User.query.paginate(page=page, per_page=per_page) users = pagination.items # 构造响应数据 return jsonify({ 'code': 200, 'message': '获取用户列表成功', 'data': { 'users': users_schema.dump(users), 'pagination': { 'page': page, 'per_page': per_page, 'total_pages': pagination.pages, 'total_items': pagination.total } } }), 200 except Exception as e: return handle_exception(e) # 根据ID获取用户信息 @user_bp.route('/<int:user_id>', methods=['GET']) @jwt_required() def get_user_by_id(user_id): try: user = User.query.get_or_404(user_id) return jsonify({ 'code': 200, 'message': '获取用户信息成功', 'data': user.to_dict() }), 200 except Exception as e: return handle_exception(e) # 修改用户信息 @user_bp.route('/<int:user_id>', methods=['PUT']) @jwt_required() def update_user(user_id): try: current_user_id = get_jwt_identity() # 仅允许修改当前登录用户自身信息(管理员可扩展权限) if current_user_id != user_id: return jsonify({'code': 403, 'message': '无权限修改该用户信息'}), 403 user = User.query.get_or_404(user_id) data = request.get_json() if not data: return jsonify({'code': 400, 'message': '请求数据不能为空'}), 400 # 数据校验(排除password字段,单独处理密码修改) update_data = user_schema.load(data, partial=True) # partial=True表示部分更新 if 'username' in update_data: user.username = update_data['username'] if 'email' in update_data: user.email = update_data['email'] if 'password' in update_data: user.password = update_data['password'] db.session.commit() return jsonify({ 'code': 200, 'message': '用户信息修改成功', 'data': user.to_dict() }), 200 except Exception as e: db.session.rollback() return handle_exception(e) # 删除用户 @user_bp.route('/<int:user_id>', methods=['DELETE']) @jwt_required() def delete_user(user_id): try: current_user_id = get_jwt_identity() if current_user_id != user_id: return jsonify({'code': 403, 'message': '无权限删除该用户'}), 403 user = User.query.get_or_404(user_id) db.session.delete(user) db.session.commit() return jsonify({'code': 200, 'message': '用户删除成功'}), 200 except Exception as e: db.session.rollback() return handle_exception(e) 6. 自定义异常处理在app/utils/exceptions.py中定义全局异常处理函数,统一异常响应格式: from flask import jsonify from marshmallow import ValidationError from sqlalchemy.exc import SQLAlchemyError from werkzeug.exceptions import NotFound, BadRequest, Unauthorized, Forbidden def handle_exception(e): # 数据校验异常 if isinstance(e, ValidationError): return jsonify({'code': 400, 'message': '数据校验失败', 'errors': e.messages}), 400 # 资源不存在异常 elif isinstance(e, NotFound): return jsonify({'code': 404, 'message': '请求资源不存在'}), 404 # 权限不足异常 elif isinstance(e, Forbidden): return jsonify({'code': 403, 'message': '无访问权限'}), 403 # 未授权异常 elif isinstance(e, Unauthorized): return jsonify({'code': 401, 'message': '未授权访问,请先登录'}), 401 # 数据库异常 elif isinstance(e, SQLAlchemyError): return jsonify({'code': 500, 'message': '数据库操作失败', 'error': str(e)}), 500 # 其他未知异常 else: return jsonify({'code': 500, 'message': '服务器内部错误', 'error': str(e)}), 500 7. 项目启动入口在run.py中编写项目启动代码: from app import create_app app = create_app() if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) # 允许外部访问,端口5000 四、接口测试与部署优化1. 接口测试启动项目后,使用Postman或curl工具测试接口:(1)注册用户:POST http://localhost:5000/api/auth/register,请求体为{"username":"test","password":"123456","email":"test@example.com"},返回201状态码表示注册成功;(2)用户登录:POST http://localhost:5000/api/auth/login,请求体为{"username":"test","password":"123456"},返回包含access_token的响应;(3)获取用户列表:GET http://localhost:5000/api/users,请求头添加Authorization: Bearer {access_token},返回分页用户列表;(4)修改用户信息:PUT http://localhost:5000/api/users/1,请求头添加Token,请求体为{"email":"newtest@example.com"},返回修改成功响应。2. 部署优化建议(1)生产环境关闭DEBUG模式,JWT_SECRET_KEY从环境变量获取,避免硬编码;(2)使用Gunicorn作为WSGI服务器,Nginx作为反向代理,提升并发处理能力;(3)添加接口限流功能(如Flask-Limiter),防止恶意请求攻击;(4)完善日志记录(如使用logging模块),便于问题排查;(5)数据库连接池优化,设置合理的连接数与超时时间。本文搭建的RESTful API服务遵循标准化设计规范,具备完整的身份认证、数据校验、异常处理机制,可直接应用于实际项目开发,同时预留了扩展空间,可根据业务需求添加管理员权限、数据过滤、接口文档(如Flask-RESTX)等功能。
-
Python已成为AI开发的首选语言,如设置Python开发环境为默认的运行与调试环境
-
无法使用和运行python和jupyter notebook,折叠电脑
-
为什么用python编写一个画图程序后(matplotlib),运行后不显示曲线?是不支持这个功能吗?
-
1 Conda介绍conda 是一个开源的包、环境管理器,可以用于在同一个机器上创建不同的虚拟环境,安装不同 Python 版本的软件包及其依赖,并能够在不同的虚拟环境之间切换。Conda常通过安装Anaconda/Miniconda来进行使用。一般使用Miniconda就够了。2 Miniconda安装1.下载Miniconda安装包(以下指令安装的都是最新版本)wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shwget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh(https://repo.anaconda.com/miniconda/ 仓库选择自己所需要的版本)国内镜像加速网站:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.shhttps://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest- Linux-aarch64.sh 2.安装Miniconda(不同cpu架构版本使用不同命令)bash Miniconda3-latest-Linux-x86_64.shbash Miniconda3-latest-Linux-aarch64.sh记得source 环境变量source ~/.bashrc 执行Anaconda服务条款接受命令conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/mainconda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r 并验证 conda info 3.配置国内镜像源(可选)conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/rconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2conda config --set show_channel_urls yes获取版本号conda --version 或 conda -V 3 Conda使用1.查看当前存在哪些虚拟环境conda env list 或 conda info -e 或 conda info --envs2.查看/安装/更新/删除包conda list:conda search package_nameconda install package_nameconda install package_name=1.5.0conda update package_nameconda remove package_name 3.创建conda虚拟环境创建名为your_env_name的环境conda create --name your_env_name (- y 添加为了后续不在确认)创建制定python版本的环境conda create --name your_env_name python=3.12 创建指定python版本下包含某些包的环境conda create --name your_env_name python=3.12 numpy scipy激活conda虚拟环境conda activate your_env_name退出conda虚拟环境conda deactivate 删除conda虚拟环境conda remove -n your_env_name --allconda remove --name your_env_name --all克隆conda虚拟环境conda create --name new_env_name --clone old_env_name 4 备注安装pytorch和troch_NPU(专属步骤)版本对应关系:https://gitee.com/ascend/pytorch参考(torch2.4和troch_npu2.4.0)pip install torch==2.4.0 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simplepip install pyyaml -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simplepip install torch-npu==2.4.0.post2 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
-
鸿蒙PC的CodeArts IDE使用matplotlib库无法显示图形
-
鸿蒙PC的CodeArts IDE无法安装sklearn
-
warning: no previously-included files found matching 'aiohttp/*.html' no previously-included directories found matching 'docs/_build' adding license file 'LICENSE.txt' adding license file 'vendor/llhttp/LICENSE' writing manifest file 'aiohttp.egg-info/SOURCES.txt' copying aiohttp/_cparser.pxd -> build/lib.harmonyos-aarch64-cpython-312/aiohttp copying aiohttp/_find_header.pxd -> build/lib.harmonyos-aarch64-cpython-312/aiohttp copying aiohttp/_headers.pxi -> build/lib.harmonyos-aarch64-cpython-312/aiohttp copying aiohttp/_http_parser.pyx -> build/lib.harmonyos-aarch64-cpython-312/aiohttp copying aiohttp/_http_writer.pyx -> build/lib.harmonyos-aarch64-cpython-312/aiohttp copying aiohttp/py.typed -> build/lib.harmonyos-aarch64-cpython-312/aiohttp creating build/lib.harmonyos-aarch64-cpython-312/aiohttp/.hash copying aiohttp/.hash/_cparser.pxd.hash -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/.hash copying aiohttp/.hash/_find_header.pxd.hash -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/.hash copying aiohttp/.hash/_http_parser.pyx.hash -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/.hash copying aiohttp/.hash/_http_writer.pyx.hash -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/.hash copying aiohttp/.hash/hdrs.py.hash -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/.hash copying aiohttp/_websocket/mask.pxd -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/_websocket copying aiohttp/_websocket/mask.pyx -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/_websocket copying aiohttp/_websocket/reader_c.pxd -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/_websocket creating build/lib.harmonyos-aarch64-cpython-312/aiohttp/_websocket/.hash copying aiohttp/_websocket/.hash/mask.pxd.hash -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/_websocket/.hash copying aiohttp/_websocket/.hash/mask.pyx.hash -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/_websocket/.hash copying aiohttp/_websocket/.hash/reader_c.pxd.hash -> build/lib.harmonyos-aarch64-cpython-312/aiohttp/_websocket/.hash running build_ext building 'aiohttp._websocket.mask' extension creating build/temp.harmonyos-aarch64-cpython-312/aiohttp/_websocket cc -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -g -O3 -Wall -I/pkgroot/include -I/pkgroot/include -fPIC -I/data/app/python.org/python_3.12/include/python3.12 -c aiohttp/_websocket/mask.c -o build/temp.harmonyos-aarch64-cpython-312/aiohttp/_websocket/mask.o error: command 'cc' failed: No such file or directory [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for aiohttpFailed to build aiohttperror: failed-wheel-build-for-install× Failed to build installable wheels for some pyproject.toml based projects╰─> aiohttp
-
【35期】run evaluation script error: run_evaluation.sh: line 4: warning: setlocale: LC_ALL: cannot change locale (en_US.UTFrun evaluation script error: run_evaluation.sh: line 4: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)这个到底是什么错啊
-
本地用例都能运行,但是提交全是time out , 是不允许用numpy吗???
-
引言上一节博主讲解了关于【Python】模块与包这一节我们来看一下Python的一些常用模块一,time模块Python 的 time 模块是处理时间相关操作的核心模块之一,主要用于获取时间戳、时间格式化、程序延时、CPU 时间统计等场景。下面从核心功能、常用函数、使用示例等方面详细介绍:(一)、核心概念在使用 time 模块前,先理解两个基础概念:时间戳(timestamp):从1970 年 1 月 1 日 00:00:00(UTC/GMT 的午夜) 开始到当前时间的秒数(浮点数),是计算机存储时间的常用方式。结构化时间(struct_time):一个包含年、月、日、时、分、秒等信息的元组 / 对象,共 9 个元素,可通过索引或属性访问(如 tm_year、tm_mon)。(二)、常用函数分类及示例1. 获取时间戳(time())import timeprint(time.time())AI写代码python运行2. 返回结构化格式的时间(localtime())import time# localtime() -- 获取当前时间st = time.localtime()# 返回结构化格式的时间# 结构化时间(struct_time): struct_time元组共有9个元素# 年 月 日 时# time.struct_time(tm_year=2025, tm_mon=12, tm_mday=10, tm_hour=19,# 分 秒 星期几 一年中的第几天 夏令时间# tm_min=50, tm_sec=32, tm_wday=2, tm_yday=344, tm_idsst=0)print(st)AI写代码python运行3.格式化和解析操作(time.strftime()和time.strptime())import time# strftime(format,struct_time) -- 根据指定格式将时间元组转换为字符串,参考格式化时间字符串化对应表# strptime(struct_time,format) -- 将时间字符串解析为时间元组struct_time# 将格式化时间转换成字符串时间str = time.strftime("%Y-%m-%d %X",time.localtime())str = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())# 将字符串时间转换成格式化时间tm = time.strptime("2025-12-10 20:23:05",'%Y-%m-%d %X')print(tm)print(str)AI写代码python运行常用格式化符号:符号 含义 示例%Y 4 位年份 2025%y 2 位年份 25%m 月份(01-12) 12%d 日期(01-31) 11%H 24 小时制(00-23) 10%I 12 小时制(01-12) 10%M 分钟(00-59) 30%S 秒(00-59) 00%a 星期缩写 Thu%A 星期全称 Thursday%b 月份缩写 Dec%B 月份全称 December4.延时函数(sleep())sleep(second) -- 程序休眠多少秒time.sleep(5)AI写代码python运行二.random模块1. random 随机数模块,用于产生随机数import random # random() -- 生成一个[0.0,1.0)范围内的随机小数r1 = random.random()print(r1)AI写代码python运行2. randint(a,b) -- 生成一个在[a,b]范围内的随机整数(包括a和b)import randomr2 = random.randint(1,10)print(r2)AI写代码python运行3. uniform(a,b) -- 返回一个在[a,b]区间内的随机小数(包括a和b)import randomr3 = random.uniform(1.0,3.0)print(r3)AI写代码python运行4. 利用切片的方式randrange(start,stop,step)import random# randrange(start,stop,step)# step是可以省略的# 从指定范围内按照指定基数递增的集合中获取一个随机数,类似于range()函数# 使用randrange方法生成一个在[0,10]之间的偶数r4 = random.randrange(0,10,2)print(r4)AI写代码python运行5. choice(有序的iterable) -- 从有序的可迭代对象中随机选择一个元素import random# choice(有序的iterable) -- 从有序的可迭代对象中随机选择一个元素# 通过索引来迭代的r5 = random.choice(range(1,10))print(r5) # 随机选择一个元素r5 = random.choice([1,1.2,15,17,12])print(r5) # 无序不可用# r5 = random.choice({'age':20,'sex':'男'})# print(r5) # 报错AI写代码python运行注意像集合,字典等无序元素不能用choice()6. shuffle() -- 将有序可迭代对象中的元素打乱顺序(类似洗牌)import random# shuffle() -- 将有序可迭代对象中的元素打乱顺序(类似洗牌)list = [1,2,3,4,5,6]random.shuffle(list)print(list)AI写代码python运行三.os模块os模块,提供了很多允许你的程序与操作系统直接交互的功能文件和目录操作:创建、删除、重命名文件或目录,获取当前工作目录等路径操作:处理不同操作系统下的路径格式(如拼接路径)1. 文件和目录操作(os.system())import os# 文件和目录操作# 打开cmdos.system('start cmd')# 打开计算器os.system('start calc')AI写代码python运行2. 路径操作(os.getcwd())import os# 路径操作# 获取当前文件所在的路径目录print(os.getcwd()) # __file__内置变量,用于表示当前模块的文件路径。它的值取决于模块是如何加载的print(__file__)AI写代码python运行3. 创建和删除(os.mkdir()和os.rmdir())import os# 创建目录# 在当前目录下创建目录,如果存在则创建失败os.mkdir('test')# 删除目录# 删除目录 必须满足:空目录 空目录:里面没有任何东西os.rmdir('test')AI写代码python运行4. 重命名(os.rename())import os# 对目录重命名os.rename('test','test02')# 对目录下面的文件进行重命名os.rename('test02\\a.py','test02/b.py')AI写代码python运行5.os.path模块import os# os.path模块# 判断文件是否存在(os.path.exists())返回的是布尔型print(os.path.exists(r'C:\Users\Windows\PycharmProjects\pythonProjects\day14\test02\b.py')) # 获取当前文件所在目录print(os.path.dirname(__file__)) # 获取当前文件名print(os.path.basename(__file__)) # 给路径做拼接cur_path = os.path.dirname(__file__)file_path = os.path.join(cur_path,'a.py')print(file_path)AI写代码python运行四.json模块json.dumps():将Python对象转换为JSON字符串json.loads():解析JSON字符串并转换为Python对象json.dump(): 分别用于将Python对象写入文件作为JSON格式json.1oad(): 从文件中读取JSON数据到Python对象import json# 将Python字典转换JSON字符串data = { 'name': '张三', 'age':18, 'phone':'1861555284'} # 使用ensure_ascii=False来正确显示中文json_str = json.dumps(data,ensure_ascii=False)print(json_str)print(type(json_str)) # <class 'str'> # 解析JSON字符串并转换为Python对象json_str = '{"name":"张三","age":18,"phone":"1008611"}'data = json.loads(json_str)print(type(data)) #<class 'dict'> # 文件操作# data = {# 'name': '张三',# 'age':18,# 'phone':'1861555284'# }# # 将Python字典写入JSON文件with open('data.json','w',encoding="utf-8") as f: json.dump(data,f,ensure_ascii=False) # 从JSON文件读取数据到Python字典with open('data.json','r',encoding="utf-8") as f: load_data = json.load(f)print(type(load_data)) # <class 'dict'>AI写代码python运行五.结语其实博主是不喜欢发表长篇大论的,但是博主是有发表额度的,只好委屈大家一下了,博主的想法是从python零基础到实现开发软件或小程序,博主会不断推出这一类文章,后期还会出一份完整教程,正常博主会每天更新的,如果你也对python感兴趣的话,不妨给个一键三连支持一下博主(透露一下博主也是大一的┗|`O′|┛ 嗷~~)————————————————版权声明:本文为CSDN博主「buqizixv」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/buqizixv/article/details/155810433
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签