从0到1学Pandas(十):Pandas 实战项目案例

发布于:2025-07-28 ⋅ 阅读:(22) ⋅ 点赞:(0)


一、电商数据分析

1.1 数据收集与整合

在电商领域,数据来源丰富多样。数据库是核心数据源之一,其中存储着关键的用户信息、订单数据以及商品详情等。例如,某电商平台的 MySQL 数据库中,用户表记录了用户的注册信息、联系方式等;订单表则包含订单编号、下单时间、商品 ID、用户 ID 以及订单金额等字段,这些数据为后续分析提供了基础。通过 SQL 语句,如SELECT * FROM orders WHERE order_date >= ‘2023-01-01’,可以从数据库中精准提取特定时间段内的订单数据 。

日志文件也是重要的数据来源,它详细记录了用户在平台上的各种操作行为,如浏览记录、搜索关键词、点击行为等。利用日志分析工具,像 Logstash 结合 Kibana,能够对日志文件进行解析和可视化展示,帮助分析人员快速了解用户行为路径。例如,通过分析日志数据发现,许多用户在购买某类商品前,会多次浏览该商品的详情页,并对比不同品牌的同款商品。

网络爬虫可从外部网站获取市场信息和竞争对手数据。使用 Python 的 Scrapy 框架编写爬虫程序,能够按照预设规则抓取网页数据。比如,抓取竞争对手电商平台上同类商品的价格、促销活动等信息,为自身平台的定价和营销策略提供参考。但在使用爬虫时,必须严格遵守网站的 robots 协议,确保数据采集合法合规。

当收集到来自不同数据源的数据后,便需要使用 Pandas 进行整合。concat函数常用于数据堆叠,若有两个结构相同的 DataFrame,分别存储不同时间段的销售数据,可使用pd.concat([df1, df2])将它们按行合并,实现数据的纵向整合;若要进行横向合并,可设置axis=1参数 。merge函数则基于键连接数据,假设存在一个用户信息表和一个订单信息表,它们都包含user_id字段,通过pd.merge(user_df, order_df, on=‘user_id’)可依据user_id将两个表进行合并,从而得到包含用户信息和订单信息的完整数据集。

1.2 用户行为分析

借助 Pandas,能够对用户的浏览、购买、收藏等行为数据展开深入分析,挖掘用户的潜在偏好。假设我们有一份包含用户 ID、浏览时间、浏览商品 ID、购买时间、购买商品 ID、收藏时间、收藏商品 ID 等字段的行为数据集。

首先,利用groupby函数按用户 ID 对数据进行分组,统计每个用户的浏览次数、购买次数以及收藏次数,从而了解用户的活跃程度和参与度。例如,user_activity = df.groupby(‘user_id’).agg({‘浏览时间’: ‘count’, ‘购买时间’: ‘count’, ‘收藏时间’: ‘count’}),这样就能得到每个用户在各个行为维度上的统计结果。

通过透视表功能,可以进一步分析用户行为与商品属性之间的关系。假设数据集中还包含商品类别、品牌等字段,使用pd.pivot_table(df, values=‘购买时间’, index=‘user_id’, columns=‘商品类别’, aggfunc=‘count’),可以生成一个透视表,展示不同用户对不同商品类别的购买次数,从而清晰地看出用户在商品类别上的偏好差异。

此外,还可以通过计算用户行为之间的相关性来挖掘潜在偏好。例如,分析发现许多用户在收藏某类商品后不久就会进行购买,这表明收藏行为可能是购买行为的一个重要前置指标,电商平台可针对这类用户在其收藏商品降价或有促销活动时及时推送通知,提高购买转化率。

1.3 销售趋势预测

基于历史销售数据预测未来销售趋势,对于电商企业的库存管理、营销策略制定等至关重要。Pandas 在时间序列处理方面功能强大,能为预测工作提供有力支持。

