1. 首页 >  安卓定制软件 >  python数据分析实践总结

python数据分析实践总结

“我的惩罚是什么?”伊萨克问艾尔曼。
“孤寂。”艾尔曼回答道。

引言:

在近日的python数据分析实战课中,我学习到使用python进行数据分析的流程、方法,对常使用的函数有一些认识和了解,对 numpy, pandas 包有了一定的理解但不深。
这篇博客将是我自己用于总结归纳的圣地,我将对整个项目的 key point 进行归纳总结,提取其中精华之所在,汲取之加以奋发向前。

一、分析数据文件:

在拿到数据的第一刻,莫急,先打开数据文件看一看,明白文件里的数据能够说明什么。于是乎我们得以提出分析的目标,并开始思索如何能够实现我们的目的。例如,我们手里有一份某电商平台一年的营销数据,这份数据中包含了达成交易订单的用户ID、本次订单对应的商品数量、总价、时间,思考:我们可以利用这些数据得到哪些结论?——从时间维度:分析不同月份的营销额;从客户维度:分析回购率、复购率、新老用户比例。根据得出的结论,我们得以制定相应的策略来提高商家的盈利。

二、数据预处理:

提一嘴,在文件最开始导入包的时候输入 plt.rcParams[‘font.sans-serif’] = ‘SimHei’ 以让中文能够正常显示(IPython中如此)

首先读取文件,利用 pandas 根据不同文件类型选择不同的读取函数:

  • csv: pd.read_csv(‘name.csv’, encoding=‘utf-8/GBK’)

  • text: pd.read_table(‘name.txt’, names=columns, sep=‘\s+’) # names指定每一列数据的含义,sep是划分数据时的参考,\s+表示跳过任意多的空格

  • excel: pd.read_excel(‘name.xlsx’)

接着进行数据的预处理:

  • 对于出现NAN的行或列且需要删除的:data.dropna(axis=0, how=‘any’, inplace=True) # 删除带有NAN的一整行数据,并修改原值

  • 对于重复出现的行或列:data.drop_duplicates(axis=0, inplace=True) # 删除重复的行,并修改原值

  • 对于无用的行或列:data.drop(columns=‘order_id’, axis=1, inplace=True) # 删除 order_id 这一列

  • 对于某些由于个别数值异常导致需要舍弃的行或列,进行再次赋值。例如我们需要舍弃销售金额为 0 的异常行:data = data[data[‘销售金额’]!=0]

  • 对于需要更新索引的数据:data.reset_index(drop=True, inplace=True) 把原来的索引index列删除,并更新index

  • 对于需要改变类型的数据,例如把时间字符串变成 datetime 类型:data[‘销售时间’] = pd.to_datetime(data[‘销售时间’])

  • 试图对某一行或列进行字符串层面的处理,首先需要确保该行或列的格式符合标准且统一:data[‘abc’].str.strip() # 转为string,并忽略首尾空格

  • 对于单位不统一的数据:如下图

看到销售金额 一列的单位有元也有万元,并且含有逗号,为了方便处理,我们将其格式化。

def data_deal(number):
    if number.find('万元')!= -1:#找到带有万元的,取出数字,去掉逗号,转成float,*10000
        number_new = float(number[:number.find('万元')].replace(',',''))*10000
    else: # 找到带有元的并处理
        number_new = float(number[:number.find('元')].replace(',',''))
    return number_new
data['销售金额'] = data['销售金额'].map(data_deal)

这里我们使用到了 Series.map() 函数,该函数的作用与 applyapplymap 类似,接收一个函数或含有映射关系的字典型对象,区别如下:

  • apply:作用于dataframe的整行或整列

  • applymap:作用于dataframe的每一个元素

  • map:作用于series中的每一个元素,在df结构中无法使用map函数

详情:https://pandas.pydata.org/pandas- docs/stable/reference/api/pandas.Series.map.html?highlight=map#pandas.Series.map

下面我们试图通过 map 函数提取 ‘销售时间’ 中的月份:

date['销售月份'] = date['销售时间'].map(lambda x:x.month)

此处使用到了 lambda 匿名函数 ,该用法等同于一般函数,但更加方便,当然也会更难理解。

Time:2023年7月13日23:22:21

三、数据分析

数据分析过程常常包括排序,统计最值、平均值、中值,对数据进行分组分层等,经常需要绘制图标进行数据可视化处理。下面就一些常见的代码进行总结归纳。

  • 在数据分析时,我们经常需要对数据进行分组,此时需要使用 dateframe.groupby() 函数

  • 查看数据信息时使用
    data(),data.info(),data.describe()

  • 在对数据进行排序时,使用
    values_sort(by=‘abc’, ascending=False)

  • stack() 将二维表转换为一维表,unstack() 将一维表转换为二维表

  • 保留小数时,使用 round(data,2)

  • 控制 datetime 的精度时,使用 astype(‘datetime64[M/D/Y]’)
    #M:month; D:day; Y:year

  • 统计累计占比时,使用 cumsum() 函数

  • 制作透视表,使用 pivot_tabel() 函数

  • 在计算时间差时,使用如下式的方法进行计算:

    rfm[‘R’] = (rfm[‘order_date’].max() - rfm[‘order_date’])/np.timedelta64(1,’D’) #np.timedelta64(1,’D’)表示以一天作为单位长度

  • 某一列的数值如果大于0,设为1,否则设为0:
    level = x.apply(lambda x:'1' if x > 0 else '0')

  • 以 value 填充所有的 NAN,使用 fillna(value)

四、数据可视化

常见的数据画图函数如下:

plt.figure(figsize=(12,4)) # 绘图大小
plt.subplot(a,b,c) # 绘图个数及分布
data.hist(bins=x) # 直方图
data.plot(kind='bar/line') # 柱状图/折线图
plt.xlabel('x')
plt.ylabel('y')
plt.legend('legend')

详情见此文

Time:2023年7月14日22:32:14

/an-zhuo-ding-zhi-ruan-jian/pythonshu-ju-fen-xi-shi-jian-zong-jie-3545.html