深度学习--项目提炼2(线性回归模型)
预测2018年,11月和12月的销售额
1 import glob #读文件 2 import os #设置工作路径 3 import pandas as pd 4 import re #正则表达式 5 import numpy as np 6 import datetime as dt #时间包 7 from sklearn.linear_model import LinearRegression 8 import seaborn as sns 9 from matplotlib import pyplot as plt 10 import jieba #分词 11 import jieba.analyse 12 import imageio #配合做词云的 13 from wordcloud import WordCloud #词云 14 15 #windows 中文编码 16 plt.rcParams['font.sans-serif']='simhei' 17 plt.rcParams['axes.unicode_minus']=False 18 19 sns.set_style("darkgrid",{"font.sans-serif":['simhei','Droid Sans Fallback']}) 20 os.chdir(r'C:\Users\Administrator\Downloads\模块三资料\模块三资料\模块三代码文件\code\综合项目(电商文本挖掘)\data') 21 os.chdir('./驱虫剂市场') 22 filenames = glob.glob('*市场近三年交易额.xlsx') #列表 23 24 25 26 def load_xlsx(filename): 27 # 抽取子类目的名字 28 colname = re.search(r'.*(?=市场)', filename).group() 29 # 读取文件 30 df = pd.read_excel(filename) 31 # 修改日期的格式 32 if df['时间'].dtypes == 'int64': 33 df['时间'] = pd.to_datetime(df['时间'], unit='D', origin=pd.Timestamp('1899-12-30')) 34 35 # 重命名列名为子类目名 36 df.rename(columns={df.columns[1]: colname}, inplace=True) 37 38 # 设置时间列作为索引 39 df = df.set_index('时间') 40 return df 41 dfs = [load_xlsx(i) for i in filenames] 42 df = pd.concat(dfs,axis=1).reset_index() #时间从大到小排序 43 month = df['时间'].dt.month 44 # 预测2018年 11、12月的数据 45 def momth_data(df,month): 46 for i in [11, 12]: 47 # 抽取对月份的数据 48 dm = df[month == i] # 2015.11 2016.11 2017.11 49 # 训练x是年份 50 xtrain = np.array(dm['时间'].dt.year).reshape(-1, 1) 51 print(xtrain)#[[2017][2016][2015]] 52 # 测试y是新增的行,对应的日期 53 ytest = [pd.datetime(2018, i, 1)] #[datetime.datetime(2018, 12, 1, 0, 0)] 54 print(ytest) 55 print(dm.columns)#Index(['时间', '灭鼠杀虫剂', '电蚊香套装', '盘香灭蟑香蚊香盘', '蚊香加热器', '蚊香液', '蚊香片', '防霉防蛀片'], dtype='object') 56 57 for j in range(1, len(dm.columns)):#1,2,3,4,5,6,7,每一列 58 print(j) 59 # 训练y是指定的列 60 ytrain = np.array(dm.iloc[:, j]).reshape(-1, 1) 61 # 回归建模 62 lm = LinearRegression().fit(xtrain, ytrain) 63 # 预测当测试x为2018时销售额 yhat 64 yhat = lm.predict(np.array([2018]).reshape(-1, 1)) 65 ytest.append(round(yhat[0][0], 2)) 66 # 给预测结果赋值对应的列名 67 newrow = pd.DataFrame([dict(zip(df.columns, ytest))]) 68 # 预测结果行加在数据前 69 df = newrow.append(df) 70 momth_data(df,month) 71 72 df.reset_index(drop=True,inplace=True) 73 df = df[df['时间'].dt.year != 2015] 74 df['colsums'] = df.sum(1) #取值第一列。交易金额总和列 :灭鼠杀虫剂 2.469394e+09 75 76 df.insert(1,'year',df['时间'].dt.year) #年份列
图表分析
近三年的市场趋势
1 byyear = df.groupby('year').sum().reset_index() 2 sns.relplot('year','colsums',kind='line',marker='o',data=byyear,height=4) 3 plt.title('近三年的市场趋势') 4 plt.xticks(byyear.year,rotation=45) 5 plt.xlabel('年份') 6 plt.ylabel('总交易额') 7 plt.show()
近三年各类市场销售趋势
1 f,ax = plt.subplots(figsize=(10,6)) 2 #dashes=False 不区分线型 3 sns.lineplot(data=byyear.set_index('year').iloc[:,:-1],dashes=False,marker='^') 4 plt.title('近三年各类市场销售趋势') 5 plt.xticks(byyear.year,rotation=45) 6 #在指定位置加文本 7 for a,b in zip(byyear.year,byyear['灭鼠杀虫剂']): 8 plt.text(a,b,'%.3e'% b, ha='center',va='bottom',size=12) 9 10 plt.xlabel('年份') 11 plt.ylabel('总交易额') 12 plt.show()
灭鼠杀虫剂近三年的增长趋势
1 g = sns.FacetGrid(byyear,height=5) 2 g.map(sns.barplot,'year','灭鼠杀虫剂',color='wheat') 3 g.map(sns.pointplot,'year','灭鼠杀虫剂') 4 5 for a,b in zip(range(len(byyear)),byyear['灭鼠杀虫剂']): 6 plt.text(a,b,'%.3e'% b, ha='center',va='bottom',size=12) 7 8 plt.xlabel('年份') 9 plt.ylabel('灭鼠杀虫剂近三年的增长趋势') 10 plt.xticks(rotation=45) 11 plt.show()
计算每年每个子市场的比例
1 byyear_per = byyear.iloc[:,1:-1].div(byyear.colsums,axis=0) 2 byyear_per.index = byyear.year 3 byyear_per 4 #stacked=True 5 byyear_per.plot(kind='bar',stacked=True,figsize=(10,8),colormap='tab10') 6 7 for a,b in zip(range(len(byyear_per)),byyear_per['灭鼠杀虫剂']): 8 plt.text(a,b/2,f'{b*100:.2f}%', ha='center',va='bottom',size=12,color='white') 9 10 11 plt.xlabel('年份') 12 plt.ylabel('总交易额占比') 13 plt.title('近三年各子类市场销量占比') 14 plt.show()
近三年各子类市场销量年增幅
1 #拿到中间7列 2 byyear0 = byyear.iloc[:,1:-1] 3 byyear0.diff()#一阶差分 17-16 18-17 4 5 #计算年增幅 6 byyear0 = byyear.iloc[:,1:-1] 7 byyear_diff = byyear0.diff().iloc[1:,:].reset_index(drop=True)/byyear0.iloc[:2,:] 8 byyear_diff.index = ['16-17','17-18'] 9 byyear_diff 10 11 #作图查看 12 f,ax = plt.subplots(figsize=(10,8)) 13 sns.lineplot(data=byyear_diff,dashes=False) 14 plt.title('近三年各子类市场销量年增幅') 15 16 plt.xlabel('年份') 17 plt.ylabel('总交易额年增幅') 18 plt.show()
交易指数占比
df1 = pd.read_excel('top100品牌数据.xlsx') df1.isna().mean() df1['交易指数占比'] = df1['交易指数']/df1['交易指数'].sum() df1.plot(x='品牌',y='交易指数占比',kind='bar',figsize=(15,5)) plt.show()
# HHI 市场集中度,俗称垄断程度,市场占有率 HHI = sum(df1['交易指数占比']**2) print(HHI) #0.013546334007208914
合并所有文件
1 ilename1 = glob.glob('*.xlsx') 2 dfs1 = [pd.read_excel(i) for i in filename1] 3 df2 = pd.concat(dfs1,sort=False)
删除缺失值大于56%的列
1 df2 = pd.read_excel(r"C:\Users\Administrator\Documents\WeChat Files\wxid_bexgq4nmz5cs22\FileStorage\File\2021-12\安全图书(1)(1)(1).xlsx",sheet_name="Sheet1") 2 ind1 = df2.isna().mean()> 0.56 # 列的缺失值的平均数大于56% 3 df20 = df2.loc[:,~ind1] # 重新赋值
ind2 = np.array([len(df20[i].unique()) == 1 for i in df20.columns]) df21 = df20.loc[:,~ind2]
列索引
ind3 = df21.columns.get_loc('出版社') #列索引 df22 = df21.iloc[:,:ind3]
删除
1 df21 = pd.read_excel(r"C:\Users\Administrator\Documents\WeChat Files\wxid_bexgq4nmz5cs22\FileStorage\File\2021-12\安全图书(1)(1)(1).xlsx",sheet_name="Sheet1") 2 df21.drop(columns="书名") 3 df21.drop(index=0)
转类型
1 df23 = df23.astype({'宝贝ID':'object'}) #将宝贝ID转成object 2 df23.reset_index(drop=True,inplace=True)
画图技巧
byclass.plot.barh()
byclass.plot.pie(autopct='%.2f')
df24['售价'].plot.hist()
1 df25 = df24[df24['价格区间']=='0_50'] 2 df25['售价'].plot.hist()
交互饼形图
import plotly.graph_objects as go #交互图形 类似于PowerBI fig = go.Figure(data=[go.Pie(labels=byclass.index,values=byclass.values)]) fig.show()
同时画三个饼图
1 #饼图 [0,1,2],bai31、an31、kl31都是Dateframe 数据 2 fig,axes = plt.subplots(1,3,figsize=(10,6)) 3 ax = axes[0] #第一个拜耳 4 bai31['销售额'].plot.pie(autopct='%.f',title='拜耳',startangle=30,ax=ax) 5 ax.set_ylabel('') 6 ax = axes[1] #第二个安速 7 an31['30天销售额'].plot.pie(autopct='%.f',title='安速',startangle=60,ax=ax) 8 ax.set_ylabel('') 9 ax = axes[2] #第三个科凌虫控 10 kl31['30天销售额'].plot.pie(autopct='%.f',title='科凌虫控',startangle=90,ax=ax) 11 ax.set_ylabel('')
分箱操作
data = pd.read_excel(r"C:\Users\Administrator\Desktop\安全图书.xlsx") print(data["价格"]) #自定义分箱 bins = [0,40,80,120] #分界线 labels = ['0_40','40_80','80_120']#箱子的标题 # #pd.cut include_lowest (0,50] ---> [0,50] 左右都是闭区间 data['价格区间'] = pd.cut(data['价格'],bins,labels=labels,include_lowest=True) print(data['价格区间'].value_counts())
结果:
0_40 11
40_80 3
80_120 2
Name: 价格区间, dtype: int64
相对竞争度
1 byc['相对竞争度'] = 1- (byc['单宝贝平均销售额']-byc['单宝贝平均销售额'].min())/( 2 byc['单宝贝平均销售额'].max()-byc['单宝贝平均销售额'].min())
前5%的价格
1 bytype1 = df21[df21['价格']>=df21['价格'].quantile(0.95)]
取排名前十
top10 = df0.sort_values('交易指数',ascending=False).reset_index(drop=True).iloc[:10,:]
value_counts().count() 总数
df['书名'].value_counts().count()
loc[:, '价格']与 loc[:, ['价格']的区别
loc[:, '价格'] 结果:
loc[:,['价格']]结果:
mask 替换,deacrib方法
1 df = pd.read_excel(r"C:\Users\Administrator\Documents\WeChat Files\wxid_bexgq4nmz5cs22\FileStorage\File\2021-12\安全图书(1)(1)(1).xlsx",sheet_name="Sheet1") 2 c = df.describe(percentiles=[0.1,0.9,0.99]) 3 def block(x): 4 qu = x.quantile(.9) 5 out = x.mask(x>qu,qu) #当大于90%分位数的进行替换 6 return(out) 7 8 def block2(df): 9 df1 = df.copy() 10 df1['价格'] = block(df1['价格']) #使用盖帽法进行替换交易增长幅度 11 return df1 12 df3 = block2(df) 13 print(df3.describe(percentiles=[0.1,0.9,0.99]))
结果: