日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

求一列数据中的波峰_用python进行数据分析的套路

發(fā)布時間:2025/3/15 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求一列数据中的波峰_用python进行数据分析的套路 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

經過一段時間的學習,總結一下目前所學知識,在用python進行數(shù)據(jù)分析的過程中所用到的函數(shù)及分析過程。

第一步 導入包

常用的包有以下這些:

1.用于處理數(shù)據(jù)的包

import pandas as pd

import numpy as np

pandas 和numpy基本包含了對數(shù)據(jù)處理的所有操作

2.用于數(shù)據(jù)可視化的包

import matplotlib.pyplot as plt

import seabron as sns

matplotlib.pyplot包用于基本的數(shù)據(jù)可視化,畫柱,線,點圖的時候用

seabron中的headmap用來畫熱力圖

3.連接數(shù)據(jù)庫的包

import pymysql

第二步 導入數(shù)據(jù)

1.導入數(shù)據(jù)的話一般考慮csv類型

pd.read_csv(r'路徑/data.csv',dtype='object',encoding='utf-8')#可以選擇指定文本類型和編碼語言 df.to_csv('C:/Users/10136/Desktop/comma_sep1.csv ')#保存數(shù)據(jù)

2.從數(shù)據(jù)庫導入數(shù)據(jù)

#導入包 import pymysql 連接數(shù)據(jù)庫 conn=pymysql.connect(host='localhost',port=3306,user='root',password='123456',db='brazilian',charset='utf8')#db為數(shù)據(jù)庫名 query='select * from new_orders_merged'#編寫SQL語句 sql_data=pd.read_sql(query,conn)#執(zhí)行SQL語句,從數(shù)據(jù)庫中導入名為new_orders_merged的表

第三步 數(shù)據(jù)處理

1.查看數(shù)據(jù)基本結構

查看行和列時可以用data.shape

查看每列數(shù)據(jù)類型用data.dtypes

查看數(shù)據(jù)每列信息用http://data.info()

查看數(shù)據(jù)的前5行用data.head()

2.處理缺失值

查看數(shù)據(jù)是否有缺失值

可以用data.insnull(),會列出所有數(shù)據(jù)的bool類型,有缺失值為True

data.isnull().any()#顯示有缺失值的列的bool類型,有缺失值為True

data[data.isnull().values==True]#顯示所有帶有缺失值的行列,適用于缺失值較少的數(shù)據(jù)

data.isnull().sum()#查看每列缺失值的個數(shù),可以根據(jù)結果對怎樣處理缺失值做出判斷

刪除缺失值

如果缺失值相對樣本數(shù)據(jù)影響不大,對缺失值可以采用刪除處理

data.dropna()#這是對樣本中所有缺失值所在的行進行刪除

data.dropna(subset=['列名'])#這是對指定列的缺失值刪除所在行

data.dropna(how='any/all',axis=0)#刪除缺失值所對應的行,any是指只要有缺失值則對整行刪除,all是指當整行都是缺失值則對其刪除。

填充缺失值

如果刪除缺失值對樣本影響較大,可以采用填充的方式補充缺失值

data.fillna('')#可以把所有缺失值補充為統(tǒng)一值* data['列名']fillna()#針對某一列進行補充 data['列名']fillna(data['列名'].mean())#以這列的平均值作為補充 data['列名']fillna(data['列名'].interpolate())#以缺失值上下數(shù)的平均值進行補充 data.fillna(axis=1,method='ffill')#以缺失值同行前一列的值進行補充,axis=0是以缺失值同列上面一行的值進行補充。

3.處理重復值

刪除重復值

data.drop_duplicates(keep='first/last'/False)#first :保留第一行重復值,last:保留最后一行重復值,False:不保留重復值,刪除所有重復的數(shù)據(jù)

4.處理異常值

如果數(shù)據(jù)中有某一列的數(shù)據(jù)有異常,可以選擇性的篩選濾去這些異常值

#方法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)]
  • 首先我們要對數(shù)據(jù)進行聚合操作
df.describe().applymap(lambda x:'%.2f'%x).T data.describe().round(2).T #與上面相同 #查看數(shù)據(jù)的最小值,最大值,四分位數(shù),標準差,平均數(shù),數(shù)據(jù)數(shù)量等 #applymap()執(zhí)行函數(shù)

然后根據(jù)數(shù)據(jù)的業(yè)務情況,分析數(shù)據(jù)的異常值,比如最大值,最小值是否符合業(yè)務情況,然后再對異常值進行相應的處理

  • data.replace(value,new_value,inplace=True)#對數(shù)據(jù)進行替換操作,inplace=True是對原數(shù)據(jù)進行更改
#對把數(shù)據(jù)數(shù)值化方便分析 ##分別查看department列和salary列唯一值有多少個 df1=pd.Series(df['department']).unique()#Series創(chuàng)建一維數(shù)組 df2=pd.Series(df['salary']).unique() ##把兩列的值轉化為數(shù)值 df['department'].replace(list(df1),np.arange(10),inplace=True) df['salary'].replace(list(df2),[0,1,2],inplace=True)

連接數(shù)據(jù)表

app_cre=pd.merge(app,cre,on='客戶號',how='inner')

第四步 數(shù)據(jù)分析

1.對列重命名

