Pandas在各类数据处理场景中的常用代码

Pandas在各类数据处理场景中的常用代码

一、引言

Pandas是Python中强大的数据处理和分析库,提供了高效、灵活的数据结构和数据分析工具,广泛应用于数据清洗、转换、分析和可视化等数据处理流程中。本文将详细介绍Pandas在各类数据处理场景中的常用代码,帮助读者快速上手并熟练运用Pandas进行数据处理任务。

二、数据读取与写入

(一)读取常见格式数据

  1. 读取CSV文件

    • 使用read_csv函数读取CSV文件,可指定文件路径、分隔符、编码等参数。
    1
    2
    3
    4
    5
    6
    7
    import pandas as pd

    # 读取CSV文件,默认逗号为分隔符
    df = pd.read_csv('data.csv')

    # 读取CSV文件,指定分号为分隔符,编码为UTF-8
    df = pd.read_csv('data.csv', sep=';', encoding='utf-8')
  2. 读取Excel文件

    • 使用read_excel函数读取Excel文件,可指定工作表名称或索引。
    1
    2
    3
    4
    5
    6
    7
    8
    # 读取Excel文件的默认工作表
    df = pd.read_excel('data.xlsx')

    # 读取Excel文件的指定工作表(通过名称)
    df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

    # 读取Excel文件的指定工作表(通过索引,0表示第一个工作表)
    df = pd.read_excel('data.xlsx', sheet_name=0)
  3. 读取SQL数据库数据(需安装相应数据库驱动)

    • 以MySQL为例,使用sqlalchemy库创建数据库引擎,再用read_sql函数读取数据。
    1
    2
    3
    4
    5
    6
    7
    8
    from sqlalchemy import create_engine
    import pandas as pd

    # 创建数据库引擎(假设MySQL数据库,根据实际情况修改参数)
    engine = create_engine('mysql+pymysql://user:password@localhost:3306/database')

    # 读取数据库表数据
    df = pd.read_sql('SELECT * FROM table_name', engine)

(二)写入数据

  1. 写入CSV文件

    • 使用to_csv函数将数据写入CSV文件,可指定文件路径、是否包含索引、编码等参数。
    1
    2
    3
    4
    5
    # 将数据写入CSV文件,包含索引
    df.to_csv('output.csv', index=True)

    # 将数据写入CSV文件,不包含索引,指定编码为UTF-8
    df.to_csv('output.csv', index=False, encoding='utf-8')
  2. 写入Excel文件

    • 使用to_excel函数将数据写入Excel文件,可指定工作表名称等参数。
    1
    2
    3
    4
    5
    # 将数据写入Excel文件的默认工作表
    df.to_excel('output.xlsx')

    # 将数据写入Excel文件的指定工作表(命名为'Sheet2')
    df.to_excel('output.xlsx', sheet_name='Sheet2')

三、数据查看与基本信息获取

(一)查看数据

  1. 查看前几行数据

    • 使用head方法查看数据框的前几行,默认显示前5行。
    1
    2
    3
    4
    df.head()

    # 查看前10行数据
    df.head(10)
  2. 查看后几行数据

    • 使用tail方法查看数据框的后几行,默认显示后5行。
    1
    2
    3
    4
    df.tail()

    # 查看后3行数据
    df.tail(3)
  3. 随机查看数据

    • 使用sample方法随机查看数据,可指定查看的行数。
    1
    2
    # 随机查看10行数据
    df.sample(10)

(二)获取数据基本信息

  1. 查看数据形状(行数和列数)

    1
    df.shape
  2. 查看数据列名

    1
    df.columns
  3. 查看数据类型

    • 使用dtypes方法查看每列的数据类型。
    1
    df.dtypes
  4. 查看数据统计信息(数值型列)

    • 使用describe方法获取数值型列的统计信息,包括计数、均值、标准差、最小值、最大值等。
    1
    df.describe()

四、数据选择与过滤