首先,将销售数据中的时间列设置为索引,并确保其为datetime类型,方便后续按时间进行数据筛选和分析。例如,df[‘销售时间’] = pd.to_datetime(df[‘销售时间’]),df.set_index(‘销售时间’, inplace=True) 。

然后,利用resample函数对数据进行重采样,以满足不同时间粒度的分析需求。比如,将每日销售数据转换为每月销售数据,使用monthly_sales = df[‘销售额’].resample(‘M’).sum(),这样可以更清晰地观察到销售数据在月度层面的变化趋势。

在预测模型选择上,ARIMA(自回归积分滑动平均模型)是常用的时间序列预测模型之一。它通过对历史数据的自回归、差分和滑动平均处理,建立预测模型。使用statsmodels库中的ARIMA类,可实现模型的构建和训练 。例如:

from statsmodels.tsa.arima_model import ARIMA
import warnings
warnings.filterwarnings("ignore")

model = ARIMA(monthly_sales, order=(1,1,1))
model_fit = model.fit(disp=0)
forecast = model_fit.forecast(steps=12)[0]

上述代码构建了一个ARIMA(1,1,1)模型,并对未来 12 个月的销售额进行了预测。

另一种流行的预测模型是 Prophet,它由 Facebook 开发,对具有趋势、季节性和节假日效应的时间序列数据有很好的预测效果。Prophet 使用简单,只需对数据进行简单预处理后即可进行训练和预测。例如:

from fbprophet import Prophet

df_prophet = pd.DataFrame({'ds': monthly_sales.index, 'y': monthly_sales.values})
m = Prophet()
m.fit(df_prophet)
future = m.make_future_dataframe(periods=12, freq='M')
forecast_prophet = m.predict(future)

通过对比不同模型的预测结果,并结合实际业务情况进行评估和调整,能够更准确地预测未来销售趋势,为电商企业的决策提供科学依据。

二、医疗数据处理

2.1 患者数据管理

在医疗领域,患者数据是宝贵的资源,对临床决策、医学研究和医疗质量提升起着关键作用。使用 Pandas 处理患者基本信息、诊断结果、治疗记录等数据时,首先面临的数据收集问题,这些数据可能存储在医院信息系统(HIS)的数据库中,如 Oracle 数据库,以结构化表格形式记录;也可能分散在不同科室的电子病历文档里,如 XML 格式的病历文件。

数据清洗是关键步骤,缺失值处理是常见任务。例如,患者年龄字段若存在缺失值,可根据患者所属年龄段的常见分布,使用fillna函数填充均值或中位数,如df[‘年龄’].fillna(df[‘年龄’].median(), inplace=True)。对于诊断结果中模糊不清或错误录入的数据,需结合医学知识和业务逻辑进行修正,比如将不规范的疾病代码统一转换为标准 ICD 编码。

数据转换旨在使数据格式更适合分析。将文本形式的日期转换为datetime类型,方便按时间顺序分析患者病程,如df[‘入院日期’] = pd.to_datetime(df[‘入院日期’])。对于分类变量,像性别字段,使用get_dummies函数进行独热编码,将其转换为数值形式,利于后续建模分析,df = pd.get_dummies(df, columns=[‘性别’]) 。

数据存储方面,清洗和转换后的数据可保存为 CSV 文件,便于长期存储和跨平台共享,使用df.to_csv(‘cleaned_patient_data.csv’, index=False)实现;若数据量较大且需高效查询,可将其存储到数据库中,如 MySQL 数据库,利用to_sql函数将 DataFrame 写入数据库表。

2.2 医疗质量分析

借助 Pandas 分析手术成功率、并发症发生率等指标,能有效评估医疗质量,为医院管理和医疗改进提供数据支持。

以手术成功率分析为例,假设数据集中包含手术记录,字段有手术 ID、患者 ID、手术结果(成功或失败)。首先,使用groupby函数按手术类型对数据分组,计算每种手术类型的成功案例数和总案例数 ,如:

surgery_data = df[['手术类型', '手术结果']]
success_count = surgery_data[surgery_data['手术结果'] == '成功'].groupby('手术类型').size()
total_count = surgery_data.groupby('手术类型').size()
surgery_success_rate = success_count / total_count

通过上述代码,得到每种手术类型的成功率,surgery_success_rate是一个包含手术类型和对应成功率的 Series。

对于并发症发生率,同样利用groupby函数,假设数据集中有并发症发生字段,可计算不同手术类型或不同科室的并发症发生率:

complication_data = df[['手术类型', '是否发生并发症']]
complication_count = complication_data[complication_data['是否发生并发症'] == '是'].groupby('手术类型').size()
complication_rate = complication_count / total_count

得到的complication_rate表示每种手术类型的并发症发生率。

为了更直观地展示这些指标,结合 Matplotlib 或 Seaborn 库进行可视化。使用 Seaborn 绘制柱状图展示不同手术类型的成功率,代码如下:

import seaborn as sns
import matplotlib.pyplot as plt

sns.barplot(x=surgery_success_rate.index, y=surgery_success_rate.values)
plt.xlabel('手术类型')
plt.ylabel('手术成功率')
plt.title('不同手术类型的成功率')
plt.xticks(rotation=45)
plt.show()

通过可视化图表,医院管理者和医护人员能快速了解不同手术类型的质量情况,发现潜在问题并制定改进措施。

2.3 药物疗效评估

基于临床实验数据,使用 Pandas 评估药物治疗效果,为药物研发和临床应用提供科学依据。

首先进行数据预处理,临床实验数据可能存在缺失值、重复值和异常值。使用dropna函数删除含有缺失值的记录,df = df.dropna();利用drop_duplicates函数去除重复数据,确保数据的唯一性,df = df.drop_duplicates() 。对于异常值,通过分析数据分布,如使用箱线图识别并处理,假设要分析患者的某项生理指标,绘制箱线图代码如下:

import seaborn as sns
import matplotlib.pyplot as plt

sns.boxplot(y=df['生理指标'])
plt.show()

根据箱线图显示的异常值范围,可使用clip函数对异常值进行截断处理,如df[‘生理指标’] = df[‘生理指标’].clip(lower=q1 - 1.5 * iqr, upper=q3 + 1.5 * iqr),其中q1、q3分别是第一、第三四分位数,iqr是四分位距。

在评估药物疗效时,常用假设检验和回归分析方法。假设检验用于判断药物治疗组和对照组之间是否存在显著差异。例如,使用独立样本 t 检验比较两组患者治疗后的某项指标均值差异,假设treatment_group和control_group分别是治疗组和对照组的数据列,代码如下:

from scipy import stats

t_stat, p_value = stats.ttest_ind(treatment_group, control_group)
if p_value < 0.05:
    print("两组之间存在显著差异,药物可能有效")
else:
    print("两组之间无显著差异,药物效果不明显")

回归分析可进一步探究药物剂量与治疗效果之间的关系。使用线性回归模型,假设数据集中有药物剂量dose和治疗效果指标effect字段,代码如下:

import pandas as pd
from sklearn.linear_model import LinearRegression

data = pd.DataFrame({'dose': dose, 'effect': effect})
X = data[['dose']]
y = data['effect']

model = LinearRegression()
model.fit(X, y)
coefficient = model.coef_[0]
intercept = model.intercept_

print(f"回归系数: {coefficient}")
print(f"截距: {intercept}")

通过回归分析得到的回归系数和截距,可构建回归方程预测不同药物剂量下的治疗效果,为临床用药提供参考。

三、社交媒体分析

3.1 文本数据处理

在社交媒体分析中,文本数据是主要的分析对象,但原始的社交媒体文本数据往往包含大量噪声和不规范信息,需要使用 Pandas 进行清洗和预处理,提取关键信息。

