Datawhale Task2(第二届世界科学智能大赛社会科学赛道-时间序列挖掘+ABM构建)学习笔记


原文阅读链接:https://linklearner.com/activity/12/2/9

学习目的:EDA技巧及ABM基础理论与搭建

EDA分析

基础性探索分析

基础探索性分析包括:缺失值统计、常用统计指标、异常值统计分析、数据整体分布,对于所有数据类任务都应该进行。

缺失值统计可以使用pandas的info或isna结合sum的方法进行分析,对应有前项填充、后项填充、均值填充等方法进行缺失值处理

常用指标统计一般使用pandas的describe方法进行快速查看,本文章中使用以下方法:

  • 中心趋势
    • 均值:df[feature].mean()
    • 中位数 df[feature].median()
    • 最大值 df[feature].max()
    • 最小值 df[feature].min()
    • 众数 df[feature].mode()
  • 变异程度
    • 标准差 df[feature].std()
    • 极差 df[feature].apply(lambda x: x.max() - x.min())
    • 四分位数 df[feature].quantile([0.25, 0.5, 0.75])
    • 变异系数 df[feature].std()/df[feature].mean()
    • 偏度和峰度 df[feature].skew(), df[feature].kurtosis()
  • 变化率:df[feature].pct_change() 计算公式为 x 2 − x 1 x 1 \dfrac{x_2-x_1}{x_1} x1x2x1

异常值统计可通过分析常用指标统计与统计分布进行初步判断,发现异常值后进行对于查询和处理

数据整体分布一般通过绘制条形图查看,对应使用matplotlib.pyplot的hist或者pandas中的hist方法进行绘制,本文章使用seaborn函数进行绘制,相较于前两项拥有更丰富的图形显示能力,原码如下(设置dke值):

# 使用 Seaborn 库绘制总负荷数值的分布图
# sns.displot(...) 函数用于绘制数据的分布图
ax = sns.displot(
    electricity_price,  # 输入数据,包含绘制所需的列
    x="demand",         # 指定绘图的列,这里是 "demand" 列
    aspect=1.5,         # 图形的宽高比,1.5 表示宽度是高度的 1.5 倍
    height=5,           # 图形的高度设置为 5 英寸
    kde=True            # 启用核密度估计(KDE),用于绘制数据的平滑概率密度曲线
)

# 设置图形的标题
ax.set(title="总负荷数值分布")

时序数据分析

本文章使用数据为时序数据,因此目标值可能与时间周期相关,包括小时、天、周、月、年等不同尺度,pandas的datetime格式能方便的对相应的时间进行提取:

# 从 DataFrame 的索引中提取时间信息,并添加为新的列
# 假设索引为 DatetimeIndex 类型

# 提取小时信息,并创建一个新列 "hour"
electricity_price["hour"] = electricity_price.index.hour
# 提取月份信息,并创建一个新列 "month"
electricity_price["month"] = electricity_price.index.month
# 提取日期信息,并创建一个新列 "day"
electricity_price["day"] = electricity_price.index.day
# 提取星期几的信息(0 = 周一, 6 = 周日),并创建一个新列 "weekday"
electricity_price["weekday"] = electricity_price.index.weekday
# 提取年份信息,并创建一个新列 "year"
electricity_price["year"] = electricity_price.index.year

文章中还结合透视表与seaborn绘制热力图,对数据能有更加直观的体现:

# 创建一个透视表,计算不同月份和时间下的电价
pivot = pd.pivot_table(
    electricity_price,          # 输入的 DataFrame
    values="price",             # 透视表中要填充的值,这里是 "price"
    index="month",              # 设置行索引为月份
    columns="hour"              # 设置列索引为小时
)

# 将透视表中的数据类型转换为整数
pivot = pivot.astype(int)
# 创建一个图形,大小为 17x10 英寸
plt.figure(figsize=(17, 10))

# 绘制热图,显示不同月份和时间下的电价
sns.heatmap(
    pivot,                      # 透视表数据
    cmap="coolwarm",            # 使用 "coolwarm" 调色板,显示热图的颜色
    linewidths=0.5,             # 设置单元格之间的分隔线宽度为 0.5
    annot=True,                 # 启用单元格值的注释
    fmt=".0f",                  # 注释的格式为整数
    annot_kws={"size": 12,      # 注释文本的大小设置为 12
               "weight": "bold",  # 注释文本的字体加粗
               "color": "black"}  # 注释文本的颜色为黑色
)

# 设置图形的标题
plt.title("不同月份和时间下的电价")

自定义分析

对负电价与高电价进行具体的探索性分析

对demand与price两边量进行相关性分析,使用corr方法计算相关系数,使用seaborn绘制两量变的散点分布图,其中设置lowess能直观的拟合数据间关系

# 创建一个图形,大小为 8x10 英寸
plt.figure(figsize=(8, 10))

# 绘制回归图(散点图及拟合线)
sns.regplot(
    data=electricity_price.loc["2022"],  # 选择2022年的数据
    x="demand",                         # x 轴的变量为 "demand"
    y="price",                          # y 轴的变量为 "price"
    scatter_kws={                       # 设置散点图的样式
        "s": 0.5,                      # 散点的大小设置为 0.5
        "alpha": 0.6,                  # 散点的透明度设置为 0.6
        "color": "black"               # 散点的颜色设置为黑色
    },
    color="red",                        # 拟合线的颜色设置为红色
    lowess=True                          # 启用局部加权回归(Lowess)以拟合数据
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值