(一)按列选择

  1. 选择单列数据

    • 使用列名作为索引选择单列数据,返回一个Series对象。
    1
    column_data = df['column_name']
  2. 选择多列数据

    • 使用列名列表选择多列数据,返回一个DataFrame对象。
    1
    columns_data = df[['column1', 'column2', 'column3']]

(二)按行选择

  1. 基于索引选择单行数据

    • 使用loc方法基于索引标签选择单行数据,返回一个Series对象。
    1
    row_data = df.loc[index_label]
  2. 基于索引选择多行数据

    • 使用loc方法基于索引标签列表选择多行数据,返回一个DataFrame对象。
    1
    rows_data = df.loc[[index_label1, index_label2, index_label3]]
  3. 基于位置选择单行数据

    • 使用iloc方法基于整数位置选择单行数据,返回一个Series对象。
    1
    row_data = df.iloc[row_index]
  4. 基于位置选择多行数据

    • 使用iloc方法基于整数位置范围选择多行数据,返回一个DataFrame对象。
    1
    rows_data = df.iloc[start_row_index:end_row_index]

(三)条件过滤

  1. 基于单个条件过滤数据

    • 使用比较运算符(如><==等)创建布尔条件,然后将条件应用于数据框进行过滤。
    1
    2
    # 选择某列大于特定值的行
    filtered_data = df[df['column_name'] > value]
  2. 基于多个条件过滤数据(使用逻辑运算符)

    • 使用逻辑运算符(如&(与)、|(或))组合多个条件进行过滤。
    1
    2
    # 选择某列大于特定值且另一列等于特定值的行
    filtered_data = df[(df['column1'] > value1) & (df['column2'] == value2)]

五、数据清洗与预处理

(一)处理缺失值

  1. 检查缺失值

    • 使用isnull方法检查数据中的缺失值,返回一个布尔型数据框,True表示缺失值。
    1
    df.isnull()
  2. 删除包含缺失值的行或列

    • 使用dropna方法删除包含缺失值的行或列,可指定axis参数(0表示行,1表示列)和how参数(any表示只要有缺失值就删除,all表示全部为缺失值才删除)。
    1
    2
    3
    4
    5
    # 删除包含缺失值的行
    df.dropna(axis=0, how='any', inplace=True)

    # 删除全为缺失值的列
    df.dropna(axis=1, how='all', inplace=True)
  3. 填充缺失值

    • 使用fillna方法填充缺失值,可指定填充的值或填充方法(如均值、中位数等)。
    1
    2
    3
    4
    5
    # 用特定值填充缺失值
    df.fillna(value, inplace=True)

    # 用均值填充数值型列的缺失值
    df.fillna(df.mean(), inplace=True)

(二)处理重复值

  1. 检查重复值

    • 使用duplicated方法检查数据中的重复行,返回一个布尔型Series,True表示重复行。
    1
    df.duplicated()
  2. 删除重复值

    • 使用drop_duplicates方法删除重复行,可保留第一次出现或最后一次出现的行。
    1
    2
    3
    4
    5
    # 删除重复行,保留第一次出现的行
    df.drop_duplicates(keep='first', inplace=True)

    # 删除重复行,保留最后一次出现的行
    df.drop_duplicates(keep='last', inplace=True)

(三)数据类型转换

  1. 转换列的数据类型

    • 使用astype方法将列的数据类型转换为指定类型,如将字符串类型转换为数值类型。
    1
    df['column_name'] = df['column_name'].astype(int)
  2. 将日期字符串转换为日期类型

    • 使用to_datetime方法将日期字符串列转换为日期类型,可指定日期格式。
    1
    df['date_column'] = pd.to_datetime(df['date_column'], format='%Y-%m-%d')

