python对列保留有效位数_用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 if <="5]"></5)]>
  • 首先我们要对数据进行聚合操作
df.describe().applymap(lambda x:'%.2f'%x).T
data.describe().round(2).T  #&#x4E0E;&#x4E0A;&#x9762;&#x76F8;&#x540C;
#&#x67E5;&#x770B;&#x6570;&#x636E;&#x7684;&#x6700;&#x5C0F;&#x503C;&#xFF0C;&#x6700;&#x5927;&#x503C;&#xFF0C;&#x56DB;&#x5206;&#x4F4D;&#x6570;&#xFF0C;&#x6807;&#x51C6;&#x5DEE;&#xFF0C;&#x5E73;&#x5747;&#x6570;&#xFF0C;&#x6570;&#x636E;&#x6570;&#x91CF;&#x7B49;
#applymap&#xFF08;&#xFF09;&#x6267;&#x884C;&#x51FD;&#x6570;

然后根据数据的业务情况,分析数据的异常值,比如最大值,最小值是否符合业务情况,然后再对异常值进行相应的处理

  • data.replace(value,new_value,inplace=True)#对数据进行替换操作,inplace=True是对原数据进行更改
#&#x5BF9;&#x628A;&#x6570;&#x636E;&#x6570;&#x503C;&#x5316;&#x65B9;&#x4FBF;&#x5206;&#x6790;
##&#x5206;&#x522B;&#x67E5;&#x770B;department&#x5217;&#x548C;salary&#x5217;&#x552F;&#x4E00;&#x503C;&#x6709;&#x591A;&#x5C11;&#x4E2A;
df1=pd.Series(df['department']).unique()#Series&#x521B;&#x5EFA;&#x4E00;&#x7EF4;&#x6570;&#x7EC4;
df2=pd.Series(df['salary']).unique()
##&#x628A;&#x4E24;&#x5217;&#x7684;&#x503C;&#x8F6C;&#x5316;&#x4E3A;&#x6570;&#x503C;
df['department'].replace(list(df1),np.arange(10),inplace=True)
df['salary'].replace(list(df2),[0,1,2],inplace=True)

连接数据表

app_cre=pd.merge(app,cre,on='&#x5BA2;&#x6237;&#x53F7;',how='inner')

第四步 数据分析

1.对列重命名

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

2.查看一列数据的唯一值

pd.Series(data[‘列名’]).unique()#用来查看一列数据有多少不同值,适合查询类别较少的数据

3.对列进行移动

有时候为了分析方便,可以适当对某些列进行前移或删除

front=data['&#x5217;&#x540D;']#&#x5148;&#x628A;&#x8FD9;&#x4E00;&#x5217;&#x8D4B;&#x4E88;&#x4E00;&#x4E2A;&#x503C;
data.drop(labels='&#x5217;&#x540D;',axis=1,inplace=True)#&#x5220;&#x9664;&#x539F;&#x5217;&#x7684;&#x6570;&#x636E;
data.insert(0,'&#x5217;&#x540D;',front)#&#x628A;&#x8FD9;&#x4E00;&#x5217;&#x63D2;&#x5165;&#x5230;&#x5217;&#x5E8F;&#x4E3A;0&#x7684;&#x4F4D;&#x7F6E;

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[‘列名’]))

  • 求某一列中各种值的占比
df['left'].value_counts()/df['left'].count()
#value_counts&#x662F;&#x5206;&#x7C7B;&#x6C42;&#x51FA;&#x8FD9;&#x4E00;&#x5217;&#x6570;&#x636E;&#x4E0D;&#x540C;&#x503C;&#x7684;&#x8BA1;&#x6570;&#x91CF;

4.连接数据库进行数据分析

从数据库引入数据的常规操做

import pymysql
#&#x4F7F;&#x7528;cursor()&#x65B9;&#x6CD5;&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x7684;&#x64CD;&#x4F5C;&#x6E38;&#x6807;
cursor= conn.cursor()
sql='''SELECT product_category_name AS "SPU",COUNT(DISTINCT(product_id)) AS "SKU&#x6570;"
FROM new_orders_merged
GROUP BY product_category_name
ORDER BY SKU&#x6570; DESC;
'''
#&#x8BFB;&#x53D6;&#x67E5;&#x8BE2;&#x7ED3;&#x679C;&#x5E76;&#x8F6C;&#x6210;&#x5217;&#x8868;
cursor.execute(sql)#&#x6267;&#x884C;&#x67E5;&#x8BE2;&#x8BED;&#x53E5;
ret=cursor.fetchall()#&#x8BFB;&#x53D6;&#x67E5;&#x8BE2;&#x7ED3;&#x679C;
ret_list=[i for i in ret]
#&#x5C06;&#x5217;&#x8868;&#x8F6C;&#x4E3A;datafarm&#x5F62;&#x5F0F;
ret_data=pd.DataFrame(ret_list,index=None,columns=['SPU','SKU&#x6570;'])
ret_data=ret_data.set_index('SPU')

