运营

我是如何摸到运营大门的门把手的?

2019-04-26  本文已影响0人  付林恒

我是如何摸到运营大门的门把手的?

在这一年里,说实话我真的走了很多的弯路,好不容易才搭建了一套属于自己的方法论,在这里就总结下,同时也给自己复盘。

演讲能力

第一件让我很头疼的的事情,就是演讲能力。我刚开始的第一个任务,就是给下面一层运营的同事介绍我们的产品,然后再让运营传达给用户使用。很没自信,再加上我对产品的不熟悉,导致我第一次讲课的时候就翻车,被下面的同事问得哑口无言。

后来我意识到,主要原因是,我只是把产品说明书原封不动的念给同事听而已,并没有深入的去理解并深挖这个功能是怎么样的,如何说得更简单。然后,我就总结了一套属于自己的演讲流程。

首先给运营培训,要理解你的观众,到底是想要什么假如说讲一套电商的平台,运营肯定会按照用户的思路来问你,总结起来通常就是三个流程:

所以说,介绍产品的 PPT 就必须做成上面那个样子:好处是什么 - 长什么样子 - 怎么获得。

后面建议附上一个 FAQ ,解决掉大部分的疑问。(通常 FAQ 在进行小流量测试的时候可以收集几个用户的建议,特别是那种第一次用的小白,你可以好好的调研他们,这样你就能马上提出优化需求对你的产品做出调整)

如果有听众,一定要多眼神交流。

多运用眼神交流

述职能力

实际上述职能力也是一个经常被人忽略的一个点,其实述职的好与坏,对运营的职业生涯有着很大的影响,可能述职讲得比较好,你就能够撬动你的领导,获得海量资源更好的做好运营。

当然,还有一个重点就是,复盘

其实每一次述职,都是一次很好的复盘机会,你可以让你老板知道你现在处于什么阶段,同时给出你下一步的建议。

通常来说,述职的 PPT 有以下几个点:

只要每周这样重新复盘一次,根据数据快速调整,那很快就可以找到主要原因并且解决问题。


数据分析

对于运营来说,数据分析是必不可少的一样东西,你可以根据你的数据,来预测你下一步要做什么,你的这一步走的有没有用。这里推荐下秦路的七周数据分析师课程哈。

其实掌握工具是最有用的,不多,掌握 Excel | SQL | Python 这三个玩意就好了。

重点提醒,工具的使用只是辅助,为什么要这个数据的逻辑才是最重要的。最好就是先熟悉业务,再想自己到底要什么数据。

首先就是就是 Excel 的一些常用的 API 了,下面我就给一个常用列表:

# 常用文本清洗
=LEFT(位置,长度)
=RIGHT(位置,长度)
=FIND("你要找的东西",位置,长度)
=CONCATENATE(位置,"要拼接的字符串")
=REPLACE(位置,从哪个字符串开始替换,到哪个字符串结束替换,"要变成一个什么字符")
=SUBSTITUTE(要替换字符的位置,替换的字符,"替换的内容")
=TRIM(要去除空格的位置)
=LEN(查看有字符长度的位置)

# 常用匹配函数
=VLOOKUP(查找值,区域匹配,返回列,精确或者模糊匹配)
=INDEX(索引区域,第几行,第几列)
=MATCH(匹配值,匹配区域,精确或者模糊匹配)

# 常用逻辑运算函数
=IF(位置>你要的值,"为真","为假")
# 还可以嵌套 IF
=IF(位置>你要的值,=IF(位置>你要的值,"为真","为假"),"为假")

# 计算函数
=SUMPRODUCT(要乘的值的区域,系数区域) #相乘后,求和
=COUNT(你要知道有多少个数的区域)
=MAX(你要知道区域的最大值)
=MIN(你要知道区域的最小值)
=RANK(位置,你要知道排名的区域)
=AVERAGE(区域平均值)
=STDEV(区域标准差)
=INT(取整)
=ROUND(位置,取整范围)
=COUNTIF(你要知道值筛选条件的区域(计数),你的条件)
=SUMIF(你要知道值筛选条件的区域(求和),你的条件)
=AVERAGEIF(你要知道值筛选条件的区域(平均数),你的条件)

# 时间换算函数
=YEAR(位置)
=MOUTH(位置)
=DAY(位置)
=WEEKDAY(位置,你要的参数) #参数建议用 2 星期一才等于 1
=NOW()
=TODAY()