(四)数据标准化与归一化

  1. 数据标准化(使数据具有零均值和单位方差)

    • 使用StandardScaler类(需从sklearn.preprocessing导入)对数值型列进行标准化。
    1
    2
    3
    4
    5
    from sklearn.preprocessing import StandardScaler

    scaler = StandardScaler()
    scaled_data = scaler.fit_transform(df[['column1', 'column2', 'column3']])
    df[['column1', 'column2', 'column3']] = scaled_data
  2. 数据归一化(将数据映射到特定区间,如[0,1])

    • 使用MinMaxScaler类(需从sklearn.preprocessing导入)对数值型列进行归一化。
    1
    2
    3
    4
    5
    from sklearn.preprocessing import MinMaxScaler

    scaler = MinMaxScaler()
    normalized_data = scaler.fit_transform(df[['column1', 'column2', 'column3']])
    df[['column1', 'column2', 'column3']] = normalized_data

六、数据合并与连接

(一)合并数据框(基于键)

  1. 内连接(取两个数据框的交集)

    • 使用merge函数进行内连接,指定连接键。
    1
    merged_df = pd.merge(df1, df2, on='key_column')
  2. 左连接(以左边数据框为基础,保留所有行,右边数据框匹配不上的用缺失值填充)

    1
    merged_df = pd.merge(df1, df2, on='key_column', how='left')
  3. 右连接(以右边数据框为基础,保留所有行,左边数据框匹配不上的用缺失值填充)

    1
    merged_df = pd.merge(df1, df2, on='key_column', how='right')
  4. 外连接(取两个数据框的并集)

    1
    merged_df = pd.merge(df1, df2, on='key_column', how='outer')

(二)连接数据框(按轴拼接)

  1. 按行拼接(纵向拼接)

    • 使用concat函数按行拼接数据框,可指定轴参数(0表示按行,1表示按列)。
    1
    concatenated_df = pd.concat([df1, df2], axis=0)
  2. 按列拼接(横向拼接)

    • 使用concat函数按列拼接数据框,需确保列数和列名匹配(或使用join='outer'参数进行外连接)。
    1
    concatenated_df = pd.concat([df1, df2], axis=1)

七、数据重塑与透视

(一)数据透视表

  1. 创建简单数据透视表

    • 使用pivot_table函数创建数据透视表,指定索引、列和值。
    1
    pivot_table = df.pivot_table(index='category_column', columns='year_column', values='sales_column')
  2. 添加聚合函数(如求和、平均值等)

    • pivot_table函数中使用aggfunc参数指定聚合函数。
    1
    pivot_table = df.pivot_table(index='category_column', columns='year_column', values='sales_column', aggfunc='sum')

(二)数据堆叠与展开

  1. 堆叠数据(将列转换为行)

    • 使用melt函数将数据框从宽格式转换为长格式,指定id_vars(保持不变的列)和value_vars(要堆叠的列)。
    1
    melted_df = df.melt(id_vars=['id_column'], value_vars=['column1', 'column2', 'column3'])
  2. 展开数据(将行转换为列)

    • 使用pivot函数将长格式数据转换回宽格式,指定索引、列和值。
    1
    pivoted_df = melted_df.pivot(index='id_column', columns='variable', values='value')

八、时间序列处理

(一)日期范围生成

  1. 生成指定频率的日期范围

    • 使用date_range函数生成日期范围,可指定起始日期、结束日期、频率(如D表示天,M表示月,Y表示年等)。
    1
    date_range = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D')

(二)时间序列数据重采样

  1. 按时间频率重采样(如将日数据转换为月数据)

    • 使用resample方法对时间序列数据进行重采样,指定重采样频率和聚合函数。
    1
    resampled_df = df.resample('M', on='date_column').sum()

(三)时间序列数据移动窗口计算

  1. 计算移动平均值

    • 使用rolling方法结合mean函数计算移动平均值,可指定窗口大小。
    1
    moving_avg = df['column_name'].rolling(window=5).mean()

九、数据分组与聚合

(一)分组操作

  1. 按单列分组

    • 使用groupby方法按单列进行分组,返回一个分组对象。
    1
    grouped = df.groupby('category_column')
  2. 按多列分组

    • 使用groupby方法按多列进行分组。
    1
    grouped = df.groupby(['category_column1', 'category_column2'])

