Python wrapper for TA-Lib (http://ta-lib.org/)

This is a Python wrapper for TA-LIB based on Cython instead of SWIG. From the homepage:

TA-Lib is widely used by trading software developers requiring to perform technical analysis of financial market data.

  • Includes 150+ indicators such as ADX, MACD, RSI, Stochastic, Bollinger Bands, etc.
  • Candlestick pattern recognition
  • Open-source API for C/C++, Java, Perl, Python and 100% Managed .NET

The original Python bindings use SWIG which unfortunately are difficult to install and aren’t as efficient as they could be. Therefore this project uses Cython and Numpy to efficiently and cleanly bind to TA-Lib — producing results 2-4 times faster than the SWIG interface.

Install TA-Lib or Read the Docs

Examples

Similar to TA-Lib, the function interface provides a lightweight wrapper of the exposed TA-Lib indicators.

Each function returns an output array and have default values for their parameters, unless specified as keyword arguments. Typically, these functions will have an initial “lookback” period (a required number of observations before an output is generated) set to NaN.

All of the following examples use the function API:

import numpy
import talib

close = numpy.random.random(100)

Calculate a simple moving average of the close prices:

output = talib.SMA(close)

Calculating bollinger bands, with triple exponential moving average:

from talib import MA_Type

upper, middle, lower = talib.BBANDS(close, matype=MA_Type.T3)

Calculating momentum of the close prices, with a time period of 5:

output = talib.MOM(close, timeperiod=5)

Abstract API Quick Start

If you’re already familiar with using the function API, you should feel right at home using the abstract API. Every function takes the same input, passed as a dictionary of Numpy arrays:

import numpy as np
# note that all ndarrays must be the same length!
inputs = {
    'open': np.random.random(100),
    'high': np.random.random(100),
    'low': np.random.random(100),
    'close': np.random.random(100),
    'volume': np.random.random(100)
}

Functions can either be imported directly or instantiated by name:

from talib import abstract
sma = abstract.SMA
sma = abstract.Function('sma')

From there, calling functions is basically the same as the function API:

from talib.abstract import *
output = SMA(input_arrays, timeperiod=25) # calculate on close prices by default
output = SMA(input_arrays, timeperiod=25, price='open') # calculate on opens
upper, middle, lower = BBANDS(input_arrays, 20, 2, 2)
slowk, slowd = STOCH(input_arrays, 5, 3, 0, 3, 0) # uses high, low, close by default
slowk, slowd = STOCH(input_arrays, 5, 3, 0, 3, 0, prices=['high', 'low', 'open'])

Learn about more advanced usage of TA-Lib here.

Supported Indicators

We can show all the TA functions supported by TA-Lib, either as a list or as a dict sorted by group (e.g. “Overlap Studies”, “Momentum Indicators”, etc):

import talib

print talib.get_functions()
print talib.get_function_groups()

Function Groups

Overlap Studies

BBANDS               Bollinger Bands
DEMA                 Double Exponential Moving Average
EMA                  Exponential Moving Average
HT_TRENDLINE         Hilbert Transform - Instantaneous Trendline
KAMA                 Kaufman Adaptive Moving Average
MA                   Moving average
MAMA                 MESA Adaptive Moving Average
MAVP                 Moving average with variable period
MIDPOINT             MidPoint over period
MIDPRICE             Midpoint Price over period
SAR                  Parabolic SAR
SAREXT               Parabolic SAR - Extended
SMA                  Simple Moving Average
T3                   Triple Exponential Moving Average (T3)
TEMA                 Triple Exponential Moving Average
TRIMA                Triangular Moving Average
WMA                  Weighted Moving Average

Momentum Indicators

ADX                  Average Directional Movement Index
ADXR                 Average Directional Movement Index Rating
APO                  Absolute Price Oscillator
AROON                Aroon
AROONOSC             Aroon Oscillator
BOP                  Balance Of Power
CCI                  Commodity Channel Index
CMO                  Chande Momentum Oscillator
DX                   Directional Movement Index
MACD                 Moving Average Convergence/Divergence
MACDEXT              MACD with controllable MA type
MACDFIX              Moving Average Convergence/Divergence Fix 12/26
MFI                  Money Flow Index
MINUS_DI             Minus Directional Indicator
MINUS_DM             Minus Directional Movement
MOM                  Momentum
PLUS_DI              Plus Directional Indicator
PLUS_DM              Plus Directional Movement
PPO                  Percentage Price Oscillator
ROC                  Rate of change : ((price/prevPrice)-1)*100
ROCP                 Rate of change Percentage: (price-prevPrice)/prevPrice
ROCR                 Rate of change ratio: (price/prevPrice)
ROCR100              Rate of change ratio 100 scale: (price/prevPrice)*100
RSI                  Relative Strength Index
STOCH                Stochastic
STOCHF               Stochastic Fast
STOCHRSI             Stochastic Relative Strength Index
TRIX                 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
ULTOSC               Ultimate Oscillator
WILLR                Williams' %R

Volume Indicators

AD                   Chaikin A/D Line
ADOSC                Chaikin A/D Oscillator
OBV                  On Balance Volume

Volatility Indicators

ATR                  Average True Range
NATR                 Normalized Average True Range
TRANGE               True Range

Price Transform

AVGPRICE             Average Price
MEDPRICE             Median Price
TYPPRICE             Typical Price
WCLPRICE             Weighted Close Price

Cycle Indicators

HT_DCPERIOD          Hilbert Transform - Dominant Cycle Period
HT_DCPHASE           Hilbert Transform - Dominant Cycle Phase
HT_PHASOR            Hilbert Transform - Phasor Components
HT_SINE              Hilbert Transform - SineWave
HT_TRENDMODE         Hilbert Transform - Trend vs Cycle Mode

Pattern Recognition

CDL2CROWS            Two Crows
CDL3BLACKCROWS       Three Black Crows
CDL3INSIDE           Three Inside Up/Down
CDL3LINESTRIKE       Three-Line Strike
CDL3OUTSIDE          Three Outside Up/Down
CDL3STARSINSOUTH     Three Stars In The South
CDL3WHITESOLDIERS    Three Advancing White Soldiers
CDLABANDONEDBABY     Abandoned Baby
CDLADVANCEBLOCK      Advance Block
CDLBELTHOLD          Belt-hold
CDLBREAKAWAY         Breakaway
CDLCLOSINGMARUBOZU   Closing Marubozu
CDLCONCEALBABYSWALL  Concealing Baby Swallow
CDLCOUNTERATTACK     Counterattack
CDLDARKCLOUDCOVER    Dark Cloud Cover
CDLDOJI              Doji
CDLDOJISTAR          Doji Star
CDLDRAGONFLYDOJI     Dragonfly Doji
CDLENGULFING         Engulfing Pattern
CDLEVENINGDOJISTAR   Evening Doji Star
CDLEVENINGSTAR       Evening Star
CDLGAPSIDESIDEWHITE  Up/Down-gap side-by-side white lines
CDLGRAVESTONEDOJI    Gravestone Doji
CDLHAMMER            Hammer
CDLHANGINGMAN        Hanging Man
CDLHARAMI            Harami Pattern
CDLHARAMICROSS       Harami Cross Pattern
CDLHIGHWAVE          High-Wave Candle
CDLHIKKAKE           Hikkake Pattern
CDLHIKKAKEMOD        Modified Hikkake Pattern
CDLHOMINGPIGEON      Homing Pigeon
CDLIDENTICAL3CROWS   Identical Three Crows
CDLINNECK            In-Neck Pattern
CDLINVERTEDHAMMER    Inverted Hammer
CDLKICKING           Kicking
CDLKICKINGBYLENGTH   Kicking - bull/bear determined by the longer marubozu
CDLLADDERBOTTOM      Ladder Bottom
CDLLONGLEGGEDDOJI    Long Legged Doji
CDLLONGLINE          Long Line Candle
CDLMARUBOZU          Marubozu
CDLMATCHINGLOW       Matching Low
CDLMATHOLD           Mat Hold
CDLMORNINGDOJISTAR   Morning Doji Star
CDLMORNINGSTAR       Morning Star
CDLONNECK            On-Neck Pattern
CDLPIERCING          Piercing Pattern
CDLRICKSHAWMAN       Rickshaw Man
CDLRISEFALL3METHODS  Rising/Falling Three Methods
CDLSEPARATINGLINES   Separating Lines
CDLSHOOTINGSTAR      Shooting Star
CDLSHORTLINE         Short Line Candle
CDLSPINNINGTOP       Spinning Top
CDLSTALLEDPATTERN    Stalled Pattern
CDLSTICKSANDWICH     Stick Sandwich
CDLTAKURI            Takuri (Dragonfly Doji with very long lower shadow)
CDLTASUKIGAP         Tasuki Gap
CDLTHRUSTING         Thrusting Pattern
CDLTRISTAR           Tristar Pattern
CDLUNIQUE3RIVER      Unique 3 River
CDLUPSIDEGAP2CROWS   Upside Gap Two Crows
CDLXSIDEGAP3METHODS  Upside/Downside Gap Three Methods

Statistic Functions

BETA                 Beta
CORREL               Pearson's Correlation Coefficient (r)
LINEARREG            Linear Regression
LINEARREG_ANGLE      Linear Regression Angle
LINEARREG_INTERCEPT  Linear Regression Intercept
LINEARREG_SLOPE      Linear Regression Slope
STDDEV               Standard Deviation
TSF                  Time Series Forecast
VAR                  Variance

pandas –移动窗口rolling的概念

概念:
​​为了提升数据的准确性,将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断,这个区间就是窗口。移动窗口就是窗口向一端滑行,默认是从右往左,每次滑行并不是区间整块的滑行,而是一个单位一个单位的滑行。给个例子好理解一点:

import pandas as pd
s = [1,2,3,5,6,10,12,14,12,30]
pd.Series(s).rolling(window=3).mean()
1
2
3
首先为了好理解,先放上放上pd.Series(s)的样子给大家看看

现在pd.Series(s).rolling(window=3).mean()处理后

不知道大家看出了其中规律没有
首先我们设置的窗口window=3,也就是3个数取一个均值。index 0,1 为NaN,是因为它们前面都不够3个数,等到index2 的时候,它的值是怎么算的呢,就是(index0+index1+index2 )/3
index3 的值就是( index1+index2+index3)/ 3

参数详解
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
1
window: 也可以省略不写。表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。offset详解
min_periods:每个窗口最少包含的观测值数量,小于这个值的窗口结果为NA。值可以是int,默认None。offset情况下,默认为1。
center: 把窗口的标签设置为居中。布尔型,默认False,居右
win_type: 窗口的类型。截取窗的各种函数。字符串类型,默认为None。各种类型
on: 可选参数。对于dataframe而言,指定要计算滚动窗口的列。值为列名。
axis: int、字符串,默认为0,即对列进行计算
closed:定义区间的开闭,支持int类型的window。对于offset类型默认是左开右闭的即默认为right。可以根据情况指定为left both等。

import pandas as pd
s = [1,2,3,5,None,10,12,14,12,30]
pd.Series(s).rolling(3,min_periods=2).mean()
1
2
3

———————
作者:maymay_
来源:CSDN
原文:https://blog.csdn.net/maymay_/article/details/80241627
版权声明:本文为博主原创文章,转载请附上博文链接!

如何搭建一套数据分析平台

今天教大家如何搭建一套数据分析平台。

它可能是最简单的搭建教程,有一点Python基础都能完成。比起动辄研发数月的成熟系统,借助开源工具,整个时间能压缩在一小时内完成。

优秀的数据分析平台,首先要满足数据查询、统计、多维分析、数据报表等功能。可惜很多分析师,工作的第一年,都是埋葬在SQL语句中,以SQL+Excel的形式完成工作,却用不上高效率的工具。

说Excel也很好用的同学,请先回避一下。

另外一方面,以互联网为代表的公司越来越重视数据,数据获取不再是难点,难点是怎样敏捷分析获得洞察。

市面上已经有不少公司推出企业级的分析平台和BI,可惜它们都是收费的。我相信不少读者听说过,但一直没有机会体验,或者老板们囊中羞涩。现在,完完全全能免费建立一套BI系统,即可以单机版用以分析,也能私有化部署到服务器,成为自家公司的分析工具。

这一切,只需要一小时。

Superset

Superset是一款轻量级的BI工具,由Airbnb的数据部门开源。整个项目基于Python框架,不是Python我也不会推荐了,它集成了Flask、D3、Pandas、SqlAlchemy等。

这是官网的案例(本来是动图的,可惜压缩后也超过微信图片大小限制,吐槽下),想必设计界面已经能秒杀一批市面上的产品了,很多BI真的是浓烈的中国式报表风……因为它的前端基于D3,所以绝大部分的可视化图表都支持,甚至更强大。

Superset本身集成了数据查询功能,查询对分析师那是常有的事。它支持各类主流数据库,包括MySQL、PostgresSQL、Oracle、Impala、SparkSQL等,深度支持Druid。

后台支持权限分配管理,针对数据源分配账户。所以它在部署服务器后,分析师们可以通过它查询数据,也能通过数据建立Dashboard报表。

介绍了这么多,想必大家已经想要安装了吧。

安装

Superset同时支持Python2和Python3, 我这里以Python3作为演示。它支持pip形式的下载,不过我不建议直接安装,因为Superset的依赖包较多,如果直接安装,很容易和现有的模块产生冲突。

这里需要先搭建Python的虚拟环境。虚拟环境可以帮助我们在单机上建立多个版本的Python。简而言之,即可以Python2和Python3共存,也能Python3.3、3.4、3.5共济一堂,彼此间互相独立。

虚拟环境的安装方式很多,pyenv和virtualenv等。这里用Anaconda自带的conda工具。打开电脑终端/cmd,输入以下命令。

conda create -n superset python=3.4

conda create是创建虚拟环境的命令。-n是环境的命名参数,在这里,我们创建了名为superset的环境,它安装在Anaconda的envs目录下。python版本为3.4(superset暂时不支持3.6)。

该命令只会安装基础包,如果需要额外安装其他包,在命令行后加上想要的包名字即可,如python=3.4 numpy pandas。

安装很迅速,完成后,我们的Python环境还是默认版本,现在需要激活虚拟环境。

source activate superset

source activate是激活命令,superset为想要激活的虚拟环境名。windows和mac的命令不一样,win只要activate superset 。如果要退出,则是source deactivate或者deactivate。

激活成功后,命令行前面会多出一个前缀(superset),表明切换到了新的虚拟环境。接下来安装superset。

pip install superset

pip会自动安装所有的依赖,速度可能有点慢,建议更改pip源。

命令行后加上 -i https://pypi.douban.com/simple ,我这里用了豆瓣的镜像源,速度嗖嗖的。

如果安装过程中报错,是部分程序缺失,像系统比较老旧的win用户,需要安装新版的visual c++,网上搜索教程即可。在官网的教程中,还要求pip install cryptography==1.7.2,我没有安装也没有影响,供大家参考。其他报错,都可以通过搜索解决。

安装成功后,需要进行初始化配置,也是在命令行输入。

fabmanager create-admin –app superset

首先用命令行创建一个admin管理员账户,也是后续的登陆账号。会依次提示输入账户名,账户使用者的first name、last name、邮箱、以及确认密码。fabmanager是flask的权限管理命令,如果大家忘了密码,也能重新设立。

superset db upgrade

初始化数据源。

superset load_examples

载入案例数据,这里的案例数据是世界卫生组织的数据,也是上文演示的各类可视化图表,大家登陆后能够直接看到。下载速度还行。

superset init

初始化默认的用户角色和权限。

superset runserver

最后一步骤,启动Superset服务。因为我们是本地环境,所以在浏览器输入 http://localhost:8088 即可。在runserver后面添加 -p XXXX 可更改为其他端口。

进入登陆界面,输入登陆密码,大功告成。

使用

先别急着使用,因为Superset是英文,我们先把它汉化了。Superset自身支持语言切换。

进入到Superset所在目录文件,按我之前的步骤,应该在anaconda/envs/superset/lib/python3.4/site-packages/superset中,路径视各位情况可能有差异。

在目录下有一个叫config.py的文件,打开它,找到Setup default language这一行,修改变量。

BABEL_DEFAULT_LOCALE调整为zh,这样界面默认为中文。languages字典中zh前面的注释#去掉。保存后退出。

接下来还是在Superset的目录下新创建文件夹,按translations/zh/LC_MESSAGES的路径依次创建三个。Superset官网提供了汉化包,在最大的同性交友网站github上下载,目录为:

https://github.com/apache/incubator-superset/blob/master/superset/translations/zh/LC_MESSAGES/messages.mo

网址路径有点长,下载后把mo文件放在LC_MESSAGES文件下。清除浏览器的缓存,重新登陆localhost。

搞定!

需要注意的是,它并非完全汉化,而是汉化了superset相关的部分。部分文字被写入在flask app的文件中,汉化起来比较麻烦。

Superset分为多个模块,安全模块是账号管理相关,包括角色列表,视图权限控制,操作日志等。管理模块没什么用,主要是设计元素。

数据源可以访问和连接数据库,切片是各类数据可视化,均是单图;看板即为Dashboard,是切片的集合,Superset提供了三个初始案例,SQL工具箱是数据查询平台。

麻雀虽小,五脏俱全,对于大部分中小型的企业,Superset足以应付数据分析工作。

先学习连接数据库,这里以我电脑中的数据库为准,如果大家学习过早前的教程,那么数据库中都应该有数据分析师的练习数据,我这里不重复了,可以看历史文章。也可用自带的卫生数据照着练习。

Superset使用了sqlalchemy框架,使用前需要安装数据库驱动程序,先退出runserver,进入superset虚拟环境,安装Python中的MySQL驱动程序。

 pip install pymysql

MySQL的驱动程序很多,除了pymysql,还有mysqlclient等。安装好后,进入数据源,新建一个database连接。

在SQLAlchemy URL中加入数据库的地址,格式为:

mysql+pymysql://root:xxxx@localhost:3306/qin?charset=utf8

mysql是数据库类型,pymysql是驱动程序,表示用pymysql连接mysql数据库,+号不能省略。

另外,root是数据库登陆账号,xxxx为密码,这个按大家自己设立的来。localhost是数据库地址,因为我的是本地环境,所以localhost即可,也可以是127.0.0.1。3306是端口,一般默认这个。qin是需要连接的数据库,也是我自己设的名字。后面带参数charset=utf8,表示编码,因为表里面有中文。

其他数据库的连接大同小异,图中绿色的连接是相关教程。

如果大家在公司网络,拥有内网访问数据库的权限,也可以尝试连接,应该是可以的,这样就能在个人电脑上实行敏捷的BI分析。

格式命名好后,点击测试,出现seems ok,表示成功访问。在选项下面还有个Expose in SQL Lab,允许我们在SQL工具箱查询,要打上勾。

进入到SQL工具箱,左边选择table为DataAnalyst。

直接出来了数据库的数据预览。连查询平台的颜值都那么高。大家的SQL技能应该都很不错,有兴趣可以在这里练习一下,语法和MySQL一致。其他数据库则是其他数据库的语法。

执行一段SQL语句,它支持下载为CSV,我没试过支持最大文件的大小,但作为日常的查询平台是绰绰有余了。

选择Visualize,进入切片绘图模式。

这里自动匹配支持的图表选项,包括Bar Chart条形图,Pir Chart饼图等。下面的选项是定义维度,我们将city,education,postitionName,salary,workYear都勾选为维度。agg_func是聚合功能,这里将职位ID求和,改成count(),点击生成图表。

这里按城市生成了各职位ID求和获得的条形图,也就是不同城市的分析师人数。

左边Chart Options可以调整分析需要的维度。Metrics是分析的度量,这里是count(positionId),Series是条形图中的类别,Breakdowns可以认为是分组或者分桶。这里将Series改成workYear,Breakdowns改成city,点击Query执行。

条形图变更为按工作年限和城市细分的多维条形图。点击Stacked Bars,则切换成堆积柱形图。操作不难。

左侧的选项栏还有其他功能,这里就不多做介绍了,和市面上常见的BI没有多大区别,琢磨一下也就会了。

Superset支持的图表很丰富,如果具备开发能力,也能以D3和Flask为基础做二次开发。Airbnb官方也会不断加入新的图表。不同图表,其左侧的操作选项也不同。

\

上图是以数据分析师职位名称为基础绘制的词云图,生成的速度会比较慢。我们选择save保存。完成的图表均存放在切片下。

Dashboard通过多个切片组合完成,每个切片连接不同的数据源,这是BI的基本逻辑。进入看板界面,新建一个Dashboard。

设置看板相应的配置选项,因为我偷懒了,所以只做了两个切片,大家有兴趣可以继续增加。其他选项忽略,都是自动生成的。点击save,到这一步,BI最重要的Dashboard就完成了。

浏览一下最终的成果吧。

关于Superset的新手教学结束了,要是部署到公司,账号和权限多研究下。它和市面上的其他BI没有太多区别,不过它是我们用Python从零到有一手建立,这个感觉可比用Excel爽不少。虽然我的演示以单机版为主,将其建立在linux服务器上大同小异。

从零开始搭建到现在,排除掉下载花费的时间,大家可以计算是不是真的只用一个小时就搭建好一个数据分析平台?没骗你们吧。

通过搭建Superset,数据分析新手对BI应该也有一个大概的了解,市面上的BI大同小异,只是侧重点不同。在Superset的基础上,往底层完成埋点采集和数据ETL,往上拓展报表监控,CRM等,这些也有不少开源软件可用。至于机器学习,以及Hadoop和Spark更是一个大生态,把这些都算上,则是真正完整的大数据分析平台了。

Superset也有缺陷,它使用的是ORM框架,虽然它能连接众多的数据库,但是它有一个关系映射过程,将SQL数据转化为Python中的对象,这也造成它在大数据量的处理效率不如专业的BI软件。在使用SQL工具箱时,应该尽量避免超大表之间的关联,以及复杂的group by。

我个人的建议是,它只是一款轻量级的BI,复杂的数据关联,应该在ETL过程中完成,Superset只需要执行最终结果表的读取即可。它足够支撑TB级别的数据源读取。技术比较成熟的团队,也能尝试将Superset和Kylin整合,这样OLAP的能力又能上一个台阶。

另外,Superset中的表都是独立的,所以多图表间的复杂联动并不支持,仅支持过滤,这点比较可惜。不知道Airbnb后续会不会支持。

好消息是,这个开源项目一直在更新,github什么也有很多新的功能特性待开发,比如dashboard上加入tab切换栏等。可以star一下关注。

如何七周成为数据分析师08:如何建立数据分析的思维框架?

曾经有人问过我,什么是数据分析思维?如果分析思维是一种结构化的体现,那么数据分析思维在它的基础上再加一个准则:

不是我觉得,而是数据证明。

这是一道分水岭,“我觉得”是一种直觉化经验化的思维,工作不可能处处依赖自己的直觉,公司发展更不可能依赖于此。数据证明则是数据分析的最直接体现,它依托于数据导向型的思维,而不是技巧,前者是指导,后者只是应用。

作为个人,应该如何建立数据分析思维呢?

建立你的指标体系

在我们谈论指标之前,先将时间倒推几十年,现代管理学之父彼得·德鲁克说过一句很经典的话:

如果你不能衡量它,那么你就不能有效增长它。

所谓衡量,就是需要统一标准来定义和评价业务。这个标准就是指标。假设隔壁老王开了一家水果铺子,你问他每天生意怎么样,他可以回答卖的不错,很好,最近不景气。这些都是很虚的词,因为他认为卖的不错也许是卖了50个,而你认为的卖的不错,是卖了100。

这就是“我觉得”造成的认知陷阱。将案例放到公司时,会遇到更多的问题:若有一位运营和你说,产品表现不错,因为每天都有很多人评价和称赞,还给你看了几个截图。而另外一位运营说,产品有些问题,推的活动商品卖的不好,你应该相信谁呢?

其实谁都很难相信,这些众口异词的判断都是因为缺乏数据分析思维造成的。

老王想要描述生意,他应该使用销量,这就是他的指标,互联网想要描述产品,也应该使用活跃率、使用率、转化率等指标。

如果你不能用指标描述业务,那么你就不能有效增长它。

了解和使用指标是数据分析思维的第一步,接下来你需要建立指标体系,孤立的指标发挥不出数据的价值。和分析思维一样,指标也能结构化,也应该用结构化。

我们看一下互联网的产品,一个用户从开始使用到离开,都会经历这些环节步骤。电商APP还是内容平台,都是雷同的。想一想,你会需要用到哪些指标?

Clipboard Image.png

而下面这张图,解释了什么是指标化,这就是有无数据分析思维的差异,也是典型的数据化运营,有空可以再深入讲这块。

Clipboard Image.png

指标体系没有放之四海而皆准的模板,不同业务形态有不同的指标体系。移动APP和网站不一样,SaaS和电子商务不一样,低频消费和高频消费不一样。好比一款婚庆相关的APP,不需要考虑复购率指标;互联网金融,必须要风控指标;电子商务,卖家和买家的指标各不一样。

这些需要不同行业经验和业务知识去学习掌握,那有没有通用的技巧和注意事项呢?

好指标与坏指标

不是所有的指标都是好的。这是初出茅庐者常犯的错误。我们继续回到老王的水果铺子,来思考一下,销量这个指标究竟是不是好的?

最近物价上涨,老王顺应调高了水果价格,又不敢涨的提高,虽然水果销量没有大变化,但老王发现一个月下来没赚多少,私房钱都不够存。

老王这个月的各类水果销量有2000,但最后还是亏本了,仔细研究后发现,虽然销量高,但是水果库存也高,每个月都有几百单位的水果滞销最后过期亏本。

这两个例子都能说明只看销量是一件多不靠谱的事情。销量是一个衡量指标,但不是好指标。老王这种个体经营户,应该以水果铺子的利润为核心要素。

好指标应该是核心驱动指标。虽然指标很重要,但是有些指标需要更重要。就像销量和利润,用户数和活跃用户数,后者都比前者重要。

核心指标不只是写在周报的数字,而是整个运营团队、产品团队乃至研发团队都统一努力的目标。

核心驱动指标和公司发展关联,是公司在一个阶段内的重点方向。记住是一个阶段,不同时期的核心驱动指标不一样。不同业务的核心驱动指标也不一样。

互联网公司常见的核心指标是用户数和活跃率,用户数代表市场的体量和占有,活跃率代表产品的健康度,但这是发展阶段的核心指标。在产品1.0期间,我们应把注意力放到打磨产品上,在大推广前提高产品质量,这时留存率是一个核心指标。而在有一定用户基数的产品后期,商业化比活跃重要,我们会关注钱相关的指标,比如广告点击率、利润率等。

核心驱动指标一般是公司整体的目标,若从个人的岗位职责看,也可以找到自己的核心指标。比如内容运营可以关注阅读数和阅读时长。

核心驱动指标一定能给公司和个人带来最大优势和利益,记得二八法则么?20%的指标一定能带来80%的效果,这20%的指标就是核心。

另外一方面,好的指标还有一个特性,它应该是比率或者比例

拿活跃用户数说明就懂了,我们活跃用户有10万,这能说明什么呢?这说明不了什么。如果产品本身有千万级别的注册用户,那么10万用户说明非常不健康,产品在衰退期。如果产品只拥有四五十万用户,那么说明产品的粘性很高。

正因为单纯的活跃用户数没有多大意义,所以运营和产品会更关注活跃率。这个指标就是一个比率,将活跃用户数除以总用户数所得。所以在设立指标时,我们都尽量想它能不能是比率。

坏指标有哪些呢?

其一是虚荣指标,它没有任何的实际意义。

产品在应用商店有几十万的曝光量,有意义吗?没有,我需要的是实际下载。下载了意义大吗?也不大,我希望用户注册成功。曝光量和下载量都是虚荣指标,只是虚荣程度不一样。

新媒体都追求微信公众号阅读数,如果靠阅读数做广告,那么阅读数有意义,如果靠图文卖商品,那么更应该关注转化率和商品销量,毕竟一个夸张的标题就能带来很高的阅读量,此时的阅读量是虚荣指标。可惜很多老板还是孜孜不倦的追求10W+,哪怕刷量。

虚荣指标是没有意义的指标,往往它会很好看,能够粉饰运营和产品的工作绩效,但我们要避免使用。

第二个坏指标是后验性指标,它往往只能反应已经发生的事情。

比如我有一个流失用户的定义:三个月没有打开APP就算做流失。那么运营每天统计的流失用户数,都是很久没有打开过的,以时效性看,已经发生很久了,也很难通过措施挽回。我知道曾经因为某个不好的运营手段伤害了用户,可是还有用吗?

活动运营的ROI(投资回报率)也是后验性指标,一个活动付出成本后才能知道其收益。可是成本已经支出,活动的好与坏也注定了。活动周期长,还能有调整余地。活动短期的话,这指标只能用作复盘,但不能驱动业务。

第三个坏指标是复杂性指标,它将数据分析陷于一堆指标造成的陷阱中。

指标能细分和拆解,比如活跃率可以细分成日活跃率、周活跃率、月活跃率、老用户活跃率等。数据分析应该根据具体的情况选择指标,如果是天气类工具,可以选择日活跃率,如果是社交APP,可以选择周活跃率,更低频的产品则是月活跃率。

每个产品都有适合它的几个指标,不要一股脑的装一堆指标上去,当你准备了二三十个指标用于分析,会发现无从下手。

指标结构

既然指标太多太复杂不好,那么应该如何正确的选择指标呢?

和分析思维的金字塔结构一样,指标也有固有结构,呈现树状。指标结构的构建核心是以业务流程为思路,以结构为导向。

假设你是内容运营,需要对现有的业务做一个分析,提高内容相关数据,你会怎么做呢?

我们把金字塔思维转换一下,就成了数据分析方法了。

从内容运营的流程开始,它是:内容收集—内容编辑发布—用户浏览—用户点击—用户阅读—用户评论或转发—继续下一篇浏览。

这是一个标准的流程,每个流程都有指标可以建立。内容收集可以建立热点指数,看哪一篇内容比较火。用户浏览用户点击则是标准的PV和UV统计,用户阅读是阅读时长。

Clipboard Image.png

从流程的角度搭建指标框架,可以全面的囊括用户相关数据,无有遗漏。

这套框架列举的指标,依旧要遵循指标原则:需要有核心驱动指标。移除虚荣指标,适当的进行删减,不要为添加指标而添加指标。

维度分析法

当你有了指标,可以着手进行分析,数据分析大体可以分三类,第一类是利用维度分析数据,第二类是使用统计学知识如数据分布假设检验,最后一类是使用机器学习。我们先了解一下维度分析法。

维度是描述对象的参数,在具体分析中,我们可以把它认为是分析事物的角度。销量是一种角度、活跃率是一种角度,时间也是一种角度,所以它们都能算维度。

当我们有了维度后,就能够通过不同的维度组合,形成数据模型。数据模型不是一个高深的概念,它就是一个数据立方体。

Clipboard Image.png

上图就是三个维度组成的数据模型/数据立方体。分别是产品类型、时间、地区。我们既能获得电子产品在上海地区的2010二季度的销量,也能知道书籍在江苏地区的2010一季度销量。

数据模型将复杂的数据以结构化的形式有序的组织起来。我们之前谈到的指标,都可以作为维度使用。下面是范例:

将用户类型、活跃度、时间三个维度组合,观察不同用户群体在产品上的使用情况,是否A群体使用的时长更明显?

将商品类型、订单金额、地区三个维度组合,观察不同地区的不同商品是否存在销量差异?

数据模型可以从不同的角度和层面来观察数据,这样提高了分析的灵活性,满足不同的分析需求、这个过程叫做OLAP(联机分析处理)。当然它涉及到更复杂的数据建模和数据仓库等,我们不用详细知道。

数据模型还有几种常见的技巧、叫做钻取、上卷、切片。

选取就是将维度继续细分。比如浙江省细分成杭州市、温州市、宁波市等,2010年一季度变成1月、2月、3月。上卷则是钻取的相反概念,将维度聚合,比如浙江、上海、江苏聚合成浙江沪维度。切片是选中特定的维度,比如只选上海维度、或者只选2010年一季度维度。因为数据立方体是多维的,但我们观察和比较数据只能在二维、即表格中进行。

Clipboard Image.png

上图的树状结构代表钻取(source和time的细分),然后通过对Route的air切片获得具体数据。

聪明的你可能已经想到,我们常用的数据透视表就是一种维度分析,将需要分析的维度放到行列组合进行求和、计数、平均值等计算。放一张曾经用到的案例图片:用城市维度和工作年限维度,计算平均工资。

Clipboard Image.png

除了Excel、BI、R、Python都能用维度分析法。BI是相对最简便的。

谈到维度法,想要强调的是分析的核心思维之一:对比,不同维度的对比,这大概是对新人快速提高的最佳捷径之一。比如过去和现在的时间趋势对比,比如不同地区维度的对比,比如产品类型的区别对比,比如不同用户的群体对比。单一的数据没有分析意义,只有多个数据组合才能发挥出数据的最大价值。

我想要分析公司的利润,利润 = 销售额 – 成本。那么找出销售额涉及的指标/维度,比如产品类型、地区、用户群体等,通过不断的组合和拆解,找出有问题或者表现良好的原因。成本也是同理。

这就是正确的数据分析思维。总结一下吧:我们通过业务建立和筛选出指标,将指标作为维度,利用维度进行分析。

很多人会问,指标和维度有什么区别?

维度是说明和观察事物的角度,指标是衡量数据的标准。维度是一个更大的范围,不只是数据,比如时间维度和城市维度,我们就无法用指标表示,而指标(留存率、跳出率、浏览时间等)却可以成为维度。通俗理解:维度>指标。

到这里,大家已经有一个数据分析的思维框架了。之所以是框架,因为还缺少具体的技巧,比如如何验证某一个维度是影响数据的关键,比如如何用机器学习提高业务,这些涉及到数据和统计学知识,以后再讲解。

这里我想强调,数据分析并不是一个结果,只是过程。还记得“如果你不能衡量它,那么你就不能有效增长它”这句话吗?数据分析的最终目的就是增长业务。如果数据分析需要绩效指标,一定不会是分析的对错,而是最终数据提升的结果。

数据分析是需要反馈的,当我分析出某项要素左右业务结果,那么就去验证它。告诉运营和产品人员,看看改进后的数据怎么样,一切以结果为准。如果结果并没有改善,那么就应该反思分析过程了。

这也是数据分析的要素,结果作导向。分析若只是当一份报告呈现上去,后续没有任何跟进、改进的措施,那么数据分析等与零。

业务指导数据,数据驱动业务。这才是不二法门。

解答上篇文章的思考题,可能大家等急了。

你是淘宝的数据分析师,现在需要你预估双十一的销量,你不能获得双十一当天和之前的所有数据。只能获得11月12日开始的数据,你应该如何预估?

因为是开放题,所以没有固定答案。

大家的回答分为两类:

一类是通过后续双十一的销量,判断16年,缺点是需要等一年,优点是简单到不像话。

二类是通过11月12日之后的销量数据,往前预估,期间会考虑一些权重。缺点是双十一属于波峰,预估难道大,优点是可操作性好。

因为题目主要看的是分析思维,目的是找出可能的思路,所以有没有其他的方法呢?

我们尝试把思维放开,因为销量能反应商品,有没有其他维度?我们可能会想到:退换货率、和商品评价率。因为双十一的商品只能在12日后退换货和收货后评价,我们就能根据这两个指标平日的平均比率,以及双十一商品的后续退换和评价总数,预估卖出总量。退换货率肯定会虚高一些(毕竟双十一退货不少),那么商品评价率更准确。

还有其他方法么?当然有,比如会有不少人用蚂蚁花呗支付双十一,那么后续还款的比率能不能预估?

如果再将思路放开呢?虽然我不知道淘宝当天的数据,但是可以寻求外部数据,比如京东,京东的双十一销量是多少,是平时的多少倍,那么就用这个倍数去预估淘宝的。

整体的分析结构就分为:

外部数据:

  • 京东等其他平台双十一销量

内部数据:

  • 商品数据:商品评价率、退换货率、商品销量
  • 支付数据:蚂蚁花呗支付比率等

《Python数据分析常用手册》一、NumPy和Pandas篇

一、常用链接:

1.Python官网:https://www.python.org/
2.各种库的whl离线安装包:http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn

3.数据分析常用库的离线安装包(pip+wheels)(百度云):http://pan.baidu.com/s/1dEMXbfN 密码:bbs2


二、常用库

1.NumPy

NumPy是高性能科学计算和数据分析的基础包。部分功能如下:

    • ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
    • 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
    • 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
    • 线性代数、随机数生成以及傅里叶变换功能。
    • 用于集成C、C++、Fortran等语言编写的代码的工具。

  首先要导入numpy库:import numpy as np

  A NumPy函数和属性:

类型 类型代码 说明
int8、uint8 i1、u1 有符号和无符号8位整型(1字节)
int16、uint16 i2、u2 有符号和无符号16位整型(2字节)
int32、uint32 i4、u4 有符号和无符号32位整型(4字节)
int64、uint64 i8、u8 有符号和无符号64位整型(8字节)
float16 f2 半精度浮点数
float32 f4、f 单精度浮点数
float64 f8、d 双精度浮点数
float128 f16、g 扩展精度浮点数
complex64 c8 分别用两个32位表示的复数
complex128 c16 分别用两个64位表示的复数
complex256 c32 分别用两个128位表示的复数
bool ? 布尔型
object O python对象
string Sn 固定长度字符串,每个字符1字节,如S10
unicode Un 固定长度Unicode,字节数由系统决定,如U10

表2.1.A.1 NumPy类型

 

生成函数 作用
np.array( x)

np.array( x, dtype)

将输入数据转化为一个ndarray

将输入数据转化为一个类型为type的ndarray

np.asarray( array ) 将输入数据转化为一个新的(copy)ndarray
np.ones( N )

np.ones( N, dtype)

np.ones_like( ndarray )

生成一个N长度的一维全一ndarray

生成一个N长度类型是dtype的一维全一ndarray

生成一个形状与参数相同的全一ndarray

np.zeros( N)

np.zeros( N, dtype)

np.zeros_like(ndarray)

生成一个N长度的一维全零ndarray

生成一个N长度类型位dtype的一维全零ndarray

类似np.ones_like( ndarray )

np.empty( N )

np.empty( N, dtype)

np.empty(ndarray)

生成一个N长度的未初始化一维ndarray

生成一个N长度类型是dtype的未初始化一维ndarray

类似np.ones_like( ndarray )

np.eye( N )

np.identity( N )

创建一个N * N的单位矩阵(对角线为1,其余为0)
np.arange( num)

np.arange( begin, end)

np.arange( begin, end, step)

生成一个从0到num-1步数为1的一维ndarray

生成一个从begin到end-1步数为1的一维ndarray

生成一个从begin到end-step的步数为step的一维ndarray

np.mershgrid(ndarray, ndarray,…) 生成一个ndarray * ndarray * …的多维ndarray
np.where(cond, ndarray1, ndarray2) 根据条件cond,选取ndarray1或者ndarray2,返回一个新的ndarray
np.in1d(ndarray, [x,y,…]) 检查ndarray中的元素是否等于[x,y,…]中的一个,返回bool数组
矩阵函数 说明
np.diag( ndarray)

np.diag( [x,y,…])

以一维数组的形式返回方阵的对角线(或非对角线)元素

将一维数组转化为方阵(非对角线元素为0)

np.dot(ndarray, ndarray) 矩阵乘法
np.trace( ndarray) 计算对角线元素的和
排序函数 说明
np.sort( ndarray) 排序,返回副本
np.unique(ndarray) 返回ndarray中的元素,排除重复元素之后,并进行排序
np.intersect1d( ndarray1, ndarray2)

np.union1d( ndarray1, ndarray2)

np.setdiff1d( ndarray1, ndarray2)

np.setxor1d( ndarray1, ndarray2)

返回二者的交集并排序。

返回二者的并集并排序。

返回二者的差。

返回二者的对称差

一元计算函数 说明
np.abs(ndarray)

np.fabs(ndarray)

计算绝对值

计算绝对值(非复数)

np.mean(ndarray) 求平均值
np.sqrt(ndarray) 计算x^0.5
np.square(ndarray) 计算x^2
np.exp(ndarray) 计算e^x
log、log10、log2、log1p 计算自然对数、底为10的log、底为2的log、底为(1+x)的log
np.sign(ndarray) 计算正负号:1(正)、0(0)、-1(负)
np.ceil(ndarray)

np.floor(ndarray)

np.rint(ndarray)

计算大于等于改值的最小整数

计算小于等于该值的最大整数

四舍五入到最近的整数,保留dtype

np.modf(ndarray) 将数组的小数和整数部分以两个独立的数组方式返回
np.isnan(ndarray) 返回一个判断是否是NaN的bool型数组
np.isfinite(ndarray)

np.isinf(ndarray)

返回一个判断是否是有穷(非inf,非NaN)的bool型数组

返回一个判断是否是无穷的bool型数组

cos、cosh、sin、sinh、tan、tanh 普通型和双曲型三角函数
arccos、arccosh、arcsin、arcsinh、arctan、arctanh 反三角函数和双曲型反三角函数
np.logical_not(ndarray) 计算各元素not x的真值,相当于-ndarray
多元计算函数 说明
np.add(ndarray, ndarray)

np.subtract(ndarray, ndarray)

np.multiply(ndarray, ndarray)

np.divide(ndarray, ndarray)

np.floor_divide(ndarray, ndarray)

np.power(ndarray, ndarray)

np.mod(ndarray, ndarray)

相加

相减

乘法

除法

圆整除法(丢弃余数)

次方

求模

np.maximum(ndarray, ndarray)

np.fmax(ndarray, ndarray)

np.minimun(ndarray, ndarray)

np.fmin(ndarray, ndarray)

求最大值

求最大值(忽略NaN)

求最小值

求最小值(忽略NaN)

np.copysign(ndarray, ndarray) 将参数2中的符号赋予参数1
np.greater(ndarray, ndarray)

np.greater_equal(ndarray, ndarray)

np.less(ndarray, ndarray)

np.less_equal(ndarray, ndarray)

np.equal(ndarray, ndarray)

np.not_equal(ndarray, ndarray)

>

>=

<

<=

==

!=

logical_and(ndarray, ndarray)

logical_or(ndarray, ndarray)

logical_xor(ndarray, ndarray)

&

|

^

np.dot( ndarray, ndarray) 计算两个ndarray的矩阵内积
np.ix_([x,y,m,n],…) 生成一个索引器,用于Fancy indexing(花式索引)
文件读写 说明
np.save(string, ndarray) 将ndarray保存到文件名为 [string].npy 的文件中(无压缩)
np.savez(string, ndarray1, ndarray2, …) 将所有的ndarray压缩保存到文件名为[string].npy的文件中
np.savetxt(sring, ndarray, fmt, newline=’\n’) 将ndarray写入文件,格式为fmt
np.load(string) 读取文件名string的文件内容并转化为ndarray对象(或字典对象)
np.loadtxt(string, delimiter) 读取文件名string的文件内容,以delimiter为分隔符转化为ndarray

表2.1.A.2 np常用函数

  B NumPy.ndarray函数和属性:

ndarray.ndim 获取ndarray的维数
ndarray.shape 获取ndarray各个维度的长度
ndarray.dtype 获取ndarray中元素的数据类型
ndarray.T 简单转置矩阵ndarray
表2.1.B.1 ndarray属性
函数 说明
ndarray.astype(dtype) 转换类型,若转换失败则会出现TypeError
ndarray.copy() 复制一份ndarray(新的内存空间)
ndarray.reshape((N,M,…)) 将ndarray转化为N*M*…的多维ndarray(非copy)
ndarray.transpose((xIndex,yIndex,…)) 根据维索引xIndex,yIndex…进行矩阵转置,依赖于shape,不能用于一维矩阵(非copy)
ndarray.swapaxes(xIndex,yIndex) 交换维度(非copy)
计算函数 说明
ndarray.mean( axis=0 ) 求平均值
ndarray.sum( axis= 0) 求和
ndarray.cumsum( axis=0)

ndarray.cumprod( axis=0)

累加

累乘

ndarray.std()

ndarray.var()

方差

标准差

ndarray.max()

ndarray.min()

最大值

最小值

ndarray.argmax()

ndarray.argmin()

最大值索引

最小值索引

ndarray.any()

ndarray.all()

是否至少有一个True

是否全部为True

ndarray.dot( ndarray) 计算矩阵内积
排序函数 说明
ndarray.sort(axis=0) 排序,返回源数据

表2.1.B.2 ndarray函数

ndarray[n] 选取第n+1个元素
ndarray[n:m] 选取第n+1到第m个元素
ndarray[:] 选取全部元素
ndarray[n:] 选取第n+1到最后一个元素
ndarray[:n] 选取第0到第n个元素
ndarray[ bool_ndarray ]

注:bool_ndarray表示bool类型的ndarray

选取为true的元素
ndarray[[x,y,m,n]]… 选取顺序和序列为x、y、m、n的ndarray
ndarray[n,m]

ndarray[n][m]

选取第n+1行第m+1个元素
ndarray[n,m,…]

ndarray[n][m]….

选取n行n列….的元素

表2.1.B.3 ndarray索引/切片方式

  C NumPy.random函数和属性:

函数 说明
seed()

seed(int)

seed(ndarray)

确定随机数生成种子
permutation(int)

permutation(ndarray)

返回一个一维从0~9的序列的随机排列

返回一个序列的随机排列

shuffle(ndarray) 对一个序列就地随机排列
rand(int)

randint(begin,end,num=1)

产生int个均匀分布的样本值

从给定的begin和end随机选取num个整数

randn(N, M, …) 生成一个N*M*…的正态分布(平均值为0,标准差为1)的ndarray
normal(size=(N,M,…)) 生成一个N*M*…的正态(高斯)分布的ndarray
beta(ndarray1,ndarray2) 产生beta分布的样本值,参数必须大于0
 chisquare() 产生卡方分布的样本值
 gamma() 产生gamma分布的样本值
 uniform() 产生在[0,1)中均匀分布的样本值

 2.1.C.1 random常用函数

  D NumPy.linalg函数和属性:

函数 说明
det(ndarray) 计算矩阵列式
eig(ndarray) 计算方阵的本征值和本征向量
inv(ndarray)

pinv(ndarray)

计算方阵的逆

计算方阵的Moore-Penrose伪逆

qr(ndarray) 计算qr分解
svd(ndarray) 计算奇异值分解svd
solve(ndarray) 解线性方程组Ax = b,其中A为方阵
lstsq(ndarray) 计算Ax=b的最小二乘解

 2.1.D.1 linalg常用函数

2.Pandas

pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

>>> from pandas import Series, DataFrame

>>> import pandas as pd

  A.pandas

函数 说明
pd.isnull(series)

pd.notnull(series)

判断是否为空(NaN)

判断是否不为空(not NaN)

2.2.A.1 pandas常用函数

  B.Series

Series可以运用ndarray或字典的几乎所有索引操作和函数,融合了字典和ndarray的优点。

属性 说明
values 获取数组
index 获取索引
name values的name
index.name 索引的name
2.2.B.1 Series常用属性
函数 说明
Series([x,y,…])Series({‘a’:x,’b’:y,…}, index=param1) 生成一个Series
Series.copy() 复制一个Series
Series.reindex([x,y,…], fill_value=NaN)

Series.reindex([x,y,…], method=NaN)

Series.reindex(columns=[x,y,…])

重返回一个适应新索引的新对象,将缺失值填充为fill_value

返回适应新索引的新对象,填充方式为method

对列进行重新索引

Series.drop(index) 丢弃指定项
Series.map(f) 应用元素级函数
排序函数 说明
Series.sort_index(ascending=True) 根据索引返回已排序的新对象
Series.order(ascending=True) 根据值返回已排序的对象,NaN值在末尾
Series.rank(method=’average’, ascending=True, axis=0) 为各组分配一个平均排名
df.argmax()

df.argmin()

返回含有最大值的索引位置

返回含有最小值的索引位置

2.2.B.2 Series常用函数

reindex的method选项:

      ffill, bfill     向前填充/向后填充
      pad, backfill   向前搬运,向后搬运
    rank的method选项
      ’average’    在相等分组中,为各个值分配平均排名
      ’max’,’min’   使用整个分组中的最小排名

      ’first’      按值在原始数据中出现的顺序排名

  C.DataFrame

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。

DataFrame可以通过类似字典的方式或者.columnname的方式将列获取为一个Series。行也可以通过位置或名称的方式进行获取。

为不存在的列赋值会创建新列。

>>> del frame[‘xxx’]  # 删除列

属性 说明
values DataFrame的值
index 行索引
index.name 行索引的名字
columns 列索引
columns.name 列索引的名字
ix 返回行的DataFrame
ix[[x,y,…], [x,y,…]] 对行重新索引,然后对列重新索引
T frame行列转置

2.2.C.1 DataFrame常用属性

 

函数 说明
DataFrame(dict, columns=dict.index, index=[dict.columnnum])

DataFrame(二维ndarray)

DataFrame(由数组、列表或元组组成的字典)

DataFrame(NumPy的结构化/记录数组)

DataFrame(由Series组成的字典)

DataFrame(由字典组成的字典)

DataFrame(字典或Series的列表)

DataFrame(由列表或元组组成的列表)

DataFrame(DataFrame)

DataFrame(NumPy的MaskedArray)

构建DataFrame

数据矩阵,还可以传入行标和列标

每个序列会变成DataFrame的一列。所有序列的长度必须相同

类似于“由数组组成的字典”

每个Series会成为一列。如果没有显式制定索引,则各Series的索引会被合并成结果的行索引

各内层字典会成为一列。键会被合并成结果的行索引。

各项将会成为DataFrame的一行。索引的并集会成为DataFrame的列标。

类似于二维ndarray

沿用DataFrame

类似于二维ndarray,但掩码结果会变成NA/缺失值

 

df.reindex([x,y,…], fill_value=NaN, limit)

df.reindex([x,y,…], method=NaN)

df.reindex([x,y,…], columns=[x,y,…],copy=True)

返回一个适应新索引的新对象,将缺失值填充为fill_value,最大填充量为limit

返回适应新索引的新对象,填充方式为method

同时对行和列进行重新索引,默认复制新对象。

df.drop(index, axis=0) 丢弃指定轴上的指定项。
排序函数 说明
df.sort_index(axis=0, ascending=True)

df.sort_index(by=[a,b,…])

根据索引排序
汇总统计函数 说明
df.count() 非NaN的数量
df.describe() 一次性产生多个汇总统计
df.min()

df.min()

最小值

最大值

df.idxmax(axis=0, skipna=True)

df.idxmin(axis=0, skipna=True)

返回含有最大值的index的Series

返回含有最小值的index的Series

df.quantile(axis=0) 计算样本的分位数
df.sum(axis=0, skipna=True, level=NaN)

df.mean(axis=0, skipna=True, level=NaN)

df.median(axis=0, skipna=True, level=NaN)

df.mad(axis=0, skipna=True, level=NaN)

df.var(axis=0, skipna=True, level=NaN)

df.std(axis=0, skipna=True, level=NaN)

df.skew(axis=0, skipna=True, level=NaN)

df.kurt(axis=0, skipna=True, level=NaN)

df.cumsum(axis=0, skipna=True, level=NaN)

df.cummin(axis=0, skipna=True, level=NaN)

df.cummax(axis=0, skipna=True, level=NaN)

df.cumprod(axis=0, skipna=True, level=NaN)

df.diff(axis=0)

df.pct_change(axis=0)

返回一个含有求和小计的Series

返回一个含有平均值的Series

返回一个含有算术中位数的Series

返回一个根据平均值计算平均绝对离差的Series

返回一个方差的Series

返回一个标准差的Series

返回样本值的偏度(三阶距)

返回样本值的峰度(四阶距)

返回样本的累计和

返回样本的累计最大值

返回样本的累计最小值

返回样本的累计积

返回样本的一阶差分

返回样本的百分比数变化

计算函数 说明 
df.add(df2, fill_value=NaN, axist=1)

df.sub(df2, fill_value=NaN, axist=1)

df.div(df2, fill_value=NaN, axist=1)

df.mul(df2, fill_value=NaN, axist=1)

元素级相加,对齐时找不到元素默认用fill_value

元素级相减,对齐时找不到元素默认用fill_value

元素级相除,对齐时找不到元素默认用fill_value

元素级相乘,对齐时找不到元素默认用fill_value

df.apply(f, axis=0) 将f函数应用到由各行各列所形成的一维数组上
df.applymap(f) 将f函数应用到各个元素上
df.cumsum(axis=0, skipna=True) 累加,返回累加后的dataframe

2.2.C.2 Dataframe常用函数

索引方式 说明
df[val] 选取DataFrame的单个列或一组列
df.ix[val] 选取Dataframe的单个行或一组行
df.ix[:,val] 选取单个列或列子集
df.ix[val1,val2] 将一个或多个轴匹配到新索引
reindex方法 将一个或多个轴匹配到新索引
xs方法 根据标签选取单行或者单列,返回一个Series
icol、irow方法 根据整数位置选取单列或单行,并返回一个Series
get_value、set_value 根据行标签和列标签选取单个值

2.2.C.3 Dataframe常用索引方式

    运算:

默认情况下,Dataframe和Series之间的算术运算会将Series的索引匹配到的Dataframe的列,沿着列一直向下传播。若索引找不到,则会重新索引产生并集。

  D.Index

pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index。Index对象不可修改,从而在多个数据结构之间安全共享。

主要的Index对象 说明
Index 最广泛的Index对象,将轴标签表示为一个由Python对象组成的NumPy数组
Int64Index 针对整数的特殊Index
MultiIndex “层次化”索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组
DatetimeIndex 存储纳秒级时间戳(用NumPy的Datetime64类型表示)
PeriodIndex 针对Period数据(时间间隔)的特殊Index

2.2.D.1 主要的Index属性

函数 说明
Index([x,y,…]) 创建索引
append(Index) 连接另一个Index对象,产生一个新的Index
diff(Index) 计算差集,产生一个新的Index
intersection(Index) 计算交集
union(Index) 计算并集
isin(Index) 检查是否存在与参数索引中,返回bool型数组
delete(i) 删除索引i处元素,得到新的Index
drop(str) 删除传入的值,得到新Index
insert(i,str) 将元素插入到索引i处,得到新Index
is_monotonic() 当各元素大于前一个元素时,返回true
is_unique() 当Index没有重复值时,返回true
unique() 计算Index中唯一值的数组

2.2.D.2 常用Index函数

pandas DataFrame-行列索引及值的获取

pandas DataFrame是二维的,所以,它既有列索引,又有行索引

import pandas as pd

df = pd.DataFrame({‘A’: [0, 1, 2], ‘B’: [3, 4, 5]})
print df

# 结果:
A B
0 0 3
1 1 4
2 2 5
复制代码
行索引自动生成了 0,1,2

如果要自己指定行索引和列索引,可以使用 index 和 column 参数:

这个数据是5个车站10天内的客流数据:

复制代码
ridership_df = pd.DataFrame(
data=[[ 0, 0, 2, 5, 0],
[1478, 3877, 3674, 2328, 2539],
[1613, 4088, 3991, 6461, 2691],
[1560, 3392, 3826, 4787, 2613],
[1608, 4802, 3932, 4477, 2705],
[1576, 3933, 3909, 4979, 2685],
[ 95, 229, 255, 496, 201],
[ 2, 0, 1, 27, 0],
[1438, 3785, 3589, 4174, 2215],
[1342, 4043, 4009, 4665, 3033]],
index=[’05-01-11′, ’05-02-11′, ’05-03-11′, ’05-04-11′, ’05-05-11′,
’05-06-11′, ’05-07-11′, ’05-08-11′, ’05-09-11′, ’05-10-11′],
columns=[‘R003’, ‘R004’, ‘R005’, ‘R006’, ‘R007’]
)
复制代码
data 参数为一个numpy二维数组, index 参数为行索引, column 参数为列索引

生成的数据以表格形式显示:

复制代码
R003 R004 R005 R006 R007
05-01-11 0 0 2 5 0
05-02-11 1478 3877 3674 2328 2539
05-03-11 1613 4088 3991 6461 2691
05-04-11 1560 3392 3826 4787 2613
05-05-11 1608 4802 3932 4477 2705
05-06-11 1576 3933 3909 4979 2685
05-07-11 95 229 255 496 201
05-08-11 2 0 1 27 0
05-09-11 1438 3785 3589 4174 2215
05-10-11 1342 4043 4009 4665 3033
复制代码
下面说下如何获取DataFrame里的值:

1.获取某一列: 直接 [‘key’]

复制代码
print(ridership_df[‘R003’])

# 结果:
05-01-11 0
05-02-11 1478
05-03-11 1613
05-04-11 1560
05-05-11 1608
05-06-11 1576
05-07-11 95
05-08-11 2
05-09-11 1438
05-10-11 1342
Name: R003, dtype: int64
复制代码
2.获取某一行: .loc[‘key’]

复制代码
print(ridership_df.loc[’05-01-11′])
# 或者
print(ridership_df.iloc[0])

# 结果:
R003 0
R004 0
R005 2
R006 5
R007 0
Name: 05-01-11, dtype: int64
复制代码
3.获取某一行某一列的某个值:

print(ridership_df.loc[’05-05-11′,’R003′])
# 或者
print(ridership_df.iloc[4,0])

# 结果:
1608
4.获取原始的numpy二维数组:

复制代码
print(ridership_df.values)

# 结果:
[[ 0 0 2 5 0]
[1478 3877 3674 2328 2539]
[1613 4088 3991 6461 2691]
[1560 3392 3826 4787 2613]
[1608 4802 3932 4477 2705]
[1576 3933 3909 4979 2685]
[ 95 229 255 496 201]
[ 2 0 1 27 0]
[1438 3785 3589 4174 2215]
[1342 4043 4009 4665 3033]]
复制代码
*注意在这过程中,数据格式如果不一致,会发生转换.

一个综合栗子:

从 ridership_df 找出第一天里客流量最多的车站,然后返回这个车站的日平均客流,以及返回所有车站的平均日客流,作为对比:

复制代码
def mean_riders_for_max_station(ridership):
max_index = ridership.iloc[0].argmax()
mean_for_max = ridership[max_index].mean()
overall_mean = ridership.values.mean()
return (overall_mean, mean_for_max)

print mean_riders_for_max_station(ridership_df)

# 结果:
(2342.6, 3239.9)
复制代码