最后的最后,还有一个数据透视表,没了,Excel 会这些绝对够用。

其次就是一些比较简单的 SQL 了。

SQL 的话建议直接安装 MySQL,比较简单。接下来给大家讲一些比较简单的语法。

SELECT * FROM data.dataanalyst; -- 这里的 * 号值的是全部匹配,实际上可以换成你想要的字段名字。data 是指主表,dataanalyst 是指主表叫 dataanalyst 的 sheet。

SELECT * FROM data.dataanalyst
limit 10; -- 指的是只要前10行的数据

SELECT * FROM data.dataanalyst
order by userId; -- 把 userId 进行升序

SELECT * FROM data.dataanalyst
order by userId desc; -- 把 userId 进行降序

SELECT * FROM data.dataanalyst
where city = "广州"; -- 把 city 为广州的数据找出来

SELECT * FROM data.dataanalyst
where userId > 1000; -- 把 userId 大于 1000 的数据找出来

SELECT * FROM data.dataanalyst
where userId < 1000; -- 把 userId 小于 1000 的数据找出来

SELECT * FROM data.dataanalyst
where userId between 1000 and 1500; -- 把 userId 在 1000 和 1500 之间的数据找出来

SELECT * FROM data.dataanalyst
where city in ("上海","广州"); -- 把 city 在上海和广州的数据找出来

SELECT * FROM data.dataanalyst
where city != "上海"; -- 把 city 剔除掉上海的数据

SELECT * FROM data.dataanalyst
where city <> "上海"; -- 意思同上

SELECT * FROM data.dataanalyst
where city not in ("上海"); -- 意思同上

SELECT * FROM data.dataanalyst
where city = "上海"
and education = "本科" -- 找到在上海又是本科的数据,后面还能加 and

SELECT * FROM data.dataanalyst
where city = "上海"
or city = "北京" -- 找到在上海或是北京的数据

/* and 和 or 的高级用法,and 和 or 同时出现的时候,and 优先执行,所以可以添加括号*/

SELECT * FROM data.dataanalyst
where 
(city = '上海'
and education = '本科')
or
(city = '北京'
and education = '硕士') -- 既满足上海和本科,有满足北京和硕士

SELECT * FROM data.dataanalyst
where 
secondType like '%开发%' -- 包含 开发 这两个字的数据

/* 分组神器 group by */
SELECT city,count(positionId) FROM data.dataanalyst
group by city -- 按照 positionId 进行城市岗位计数

SELECT city,count(positionId),count(distinct companyId) FROM data.dataanalyst
group by city -- 按照 positionId 进行城市岗位计数并对公司数量进行计数

SELECT city,education,count(1) FROM data.dataanalyst
group by city,education -- 城市底下不同学历的岗位数量

/* 如何针对分组后的数据进行过滤 */
SELECT city,count(1) FROM data.dataanalyst
group by city
having count(positionId) >= 100 -- id 大于 100 以上的岗位

SELECT city,count(1) FROM data.dataanalyst
where industryField like '%产品运营%'
group by city
having count(positionId) >= 50 -- 所有产品运营岗位大于 50 的城市,having 可以对分组后的数据进行处理

SELECT city FROM data.dataanalyst
group by city
having count(if(industryField like '%产品运营%',1,null)) >= 50 -- 如果是产品运营,就返回 1 到 count 进行计数,如果返回 null 就不计数

SELECT
city,
count(1),
count(if(industryField like '%产品运营%',industryField,null))
count(if(industryField like '%产品运营%',industryField,null)) / count(1)
FROM data.dataanalyst
group by city
having count(if(industryField like '%产品运营%',industryField,null)) >= 10
order by count(if(industryField like '%产品运营%',industryField,null))
-- 会算出一个是城市岗位数量的值,一个是包含 产品运营 的值,并算出占比,还能再进行过滤,并进行降序排列。

SELECT
city,
count(1) as total,
count(if(industryField like '%产品运营%',industryField,null)) as po
count(if(industryField like '%产品运营%',industryField,null)) / count(1)
FROM data.dataanalyst
group by city
having po >= 10
order by po
-- 可以进行赋值

/* SQL 函数 */
SELECT left(salary,locate('k',salary)-1),salary FROM data.dataanalyst
-- 找到第一个 k 的位置并截取,而且把 k 也去掉