(二)聚合操作

  1. 对分组后的数据进行聚合计算(如求和、平均值、计数等)

    • 使用聚合函数(如summeancount等)对分组后的数据进行计算,可对不同列应用不同聚合函数。
    1
    grouped_agg = grouped.agg({'column1': 'sum', 'column2': 'mean', 'column3': 'count'})

十、数据可视化(结合Matplotlib或Seaborn)

(一)简单绘图

  1. 绘制折线图

    • 使用plot方法绘制折线图,可指定x轴和y轴列。
    1
    df.plot(x='x_column', y='y_column', kind='line')
  2. 绘制柱状图

    • 使用plot方法绘制柱状图,可指定柱状图类型(如barbarh表示水平柱状图)。
    1
    df.plot(x='category_column', y='value_column', kind='bar')
  3. 绘制散点图

    • 使用plot方法绘制散点图。
    1
    df.plot(x='x_column', y='y_column', kind='scatter')

(二)高级绘图(结合Seaborn)

  1. 绘制箱线图

    • 使用seaborn库的boxplot函数绘制箱线图,可指定x轴、y轴和数据集。
    1
    2
    3
    import seaborn as sns

    sns.boxplot(x='category_column', y='value_column', data=df)
  2. 绘制热力图

    • 使用seaborn库的heatmap函数绘制热力图,可指定数据矩阵和颜色映射。
    1
    sns.heatmap(df.corr(), annot=True, cmap='coolwarm')

(三)保存绘图

  1. 保存绘制的图形为文件(如PNG、PDF等)

    • 使用savefig方法保存图形,指定文件路径和格式。
    1
    plt.savefig('plot.png', format='png')

十一、数据处理的综合应用示例

