分类目录归档:职业

Pandas速查手册中文版 | Day4

对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非常重要的Python包。它不仅提供了很多方法,使得数据处理非常简单,同时在数据处理速度上也做了很多优化,使得和Python内置方法相比时有了很大的优势。

如果你想学习Pandas,建议先看两个网站

  • 官网:Python Data Analysis Library
  • 十分钟入门Pandas:10 Minutes to pandas

在第一次学习Pandas的过程中,你会发现你需要记忆很多的函数和方法。所以在这里我们汇总一下Pandas官方文档中比较常用的函数和方法,以方便大家记忆。

关键缩写和包导入

在这个速查手册中,我们使用如下缩写:

df:任意的Pandas DataFrame对象
s:任意的Pandas Series对象

同时我们需要做如下的引入:

import pandas as pd
import numpy as np

导入数据

  • pd.read_csv(filename):从CSV文件导入数据
  • pd.read_table(filename):从限定分隔符的文本文件导入数据
  • pd.read_excel(filename):从Excel文件导入数据
  • pd.read_sql(query, connection_object):从SQL表/库导入数据
  • pd.read_json(json_string):从JSON格式的字符串导入数据
  • pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
  • pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
  • pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据

导出数据

  • df.to_csv(filename):导出数据到CSV文件
  • df.to_excel(filename):导出数据到Excel文件
  • df.to_sql(table_name, connection_object):导出数据到SQL表
  • df.to_json(filename):以Json格式导出数据到文本文件

创建测试对象

  • pd.DataFrame(np.random.rand(20,5)):创建20行5列的随机数组成的DataFrame对象
  • pd.Series(my_list):从可迭代对象my_list创建一个Series对象
  • df.index = pd.date_range(‘1900/1/30’, periods=df.shape[0]):增加一个日期索引

查看、检查数据

  • df.head(n):查看DataFrame对象的前n行
  • df.tail(n):查看DataFrame对象的最后n行
  • df.shape():查看行数和列数
  • df.info():查看索引、数据类型和内存信息
  • df.describe():查看数值型列的汇总统计
  • s.value_counts(dropna=False):查看Series对象的唯一值和计数
  • df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数

数据选取

  • df[col]:根据列名,并以Series的形式返回列
  • df[[col1, col2]]:以DataFrame形式返回多列
  • s.iloc[0]:按位置选取数据
  • s.loc[‘index_one’]:按索引选取数据
  • df.iloc[0,:]:返回第一行
  • df.iloc[0,0]:返回第一列的第一个元素

数据清理

  • df.columns = [‘a’,’b’,’c’]:重命名列名
  • pd.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组
  • pd.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组
  • df.dropna():删除所有包含空值的行
  • df.dropna(axis=1):删除所有包含空值的列
  • df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行
  • df.fillna(x):用x替换DataFrame对象中所有的空值
  • s.astype(float):将Series中的数据类型更改为float类型
  • s.replace(1,’one’):用‘one’代替所有等于1的值
  • s.replace([1,3],[‘one’,’three’]):用’one’代替1,用’three’代替3
  • df.rename(columns=lambda x: x + 1):批量更改列名
  • df.rename(columns={‘old_name’: ‘new_ name’}):选择性更改列名
  • df.set_index(‘column_one’):更改索引列
  • df.rename(index=lambda x: x + 1):批量重命名索引