SELECT 
left(salary,locate('k',salary)-1)
locate('-',salary),
length(salary),
substr(salary,locate('-',salary)+1,length(salary)-locate('-',salary)-1),
salary FROM data.dataanalyst
-- 先找到薪资第一个 k 切片再把 k 去掉,再把 - 的位置截取,取薪资的长度,字符串薪资,起始位置到结束位置切片

/* 子查询,查询也是可以嵌套的 */
SELECT (bottom + top)/2 FROM (
SELECT
left(salary,locate('k',salary)-1) as bottom,
substr(salary,locate('-',salary)+1,lengeh(salary)-locate('-',salary)+1) as top,
salary
FROM data.dataanalyst) as t
-- 对已处理的数据进行查询并求出平均薪资

SELECT 
case
when (bottom + top)/2 <= 10 then '0-10' 
when (bottom + top)/2 <= 20 then '10-20' 
when (bottom + top)/2 <= 30 then '20-30'
else '30+'
end,
salary FROM (
SELECT
left(salary,locate('k',salary)-1) as bottom,
substr(salary,locate('-',salary)+1,lengeh(salary)-locate('-',salary)+1) as top,
salary
FROM data.dataanalyst) as t
-- 对数据进行匹配,类似 vlookup

SELECT * FROM data.dataanalyst
where city in (
SELECT city FROM data.dataanalyst
group by city having count(positionId) >= 100
)
-- 分组完符合规定的城市之后再进行数据查询

/* join 跨表分析,其实有点像 vlookup */
SELECT * FROM data.dataanalyst as d
join data.company as c on d.companyId = c.companyId
-- 根据唯一值 companyId 合并两张表
-- 其实还有各种 join 这里就不一一举例了
SQL JOIN

然后还有 Python 的数据分析,其实不难,只用学 pandas 这个框架就行了。

如果之前一直看我文章的朋友,应该是了解到我对前端还是比较熟悉的,实际上 JavaScript 和 Python 是非常相似的,下面就给大家简单介绍一下 Python 的基础语法。

print() 是一个和 console.log() 一模一样的东西

通常,我们用 JavaScript 打印东西的时候,会用到 console.log()

console.log('holy crap')

那用 Python 打印,是用 print()

print('holy crap')

我的经验告诉我,print() 这个玩意和 console.log() 一样,是 debug 最好的办法。把觉得有问题的地方都打印一遍。

字符串和数字

'holy crap'
123456

和 JavaScript 一样的逻辑。

变量

JavaScript 有 var / const / let

现在看起来 Python 可以之间定义,只用赋值就可以了。

people = 'frankietang'
print(people)

也是自上到下运行,重新定义的值会直接覆盖掉。

salary = 3500
salary = 0
print('your salary:' + str(salary))

input()

input() 是一个新玩意。就是可以把你在终端输入的东西给获取出来。类似事件?也不太像。

可以获取到用户输入的东西。

happen = input('What\'s happening?')
print('Suggestions:' + happen)

str() , int() , float() , type() , len()

字符串同样是要用 \ 来转义,或者 ""

test = 'What\'s happening?'
test = "What's happening"
转义字符 描述
(在行尾时) 续行符
\ 反斜杠符号
' 单引号
" 双引号
\a 响铃
\b 退格(Backspace)
\e 转义
\000
\n 换行
\v 纵向制表符
\t 横向制表符
\r 回车
\f 换页
\oyy 八进制数yy代表的字符,例如:\o12代表换行
\xyy 十进制数yy代表的字符,例如:\x0a代表换行
\other 其它的字符以普通格式输出

不会直接查,不用记。

type() 就是看属性的,也不用记。

test = '123'
print(type(test)) # <type 'str'>

len() 看长度的。

print(len('123')) # 3

整数是 int() ,没有小数点的那种。

浮点数是 float() ,有小数点的那种。

play = str(int(input('你每天看片的时间?'))*7)
print('您一周玩手机' + play + '小时')

就是可以一直转类型,多少层都可以。

条件语句

就是 if 和 else,还有一个 elif

num = 1
if num < 0 :
    print(num + 1)
else :
    print(num - 1)
    
# 0
x = 1
if x > 1:
    print ('x > 1')
elif x < 1:
    print('x < 1')
else:
    print('x = 1')

# 1

布尔值

就是 Ture 和 False

其中Python把 0 、空字符串 '' 和 None 看成 False,其他数值和非空字符串都看成 True 。