(一)数据清洗与分析流程

  1. 读取数据

    • 从文件或数据库读取原始数据。
    1
    df = pd.read_csv('raw_data.csv')
  2. 查看数据信息

    • 查看数据形状、列名、数据类型和统计信息。
    1
    2
    3
    4
    print(df.shape)
    print(df.columns)
    print(df.dtypes)
    print(df.describe())
  3. 数据清洗

    • 处理缺失值

      • 统计每列缺失值数量。
      1
      print(df.isnull().sum())
      • 根据缺失值情况选择合适的处理方法,如删除包含缺失值的行或列,或使用特定值填充缺失值。
      1
      2
      3
      4
      # 删除包含缺失值的行
      df.dropna(inplace=True)
      # 或者使用均值填充某列缺失值(假设为数值列)
      df['column_name'].fillna(df['column_name'].mean(), inplace=True)
    • 处理重复值

      • 查找重复行。
      1
      print(df.duplicated().sum())
      • 删除重复行,保留第一次出现的行。
      1
      df.drop_duplicates(keep='first', inplace=True)
    • 处理异常值

      • 根据数据的分布和业务逻辑,识别并处理异常值。例如,对于数值列,可以使用箱线图来确定异常值范围。
      1
      2
      3
      4
      5
      6
      7
      8
      import matplotlib.pyplot as plt
      plt.boxplot(df['numeric_column'])
      plt.show()
      # 根据箱线图确定异常值范围后删除异常值(假设异常值定义为小于 Q1 - 1.5 * IQR 或大于 Q3 + 1.5 * IQR)
      Q1 = df['numeric_column'].quantile(0.25)
      Q3 = df['numeric_column'].quantile(0.75)
      IQR = Q3 - Q1
      df = df[(df['numeric_column'] >= Q1 - 1.5 * IQR) & (df['numeric_column'] <= Q3 + 1.5 * IQR)]
  4. 数据转换

    • 数据类型转换

      • 根据需要将列的数据类型进行转换。例如,将字符串类型的日期列转换为日期时间类型。
      1
      df['date_column'] = pd.to_datetime(df['date_column'])
    • 特征工程

      • 创建新特征。例如,根据日期列提取年、月、日等信息作为新列。
      1
      2
      3
      df['year'] = df['date_column'].dt.year
      df['month'] = df['date_column'].dt.month
      df['day'] = df['date_column'].dt.day
      • 对数值列进行标准化或归一化处理(例如,使用 Min-Max 归一化将数据映射到 0 到 1 区间)。
      1
      2
      3
      from sklearn.preprocessing import MinMaxScaler
      scaler = MinMaxScaler()
      df[['numeric_column1', 'numeric_column2']] = scaler.fit_transform(df[['numeric_column1', 'numeric_column2']])
  5. 数据分析与探索

    • 单变量分析

      • 对数值列计算基本统计指标(均值、中位数、标准差、偏度、峰度等)。
      1
      2
      3
      4
      5
      print(df['numeric_column'].mean())
      print(df['numeric_column'].median())
      print(df['numeric_column'].std())
      print(df['numeric_column'].skew())
      print(df['numeric_column'].kurtosis())
      • 绘制数值列的分布直方图。
      1
      2
      3
      4
      plt.hist(df['numeric_column'], bins=10)
      plt.xlabel('Value')
      plt.ylabel('Frequency')
      plt.show()
      • 对分类列计算类别分布。
      1
      print(df['category_column'].value_counts())
    • 双变量分析

      • 计算数值列之间的相关性矩阵。
      1
      print(df[['numeric_column1', 'numeric_column2', 'numeric_column3']].corr())
      • 绘制数值列之间的散点图。
      1
      2
      3
      4
      plt.scatter(df['numeric_column1'], df['numeric_column2'])
      plt.xlabel('Numeric Column 1')
      plt.ylabel('Numeric Column 2')
      plt.show()
      • 分析分类列与数值列之间的关系(例如,按分类列分组计算数值列的均值)。
      1
      2
      grouped = df.groupby('category_column')['numeric_column'].mean()
      print(grouped)
    • 多变量分析(例如,使用数据透视表分析多个变量之间的关系)

      1
      2
      pivot_table = df.pivot_table(index='category_column1', columns='category_column2', values='numeric_column', aggfunc='mean')
      print(pivot_table)
  6. 数据可视化

    • 根据数据分析结果选择合适的可视化方式展示数据。
    • 绘制折线图展示时间序列数据的趋势。
    1
    2
    3
    4
    plt.plot(df['date_column'], df['numeric_column'])
    plt.xlabel('Date')
    plt.ylabel('Value')
    plt.show()
    • 绘制柱状图比较不同类别之间的数据差异。
    1
    2
    3
    4
    5
    plt.bar(df['category_column'], df['numeric_column'])
    plt.xlabel('Category')
    plt.ylabel('Value')
    plt.xticks(rotation=45)
    plt.show()
    • 绘制箱线图展示数值列的分布情况及异常值。
    1
    2
    3
    plt.boxplot(df['numeric_column'])
    plt.ylabel('Value')
    plt.show()
    • 绘制饼图展示分类列的类别占比。
    1
    2
    3
    plt.pie(df['category_column'].value_counts(), labels=df['category_column'].value_counts().index, autopct='%1.1f%%')
    plt.axis('equal')
    plt.show()
  7. 模型构建与评估(如果适用)

    • 根据分析目的选择合适的机器学习模型(如回归模型、分类模型等)。
    • 划分训练集和测试集。
    1
    2
    3
    4
    from sklearn.model_selection import train_test_split
    X = df.drop('target_column', axis=1)
    y = df['target_column']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    • 训练模型(以线性回归为例)。
    1
    2
    3
    from sklearn.linear_model import LinearRegression
    model = LinearRegression()
    model.fit(X_train, y_train)
    • 在测试集上进行预测。
    1
    y_pred = model.predict(X_test)
    • 评估模型性能(例如,使用均方误差、准确率等指标)。
    1
    2
    3
    4
    5
    6
    from sklearn.metrics import mean_squared_error, accuracy_score
    mse = mean_squared_error(y_test, y_pred)
    print(f"Mean Squared Error: {mse}")
    # 如果是分类问题,计算准确率
    # accuracy = accuracy_score(y_test, y_pred)
    # print(f"Accuracy: {accuracy}")