data.rename(columns={'原列名':'新列名'})#可以更改列名,方便后面分析

2.查看一列數(shù)據(jù)的唯一值

pd.Series(data['列名']).unique()#用來查看一列數(shù)據(jù)有多少不同值,適合查詢類別較少的數(shù)據(jù)

3.對列進行移動

有時候為了分析方便,可以適當對某些列進行前移或刪除

front=data['列名']#先把這一列賦予一個值 data.drop(labels='列名',axis=1,inplace=True)#刪除原列的數(shù)據(jù) data.insert(0,'列名',front)#把這一列插入到列序為0的位置

4.常用的一些數(shù)據(jù)操作

  • 排序

data.sort_values(by='列名',ascending=True, inplace=False)#注意指定列,升序降序問題

  • 分組

data.groupby(by='列名').agg({'列名':'median','列名':'mean'})#通常groupby后面要跟聚合函數(shù)

data.groupby('列名')['列名'].transform('mean')#在原數(shù)據(jù)的基礎上對分組后的列進行求同組的均值,結果是在原數(shù)據(jù)的后面再加一列

把數(shù)據(jù)離散化

pd.cut(data['列名'],[1,30,60,100],labels=['小','中','大'])

loc()結合cut可以添加新列

給數(shù)據(jù)添加列

data.assign(新列名=np.log(data['列名']))

  • 求某一列中各種值的占比
df['left'].value_counts()/df['left'].count() #value_counts是分類求出這一列數(shù)據(jù)不同值的計數(shù)量

4.連接數(shù)據(jù)庫進行數(shù)據(jù)分析

從數(shù)據(jù)庫引入數(shù)據(jù)的常規(guī)操做

import pymysql #使用cursor()方法獲取數(shù)據(jù)庫的操作游標 cursor= conn.cursor() sql='''SELECT product_category_name AS "SPU",COUNT(DISTINCT(product_id)) AS "SKU數(shù)" FROM new_orders_merged GROUP BY product_category_name ORDER BY SKU數(shù) DESC; ''' #讀取查詢結果并轉成列表 cursor.execute(sql)#執(zhí)行查詢語句 ret=cursor.fetchall()#讀取查詢結果 ret_list=[i for i in ret] #將列表轉為datafarm形式 ret_data=pd.DataFrame(ret_list,index=None,columns=['SPU','SKU數(shù)']) ret_data=ret_data.set_index('SPU')

5.設置顯示問題

設置顯示結果的最大行列

pd.set_option('display.max_columns',10)#最大顯示多少列 pd.set_option('display.max_rows',100)#最大顯示多少行

設置現(xiàn)在圖表中的中文字體

#方法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']

第五步 數(shù)據(jù)可視化

1.熱力圖

import pandas as pd import seaborn as sns import matplotlib.pyplot as plt #導入數(shù)據(jù)并分組 df=pd.read_csv('week.csv') #df.columns=['week','hours','counts'] #做成數(shù)據(jù)透視表 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是顯示每個數(shù)據(jù),fmt是顯示方式 ax.set_xlabel('小時',size=14)#X軸標簽 ax.set_ylabel('星期',size=14)#Y軸標簽 ax.set_title('客戶購買頻數(shù)圖',size=18)#標題 plt.savefig('customers_.png',dpi=1000,bbox_inches='tight')#保存圖片

首先導入的數(shù)據(jù)形式如下:

在進行畫圖之前要對數(shù)據(jù)進行處理,利用pivot_table()函數(shù)把原數(shù)據(jù)的行列轉換成畫圖時數(shù)據(jù)的行、列和數(shù)據(jù)值,這時的數(shù)據(jù)形式就是畫圖時的數(shù)據(jù)形式,呈現(xiàn)如下:

然后就是畫熱力圖,結果呈現(xiàn)如下:

當數(shù)據(jù)為多列時,可以用df.corr()求出每列的相關系數(shù),然后畫出熱力圖

sns.heatmap(df.corr(),cmap="BuGn"); plt.title('Heatmap of Correlation Matrix')

結果如下

2.餅圖

left_rate=df['left'].value_counts()/df['left'].count()#餅圖的數(shù)據(jù)類型 #用餅狀圖表示 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是數(shù)據(jù)交叉表,計算數(shù)據(jù)因子的頻率值,對比數(shù)據(jù)透視表pivot_table() depart_salary_table=pd.crosstab(index=df['department'],columns=df['salary']) print(depart_salary_table) #兩種數(shù)據(jù)疊加在一起顯示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')#不帶參數(shù)時自動選擇位置 #繪制網格 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']#連接數(shù)據(jù)庫 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)#對數(shù)據(jù)匯總分析,查看異常值 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() #執(zhí)行sql語句 cursor.execute(sql) #讀取全部數(shù)據(jù) state_pay=cursor.fetchall() #轉換數(shù)據(jù)類型 #轉為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) #繪圖 #創(chuàng)建畫板 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()

結果如下:

根據(jù)實際業(yè)務情況提出問題并找出問題的原因是數(shù)據(jù)分析的關鍵,在分析數(shù)據(jù)的過程中,如何選擇合適的模型是重中之重,以上只是對數(shù)據(jù)分析流程的操作做了大概的總結。

總結

以上是生活随笔為你收集整理的求一列数据中的波峰_用python进行数据分析的套路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。