5.设置显示问题

设置显示结果的最大行列

pd.set_option('display.max_columns',10)#&#x6700;&#x5927;&#x663E;&#x793A;&#x591A;&#x5C11;&#x5217;
pd.set_option('display.max_rows',100)#&#x6700;&#x5927;&#x663E;&#x793A;&#x591A;&#x5C11;&#x884C;

设置现在图表中的中文字体

#&#x65B9;&#x6CD5;1
from matplotlib import font_manager
#&#x8BBE;&#x7F6E;&#x4E2D;&#x6587;&#x5B57;&#x4F53;
my_font=font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc',size=18)
#&#x65B9;&#x6CD5;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
#&#x5BFC;&#x5165;&#x6570;&#x636E;&#x5E76;&#x5206;&#x7EC4;
df=pd.read_csv('week.csv')
#df.columns=['week','hours','counts']
#&#x505A;&#x6210;&#x6570;&#x636E;&#x900F;&#x89C6;&#x8868;
df=pd.pivot_table(df,index='week',columns='hours',values='counts')
print(df)
#&#x753B;&#x70ED;&#x529B;&#x56FE;
plt.figure(figsize=(16,8))#&#x753B;&#x5E03;
ax=sns.heatmap(df,annot=True,fmt='d',cmap='Blues')#annot&#x662F;&#x663E;&#x793A;&#x6BCF;&#x4E2A;&#x6570;&#x636E;&#xFF0C;fmt&#x662F;&#x663E;&#x793A;&#x65B9;&#x5F0F;
ax.set_xlabel('&#x5C0F;&#x65F6;',size=14)#X&#x8F74;&#x6807;&#x7B7E;
ax.set_ylabel('&#x661F;&#x671F;',size=14)#Y&#x8F74;&#x6807;&#x7B7E;
ax.set_title('&#x5BA2;&#x6237;&#x8D2D;&#x4E70;&#x9891;&#x6570;&#x56FE;',size=18)#&#x6807;&#x9898;
plt.savefig('customers_.png',dpi=1000,bbox_inches='tight')#&#x4FDD;&#x5B58;&#x56FE;&#x7247;

首先导入的数据形式如下:

在进行画图之前要对数据进行处理,利用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()#&#x997C;&#x56FE;&#x7684;&#x6570;&#x636E;&#x7C7B;&#x578B;
#&#x7528;&#x997C;&#x72B6;&#x56FE;&#x8868;&#x793A;
left_rate.plot.pie(labels = ['&#x5728;&#x804C;','&#x79BB;&#x804C;'],autopct = '%.2f%%',figsize=(8,8))
plt.axis('equal')  #&#x5C06;&#x5750;&#x6807;&#x7CFB;&#x8BBE;&#x7F6E;&#x4E3A;&#x6B63;&#x65B9;&#x5F62;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x4F7F;&#x997C;&#x72B6;&#x56FE;&#x4E3A;&#x5706;&#x5F62;
plt.title('&#x5728;&#x804C;&#xFF0C;&#x79BB;&#x804C;&#x5458;&#x5DE5;&#x6BD4;&#x4F8B;')
plt.savefig('scatr.png',dpi=1000)
plt.show()#&#x4E0D;&#x80FD;&#x653E;&#x5230;&#x524D;&#x9762;&#xFF0C;&#x5426;&#x5219;&#x4FDD;&#x5B58;&#x4E0D;&#x4E86;&#x56FE;&#x7247;

结果如下:

3.柱状图

#crosstab&#x662F;&#x6570;&#x636E;&#x4EA4;&#x53C9;&#x8868;&#xFF0C;&#x8BA1;&#x7B97;&#x6570;&#x636E;&#x56E0;&#x5B50;&#x7684;&#x9891;&#x7387;&#x503C;&#xFF0C;&#x5BF9;&#x6BD4;&#x6570;&#x636E;&#x900F;&#x89C6;&#x8868;pivot_table()
depart_salary_table=pd.crosstab(index=df['department'],columns=df['salary'])
print(depart_salary_table)
#&#x4E24;&#x79CD;&#x6570;&#x636E;&#x53E0;&#x52A0;&#x5728;&#x4E00;&#x8D77;&#x663E;&#x793A;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]#&#x5217;&#x8868;&#x751F;&#x6210;&#x5F0F;