使用Pandas进行数据分析的实际案例

案例一:销售数据分析

1. 背景介绍

某公司销售部门希望通过分析销售数据,了解销售趋势、产品销售情况以及客户购买行为,以便制定更有效的营销策略和库存管理策略。

2. 数据准备

  • 数据来源:包含销售订单信息的CSV文件,字段包括订单日期、产品ID、产品名称、销售数量、销售单价、客户ID、客户名称等。
  • 读取数据:
1
2
3
import pandas as pd

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

3. 数据分析步骤

数据清洗

  • 检查缺失值:
1
print(df.isnull().sum())
  • 处理缺失值(例如,删除包含缺失值的行或根据业务逻辑填充缺失值):
1
2
# 删除包含缺失值的行
df.dropna(inplace=True)
  • 检查重复值:
1
print(df.duplicated().sum())
  • 删除重复值:
1
df.drop_duplicates(inplace=True)

数据转换

  • 将订单日期列转换为日期类型:
1
df['订单日期'] = pd.to_datetime(df['订单日期'])
  • 计算销售总额列:
1
df['销售总额'] = df['销售数量'] * df['销售单价']

数据分析与探索

  • 按产品分析销售情况
    • 计算每个产品的销售总额:
1
2
product_sales = df.groupby('产品名称')['销售总额'].sum().sort_values(ascending=False)
print(product_sales)
  • 绘制产品销售总额的柱状图(使用Matplotlib或Seaborn):
1
2
3
4
5
6
7
import matplotlib.pyplot as plt

plt.bar(product_sales.index, product_sales.values)
plt.xticks(rotation=90)
plt.xlabel('产品名称')
plt.ylabel('销售总额')
plt.show()
  • 按时间分析销售趋势
    • 按月份汇总销售总额:
1
2
3
df['月份'] = df['订单日期'].dt.month
monthly_sales = df.groupby('月份')['销售总额'].sum()
print(monthly_sales)
  • 绘制销售趋势折线图:
1
2
3
4
plt.plot(monthly_sales.index, monthly_sales.values)
plt.xlabel('月份')
plt.ylabel('销售总额')
plt.show()
  • 分析客户购买行为
    • 计算每个客户的购买次数和总消费金额:
1
2
3
customer_behavior = df.groupby('客户名称').agg({'订单ID': 'count', '销售总额': 'sum'})
customer_behavior.rename(columns={'订单ID': '购买次数'}, inplace=True)
print(customer_behavior)
  • 找出消费金额最高的前10名客户:
1
2
top_customers = customer_behavior.sort_values('销售总额', ascending=False).head(10)
print(top_customers)

案例二:学生成绩数据分析

1. 背景介绍

学校教务部门想要分析学生的考试成绩,评估教学质量,发现学生学习中的问题,并为教学改进提供依据。

2. 数据准备

  • 数据来源:包含学生成绩信息的Excel文件,包括学生ID、姓名、科目、成绩等字段。
  • 读取数据:
1
2
3
import pandas as pd

df = pd.read_excel('student_scores.xlsx')

3. 数据分析步骤

数据清洗

  • 检查数据类型是否正确,如有错误进行转换。例如,成绩列可能被错误识别为字符串类型,需要转换为数值类型:
1
df['成绩'] = df['成绩'].astype(int)
  • 处理异常值(例如,成绩超出合理范围的值):
1
2
# 假设成绩合理范围为0到100
df = df[(df['成绩'] >= 0) & (df['成绩'] <= 100)]

数据分析与探索

  • 整体成绩分布分析
    • 绘制成绩分布直方图:
1
2
3
4
5
6
import matplotlib.pyplot as plt