数据处理:Filter、Sort和GroupBy

  • df[df[col] > 0.5]:选择col列的值大于0.5的行
  • df.sort_values(col1):按照列col1排序数据,默认升序排列
  • df.sort_values(col2, ascending=False):按照列col1降序排列数据
  • df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据
  • df.groupby(col):返回一个按列col进行分组的Groupby对象
  • df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象
  • df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值
  • df.pivot_table(index=col1, values=[col2,col3], aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表
  • df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
  • data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
  • data.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max

数据合并

  • df1.append(df2):将df2中的行添加到df1的尾部
  • df.concat([df1, df2],axis=1):将df2中的列添加到df1的尾部
  • df1.join(df2,on=col1,how=’inner’):对df1的列和df2的列执行SQL形式的join

数据统计

  • df.describe():查看数据值列的汇总统计
  • df.mean():返回所有列的均值
  • df.corr():返回列与列之间的相关系数
  • df.count():返回每一列中的非空值的个数
  • df.max():返回每一列的最大值
  • df.min():返回每一列的最小值
  • df.median():返回每一列的中位数
  • df.std():返回每一列的标准差

文章来源
https://www.dataquest.io/blog/pandas-cheat-sheet/

数据工程师学习路径

行业背景

技能清单

  1. 《Python 3 数据分析 Data Science零基础完全入门》第四、五节.学习panda库–>学习
  2. 《Python3零基础完全入门》第一、二、三节,学习基础内容

学习工具

学习日记

用户分析笔记

1. 数据的准备工作
在数据分析之前,对数据收集和整合是很重要的。
就像在破案一样,初步是收集尽可能多的数据来源,而后是筛选。

2. 筛选数据
面对大量数据时,不要着急直接看数据,要根据数据分析的目标来设定筛选规则,不停的以各种角度来分类用户,即要根据目标来设定数据筛选规则。

继续阅读

豆瓣发展历程

其实,很早以前就想好好整理整理豆瓣产品的发展演变历程。但对于一个懒人来说,一切都是可以有借口的。
只是想做的事情永远围绕在脑子里,其实也挺难过的。于是终于动手开始整理现在的这个v0.1版本。
其实这类资料来源大概有两个出处分:好事者零碎的收集和豆瓣官方的整理与罗列。这两块我都看到过,特别是官方的,应该是在一个新功能测试小组里面,但现在这个小组似乎被埋的很深。
所以我应该会先合并几份数据,然后根据时间线来罗列出整个产品演进的历程。最后再依照产品的重要程度,做出一定删选。

望闻问切,我的需求收集4步骤

一直以来我都有通过greader订阅rss的习惯。
但从去年开始翻墙变的越来越麻烦,上greader更是如此。经常莫名其妙挂掉,从那时起我就在想是不是自己倒腾一个更适合自己的rss工具来。但直到这几天,我才终于空下来,开始做这个事情。

当然我并没有立刻动手,因为即使这只是给我个人用的产品,我也不想因为匆忙动手,而造成以后的反复推到,重做,是我最讨厌的。与其这样不如开始就认认真真的做好需求分析。

关于需求分析,我方法论是这样的:
1. 望
找核心用户群,从他们的各种行为里找出已经遇到的,或者强烈需要解决的问题。一般不能立刻直接去问,因为一般都没有结果,还会把自己弄的很郁闷。

2. 闻
把第一步找到的信息,做一次梳理,去芜存菁,让问题聚焦。为下一步与用户沟通做准备

3. 问
现在我们已经对问题有了大体的了解,里外有数。我们可以开始准备一些问题,最后能做出文档的形式。
或QQ、或电话、或咖啡见面聊。找一些我认识的核心用户(比如重度rss使用者)交换意见。并且也在一些专业论坛询问,以确定是否存在外围用户。并将所有反馈收集整理。为下一步准备。

4. 切
这是最后一步,要解决两个问题,1)这个问题是否值得花时间去做,2)如果做,先从哪个核心点切入。

在完成以上工作后,如果我决定要做。那就会根据找出的核心点,做更细致的需求文档。
每次只解决一个核心问题

最后,我关于rss订阅的问题的结果是这样的!

1. 我自己需要解决这个问题
并且从社区和核心用户处得到的反馈,虽然目前已有一些国内的公司在做(如zaker),但那些更多是面向小白用户,他们只要结果,不管是否从rss或微薄得来的信息。
不太适合我们。而鲜果、9点等老牌工具已经因为各种原因相继挂掉。