#&#x8BBE;&#x7F6E;&#x80CC;&#x666F;&#x989C;&#x8272;
#print(plt.style.available)
plt.style.use('bmh')
#&#x8BBE;&#x7F6E;&#x56FE;&#x7247;&#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x753B;&#x5E03;&#x5927;&#x5C0F;
plt.figure(figsize=(10,6),dpi=80)

#&#x8BBE;&#x7F6E;xy&#x8F74;&#x523B;&#x5EA6;&#x6807;&#x7B7E;
x_ticks_lable=['{}:00'.format(i) for i in x]
plt.xticks(x,x_ticks_lable,rotation=30)
y_ticks_lable=['{}&#x2103;'.format(i) for i in range(min(y),max(y)+1)]
plt.yticks(range( min(y),max(y)+1),y_ticks_lable)

#&#x8BBE;&#x7F6E;xy&#x8F74;&#x6807;&#x9898;
plt.xlabel('&#x65F6;&#x95F4;',rotation=30)#&#x65CB;&#x8F6C;rotation
plt.ylabel('&#x6E29;&#x5EA6;')
#&#x8BBE;&#x7F6E;&#x6807;&#x9898;
plt.title('&#x6BCF;&#x4E24;&#x5C0F;&#x65F6;&#x6E29;&#x5EA6;&#x53D8;&#x5316;',size=18,color = 'b')
plt.plot(x,y,color='red',linestyle='-.',linewidth=1.5,label='&#x7B2C;&#x4E00;&#x5929;',
         marker = 'o',markersize = 7)
#&#x8BBE;&#x7F6E;&#x56FE;&#x4F8B;
#&#x8BBE;&#x7F6E;&#x4F4D;&#x7F6E;loc(upper left,  lower left,  center left,  upper center)
plt.legend(loc='upper left')#&#x4E0D;&#x5E26;&#x53C2;&#x6570;&#x65F6;&#x81EA;&#x52A8;&#x9009;&#x62E9;&#x4F4D;&#x7F6E;
#&#x7ED8;&#x5236;&#x7F51;&#x683C;
plt.grid(alpha=0.3)
#&#x4FDD;&#x5B58;&#x56FE;&#x7247;
plt.savefig('line.png')
#&#x663E;&#x793A;&#x56FE;&#x7247;
#plt.show()

显示结果如下:

5.多个坐标系显示

import pandas as pd
from pylab import mpl
import pymysql
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif']=['SimHei']

#&#x8FDE;&#x63A5;&#x6570;&#x636E;&#x5E93;
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)

#&#x5BF9;&#x6570;&#x636E;&#x6C47;&#x603B;&#x5206;&#x6790;&#xFF0C;&#x67E5;&#x770B;&#x5F02;&#x5E38;&#x503C;
a=sql_data.describe()

#&#x5DDE;&#x4EA4;&#x6613;&#x989D;&#x8D21;&#x732E;
#sql&#x8BED;&#x53E5;
sql="""SELECT customer_state,ROUND(SUM(payment_value),2) AS "&#x4EA4;&#x6613;&#x989D;"
FROM new_orders_merged
GROUP BY customer_state ORDER BY &#x4EA4;&#x6613;&#x989D; DESC;"""
cursor= conn.cursor()
#&#x6267;&#x884C;sql&#x8BED;&#x53E5;
cursor.execute(sql)
#&#x8BFB;&#x53D6;&#x5168;&#x90E8;&#x6570;&#x636E;
state_pay=cursor.fetchall()
#&#x8F6C;&#x6362;&#x6570;&#x636E;&#x7C7B;&#x578B;
#&#x8F6C;&#x4E3A;list&#x7C7B;&#x578B;
state_pay_List=list(state_pay)
#&#x8F6C;&#x4E3A;DataFrame&#x7C7B;&#x578B;
state_pay_Data = pd.DataFrame(state_pay_List,columns=["state","&#x4EA4;&#x6613;&#x989D;"])
state_pay_Data=state_pay_Data.set_index("state")
print(state_pay_Data)
#&#x7ED8;&#x56FE;
#&#x521B;&#x5EFA;&#x753B;&#x677F;
plt.figure(figsize=(10,5),dpi=80)
#&#x7ED8;&#x56FE;
state_pay_Data.plot(kind='bar',label="&#x4EA4;&#x6613;&#x989D;",figsize=(12,6))
#plt.bar - &#x8FD9;&#x4E2A;&#x7F51;&#x7AD9;&#x53EF;&#x51FA;&#x552E;&#x3002; - &#x6700;&#x4F73;&#x7684;Server monitoring &#x6765;&#x6E90;&#x548C;&#x76F8;&#x5173;&#x4FE1;&#x606F;&#x3002;(range(len(state_pay_Data.index)),state_pay_Data['&#x4EA4;&#x6613;&#x989D;'],label="&#x4EA4;&#x6613;&#x989D;")
#&#x8BBE;&#x7F6E;&#x8F74;&#x6807;&#x7B7E;