plt.hist(df['成绩'], bins=10)
plt.xlabel('成绩')
plt.ylabel('学生人数')
plt.show()
  • 计算成绩的统计指标(均值、中位数、标准差等):
1
print(df['成绩'].describe())
  • 按科目分析成绩
    • 计算每个科目的平均成绩、最高分和最低分:
1
2
subject_stats = df.groupby('科目').agg({'成绩': ['mean', 'max', 'min']})
print(subject_stats)
  • 比较不同科目成绩的差异(例如,使用箱线图):
1
2
3
4
import seaborn as sns

sns.boxplot(x='科目', y='成绩', data=df)
plt.show()
  • 学生个体成绩分析
    • 计算每个学生的平均成绩:
1
2
student_avg_scores = df.groupby('学生ID')['成绩'].mean().sort_values(ascending=False)
print(student_avg_scores)
  • 找出成绩波动较大的学生(例如,通过计算成绩的标准差):
1
2
student_score_std = df.groupby('学生ID')['成绩'].std().sort_values(ascending=False)
print(student_score_std)

案例三:股票价格数据分析

1. 背景介绍

投资者希望通过分析股票价格数据,了解股票价格走势、波动情况以及不同股票之间的相关性,为投资决策提供参考。

2. 数据准备

  • 数据来源:从金融数据平台获取股票价格的CSV文件,包含日期、股票代码、开盘价、最高价、最低价、收盘价、成交量等字段。
  • 读取数据:
1
2
3
import pandas as pd

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

3. 数据分析步骤

数据清洗

  • 处理缺失值(例如,某些日期可能没有交易数据,根据业务需求选择合适的处理方法,如向前填充或向后填充):
1
df.fillna(method='ffill', inplace=True)
  • 检查数据的一致性(例如,确保股票代码的唯一性和正确性):
1
print(df['股票代码'].nunique())

数据分析与探索

  • 股票价格走势分析
    • 绘制单个股票价格随时间变化的折线图(以某只股票为例):
1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt

stock_df = df[df['股票代码'] == 'AAPL']
plt.plot(stock_df['日期'], stock_df['收盘价'])
plt.xlabel('日期')
plt.ylabel('收盘价')
plt.title('AAPL股票价格走势')
plt.show()
  • 计算股票价格的移动平均线(例如,5日移动平均线和20日移动平均线),并绘制在同一图表中:
1
2
3
4
5
6
7
8
9
10
stock_df['5日均线'] = stock_df['收盘价'].rolling(window=5).mean()
stock_df['20日均线'] = stock_df['收盘价'].rolling(window=20).mean()
plt.plot(stock_df['日期'], stock_df['收盘价'])
plt.plot(stock_df['日期'], stock_df['5日均线'])
plt.plot(stock_df['日期'], stock_df['20日均线'])
plt.xlabel('日期')
plt.ylabel('收盘价')
plt.title('AAPL股票价格走势及移动平均线')
plt.legend(['收盘价', '5日均线', '20日均线'])
plt.show()
  • 股票价格波动分析
    • 计算股票价格的日收益率(使用对数收益率公式):
1
df['日收益率'] = np.log(df['收盘价'] / df['收盘价'].shift(1))
  • 分析日收益率的分布(例如,绘制直方图和计算统计指标):
1
2
3
4
5
plt.hist(df['日收益率'].dropna(), bins=50)
plt.xlabel('日收益率')
plt.ylabel('频率')
plt.show()
print(df['日收益率'].describe())
  • 股票相关性分析
    • 选择几只感兴趣的股票,计算它们收盘价之间的相关性矩阵:
1
2
3
selected_stocks = df[df['股票代码'].isin(['AAPL', 'MSFT', 'GOOG'])]
correlation_matrix = selected_stocks.pivot_table(index='日期', columns='股票代码', values='收盘价').corr()
print(correlation_matrix)
  • 使用热力图可视化相关性矩阵:
1
2
3
4
import seaborn as sns

sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.show()