“与”“或”“非”三种运算
与运算:只有两个布尔值都为 True 时,计算结果才为 True。
或运算:只要有一个布尔值为 True,计算结果就是 True。
非运算:把True变为False,或者把False变为True。

and 和 or 运算的一条重要法则:短路计算

a = True
print a and 'a = T' or 'a = F'
#输出为“a = T”
  1. 在计算 a and b 时, a 是 True,则整个计算结果必定取决与 b,因此返回 b。
  2. 在计算 a or b 时, a 是 True,则根据或运算法则,整个计算结果必定为 True,因此返回 a。

所以 Python 解释器在做布尔运算时,只要能提前确定计算结果,它就不会往后算了,直接返回结果。

whliebreakcontinueexit()

while 是循环,break 是结束,continue 是不再执行下面的语句,回到 while 。

while True:
  a1=input('认罪吗?请回答认罪或者不认')
  a2=input('认罪吗?请回答认罪或者不认')
  if a1 == '认罪' and a2 == '认罪':
    print('两人都得判10年,唉')
  elif a1 == '不认' and a2 == '认罪':
    print('a1判20年,a2判1年,唉')
  elif a1 == '认罪' and a2 == '不认':
    print('a1判1年,a2判20年')
  else:
    print('都判3年,太棒了')
    break
    
# 认罪吗?请回答认罪或者不认不认
# 认罪吗?请回答认罪或者不认认罪
# a1判20年,a2判1年,唉
# 认罪吗?请回答认罪或者不认认罪
# 认罪吗?请回答认罪或者不认认罪
# 两人都得判10年,唉
# 认罪吗?请回答认罪或者不认认罪
# 认罪吗?请回答认罪或者不认不认
# a1判1年,a2判20年
# 认罪吗?请回答认罪或者不认不认
# 认罪吗?请回答认罪或者不认不认
# 都判3年,太棒了

exit() 也可以结束循环

a = 0
while True:
    a = a + 1
    if a == 2:
        exit()
print(a)

列表

举个例子

list = [1,2,3,[4,5],6]
print(list[1]) # 2
print(list[3][1]) # 5
print(list[-1]) # 6
print(list[0:4]) # [1, 2, 3, [4, 5]]
print(list[1:3]) # [2, 3]
print(list[1:]) # [2, 3, [4, 5], 6]
print(list[:2]) # [1, 2]

插入数据用 append()

list = [1,2,3,[4,5],6]
list.append(7)
print(list) # [1, 2, 3, [4, 5], 6, 7]

字典

其实就是 key 和 value 的意思。

举个例子,这个是字典包列表

dict = {a:['甲','乙','丙'],b:['A','B','C']}
print(dict[1][0]) # 甲
print(dict[1]) # ['甲','乙','丙']

还有列表包字典

list = [{1:'甲'},{2:'乙'},{3:'丙'}]
print(list[1][2]) # 乙
print(list[1]) # {2: '乙'}

for 循环

和 JavaScript 同理

a = [1,2,3]
for i in a:
    print(i) # 123

其实就是等于

a = [1,2,3]
i = a[0]       #把列表a里面的第0个数据放到i里面
print(i)
i = a[1]       #把列表a里面的第1个数据放到i里面
print(i)
i = a[2]       #把列表a里面的第2个数据放到i里面
print(i)

如果要从字典里面取值,用下面这种操作

dict = {'a':1,'b':2,'c':3,'d':4}
for i in dict :
    print(i+':'+str(dict[i]))

# a:1
# b:2
# c:3
# d:4

还有一个叫 range() 可以生成整数数列

for i in range(3):
    print(i) # 012

for i in range(13,17):
    print(i) # 13,14,15,16

for i in range(3):
    print('a') # aaa

函数

funtion() 同理

def people(name):
    print(name+'早上好')

people('邓嘉麟')

return() 也不太难理解,例如下面这个例子,就是返回了一个字符串

def age(i):
    if i < 12:
        return '是小朋友啊'
    elif i < 18:
        return '是少年啊'
    else:
        return '嗯,永远18岁'

n = age(30)
print(n)

这里同样也有作用域这个概念,这里就不多加叙述了。其实可以理解为,外部是公交车,人人可以上,内部是私家车,私人可以上。

try...except...

看一个例子

num = [0,1,2,3]
for x in num:
    try:
    #尝试执行下列代码
        print (6/x)
        #使用6除以num中的元素,并输出
    except ZeroDivisionError:
    #除非发生ZeroDivisionError报错,执行下列代码:
        print('0是不能做除数的!')
        #打印“0是不能做除数的!”
        
