暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python解决工作问题(4)

牛谈琴 2021-06-01
366

本文继续使用python解决工作中的实际问题。从问题的本身来看,好像只能够用python编程来解决。那就只能硬着头皮往前走了。

01 具体的问题

我们需要计算某一家门店的品规再购率。意思是说,小李家上个月购买了三种同类品牌,这个月接着购买三个同类品牌,但是总的购买数5,所以我们就用这3个品规除以5,就是小李家当期的再购率。

具体的数据图表如下:

具体地思路

  1. 读取数据
  2. 找到上期购买的品牌,本期继续购买的终端数的数量
  3. 将数据汇总

02具体解决步骤

import pandas as pd
import numpy as np
import os

# 1.读取数据
df1 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\8.03-8.09购进.xls')
df2 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\8.10-8.16购进.xls')

df1 = df1[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
     '黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
     '红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
     '好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]
df2 = df2[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
     '黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
     '红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
     '好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]
# 整理列表

复制

接下来需要计算上期购买的品牌,本期继续购买的终端的数量。

dt = {}
for i in range(len(df2)):
  row_ls = []
  x1 = list(df2.iloc[i])  #确定现期
  x2 = df1[df1['许可证号'] == x1[0]] #基期
  if len(x2) == 0#没有匹配到
    continue
   elif len(x2) == 1:
    x2 = list(x2.values[0])  #找到了具体的终端数
    for xx in range(1,31):    #考虑列的情况
      if x1[xx] != 0 and x2[xx] != 0:  #说明现期和基期的品牌都有购买的
        row_ls.append(1)
       else:
        row_ls.append(0)
    else:
      print(x1[0]) # 主要表明是否有重复值
   dt_m = {x1[0]:row_ls}
    dt.update(dt_m)
df_z = pd.DataFrame(dt).T
df_z

复制

输出结果为:

接下来需要做的就是将其全部相加,计算回购的数量

df_z = df_z.apply(lambda x:sum(x),axis = 1)
df_z

复制

输出结果为:

420381105071    17
420301182194     9
420301182582    14
420301182620    12
420301183346    10
420301183765    11
420301183992     5
420301184119    12
420302101385     8
420302106761     7
420303100775    14
420303107636    11

复制

然后除以总的品牌数,将其整理即可

df_zz = pd.DataFrame(df_z)
df_zz = df_zz.apply(lambda x:round(x/30,2),axis = 1)
np.mean(df_zz).values[0]

复制

输出结果为:

0.35

复制

接下来需要做的就是将整个表全部读出来

import pandas as pd
import numpy as np
import os
road = os.listdir(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次')
zg = []
for t in range(8):
  dm = {}
  df1 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\{}'.format(road[t]))
  df2 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\{}'.format(road[t+1]))
  df1 = df1[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
     '黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
     '红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
     '好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]
  df2 = df2[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
     '黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
     '红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
     '好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]
  for i in range(len(df2)):
    row_columns = []
    x1 = list(df2.iloc[i])
    x2 = df1[df1['许可证号'] == x1[0]]
    if len(x2) == 0:
      continue
     elif len(x2) == 1:
      x2 = list(x2.values[0])
      for xx in range(1,31):
        if x1[xx] != 0 and x2[xx] != 0:
          row_columns.append(1)
         else:
          row_columns.append(0)
     else:
      print(x1[0])
      dr = {x1[0]:row_columns}
      dm.update(dr)
 dzg = pd.DataFrame(dm).T
  dzg_z = dzg.apply(lambda x:sum(x),axis = 1)
  dzg_zz = pd.DataFrame(dzg_z)
  df_zgl = dzg_zz.apply(lambda x:round(x/30,2),axis = 1)
  zg.append(round(np.mean(df_zgl).values[0],2))
print(zg)

复制

输出结果为:

[0.360.340.350.330.350.410.360.36]

复制

整个项目涉及到的知识点较多,需要认真消化。

03 项目知识点

  1. 看一下具体的数据形态
import pandas as pd
import numpy as np
import os

df1 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\8.03-8.09购进.xls')
df2 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\8.10-8.16购进.xls')

df1 = df1[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
     '黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
     '红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
     '好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]
df2 = df2[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
     '黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
     '红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
     '好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]

复制

看一下具体的数据形态:

for i in range(len(df2)):
  x1 = list(df2.iloc[i])
  print(x1)

复制

输出结果为:

[4203811050710012340345151115522124222000101]
[420301182194000011102080015222002200000000]
[4203011825820000040105142125222023200000000]
[4203011826201000011110100015222022200001000]
.....

复制

这个比较好理解,把每一行都遍历了一遍。这个是现期的数据.

接下来继续:

x2 = df1[df1['许可证号'] == x1[0]]
print(x2)

复制

我们首先进行猜测,这个一看就知道是x2是列表类型,然后再来打印出来看具体的形式,输出结果为:

许可证号  黄鹤楼(1916软)  黄鹤楼(1916硬)  中华(软)  中华(硬)  黄鹤楼(软珍品)  黄鹤楼(硬珍品)  \
154  420381105071           1           0      0      0         3         4   

     黄鹤楼(硬峡谷柔情)  黄鹤楼(硬奇景)  黄鹤楼(软红)   ...    利群(新版)  娇子(软阳光)  黄金叶(喜满堂)   云烟(紫)  \
154           1         0        4   ...         4        0          0      2   

      红河(软88)  红塔山(硬经典100)  红塔山(软经典)  好猫(金猴王)  钻石(硬蓝)  雄狮(薄荷)  
154         0            0         0        1       2       1  

[1 rows x 31 columns]

复制

我们可以使用type
函数知道数据类型

print(type(X2))

复制

输出结果为:

<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>

复制

我们知道了 x2
的数据类型是dataframe
dataframe
有两种属性,一种是 columns
其二是 values

这个地方要说明

将其转为list
为:

x3 = list(x2)
print(x3)

复制

输出结果为:

['许可证号''黄鹤楼(1916软)''黄鹤楼(1916硬)''中华(软)''中华(硬)''黄鹤楼(软珍品)''黄鹤楼(硬珍品)''黄鹤楼(硬峡谷柔情)''黄鹤楼(硬奇景)''黄鹤楼(软红)''黄鹤楼(硬红)''黄鹤楼(软蓝)''黄鹤楼(天下名楼)''黄鹤楼(软雪之景) ''红金龙(硬蓝爱你)''红金龙(软精品)''红金龙(硬神州腾龙)''红金龙(硬新版) ''红金龙(软蓝九州腾龙)''红金龙(软虹之彩)''南京(炫赫门)''利群(新版)''娇子(软阳光)''黄金叶(喜满堂) ''云烟(紫)'' 红河(软88)''红塔山(硬经典100)''红塔山(软经典)''好猫(金猴王)''钻石(硬蓝)''雄狮(薄荷)']
['许可证号''黄鹤楼(1916软)''黄鹤楼(1916硬)''中华(软)''中华(硬)''黄鹤楼(软珍品)''黄鹤楼(硬珍品)''黄鹤楼(硬峡谷柔情)''黄鹤楼(硬奇景)''黄鹤楼(软红)''黄鹤楼(硬红)''黄鹤楼(软蓝)''黄鹤楼(天下名楼)''黄鹤楼(软雪之景) ''红金龙(硬蓝爱你)''红金龙(软精品)''红金龙(硬神州腾龙)''红金龙(硬新版) ''红金龙(软蓝九州腾龙)''红金龙(软虹之彩)''南京(炫赫门)''利群(新版)''娇子(软阳光)''黄金叶(喜满堂) ''云烟(紫)'' 红河(软88)''红塔山(硬经典100)''红塔山(软经典)''好猫(金猴王)''钻石(硬蓝)''雄狮(薄荷)']

复制

接下来我们设置

x3 = list(x2.values)
print(x3)

复制

输出结果为:

[array([420381105071,            1,            0,            0,
                  0,            3,            4,            1,
                  0,            4,            4,           12,
                  3,            1,            1,            3,
                  5,            2,            1,            0,
                  2,            4,            0,            0,
                  2,            0,            0,            0,
                  1,            2,            1], dtype=int64)]
....

复制

因为x2
是一个dataframe
所以我们可以看到values

print(x2.values)

复制

输出结果为:

[[420381105071            1            0            0            0
             3            4            1            0            4
             4           12            3            1            1
             3            5            2            1            0
             2            4            0            0            2
             0            0            0            1            2
             1]]
<class 'numpy.ndarray'>
[[420301182194            0            0            0            0
             0            1            0            0            2
             2            8            0            2            1
             2            2            2            1            0
             0            1            0            0            1
             0            1            0            0            0
             0]]
<class 'numpy.ndarray'>
[[420301182582            1            0            0            0
             0            3            1            1            2
             2           11            1            1            2
             3            2            2            1            0
             1            3            1            1            2
             0            0            0            0            0
             0]]
<class 'numpy.ndarray'>

复制

所以我们知道这个是一个列表,里面涵盖一个元素

继续改进为:

x3 = list(x2.values[0])
print(x3)

复制

输出结果为:

[4203811050711000341044123113521024002000121]
[420301182194000001002280212221001001010000]
[4203011825821000031122111123221013112000000]
[420301182620000032013280223221012111010000]
[420301183346000001012080121120011111010000]

复制

这个地方需要有python的基础知识要非常熟练,其二,在学习的过程中,如果遇到不懂的问题可以先打印出来不停地尝试即可。

往期回顾

python解决工作问题(3)

python解决工作中的问题(2)

使用Pandas处理实际工作问题

Pandas学习笔记(二)

Pandas学习笔记(一)

文章转载自牛谈琴,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论