2. 目前最核心的问题有几个
a. 收集墙外rss
b. 良好的话题讨论和气氛的营造
c. 消息排名机制,也就是要使用特定算法将用户的喜好,通过排序表现出来。也可以帮助其他用户快速找到优秀内容。

我的决定是先按次序解决,目前先打好框架,并解决翻墙问题,先不做用户功能,只能浏览。
目前网站第一步其实已经解决,先放出网址,大家看看 http://bouoe.com/
欢迎大家使用并给出反馈意见。

谢谢

产品与前端工程师的沟通边界

根据最近一段工作经验和自我分析,觉得产品与前端工程师大概有4个时间点,是必须做充分交流的。

 

第一点,需求说明

这是整个需求的开始,产品必须较为详细和完整和开发同学讲清楚需求,特别是细节。

 

第二点,功能点完成

开发在完成基础功能时,应该给产品做demo,在产品确定功能符合需求和修改bug后,才开始下一步工作。

 

第三点,主浏览器下前端效果完成

在完成基础功能后,先依据主浏览器的情况,完成前端效果。不用急于做兼容性优化。

在完成效果后,需要和产品、UI沟通,完成bug。

 

第四点,浏览器兼容性修补

在这个时间点,功能早就完成,但要小心的是,因为做兼容性或新功能,要破坏了其他功能的视觉效果。

这个时间点,一定要做全局的回归测试。

30-35岁的人在互联网上干什么?

2011年9月中国主要sns网站用户年龄分布

我今天30岁,2000年来杭州读大学,当时只有极少几个大学有完善的校内局域网外,其中的学生可以较为方便的浏览网络,也只有极少几个学校开通了自己域名的邮箱系统,并鼓励同学和老师使用,所以我和我大部分同学一样,或者和当时大部分网络用户一样,除了在网吧里打打游戏\上上QQ以外,对网络几乎是没有太多认识的.

而我有一个粗鄙的看法,就是人会一辈子延用他们在青少年时期养成的各种习惯.对互联网也是一样等科技产品也是一样.比如我爸,他年轻的时候学会了使用电话,但那时候的电话是古老的手摇式电话机,讲电话时必须用喊才能正常通话.尽管几十年过去了,手摇式电话机经进入博物馆,电话也变手机了,但对我爸来说,手里小巧玲珑的手机就是当年的老式电话,所他几乎在20米开外打电话,我都是能听到的,而我每次和他通话,也都必须手机放的很远很远.

别以为这样的事情只发生在我爸那一辈人身上,我也观察好多大学同学,我的这一理论也是成立的.比如,虽然现在微博很流行,但我大学同学里开微博的人极少.每次聚会,假如他们聊互联网的话,那最爱聊的然是他们大学时耗时最多的网络游戏,甚至有的人连游戏都没有换过..当然,如果我不从事这个行业的话,我几乎和他们也是一样的.

好,还是回到我的主题,30-35岁的人在互联网上干什么?通过我上面一通的废话,我想很清楚,你想知道他们现在做什么,最好的办法就是去看看他们10年前或15年前他们是怎么使用互谅网的,新闻门户,QQ,bbs,可能就是他们的选择.只有极少从事it相关行业的人才会对互联网有更深的了解.

不是因为他们现在没有机会去了解,而是他们在青年时期,或者说是学生时期,就从没有好好的了解过web,就和我的大学同学一样.惯性的力量是超乎我们想象的.他们往往只是重复年轻时的使用经历.

所以我想只能下一个很悲观的决定,假若我们还是想做web2.0 的话,那还是让我们暂时放弃把30-35岁用户作为主攻市场的念头吧!有效用户太少了!

PD和猎人

产品是一个承下起上的环节,上接着出产方,下联这使用者。

所以它又必须是一个上下讨好的物件。否则上游不愿生产,下游不愿使用,那产品再貌美如花也是枉然。

既然如此,似乎相当复杂。那不由的问自己,一件产品到底应该是个什么模样呢?或者说一个产品经理应该如何设计一个产品。这自然又牵扯到了产品与PD的关联。他们的到底有什么渊源?

