问题背景概述:
M公司在20座城市拥有门店,销售A、B、C三种产品。现有2014年1月至2016年12月(共计三年,36个月)以来,每个城市每月每产品的销量数据,意在预测2017年度每城市每月每产品的销量。
解决方案:
本题拟对城市-产品分组建模,对20个城市-3种产品共建立60个时间序列模型。
读入数据并使用匿名函数转换时间变量:
data = read_csv("sales_data.csv",encoding= "gbk")
data["month"] = data["month"].apply(lambda x:datetime.datetime.strptime(x,'%Y-%m'))
data["month"]是dataframe里的一列,是series类型,如果想对其中每一个值进行操作,需要遍历读取。此处使用的方法是apply(lambda函数)。
分组:
grouped = data.groupby(["city","product"])
data共四列,分别是city,product,time,Q
grouped 变量作为groupby函数的输出,是一个二元组。其中的0号元素是又一个二元组,代表分组的组别标签,如(北京市,A产品);其中的1号元素是一个dataframe,是该组内的所有记录,如(北京市,A产品,2015年6月,5664件)。如下所示:
(北京市,A产品) |
| ||||||||||||
考虑到访问元组只能通过遍历或索引的形式,可能带来不便,故将其转换为字典:键是二元组(city,product),值是该城市该产品的记录。完成后画销量折线图。
sale_dict = {}
for i in grouped:
sale_dict[i[0]]=i[1]
#利用键访问分组后的记录并再次按年份分组画图
for lable in sale_dict:
df = sale_dict[lable]
plt.figure(figsize= (20,10),dpi=100)
for i in df.groupby(["year"]):
plt.plot(i[1]["month"],i[1]["quantity"])
plt.savefig("fig/{}.jpg".format(lable))
得到折线图如下:蓝色代表2014年12个月的销量。黄色代表2015年12个月的销量。绿色代表2016年12个月的销量。
60张图片看下来没一个时间序列是平稳的。。。服了。不过年年销量走向都差不多,说明有明显的季节性。接下来挑出一个城市的一个产品为例具体建模。