去除停用词是常见的预处理步骤之一。停用词是指那些在文本中频繁出现但几乎不携带实际语义信息的词,如英文中的 “the”“and”“is” 等,中文中的 “的”“地”“得” 等。利用 NLTK(Natural Language Toolkit)库结合 Pandas,可以方便地去除停用词。首先下载 NLTK 的停用词表,nltk.download(‘stopwords’),然后定义一个函数来去除文本中的停用词 :

import nltk
from nltk.corpus import stopwords

stop_words = set(stopwords.words('english'))

def remove_stopwords(text):
    words = text.split()
    filtered_words = [word for word in words if word.lower() not in stop_words]
    return " ".join(filtered_words)

# 假设df是包含文本数据的DataFrame,'text_column'是文本列
df['cleaned_text'] = df['text_column'].apply(remove_stopwords)

上述代码中,remove_stopwords函数接收一个文本字符串,将其拆分为单词,去除其中的停用词后再重新拼接成字符串。通过apply方法将该函数应用到 DataFrame 的文本列上,得到去除停用词后的新列cleaned_text。

词干提取和词形还原也是重要的预处理操作,它们能够将单词还原为基本形式,以便更好地进行统计和分析。以词干提取为例,使用 NLTK 中的PorterStemmer类,代码如下:

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()

def stem_text(text):
    words = text.split()
    stemmed_words = [stemmer.stem(word) for word in words]
    return " ".join(stemmed_words)

df['stemmed_text'] = df['cleaned_text'].apply(stem_text)

stem_text函数对输入文本的每个单词进行词干提取,得到词干化后的文本。同样,使用apply方法将其应用到 DataFrame 的列上。

此外,还需要对文本进行去噪处理,如去除 HTML 标签、特殊字符等。利用正则表达式结合 Pandas 的str访问器可以实现这一操作 :

import re

def remove_special_characters(text):
    text = re.sub(r'<.*?>', '', text)  # 去除HTML标签
    text = re.sub(r'[^\w\s]', '', text)  # 去除特殊字符
    return text

df['cleaned_text'] = df['text_column'].apply(remove_special_characters)

这段代码定义了remove_special_characters函数,使用re.sub方法分别去除文本中的 HTML 标签和特殊字符,然后更新 DataFrame 中的文本列。

3.2 情感分析

通过 Pandas 结合自然语言处理库,如 NLTK、TextBlob 等,可以分析用户评论的情感倾向,了解用户对特定话题或事件的态度。

以 TextBlob 库为例,它提供了简单易用的情感分析功能。首先安装 TextBlob 库,pip install textblob,然后使用以下代码进行情感分析:

from textblob import TextBlob

def analyze_sentiment(text):
    blob = TextBlob(text)
    sentiment = blob.sentiment.polarity
    if sentiment > 0:
        return 'positive'
    elif sentiment < 0:
        return 'negative'
    else:
        return 'neutral'

df['sentiment'] = df['cleaned_text'].apply(analyze_sentiment)

上述代码中,analyze_sentiment函数接收一个文本字符串,使用 TextBlob 进行情感分析,根据情感极性sentiment判断情感倾向,大于 0 为积极,小于 0 为消极,等于 0 为中性。通过apply方法将该函数应用到 DataFrame 中经过清洗的文本列cleaned_text上,得到情感倾向列sentiment。

若使用 NLTK 库中的SentimentIntensityAnalyzer进行情感分析,步骤如下:

from nltk.sentiment import SentimentIntensityAnalyzer

sia = SentimentIntensityAnalyzer()

def nltk_analyze_sentiment(text):
    sentiment_score = sia.polarity_scores(text)
    compound_score = sentiment_score['compound']
    if compound_score >= 0.05:
        return 'positive'
    elif compound_score <= -0.05:
        return 'negative'
    else:
        return 'neutral'

df['nltk_sentiment'] = df['cleaned_text'].apply(nltk_analyze_sentiment)

