星期三, 十月 22, 2014

ipython notebook server配置及数据库连接

ipython notebook是个好东西,它的另一优点就是可以在本地用浏览器,去远程连接服务器的计算资源,就类似于Rstudio公司推出的rstudio server的功能。下面记录一下配置步骤:

第一步:服务器上安装ipython系列,推荐是安装anaconda套件,非常方便。安装完毕后将路径加在PATH环境变量中。

第二步:设置notebook server。用在ipython中如下命令设置密码:
from IPython.lib import passwd
passwd()
记下生成的字符串。

第三步:创建一个ipython配置文件,比如起名叫myserver
ipython profile create myserver
vim ~/.ipython/profile_myserver/ipython_notebook_config.py
编辑文件,加入下面几项:
c = get_config()
c.IPKernelApp.pylab = 'inline' #启动inline模式
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.password = u'sha1:yourhashedpassword'  #把第二步的密码考进来
c.NotebookApp.port = 9999   #自己设一个端口号

第四步:启动服务
ipython notebook --profile=myserver

最后你就可以在本地浏览器中登陆,输入密码,即可进入ipython notebook。

因为公司的数据库是Oracle的,所以下面的例子没有包括其它的数据库,不过方法类似。

最原始的连接数据库方式是cx_Oracle包,使用pip安装后import进来即可调用,出来的结果是一个list。
import cx_Oracle
conn = cx_Oracle.connect('user','password','ip/dbname')
cr = conn.cursor()
cr.execute('select * from table')
result = cr.fetchall()
cr.close()
conn.close()

对于数据分析而言,方便的调用方式是通过pandas封装的sql接口来做,这样出来的数据直接就是一个dataframe。使用它有几个前提要求
1 安装oracle瘦客户端
2 设置好环境变量,例如ORACLE_HOME和LD_LIBRARY_PATH
3 设置好tnsnames.ora
4 安装sqlalchemy包

设置好以后使用如下例:
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('oracle://user:password@service_name')
df = pd.read_sql_query('select * from table', engine)

星期六, 十月 18, 2014

python中的线性回归

python中的线性回归

对于统计模型来说,最简单也最经典的模型要数线性回归模型,它可以满足统计建模的所有标准流程,并且适用范围也非常广。R里面是使用lm函数来做回归,而在python里面有几个包都提供了这一功能,首先介绍sklearn包中的回归函数,然后介绍statsmodels包中的回归函数。前者适合于机器学习中的预测,不需要太多中间结果的观察。后者适合于分析,需要对中间结果,例如系数,残差以及效果做判断的时候使用。

  • 第一步:加载各种包
In [228]:
%pylab inline
import pandas as pd
import matplotlib.pylab as ply
import statsmodels.api as sm
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import statsmodels.formula.api as sm
Populating the interactive namespace from numpy and matplotlib

  • 第二步:读取数据并画图
In [222]:
df = pd.read_csv('iris.csv')
lmdf = df[['Petal_Length','Petal_Width']]
lmdf.plot(kind='scatter',x=0,y=1)
Out[222]:
<matplotlib.axes.AxesSubplot at 0x119b1f110>
  • 第三步:使用sklearn包中的函数进行回归
In [230]:
# 建立回归对象
linear_sk = LinearRegression()
X=lmdf[['Petal_Length']]
y=lmdf['Petal_Width']
linear_sk.fit(X,y)
linear_fit.intercept_,linear_fit.coef_  # coef
Out[230]:
(-0.36651404521672837, array([ 0.41641913]))
In [226]:
linear_fit.score(X,y) # R2
Out[226]:
0.92690122792200369
In [214]:
yhat = linear_fit.predict(X=lmdf[['Petal_Length']])
mean_squared_error(lmdf['Petal_Width'],yhat)  #MSE
Out[214]:
0.04228994631948424
  • 第四步:观察回归效果
In [196]:
plt.scatter(lmdf['Petal_Length'],lmdf['Petal_Width'])
plt.plot(lmdf['Petal_Length'],yhat)
Out[196]:
[<matplotlib.lines.Line2D at 0x11991a790>]
  • 使用statmodels包的过程和结果,可以使用和R类似的公式实施
In [229]:
linear_model = sm.ols(formula='Petal_Width ~ Petal_Length', data=lmdf)
results = linear_model.fit()
results.summary()
Out[229]:
OLS Regression Results
Dep. Variable: Petal_Width R-squared: 0.927
Model: OLS Adj. R-squared: 0.926
Method: Least Squares F-statistic: 1877.
Date: Sat, 18 Oct 2014 Prob (F-statistic): 5.78e-86
Time: 18:00:43 Log-Likelihood: 24.400
No. Observations: 150 AIC: -44.80
Df Residuals: 148 BIC: -38.78
Df Model: 1
coef std err t P>|t| [95.0% Conf. Int.]
Intercept -0.3665 0.040 -9.188 0.000 -0.445 -0.288
Petal_Length 0.4164 0.010 43.320 0.000 0.397 0.435
Omnibus: 5.498 Durbin-Watson: 1.461
Prob(Omnibus): 0.064 Jarque-Bera (JB): 5.217
Skew: 0.353 Prob(JB): 0.0736
Kurtosis: 3.579 Cond. No. 10.3

星期四, 十月 16, 2014

pandas包绘图函数初步

python中绘图有很多包来支持,但总是觉得没有ggplot2有用。尽管如此,在探索数据时还是需要画些图来观察数据。尝试了很多方式,感觉比较方便的还是利用pandas包的附带绘图函数,可以做一些初步的探索性画图。它本身还是对matplotlib包的一个封装。下面的代码是画一些基本的图形,如线图,直方图,条形图,散点图。散点图映射点的color时要注意,不能直接把字符串进行映射,需要用scatter函数,并且需要用数值来映射到颜色。
In [6]:
%pylab inline
import pandas as pd
df= pd.read_csv('iris.csv')
df.head()
Populating the interactive namespace from numpy and matplotlib

Out[6]:
Sepal_Length Sepal_Width Petal_Length Petal_Width Species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
In [8]:
df.Sepal_Length.hist(by=df['Species'])
Out[8]:
array([[,
        ],
       [,
        ]], dtype=object)
In [9]:
df.ix[:,:4].plot(kind='line')
Out[9]:

In [10]:
df1= df.groupby('Species').mean()
df1.plot(kind='bar', stacked=True )
Out[10]:

In [12]:
df.ix[:,:4].plot(kind='scatter',x='Sepal_Length',y='Sepal_Width',by=df['Species'])
Out[12]:

In [13]:
scatter(df.Petal_Length,df.Petal_Width, c=tile([1,2,3],50))
Out[13]:

In []: