Python数据分析实战:从入门到精通的代码案例库_第1页
Python数据分析实战:从入门到精通的代码案例库_第2页
Python数据分析实战:从入门到精通的代码案例库_第3页
Python数据分析实战:从入门到精通的代码案例库_第4页
Python数据分析实战:从入门到精通的代码案例库_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-Python数据分析实战:从入门到精通的代码案例库任何高质量的数据分析项目,其成败往往取决于数据准备的阶段。在真实业务场景中,原始数据极少是干净、规整的,它们通常散落在不同的系统、格式各异且充满噪声。本章节通过三个核心场景,展示如何利用Pandas和Requests库完成从数据抓取到标准化清洗的全流程。1.1多源异构数据的动态采集面对电商销售数据或社交媒体评论,静态CSV文件已无法满足需求。我们需要编写脚本实时抓取API接口数据。以下代码展示了如何构建一个健壮的请求封装类,处理超时重试与异常捕获,确保数据采集的连续性。importrequests

importtime

fromtypingimportList,Dict

classDataScraper:

def__init__(self,base_url:str,api_key:str):

self.base_url=base_url

self.headers={'Authorization':f'Bearer{api_key}'}

self.session=requests.Session()

deffetch_with_retry(self,endpoint:str,params:Dict,max_retries:int=3)->Dict:

"""带重试机制的数据获取函数"""

forattemptinrange(max_retries):

try:

response=self.session.get(

f"{self.base_url}/{endpoint}",

params=params,

headers=self.headers,

timeout=10

)

response.raise_for_status()

returnresponse.json()

exceptrequests.exceptions.RequestExceptionase:

ifattempt==max_retries-1:

raiseException(f"Failedtofetchdataafter{max_retries}attempts:{e}")

wait_time=2**attempt#指数退避策略

print(f"Attempt{attempt+1}failed,retryingin{wait_time}s...")

time.sleep(wait_time)

return{}

#应用场景示例:获取某电商平台过去7天的订单数据

scraper=DataScraper("/v1/orders","your_api_key")

orders_data=scraper.fetch_with_retry('daily_summary',{'days':7})1.2复杂脏数据的自动化清洗数据清洗是耗时最长的环节。实际数据中常包含缺失值、重复记录、格式不统一(如日期格式混乱)以及异常离群点。以下案例演示了如何针对一份包含50万行销售记录的Excel文件进行标准化处理。数据清洗前后对比表:清洗维度清洗前状态清洗后状态处理逻辑说明缺失率总缺失率12.4%总缺失率0%数值型采用中位数填充,类别型采用众数填充重复记录存在3,450条完全重复行0条重复行基于主键(Order_ID)去重异常值销售额存在负数及>100万极端值剔除99.9%分位以上数据使用IQR(四分位距)法则识别并修正格式统一日期格式混杂(YYYY/MM/DD,DD-MM-YY)统一为ISO8601(YYYY-MM-DD)利用`pd.to_datetime`强制解析importpandasaspd

importnumpyasnp

defclean_sales_data(file_path:str)->pd.DataFrame:

df=pd.read_excel(file_path)

#1.去重

initial_count=len(df)

df=df.drop_duplicates(subset=['order_id'])

print(f"Removed{initial_count-len(df)}duplicaterecords.")

#2.日期标准化

df['order_date']=pd.to_datetime(df['order_date'],errors='coerce')

df=df.dropna(subset=['order_date'])

#3.异常值处理(IQR方法)

Q1=df['sales_amount'].quantile(0.25)

Q3=df['sales_amount'].quantile(0.75)

IQR=Q3-Q1

lower_bound=Q1-1.5*IQR

upper_bound=Q3+1.5*IQR

#将超出范围的数值替换为边界值(而非直接删除,保留样本量)

df.loc[df['sales_amount']<lower_bound,'sales_amount']=lower_bound

df.loc[df['sales_amount']>upper_bound,'sales_amount']=upper_bound

#4.缺失值智能填充

numeric_cols=df.select_dtypes(include=[np.number]).columns

forcolinnumeric_cols:

median_val=df[col].median()

df[col]=df[col].fillna(median_val)

categorical_cols=df.select_dtypes(include=['object']).columns

forcolincategorical_cols:

mode_val=df[col].mode()[0]ifnotdf[col].mode().emptyelse'Unknown'

df[col]=df[col].fillna(mode_val)

returndf第二章:探索性数据分析(EDA)——洞察数据背后的故事当数据准备好后,下一步是通过可视化手段快速理解数据分布、相关性以及潜在模式。这一阶段的目标不是得出结论,而是提出假设。2.1多维特征的相关性热力图在金融风控或用户画像项目中,识别特征间的共线性至关重要。直接使用Seaborn绘制热力图可以直观展示变量间的相关系数矩阵。importseabornassns

importmatplotlib.pyplotasplt

#假设df为清洗后的用户行为数据集

plt.figure(figsize=(12,10))

corr_matrix=df.corr(numeric_only=True)

#掩码上三角区域,避免重复显示

mask=np.triu(np.ones_like(corr_matrix,dtype=bool))

sns.heatmap(corr_matrix,mask=mask,cmap='RdBu_r',center=0,

annot=True,fmt=".2f",linewidths=.5,cbar_kws={"shrink":.5})

plt.title('FeatureCorrelationMatrix',fontsize=16,fontweight='bold')

plt.show()解读策略:若发现“登录次数”与“购买金额”相关系数高达0.85,而“浏览时长”仅为0.15,则提示业务侧应重点关注提升用户活跃度,而非单纯增加页面停留时间。对于绝对值超过0.9的特征对,需警惕多重共线性问题,建议在后续建模时进行降维处理。2.2分布分析与异常检测箱线图单变量分析能揭示数据的集中趋势与离散程度。箱线图(Boxplot)是识别离群点的最佳工具之一。fig,axes=plt.subplots(2,2,figsize=(14,12))

#销售额分布

sns.boxplot(data=df,y='sales_amount',ax=axes[0,0])

axes[0,0].set_title('SalesAmountDistribution')

#不同地区客单价对比

sns.boxplot(data=df,x='region',y='avg_order_value',ax=axes[0,1])

axes[0,1].set_title('AvgOrderValuebyRegion')

#年龄分布直方图叠加KDE

sns.histplot(data=df,x='age',kde=True,ax=axes[1,0])

axes[1,0].set_title('UserAgeDistributionwithKDE')

#消费频次与金额的散点图

sns.scatterplot(data=df,x='purchase_frequency',y='sales_amount',alpha=0.5,ax=axes[1,1])

axes[1,1].set_title('PurchaseFrequencyvsTotalSales')

plt.tight_layout()

plt.show()关键发现示例:通过上述图表,我们可能发现“华东地区”虽然订单量大,但客单价显著低于“华南地区”,且存在大量低龄用户的高频低额消费行为。这直接指向了区域定价策略的失效或特定人群的用户分层运营机会。第三章:高级建模与预测——从描述到预测进入实战的核心阶段,我们将利用Scikit-learn构建机器学习模型,解决具体的业务预测问题。此处以“客户流失预测”为例,展示完整的建模流水线。3.1特征工程与模型训练特征工程是决定模型上限的关键。我们将构造“最近一次消费距离天数(Recency)”、“消费频率(Frequency)”和“消费总额(Monetary)”作为RFM指标,并结合用户注册时长、客服投诉次数等衍生特征。fromsklearn.model_selectionimporttrain_test_split,GridSearchCV

fromsklearn.preprocessingimportStandardScaler

fromsklearn.ensembleimportRandomForestClassifier

fromsklearn.metricsimportclassification_report,roc_auc_score

#1.数据划分

X=df[['recency','frequency','monetary','reg_days','complaint_count']]

