求一列数据中的波峰_用python进行数据分析的套路
經過一段時間的學習,總結一下目前所學知識,在用python進行數據分析的過程中所用到的函數及分析過程。
第一步 導入包
常用的包有以下這些:
1.用于處理數據的包
import pandas as pd
import numpy as np
pandas 和numpy基本包含了對數據處理的所有操作
2.用于數據可視化的包
import matplotlib.pyplot as plt
import seabron as sns
matplotlib.pyplot包用于基本的數據可視化,畫柱,線,點圖的時候用
seabron中的headmap用來畫熱力圖
3.連接數據庫的包
import pymysql
第二步 導入數據
1.導入數據的話一般考慮csv類型
pd.read_csv(r'路徑/data.csv',dtype='object',encoding='utf-8')#可以選擇指定文本類型和編碼語言 df.to_csv('C:/Users/10136/Desktop/comma_sep1.csv ')#保存數據2.從數據庫導入數據
#導入包 import pymysql 連接數據庫 conn=pymysql.connect(host='localhost',port=3306,user='root',password='123456',db='brazilian',charset='utf8')#db為數據庫名 query='select * from new_orders_merged'#編寫SQL語句 sql_data=pd.read_sql(query,conn)#執行SQL語句,從數據庫中導入名為new_orders_merged的表第三步 數據處理
1.查看數據基本結構
查看行和列時可以用data.shape
查看每列數據類型用data.dtypes
查看數據每列信息用http://data.info()
查看數據的前5行用data.head()
2.處理缺失值
查看數據是否有缺失值
可以用data.insnull(),會列出所有數據的bool類型,有缺失值為True
data.isnull().any()#顯示有缺失值的列的bool類型,有缺失值為True
data[data.isnull().values==True]#顯示所有帶有缺失值的行列,適用于缺失值較少的數據
data.isnull().sum()#查看每列缺失值的個數,可以根據結果對怎樣處理缺失值做出判斷
刪除缺失值
如果缺失值相對樣本數據影響不大,對缺失值可以采用刪除處理
data.dropna()#這是對樣本中所有缺失值所在的行進行刪除
data.dropna(subset=['列名'])#這是對指定列的缺失值刪除所在行
data.dropna(how='any/all',axis=0)#刪除缺失值所對應的行,any是指只要有缺失值則對整行刪除,all是指當整行都是缺失值則對其刪除。
填充缺失值
如果刪除缺失值對樣本影響較大,可以采用填充的方式補充缺失值
data.fillna('')#可以把所有缺失值補充為統一值* data['列名']fillna()#針對某一列進行補充 data['列名']fillna(data['列名'].mean())#以這列的平均值作為補充 data['列名']fillna(data['列名'].interpolate())#以缺失值上下數的平均值進行補充 data.fillna(axis=1,method='ffill')#以缺失值同行前一列的值進行補充,axis=0是以缺失值同列上面一行的值進行補充。3.處理重復值
刪除重復值
data.drop_duplicates(keep='first/last'/False)#first :保留第一行重復值,last:保留最后一行重復值,False:不保留重復值,刪除所有重復的數據
4.處理異常值
如果數據中有某一列的數據有異常,可以選擇性的篩選濾去這些異常值
#方法1 app=app.iloc[np.where(app["CNT_CHILDREN"]<5)] #方法2 app=app[app["CNT_CHILDREN"]<5] #方法3 d=pd.Series(app['CNT_CHILDREN']).unique() list1 = [i for i in d if i <=5] app=app[app.CNT_CHILDREN.isin(list1)]- 首先我們要對數據進行聚合操作
然后根據數據的業務情況,分析數據的異常值,比如最大值,最小值是否符合業務情況,然后再對異常值進行相應的處理
- data.replace(value,new_value,inplace=True)#對數據進行替換操作,inplace=True是對原數據進行更改
連接數據表
app_cre=pd.merge(app,cre,on='客戶號',how='inner')第四步 數據分析
1.對列重命名
data.rename(columns={'原列名':'新列名'})#可以更改列名,方便后面分析
2.查看一列數據的唯一值
pd.Series(data['列名']).unique()#用來查看一列數據有多少不同值,適合查詢類別較少的數據
3.對列進行移動
有時候為了分析方便,可以適當對某些列進行前移或刪除
front=data['列名']#先把這一列賦予一個值 data.drop(labels='列名',axis=1,inplace=True)#刪除原列的數據 data.insert(0,'列名',front)#把這一列插入到列序為0的位置4.常用的一些數據操作
- 排序
data.sort_values(by='列名',ascending=True, inplace=False)#注意指定列,升序降序問題
- 分組
data.groupby(by='列名').agg({'列名':'median','列名':'mean'})#通常groupby后面要跟聚合函數
data.groupby('列名')['列名'].transform('mean')#在原數據的基礎上對分組后的列進行求同組的均值,結果是在原數據的后面再加一列
把數據離散化
pd.cut(data['列名'],[1,30,60,100],labels=['小','中','大'])
loc()結合cut可以添加新列
給數據添加列
data.assign(新列名=np.log(data['列名']))
- 求某一列中各種值的占比
4.連接數據庫進行數據分析
從數據庫引入數據的常規操做
import pymysql #使用cursor()方法獲取數據庫的操作游標 cursor= conn.cursor() sql='''SELECT product_category_name AS "SPU",COUNT(DISTINCT(product_id)) AS "SKU數" FROM new_orders_merged GROUP BY product_category_name ORDER BY SKU數 DESC; ''' #讀取查詢結果并轉成列表 cursor.execute(sql)#執行查詢語句 ret=cursor.fetchall()#讀取查詢結果 ret_list=[i for i in ret] #將列表轉為datafarm形式 ret_data=pd.DataFrame(ret_list,index=None,columns=['SPU','SKU數']) ret_data=ret_data.set_index('SPU')5.設置顯示問題
設置顯示結果的最大行列
pd.set_option('display.max_columns',10)#最大顯示多少列 pd.set_option('display.max_rows',100)#最大顯示多少行設置現在圖表中的中文字體
#方法1 from matplotlib import font_manager #設置中文字體 my_font=font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc',size=18) #方法2 from pylab import mpl mpl.rcParams['font.sans-serif']=['SimHei']第五步 數據可視化
1.熱力圖
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt #導入數據并分組 df=pd.read_csv('week.csv') #df.columns=['week','hours','counts'] #做成數據透視表 df=pd.pivot_table(df,index='week',columns='hours',values='counts') print(df) #畫熱力圖 plt.figure(figsize=(16,8))#畫布 ax=sns.heatmap(df,annot=True,fmt='d',cmap='Blues')#annot是顯示每個數據,fmt是顯示方式 ax.set_xlabel('小時',size=14)#X軸標簽 ax.set_ylabel('星期',size=14)#Y軸標簽 ax.set_title('客戶購買頻數圖',size=18)#標題 plt.savefig('customers_.png',dpi=1000,bbox_inches='tight')#保存圖片首先導入的數據形式如下:
在進行畫圖之前要對數據進行處理,利用pivot_table()函數把原數據的行列轉換成畫圖時數據的行、列和數據值,這時的數據形式就是畫圖時的數據形式,呈現如下:
然后就是畫熱力圖,結果呈現如下:
當數據為多列時,可以用df.corr()求出每列的相關系數,然后畫出熱力圖
sns.heatmap(df.corr(),cmap="BuGn"); plt.title('Heatmap of Correlation Matrix')結果如下
2.餅圖
left_rate=df['left'].value_counts()/df['left'].count()#餅圖的數據類型 #用餅狀圖表示 left_rate.plot.pie(labels = ['在職','離職'],autopct = '%.2f%%',figsize=(8,8)) plt.axis('equal') #將坐標系設置為正方形,也就是使餅狀圖為圓形 plt.title('在職,離職員工比例') plt.savefig('scatr.png',dpi=1000) plt.show()#不能放到前面,否則保存不了圖片結果如下:
3.柱狀圖
#crosstab是數據交叉表,計算數據因子的頻率值,對比數據透視表pivot_table() depart_salary_table=pd.crosstab(index=df['department'],columns=df['salary']) print(depart_salary_table) #兩種數據疊加在一起顯示stacked=Ture depart_salary_table.plot(kind="bar",figsize=(10,10),stacked=True)結果如下:
4.折線圖
import matplotlib.pyplot as plt import random from pylab import mpl mpl.rcParams['font.sans-serif']=['SimHei'] x=range(2,26,2) y=[random.randint(15,30)for i in x]#列表生成式#設置背景顏色 #print(plt.style.available) plt.style.use('bmh') #設置圖片的大小,畫布大小 plt.figure(figsize=(10,6),dpi=80)#設置xy軸刻度標簽 x_ticks_lable=['{}:00'.format(i) for i in x] plt.xticks(x,x_ticks_lable,rotation=30) y_ticks_lable=['{}℃'.format(i) for i in range(min(y),max(y)+1)] plt.yticks(range( min(y),max(y)+1),y_ticks_lable)#設置xy軸標題 plt.xlabel('時間',rotation=30)#旋轉rotation plt.ylabel('溫度') #設置標題 plt.title('每兩小時溫度變化',size=18,color = 'b') plt.plot(x,y,color='red',linestyle='-.',linewidth=1.5,label='第一天',marker = 'o',markersize = 7) #設置圖例 #設置位置loc(upper left, lower left, center left, upper center) plt.legend(loc='upper left')#不帶參數時自動選擇位置 #繪制網格 plt.grid(alpha=0.3) #保存圖片 plt.savefig('line.png') #顯示圖片 #plt.show()顯示結果如下:
5.多個坐標系顯示
import pandas as pd from pylab import mpl import pymysql import matplotlib.pyplot as plt mpl.rcParams['font.sans-serif']=['SimHei']#連接數據庫 conn=pymysql.connect(host='localhost',port=3306,user='root',password='123456',db='brazilian',charset='utf8') query='select * from new_orders_merged' sql_data=pd.read_sql(query,conn)#對數據匯總分析,查看異常值 a=sql_data.describe()#州交易額貢獻 #sql語句 sql="""SELECT customer_state,ROUND(SUM(payment_value),2) AS "交易額" FROM new_orders_merged GROUP BY customer_state ORDER BY 交易額 DESC;""" cursor= conn.cursor() #執行sql語句 cursor.execute(sql) #讀取全部數據 state_pay=cursor.fetchall() #轉換數據類型 #轉為list類型 state_pay_List=list(state_pay) #轉為DataFrame類型 state_pay_Data = pd.DataFrame(state_pay_List,columns=["state","交易額"]) state_pay_Data=state_pay_Data.set_index("state") print(state_pay_Data) #繪圖 #創建畫板 plt.figure(figsize=(10,5),dpi=80) #繪圖 state_pay_Data.plot(kind='bar',label="交易額",figsize=(12,6)) #plt.bar - 這個網站可出售。 - 最佳的Server monitoring 來源和相關信息。(range(len(state_pay_Data.index)),state_pay_Data['交易額'],label="交易額") #設置軸標簽plt.ylabel("交易額") #設置圖例 plt.legend(loc="center right") #設置x軸刻度 plt.xticks(range(len(state_pay_Data.index)),state_pay_Data.index,rotation=0,ha='center') #繪制累計曲線 plt.twinx() #累計百分比 p=state_pay_Data["交易額"].cumsum()/state_pay_Data["交易額"].sum() print(p) #找出累計80%的點 key=p[p>0.8].index[0] #找到點對應的位置 key_num=state_pay_Data.index.tolist().index(key) #輸出結果 print("累計超過80%的州:",key) print("累計超過80%的州的索引位置:",key_num) print("---------------------------------") #顯示核心州 key_state=state_pay_Data[:key] print("核心州:",key_state) #繪制曲線 p.plot(color = 'orange',style = '-o',linewidth=1) #次坐標曲線 #設置80%標識線 plt.axvline(key_num,hold=None,color="red",linestyle="--") #設置80%文本 plt.text(key_num+0.2,p[key]-0.02,"累計占比為:%.2f%%"%(p[key]*100),color="red") #設置軸標簽 plt.ylabel("交易額占比") #整個圖標題 plt.title("州交易額貢獻分布情況",fontsize=15) plt.show()結果如下:
根據實際業務情況提出問題并找出問題的原因是數據分析的關鍵,在分析數據的過程中,如何選擇合適的模型是重中之重,以上只是對數據分析流程的操作做了大概的總結。
總結
以上是生活随笔為你收集整理的求一列数据中的波峰_用python进行数据分析的套路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言作业模拟虚拟内存,如何用c语言实现
- 下一篇: 1327集群_MPT1327集群通讯系统