大家好,我是不知所措撓頭娜。o(〃'▽'〃)o
今天開篇沒有廢話。如果你學了前面提到的python的幾個包,看了作業題目覺得很想自己動手試試,可以私下找我把作業需要用到的數據資料分享給你~
接著分享娜娜醬的第四個python學習小作業:某公司產品銷量分析
作業要求:
1、批量讀取數據,并輸出以下信息:數據量、數據字段名、每個文件分別有多少缺失值
① 創建獨立函數,從讀取數據到以上輸出要求
② 運行代碼調用創建函數,對數據進行批量處理
2、創建函數,批量讀取數據,用均值填充缺失值數據,并完成以下計算及圖表
(1)讀取數據并用均值填充缺失值;對“日期”字段進行時間序列處理,輸出三個Dataframe文件data1,data2,data3
(2)分別計算data1,data2,data3中A,B產品的月總銷量,并繪制多系列柱狀圖,存儲在對應的圖片文件夾路徑
(3)分別計算A、B產品在每個月中哪一天超過了月度80%的銷量,輸出日期
3、創建函數,讀取數據并合并,對兩種產品銷量作線性回歸擬合,預測
(1)讀取數據刪除缺失值;對“日期”字段進行時間序列處理,合并三個月數據,輸出data;
(2)針對A產品銷量和B產品銷量數據做回歸分析,制作散點圖并存儲,并預測當A銷量為1200時,B產品銷量值
AB產品銷量數據大概長這樣
娜娜醬的代碼(在jupyter notebook做的):
第1題:加載模塊,創建函數讀取產品銷量數據
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus']=False
from sklearn.linear_model import LinearRegression
import datetime
import os
% matplotlib inline
#1、批量讀取數據,并輸出以下信息
#(1)數據量
#(2)數據字段columns
#(3)輸出每個文件分別有多少缺失值
#創建函數 :f()
def f():
add = input('請指定工作目錄路徑:\n')
while os.path.exists(add) == False:
add = input('輸入有誤,路徑不存在,請重新指定工作目錄:\n')
else:
os.chdir(add)
for i in os.walk(add):
filename_lst = i[2]
print('數據已加載')
# 這里用了os.walk(path) ,可以返回路徑中的信息及文件,結果為一個生成器
for j in range(len(filename_lst)):
data = pd.read_excel(filename_lst[j],header = 0,index_col=0)
datasize = len(data) #數據量
colname = data.columns.values.tolist() # 數據字段
nan_num = len(data[data.isnull().values == True]) # 缺失值數量
print('第%i個數據數據量為:%i' %(j+1,datasize))
print('第%i個數據字段為:%s' %(j+1,colname))
print('第%i個數據缺失值數量為:%i' %(j+1,nan_num))
print('----------')
#調用函數
f()
print('-----The end of Q1-----')
上段運行后,可以得到:
第2題:(1)批量讀取數據,用均值填充缺失值數據對“日期”字段進行時間序列處理,轉換成period
#創建函數:Q2_read_and_fillna()
def Q2_read_and_fillna():
add = r'C:\Users\my\Desktop\python_project5'
os.chdir(add)
for i in os.walk(add):
filename_lst = i[2]
dataset = []
for j in range(len(filename_lst)):
data = pd.read_excel(filename_lst[j],header = 0,index_col=0)
#用均值填充缺失值
colname = data.columns.values.tolist()
for col in colname:
u = data[col].mean()
data[col].fillna(u,inplace = True)
#日期轉換成時間序列
dataindex = data.index
dataindex.to_period()
#將data加入dataset
dataset.append(data)
return(dataset)
#調用函數
data1 = Q2_read_and_fillna()[0]
data2 = Q2_read_and_fillna()[1]
data3 = Q2_read_and_fillna()[2]
print('數據已加載已處理!')
print('-----The end of Q2(1)-----')
此時data1~data3就已經處理好了:
第2題:(2)分別計算data1~data3中A、B產品的月總銷量,繪制多系列柱狀圖并存儲
#創建函數: Q2_monthly_sales(*dfs)
def Q2_monthly_sales(*dfs):
sales_A = []
sales_B = []
for df in dfs:
sales = df.sum()
print(sales)
sales_A.append(sales[0])
sales_B.append(sales[1])
#創建銷量dataframe
saledf = pd.DataFrame({'產品A月銷量':sales_A,'產品B月銷量':sales_B},
index = pd.period_range('201801','201803',freq = 'M'))
#return(saledf)
#繪圖
saledf.plot(kind = 'bar',grid = True,alpha = 0.5,rot = 0)
plt.title('1-3月產品A、B總銷量柱狀圖')
plt.savefig(r'C:\Users\my\Desktop\python_project5_圖片保存\銷量圖.png')
#調用函數
Q2_monthly_sales(data1,data2,data3)
print('銷量柱狀圖已繪制已保存!')
print('-----The end of Q2(2)-----')
運行上段代碼可得到每月產品總銷量:
第2題:(3)分別計算A、B產品在每個月中哪一天超過了月度80%的銷量,輸出日期
#創建函數:Q2_date_when_sales_over80(*dfs)
def Q2_date_when_sales_over80(*dfs):
date_A = []
date_B = []
for df in dfs:
df['A_cum'] = df['productA'].cumsum()
df['B_cum'] = df['productB'].cumsum()
df_Aover80 = df[df['A_cum']>(0.8*df['productA'].sum())]
df_Bover80 = df[df['B_cum']>(0.8*df['productB'].sum())]
date_A.append(str(df_Aover80.iloc[0].name))
date_B.append(str(df_Bover80.iloc[0].name))
return(date_A,date_B)
#調用函數
print('A、B產品各月超過80%的銷量日期分別為:\n')
print(Q2_date_when_sales_over80(data1,data2,data3))
print('-----The end of Q2(3)-----')
可知A產品各月銷量超過80%總銷量的日期為:
2018年01月26日、2018年02月23日、2018年03月25日
B產品各月銷量超過80%總銷量的日期為:
2018年01月26日、2018年02月24日、2018年03月26日
上面兩個日期非常相近,可以猜測A、B產品可能存在某種關聯,下面第3題可以證實我們的猜測。
第3題:(1)讀取一季度三個月的數據并合并,做散點圖觀察A,B產品銷量情況,并做回歸
#創建函數:Q3_read_and_combine()
def Q3_read_and_combine():
add = r'C:/Users/my/Desktop/python_project5'
os.chdir(add)
for i in os.walk(add):
filename_lst = i[2]
#print(filename_list)
dataset = []
for j in range(len(filename_lst)):
data = pd.read_excel(filename_lst[j],header = 0,index_col=0)
#日期轉換成時間序列
dataindex = data.index
dataindex.to_period()
#刪除缺失值
data.dropna(inplace = True)
#將data加入dataset
dataset.append(data)
#連接data
data_re = pd.concat([dataset[0],dataset[1],dataset[2]])
return(data_re)
#調用函數
data_combine = Q3_read_and_combine()
print(data_combine)
print('數據已加載已處理已合并!')
print('-----The end of Q3(1)-----')
這樣一季度的銷量就已經處理好了:
第3題:(2)針對A產品銷量和B產品銷量數據做回歸分析,制作散點圖并存儲,預測當A銷量為1200時,B產品銷量值
#創建函數:Q3_regression_analysis(df)
def Q3_regression_analysis(df):
#樣本數據
xtrain = data_combine['productA']
ytrain = data_combine['productB']
#線性回歸分析
model = LinearRegression()
model.fit(xtrain[:,np.newaxis],ytrain)
xtest = np.linspace(0,1000,1000)
ytest = model.predict(xtest[:,np.newaxis])
#繪制散點圖、線性回歸擬合直線
plt.scatter(xtrain,ytrain,marker = '.',color = 'k')
plt.plot(xtest,ytest,color = 'r')
plt.grid()
plt.title('A-B產品銷量回歸擬合')
plt.savefig(r'C:\Users\my\Desktop\python_project5_圖片保存\線性回歸擬合.png')
return(model.predict(1200))
#調用函數
Q3_regression_analysis(data_combine)
print('當A銷量為1200時,B的銷量預測值為:%i'%Q3_regression_analysis(data_combine))
print('A-B產品銷量回歸擬合圖已繪制已保存!')
print('-----The end of Q3(2)-----')
果然A、B產品銷量存在某種關系~可能有人會覺得,這些操作有什么難的,Excel也能做出來,還比敲代碼快。確實Excel是一個非常強大的工具,可以做很多比較復雜的分析。不過,正因為它太“高大上”了,點幾下鼠標就可以分析,也就意味著它太不自由了。而且如果我們每個月都需要分析很多個產品的銷量,又或者數據量很大的時候,python的優勢就突顯出來了:這套代碼只需要寫好一次,以后每次使用前修改幾個參數,調整幾行代碼即可,極大地減少了重復動作。大量的機械的重復交給代碼就好了,多余出的時間可以用來做更有意思的事情哪!
我是娜娜醬,請繼續期待后續數據分析打怪升級小作業~前面這幾個作業比較初級,從下個作業起畫風要變得炫酷起來了!
這是零基礎入門數據分析系列的第五篇,其他內容在這里:
第一篇:零基礎小白自學數據分析:從入門到摔門?
第二篇:零基礎小白自學數據分析:從入門到絆倒?
第三篇:零基礎小白自學數據分析:從入門到住院?
第四篇:零基礎小白自學數據分析:從入門到出家?
也許你還想看看:數據分析,從入門到放棄
(-'?_?'-)謝謝您閱讀,請勿轉載。