到底是父子,还是情人?

如是父子,自然有先后和因果。可以用这样“如果没有。。。也就不存在。。。”的语句来描述事件。说到这,似乎事情已经变的简单很多,我们大可以拿这句话来检验许多事情。倘若能套用,则的确是父子,如果不行,则该有其他。

众里寻他的过程,要梳理很多的线索,一点点的寻找,就像一个猎手一点点扑捉。

并且这是一个竞赛,无数人再找他。

互联网产品粒度和发布门槛的思考

说产品粒度有点空,拿具体功能,如网站注册来举例。

大体可分为:用户信息填写和提交、用户信息认证(邮件激活和手机短信认证最为常见)、第三方ID接入。

当然还可以分的更细,例如,用户信息填写中的登录ID还可以分为用户id和邮箱。有的网站的登录id是从ID升级为邮箱,然后两者皆可登录。但这是历史原因造成的,对于新发网站,还有必要重走老路吗?当然是直接使用邮件登录。

所以对我而言,产品粒度分割的依据主要亮点

  1. 个体而言,是否完整实现最小功能
  2. 整体而言,是否功能链中不可缺少的一环

那这三块功能的重要程度怎么分,是否需要同时上线?也可以说他们的对外发布的门槛在哪里?

image

如上图所示,产品需求大体分为:核心需求(关键过程需求和非关键过程需求)+衍生需求。就上列中的注册而言:

  1. 用户信息填写和提交,必然是关键过程需求
  2. 用户可信度认证,对于强调用户身份真实性的网站来说,分为非关键过程的核心需求是不为过的。
  3. 第三方ID接入,这个要看产品所处的阶段和市场依赖,要根据具体产品来定。但对于布兜来说,目前可以定位衍生需求

好,根据这个实例我们对需求做了具体判断,那让我们回到原先的问题上来,当我们完成到什么程度可以发布呢?

对于我来说,只要完成核心需求中的关键过程,就可以上线。

要不要等衍生需求,不要

要不要等非关键过程需求,除非是帮助市场推广的亮点功能,否则不要等!

这些功能全部可以等发布后一步一步的完善,并且多听用户的意见。

对于互联网产品最重要的是速度和用户反馈:快速发布;快速推出新功能;用户反馈机制一定要简单,从而帮助用户发出自己的声音,增强参与感;通过用户反馈,快速检查产品问题;快速修复产品以及预期。。。总之,互联网的江湖,对于小团队,草根团队来说,只有一招,就是速度。

不要害怕推出错误的产品,不要害怕错过什么时机。。。中国的人口红利,对于互联网企业来说虽然已经不在峰顶,但那只对大公司有影响。对于草根初创团队,市场仍然是巨大的。只要做出了满足用户需求的产品,就能成功!

但怎么样算成功?对于小团队来说,1000个用户也是成功,不可犯贪。

很多时候,在用户真正看到产品之前,无法告诉我们ta是否喜欢,产品开发同学更不知道,谁能打包票?所以,让用户参与开发变得越来越重要,实际操作中也变得越来越常见。不但网站、游戏如此,连一些网络小说的创作也是。毕竟在无法完全猜透用户需求的时候,为什么不让他们直接告诉我们呢?

一个产品要怎么做呢?

一个产品总有核心功能和附件功能之分。

核心功能做起来费时费力,还往往没有附加功能的诸多花哨亮点。可正因为花哨,常常都有些可有可无。并且用户永远不会因为花哨使用你的产品!

有一个感觉,在最初的版本中,一定要坚决的放弃附加功能,扎扎实实的想清楚产品的核心在哪里,并找一定量的目标用户群体聊。看他们是否接收,是否喜欢,是否会疯狂。

第一步  确定和完善产品核心目标

第二步 确定分阶段完成的工作

第三步  确定和筛选产品每一阶段的核心功能

第四步   具体实施

第五步  在此回到第2、3步。并且检查自己的工作是否符合第一条