y=df['churn_label']#0:留存,1:流失

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42,stratify=y)

#2.特征缩放

scaler=StandardScaler()

X_train_scaled=scaler.fit_transform(X_train)

X_test_scaled=scaler.transform(X_test)

#3.模型参数调优

param_grid={

'n_estimators':[100,200],

'max_depth':[None,10,20],

'min_samples_split':[2,5]

}

rf_clf=RandomForestClassifier(class_weight='balanced',random_state=42)

grid_search=GridSearchCV(rf_clf,param_grid,cv=5,scoring='roc_auc',n_jobs=-1)

grid_search.fit(X_train_scaled,y_train)

best_model=grid_search.best_estimator_

print(f"BestParameters:{grid_search.best_params_}")

#4.评估与报告

y_pred_proba=best_model.predict_proba(X_test_scaled)[:,1]

y_pred=best_model.predict(X_test_scaled)

print("\nClassificationReport:")

print(classification_report(y_test,y_pred))

print(f"ROC-AUCScore:{roc_auc_score(y_test,y_pred_proba):.4f}")3.2模型可解释性与业务落地仅仅知道模型准确是不够的,业务部门需要知道“为什么”。利用SHAP(SHapleyAdditiveexPlanations)库,我们可以量化每个特征对单个预测结果的贡献度。特征重要性排序(Top5):排名特征名称平均SHAP值影响业务含义解读1最近一次消费天数+0.45用户越久未消费,流失风险越高(正向驱动)2近30天投诉次数+0.32负面体验是导致流失的最强信号3会员等级-0.28高等级会员更倾向于留存(负向驱动,即降低风险)4月均消费金额-0.15高价值用户粘性更强5注册时长-0.10老用户比新用户更稳定基于此结论,运营团队应立即制定策略:针对“近30天无消费且注册时间短”的高危用户群发送定向优惠券;同时优化客服响应机制,减少投诉发生概率。第四章:自动化报表与部署——构建数据闭环分析的最终目的是辅助决策。将脚本转化为自动化的定时任务,并生成可视化的Dashboard,是数据分析师进阶的必经之路。4.1自动化调度与邮件推送利用Cron或Airflow调度脚本,每日凌晨自动运行ETL流程,并将关键指标异常报警发送至管理层邮箱。importsmtplib

fromemail.mime.textimportMIMEText

fromemail.mime.multipartimportMIMEMultipart

defsend_alert_email(subject,body,recipient_list):

sender="data_system@"

password=os.getenv("EMAIL_PASSWORD")

msg=MIMEMultipart()

msg['From']=sender

msg['To']=",".join(recipient_list)

msg['Subject']=subject

msg.attach(MIMEText(body,'html'))

server=smtplib.SMTP('',587)

server.starttls()

server.login(sender,password)

server.send_message(msg)

server.quit()

#模拟触发条件:当日销售额低于预期阈值20%

ifdaily_sales<expected_sales*0.8:

alert_msg=f"<h3>警报:销售额异常</h3><p>当前销售额:{daily_sales}</p><p>预期目标:{expected_sales}</p>"

send_alert_email("DailySalesAlert",alert_msg,["manager@"])4.2Streamlit交互式看板开发为了替代传统的静态PPT汇报,使用Streamlit可以快速搭建Web应用,让非技术人员也能通过拖拽筛选器自助分析数据。importstreamlitasst

importpandasaspd

st.set_page_config(page_title="销售数据驾驶舱",layout="wide")

st.title("📊销售数据实时驾驶舱")

#侧边栏筛选器

region=st.sidebar.multiselect("选择区域",options=df['region'].unique(),default=df['region'].unique())

date_range=st.sidebar.date_input("选择日期范围",value=(df['order_date'].min(),df['order_date'].max()))

#数据过滤

filtered_df=df[(df['region'].isin(region))&

((df['order_date']>=date_range[0])&(df['order_date']<=date_range

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论