nltk_analyze_sentiment函数利用SentimentIntensityAnalyzer计算文本的情感得分,根据compound复合得分判断情感倾向,同样通过apply方法应用到 DataFrame 的文本列上,得到基于 NLTK 分析的情感倾向列nltk_sentiment。

为了更直观地展示情感分析结果,可以结合 Matplotlib 库进行可视化。统计不同情感倾向的评论数量,绘制柱状图:

import matplotlib.pyplot as plt

sentiment_counts = df['sentiment'].value_counts()

plt.bar(sentiment_counts.index, sentiment_counts.values)
plt.xlabel('Sentiment')
plt.ylabel('Count')
plt.title('Sentiment Distribution')
plt.show()

上述代码统计了sentiment列中不同情感倾向的数量,使用 Matplotlib 绘制柱状图展示情感分布情况,帮助分析人员快速了解用户情感的总体趋势。

3.3 社交网络分析

使用 Pandas 构建用户关系网络,并结合 NetworkX 等库分析用户影响力和传播路径,能够深入挖掘社交媒体中的社交结构和信息传播规律。

假设我们有一份包含用户之间关注关系的数据,数据格式为 CSV 文件,包含source_user(关注者)和target_user(被关注者)两列。首先使用 Pandas 读取数据:

import pandas as pd
import networkx as nx

df = pd.read_csv('social_relations.csv')

然后利用 NetworkX 库从 DataFrame 构建图:

G = nx.from_pandas_edgelist(df,'source_user', 'target_user')

上述代码中,nx.from_pandas_edgelist函数根据 DataFrame 中的边列表数据创建一个图对象G,其中节点为用户,边为用户之间的关注关系。

在构建好的用户关系网络中,可以计算各种中心性指标来衡量用户的影响力。度中心性(Degree Centrality)是最简单的中心性指标,它表示节点的连接数,连接数越多,说明该节点在网络中的活跃度越高,影响力可能越大。使用 NetworkX 计算度中心性的代码如下:

degree_centrality = nx.degree_centrality(G)

degree_centrality是一个字典,键为节点(用户),值为对应的度中心性。

介数中心性(Betweenness Centrality)衡量节点在网络中最短路径上的出现频率,反映了节点对信息传播的控制能力。计算介数中心性的代码为:

betweenness_centrality = nx.betweenness_centrality(G)

同样,betweenness_centrality也是一个字典,存储每个节点的介数中心性。

为了分析信息在社交网络中的传播路径,可以使用广度优先搜索(BFS)或深度优先搜索(DFS)算法。以 BFS 为例,假设我们要从某个起始节点start_node开始搜索信息传播路径:

def bfs_spread(G, start_node):
    visited = set()
    queue = [start_node]
    visited.add(start_node)
    spread_path = []

    while queue:
        node = queue.pop(0)
        spread_path.append(node)
        neighbors = list(G.neighbors(node))
        for neighbor in neighbors:
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append(neighbor)

    return spread_path

start_node ='some_user_id'
spread_path = bfs_spread(G, start_node)
print(spread_path)

上述bfs_spread函数实现了从start_node开始的广度优先搜索,返回信息传播经过的节点路径。通过分析这些传播路径,可以了解信息在社交网络中的扩散方式和速度,为社交媒体营销、舆情监测等提供有价值的参考。

四、金融风险管理

4.1 市场风险分析

在金融市场中,股票、债券等金融产品的价格波动频繁,准确分析这些波动并评估市场风险对于投资者和金融机构至关重要。Pandas 提供了强大的数据处理和分析能力,能有效助力市场风险分析工作。

首先,获取金融产品的历史价格数据。这些数据可以从专业的金融数据提供商,如 Wind、同花顺等获取,也可通过网络爬虫从金融网站抓取,如雅虎财经(Yahoo Finance) 。获取的数据通常以 CSV 文件或 DataFrame 格式存储,包含日期、开盘价、收盘价、最高价、最低价等字段。使用 Pandas 读取数据后,将日期列设置为索引并转换为datetime类型,方便后续按时间进行数据处理和分析 :

