jjzjj

第十一届泰迪杯数据挖掘挑战赛-产品订单数据分析B题(完整代码)--数据处理--第一部分(下一部分请看下一博客)

Hole~ 2023-06-11 原文

需要解决的问题

1. 请对附件中的训练数据(order_train1.csv)进行深入地分析,可参照但不限于下述主题。

(1) 产品的不同价格对需求量的影响;

(2) 产品所在区域对需求量的影响,以及不同区域的产品需求量有何特性;

(3) 不同销售方式(线上和线下)的产品需求量的特性;

(4) 不同品类之间的产品需求量有何不同点和共同点;

(5) 不同时间段(例如月头、月中、月末等)产品需求量有何特性;

(6) 节假日对产品需求量的影响;

(7) 促销(如618、双十一等)对产品需求量的影响;

(8) 季节因素对产品需求量的影响。

2. 基于上述分析,建立数学模型,对附件预测数据(predict_sku1.csv)中给出的产品,预测未来3月(即2019年1月、2月、3月)的月需求量,将预测结果按照表3的格式保存为文件result1.xlsx,与论文一起提交。请分别按天、周、月的时间粒度进行预测,试分析不同的预测粒度对预测精度会产生什么样的影响。

**本文是运用jupyter notebook来撰写代码**

代码私聊获取,平台不能放链接

移步社区获取完整代码

 

数据处理

#导入需要的库
import pandas as pd          
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime    
from pandas import Series 
from sklearn.metrics import mean_squared_error
from math import sqrt
from statsmodels.tsa.seasonal import seasonal_decompose
import statsmodels
import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARIMA
%matplotlib inline
plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
import seaborn as sns
df = pd.read_csv("order_train0.csv")#访问数据

#从上方可以看出,价格最大值去到47911,最大需求去到12480,远大于一般商品

#查看价格分布、需求分布状况

 #检验数据是否呈现正态分布

 #检验数据是否呈现正态分布
def KsNormDetect(df):   # 输出结果是服从正态分布的数据列的名字
    from scipy.stats import kstest
    list_norm_T = []   # 用来储存服从正态分布的数据列的名字
    for col in df.columns:
        ***********        # 计算均值
        ***********        # 计算标准差
        ***********        # 计算P值
        if res>=0.05:             # 判断p值是否服从正态分布,p<=0.05 则服从正态分布,否则不服从
            print(f'{col}该列数据不服从正态分布------')
            print('均值为:%.3f,标准差为:%.3f' % (u, std))
            print('-'*40)
            **************           
        else:                                # 这一段实际上没什么必要
            print(f'!!!{col}该列数据服从正态分布**********')
            print('均值为:%.3f,标准差为:%.3f' % (u, std))
            print('*'*40)
KsNormDetect(df[['item_price', 'ord_qty']])

 

# 对待处理数据中心服从正态分布的数据列
def three_sigma(Ser1):  # Ser1:表示传入DataFrame的某一列
    rule = []
    ***********************
    ***********************
    print(len(out))
    return out          # 返回落在3sigma之外的行索引值

def delete_out3sigma(data, list_norm):  # data:待检测的DataFrame;list_norm:服从正态分布的数据列名
    out_index = []                      # 保存要删除的行索引
    for col in list_norm:            # 对每一列分别用3sigma原则处理
        ***************************
        ***************************
    ******************  # 去除 out_index 中的重复元素
    print(f'\n所删除的行索引共计{len(delete_)}个:\n',delete_)
    data = data.drop(delete_,inplace=True) # 根据 delete_ 删除对应行的数据
    df = data
    return df

delete_out3sigma(df,['item_price','ord_qty'])

 

 

从上图看出数据并不服从正态分布

 

 #再次查看分布状况

 

 #查看数据具体值状况

#更改日期类型为datatime类型
df["order_date"]=df["order_date"].apply(pd.to_datetime,format='%Y-%m-%d')

#查看数据情况

 #对sales_chan_name进行处理

dic = {"offline":1,"online":0}
df['sales_chan_name'] = df['sales_chan_name'].map(dic)

 #时间特征添加

对日期时间进行时间特征处理,而时间特征包括年、季度、月、周、天(一年、一月、一周的第几天)

时间戳衍生中,另一常用的方法为布尔特征,即:

    是否年初/年末

    是否月初/月末

    是否周末

    是否节假日

    是否特殊日期

    是否早上/中午/晚上

上述都有具体的函数,可以去pandas官网上查找,有源码解释

这里为了方便处理节假日,需要安装chinesecalendar库

import chinese_calendar
df['Year'] = df.order_date.dt.year
df['Month'] = df.order_date.dt.month
df['day'] = df.order_date.dt.day

df["day of the week"] = df.order_date.dt.dayofweek 
def applyer(df_row):
    if ******************:
        return 1
    else:
        return 0
temp1 = df["order_date"]
temp2 = df.order_date.********
temp2["weekend"] = temp2
df.index = df["order_date"]