# 0是不能做除数的!
# 6.0
# 3.0
# 2.0

就是错误后也运行,不过会抛出自己的写的异常。

还有一个 pass,就是直接跳过,执行下一轮循环。

num = [0,1,2,3]
for x in num:
    try:
        print (6/x)
    except :
        pass

# 6.0
# 3.0
# 2.0
  1. except后面什么也不跟,直接加冒号。意味着,只要报错就执行下面的代码,不管是什么错误类型。
  2. 报错后执行的代码,你也可以只写一个'pass','pass'的意思就是:什么都不做。'pass'的存在意义是占个位,维护格式完整。比如except语句后面要求你要执行点什么报错后的程序,但你又什么都不想执行,那就pass好了。

encode() , decode() , ord() , chr()

decode 的作用是将其他编码的字符串转换成 unicode 编码,如str1.decode('gb2312'),表示将 gb2312 编码的字符串转换成 unicode 编码。

encode 的作用是将 unicode 编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将 unicode 编码的字符串转换成 gb2312 编码。

ord()函数主要用来返回对应字符的 ascii 码,chr()主要用来表示 ascii 码对应的字符他的输入时数字,可以用十进制,也可以用十六进制。

print('邓嘉麟'.encode('gbk'))
print(b'\xb5\xcb\xbc\xce\xf7\xeb'.decode('gbk'))
print(ord('麟'))
print(chr(40607))

open() 方法

Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

open(file, mode='r')

完整的语法格式为:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

mode 参数有:

模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

默认为文本模式,如果要以二进制模式打开,加上 b 。

file 对象

file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

序号 方法及描述
1 file.close()关闭文件。关闭后文件不能再进行读写操作。
2 file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
3 file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
4 file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。
5 file.next()返回文件下一行。
6 [file.read(size])从文件读取指定的字节数,如果未给定或为负则读取所有。
7 [file.readline(size])读取整行,包括 "\n" 字符。
8 [file.readlines(sizeint])读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。
9 [file.seek(offset, whence])设置文件当前位置
10 file.tell()返回文件当前位置。
11 [file.truncate(size])截取文件,截取的字节通过size指定,默认为当前文件位置。
12 file.write(str)将字符串写入文件,返回的是写入的字符长度。
13 file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

举个例子

# -*- coding: UTF-8 -*-

# file1 = open('./abc.txt','r') # 只读
# filecontent = file1.read()
# print(filecontent)
# file1.close()

# file1 = open('./abc.txt','w') # 覆盖
# file1.write('张无忌\n')
# file1.write('宋青书\n')

file1 = open('./abc.txt','a') # 添加
file1.write('张无忌\n')
file1.write('宋青书\n')
file1.close()

abc.txt 就长这个样子

周芷若
赵敏
张无忌
宋青书

split()join()

join() 链接字符串

split() 拆分字符串

test1=['a','b','c']
print('-'.join(test1)) # a-b-c
test2='a b c'
print(test2.split(' ')) # ['a','b','c']

对象

class Food() :
# 定义一个食物的类别
    delicious = True
    # 属性“好吃”为真
    def taste(self,people) :
    # 定义一个“品尝”的方法,参数有两个。其中self是系统预设关键词,代表的是这个对象本身,调用该方法时可省略这个参数的填写。
    # people是吃食物的人。
        print(people,'说:真香!')
        # 输出people,'说:真香!'
chaofan = Food()
# 定义一个食物,炒饭
print(type(chaofan))
# 输出食物炒饭的数据类型
print(chaofan.delicious)
# 输出食物炒饭的 delicious 属性
chaofan.taste('Frankie')
# 调用品尝的方法,Frankie 吃掉炒饭

好,以上就是 Python 的基础,是进行 Python 数据分析的根基。

数据分析推进下一步进展

目前在公司,其实主要是负责 B 端用户的运营,专注提升用户对 TO C 的服务能力的,所以我每天都会在看每个品牌下面有什么大区,大区下面有什么门店,哪个用户比较突出,哪个用户数据不行,通常来说,我都是会直接面对面接触用户看看他们在干什么,如果他们做了哪些比较优秀的点,我就会收集起来制定一套方案,并且执行落地。


以上就是我这快一年来的运营回顾,可提升的事情还有很多,仍需努力呢。

上一篇下一篇

猜你喜欢

热点阅读