import pandas as pd

# 假设数据文件为stock_prices.csv
df = pd.read_csv('stock_prices.csv')
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)

为了衡量价格波动,计算收益率是常用的方法。收益率反映了资产价格的变化率,能更直观地展示价格波动情况。简单收益率可通过当前价格与上一周期价格的差值除以上一周期价格计算得到;对数收益率则通过对价格取对数后再计算差值得到。在 Pandas 中,使用pct_change函数计算简单收益率,假设收盘价列名为’收盘价’ :

df['简单收益率'] = df['收盘价'].pct_change()

计算对数收益率可使用np.log函数,假设numpy库已导入为np:

df['对数收益率'] = np.log(df['收盘价'] / df['收盘价'].shift(1))

除了收益率,标准差也是衡量市场风险的重要指标。标准差反映了收益率的离散程度,标准差越大,说明收益率的波动越大,市场风险越高。使用 Pandas 的std函数计算收益率的标准差:

std_dev = df['简单收益率'].std()
print(f"简单收益率的标准差: {std_dev}")

在实际应用中,风险价值(VaR)模型被广泛用于评估市场风险。VaR 表示在一定置信水平下,投资组合在未来特定时期内可能遭受的最大损失。以历史模拟法计算 VaR 为例,首先对收益率数据进行排序,然后根据置信水平确定分位数,该分位数对应的收益率即为 VaR 值。假设置信水平为 95% :

confidence_level = 0.95
var = np.percentile(df['简单收益率'], (1 - confidence_level) * 100)
print(f"95%置信水平下的VaR值: {var}")

上述代码中,np.percentile函数用于计算收益率数据的分位数,得到 VaR 值。通过这些方法,结合 Pandas 的数据处理能力,能够全面、准确地分析金融产品的价格波动,评估市场风险,为投资者和金融机构的决策提供有力支持。

4.2 信用风险评估

信用风险是金融领域面临的重要风险之一,基于客户信用数据,使用 Pandas 构建信用评分模型,能有效评估违约风险,帮助金融机构做出合理的信贷决策。

首先,收集客户信用数据,这些数据可能来自银行内部的信贷记录、第三方信用评级机构数据以及公开的信用信息等。数据内容通常包括客户基本信息(如年龄、职业、收入等)、信用历史(如贷款还款记录、信用卡使用情况等)、负债情况等。将这些数据整理成结构化的表格形式,使用 Pandas 读取并进行预处理。

数据预处理过程中,处理缺失值是关键步骤。对于数值型数据的缺失值,可采用均值、中位数填充,如客户收入字段存在缺失值,使用fillna函数填充均值:

df['收入'] = df['收入'].fillna(df['收入'].mean())

对于分类变量的缺失值,可根据其分布情况填充最频繁出现的类别,假设职业字段存在缺失值:

most_frequent_occupation = df['职业'].mode()[0]
df['职业'] = df['职业'].fillna(most_frequent_occupation)

异常值处理也不容忽视。通过分析数据分布,使用箱线图识别异常值,对于明显偏离正常范围的数据进行修正或删除。假设要分析客户年龄数据,绘制箱线图并处理异常值:

import seaborn as sns
import matplotlib.pyplot as plt

sns.boxplot(y=df['年龄'])
plt.show()

# 假设根据箱线图确定异常值范围,进行处理
lower_bound = df['年龄'].quantile(0.01)
upper_bound = df['年龄'].quantile(0.99)
df = df[(df['年龄'] >= lower_bound) & (df['年龄'] <= upper_bound)]

完成数据预处理后,选择合适的模型构建信用评分模型。逻辑回归是常用的信用评分模型之一,它基于历史数据学习客户特征与违约概率之间的关系。使用scikit - learn库构建逻辑回归模型,假设特征矩阵为X,目标变量(是否违约)为y:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LogisticRegression()
model.fit(X_train, y_train)