plt.ylabel("&#x4EA4;&#x6613;&#x989D;")
#&#x8BBE;&#x7F6E;&#x56FE;&#x4F8B;
plt.legend(loc="center right")
#&#x8BBE;&#x7F6E;x&#x8F74;&#x523B;&#x5EA6;
plt.xticks(range(len(state_pay_Data.index)),state_pay_Data.index,rotation=0,ha='center')
#&#x7ED8;&#x5236;&#x7D2F;&#x8BA1;&#x66F2;&#x7EBF;
plt.twinx()
#&#x7D2F;&#x8BA1;&#x767E;&#x5206;&#x6BD4;
p=state_pay_Data["&#x4EA4;&#x6613;&#x989D;"].cumsum()/state_pay_Data["&#x4EA4;&#x6613;&#x989D;"].sum()
print(p)
#&#x627E;&#x51FA;&#x7D2F;&#x8BA1;80%&#x7684;&#x70B9;
key=p[p>0.8].index[0]
#&#x627E;&#x5230;&#x70B9;&#x5BF9;&#x5E94;&#x7684;&#x4F4D;&#x7F6E;
key_num=state_pay_Data.index.tolist().index(key)
#&#x8F93;&#x51FA;&#x7ED3;&#x679C;
print("&#x7D2F;&#x8BA1;&#x8D85;&#x8FC7;80%&#x7684;&#x5DDE;&#xFF1A;",key)
print("&#x7D2F;&#x8BA1;&#x8D85;&#x8FC7;80%&#x7684;&#x5DDE;&#x7684;&#x7D22;&#x5F15;&#x4F4D;&#x7F6E;&#xFF1A;",key_num)
print("---------------------------------")
#&#x663E;&#x793A;&#x6838;&#x5FC3;&#x5DDE;
key_state=state_pay_Data[:key]
print("&#x6838;&#x5FC3;&#x5DDE;&#xFF1A;",key_state)
#&#x7ED8;&#x5236;&#x66F2;&#x7EBF;
p.plot(color = 'orange',style = '-o',linewidth=1) #&#x6B21;&#x5750;&#x6807;&#x66F2;&#x7EBF;
#&#x8BBE;&#x7F6E;80%&#x6807;&#x8BC6;&#x7EBF;
plt.axvline(key_num,hold=None,color="red",linestyle="--")
#&#x8BBE;&#x7F6E;80%&#x6587;&#x672C;
plt.text(key_num+0.2,p[key]-0.02,"&#x7D2F;&#x8BA1;&#x5360;&#x6BD4;&#x4E3A;:%.2f%%"%(p[key]*100),color="red")
#&#x8BBE;&#x7F6E;&#x8F74;&#x6807;&#x7B7E;
plt.ylabel("&#x4EA4;&#x6613;&#x989D;&#x5360;&#x6BD4;")
#&#x6574;&#x4E2A;&#x56FE;&#x6807;&#x9898;
plt.title("&#x5DDE;&#x4EA4;&#x6613;&#x989D;&#x8D21;&#x732E;&#x5206;&#x5E03;&#x60C5;&#x51B5;",fontsize=15)
plt.show()

结果如下:

根据实际业务情况提出问题并找出问题的原因是数据分析的关键,在分析数据的过程中,如何选择合适的模型是重中之重,以上只是对数据分析流程的操作做了大概的总结。

Original: https://blog.csdn.net/weixin_33905037/article/details/113538333
Author: 王金龙花柒
Title: python对列保留有效位数_用python进行数据分析的套路

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/754072/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球