df["quarter"] = *********
df['is_month_start'] = **********
df['is_month_end'] = ************
df['is_quarter_start'] = ********
df['is_quarter_end'] = *********
df['is_year_start'] = **********
df['is_year_end'] =************
df['is_workday']=df['order_date'].map(***********)
df["is_holiday"]=df["order_date"].map(***********)

#上述运行后是以布尔值出现的,需要换成0 1 形式

for u in df.columns:
    ***********
        **********
df

#添加销售额
df["sales"] = (df["ord_qty"])*(df["item_price"])
df.to_csv("df_sales_.csv")#保存文件,方便后续使用

 数据探索

sales_data = df  #养成习惯,每当进行下一环节时,更改变量,以便失误可以返回来调取数据
quantitative_variable = **********
sales_data[quantitative_variable].plot(***********,figsize=(15,15))
plt.show()

plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
#频率分布
*********************************
plt.figure(figsize=(16,8))
region.plot(**********************)
plt.title("地区频率分布",fontsize=20)
plt.show()

 

#查看时间序列是否完整

 可以发现不完整,2015年只有4个月的数据

月度信息将进行进一步分析

#月收入状况
plt.figure(figsize=(16,8))

monthly_revenue = sales_data.groupby(['Year','Month'])['sales'].sum().reset_index()
sns.lineplot(x="Month", y="sales",hue="Year", data = monthly_revenue)
plt.xlabel('Month',fontsize = 20)
plt.ylabel('Sales',fontsize = 20)
plt.title('月收入',fontsize = 20)
plt.show()

数据显示,2016年,2017年的销售额在10月左右达到峰值,1、3月份也有大幅度回升,2018年在1月达到最大值,3月、10月也有大幅度回升。 这可能是因为当时有许多庆祝活动和节日(感恩节、万圣节、国庆节、春节等)。

我们没有足够的2015年数据,但现有数据显示

plt.figure(figsize=(16,8))

****************************************
['sales'].sum().reset_index()
****************************************
plt.xlabel('Year',fontsize = 20)
plt.ylabel('Sales',fontsize = 20)
plt.title('年-月初收入',fontsize = 20)
plt.show()

 

 

 

 

......

......

 上述代码可以相同,以此类推,看自己需要去更换变量

#周一到周末的销售情况
sales_data['order_date'].dt.dayofweek
plt.figure(figsize=(16,8))
**************************
plt.title('周一-周日的销售情况',fontsize = 20)
**************************
plt.xlabel('Day of Week')
plt.ylabel('订单')
plt.plot()

 

 

#节假日销售情况
plt.figure(figsize=(16,8))
**************************
**************************
**************************
plt.xlabel('节假日',fontsize = 15)
plt.ylabel('订单',fontsize = 15)
plt.plot()

 

 可以看出地区销售量状况中,105销售最多,其次是102,101,103,1104

 

 

 

 

 .........

..........

以此类推,根据自己需求去更换变量

##########################################

热编码看个人需要情况,个人觉得热编码后对后续的预测也没多大用处

dic1 = {101:"地区1",102:"地区2",103:"地区3",104:"地区4",105:"地区5"}
dic2 = {301:"大类别1",302:"大类别2",303:"大类别3",304:"大类别4",305:"大类别5",306:"大类别6",307:"类别7",308:"大类别8"}
dic3 = {401:"细类别1",402:"细类别2",403:"细类别3",404:"细类别4",405:"细类别5",406:"细类别6",407:"细类别7",408:"细类别8",409:"细类别9",410:"细类别10",411:"细类别11",412:"细类别12"}
sales_data['sales_region_code'] = ********
sales_data['first_cate_code'] = ***********
sales_data['second_cate_code'] =*********

#热编码
************************************
sales_data_dummies = sales_data_dummies.drop(["sales_chan_name"],axis=1)

#将热编码后的数据与原数据结合
*******************
n_sales_data.columns
#绘制热力图
plt.figure(figsize = (40,40))
**********************
sns.heatmap(corr_matrix, annot = True)

 

 

更精彩还在后续-敬请关注“哒哒的马蹄”下一博客

 

 

 

 

 

 

 

 

 

有关第十一届泰迪杯数据挖掘挑战赛-产品订单数据分析B题(完整代码)--数据处理--第一部分(下一部分请看下一博客)的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  4. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  5. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  6. ETH 徘徊在 1,700 美元附近;下一步是什么? - 2

    以太坊价格分析表明横盘整理,偏向中性。价格从前一交易日的高点1,791美元回落后正在盘整。但是,有趣的是,多头在1,680美元附近持有重要支撑。多头在1,700美元的心理水平附近聚集动能,并准备在接下来的几个交易日推向1,800美元。以太坊价格显示出盘整迹象,因为它形成了多个连续的顶部形态。这种回撤可能是第二大加密货币下一轮上涨的基石。以太坊连续第二个交易日走低。过去10天,价格在1,590-1,760美元的短期区间内盘整。每日烛台高于1,800美元将维持ETH的进一步上涨。ETH价格走低日线图上,以太坊价格在上升趋势线附近获得一轮支撑。来自879.80美元低点的看涨趋势线为ETH买家提供了支

  7. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  8. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  9. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  10. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

随机推荐