决策树模型也可用于信用风险评估,它通过对特征进行划分,构建树形结构来预测客户的违约风险。使用scikit - learn库的DecisionTreeClassifier类构建决策树模型:

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
model.fit(X_train, y_train)

模型训练完成后,使用测试集数据对模型进行评估,常用的评估指标有准确率、召回率、F1 值等。以逻辑回归模型为例,计算评估指标:

from sklearn.metrics import accuracy_score, recall_score, f1_score

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

print(f"准确率: {accuracy}")
print(f"召回率: {recall}")
print(f"F1值: {f1}")

通过这些步骤,利用 Pandas 进行数据预处理,结合合适的模型构建信用评分模型,能够准确评估客户的信用风险,降低金融机构的信贷损失。

4.3 投资组合优化

在金融投资中,构建合理的投资组合至关重要,它能够帮助投资者在控制风险的同时实现收益最大化。Pandas 在投资组合分析和优化中发挥着关键作用,通过计算资产收益率、协方差矩阵等关键指标,结合均值 - 方差模型等方法,实现投资组合的优化。

首先,获取投资组合中各资产的历史价格数据,如股票、债券等。使用 Pandas 读取数据并进行整理,计算各资产的收益率。假设资产价格数据存储在一个 DataFrame 中,列名为不同资产的代码,索引为日期 :

import pandas as pd
import numpy as np

# 假设数据文件为portfolio_prices.csv
df = pd.read_csv('portfolio_prices.csv')
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)

# 计算对数收益率
returns = np.log(df / df.shift(1))
returns = returns.dropna()

计算资产收益率的均值和协方差矩阵,均值反映了资产的平均收益水平,协方差矩阵则衡量了资产之间的相关性。使用 Pandas 的mean和cov函数进行计算:

mean_returns = returns.mean()
cov_matrix = returns.cov()

均值 - 方差模型是投资组合优化的经典模型,其目标是在给定的风险水平下最大化预期收益,或在给定的预期收益下最小化风险。在 Python 中,使用scipy.optimize模块的minimize函数实现均值 - 方差优化。以下是一个以最大化夏普比率为目标的优化示例,夏普比率是衡量投资组合风险调整后收益的指标,越高表示投资组合的表现越好 :

from scipy.optimize import minimize

# 定义计算夏普比率的函数
def sharpe_ratio(weights, mean_returns, cov_matrix, risk_free_rate=0.0):
    portfolio_return = np.sum(mean_returns * weights)
    portfolio_volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
    return (portfolio_return - risk_free_rate) / portfolio_volatility

# 定义优化目标函数(最大化夏普比率,取负号转化为最小化问题)
def objective_function(weights, mean_returns, cov_matrix, risk_free_rate=0.0):
    return -sharpe_ratio(weights, mean_returns, cov_matrix, risk_free_rate)

# 定义约束条件,权重之和为1
constraints = ({'type': 'eq', 'fun': lambda weights: np.sum(weights) - 1})

# 定义初始权重猜测
num_assets = len(mean_returns)
init_guess = np.ones(num_assets) / num_assets

# 定义权重边界
bounds = tuple((0, 1) for _ in range(num_assets))

# 进行优化
result = minimize(objective_function, init_guess, args=(mean_returns, cov_matrix), method='SLSQP', bounds=bounds, constraints=constraints)

# 输出最优权重
optimal_weights = result.x
print(f"最优权重: {optimal_weights}")

上述代码中,sharpe_ratio函数计算投资组合的夏普比率,objective_function函数将夏普比率取负作为优化目标,minimize函数使用序列最小二乘法(SLSQP)寻找最优权重,满足权重之和为 1 的约束条件。通过这种方式,利用 Pandas 进行数据处理,结合优化算法,能够实现投资组合的优化,帮助投资者做出更合理的投资决策,平衡风险与收益。


网站公告

今日签到

点亮在社区的每一天
去签到