python使用虚函数的简单介绍
python中怎么把datetime类型转换成timestamp
在进行新纪元时间(1970-01-01 00:00:00)以来的秒到实际时间之间转换的时候 MySQL 根据参数 time_zone 的设置有两种选择:
创新互联建站专注于师宗网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供师宗营销型网站建设,师宗网站制作、师宗网页设计、师宗网站官网定制、成都小程序开发服务,打造师宗网络公司原创品牌,更为您提供师宗网站排名全网营销落地服务。
time_zone 设置为 SYSTEM 的话:使用 sys_time_zone 获取的 OS 会话时区,同时使用 OS API 进行转换。对应转换函数 Time_zone_system::gmt_sec_to_TIME
time_zone 设置为实际的时区的话:比如 ‘+08:00’,那么使用使用 MySQL 自己的方法进行转换。对应转换函数 Time_zone_offset::gmt_sec_to_TIME
实际上 Time_zone_system 和 Time_zone_offset 均继承于 Time_zone 类,并且实现了 Time_zone 类的虚函数进行了重写,因此上层调用都是 Time_zone::gmt_sec_to_TIME。
如何用python实现含有虚拟自变量的回归
利用python进行线性回归
理解什么是线性回归
线性回归也被称为最小二乘法回归(Linear Regression, also called Ordinary Least-Squares (OLS) Regression)。它的数学模型是这样的:
y = a+ b* x+e
其中,a 被称为常数项或截距;b 被称为模型的回归系数或斜率;e 为误差项。a 和 b 是模型的参数。
当然,模型的参数只能从样本数据中估计出来:
y'= a' + b'* x
我们的目标是选择合适的参数,让这一线性模型最好地拟合观测值。拟合程度越高,模型越好。
那么,接下来的问题就是,我们如何判断拟合的质量呢?
这一线性模型可以用二维平面上的一条直线来表示,被称为回归线。
模型的拟合程度越高,也即意味着样本点围绕回归线越紧密。
如何计算样本点与回归线之间的紧密程度呢?
高斯和勒让德找到的方法是:被选择的参数,应该使算出来的回归线与观测值之差的平房和最小。用函数表示为:
这被称为最小二乘法。最小二乘法的原理是这样的:当预测值和实际值距离的平方和最小时,就选定模型中的两个参数(a 和 b)。这一模型并不一定反映解释变量和反应变量真实的关系。但它的计算成本低;相比复杂模型更容易解释。
模型估计出来后,我们要回答的问题是:
我们的模型拟合程度如何?或者说,这个模型对因变量的解释力如何?(R2)
整个模型是否能显著预测因变量的变化?(F 检验)
每个自变量是否能显著预测因变量的变化?(t 检验)
首先回答第一个问题。为了评估模型的拟合程度如何,我们必须有一个可以比较的基线模型。
如果让你预测一个人的体重是多少?在没有任何额外信息的情况下,你可能会用平均值来预测,尽管会存在一定误差,但总比瞎猜好。
现在,如果你知道他的身高信息,你的预测值肯定与平均值不一样。额外信息相比平均值更能准确地预测被预测的变量的能力,就代表模型的解释力大小。
上图中,SSA 代表由自变量 x 引起的 y 的离差平方和,即回归平方和,代表回归模型的解释力;SSE 代表由随机因素引起的 y 的离差平方和,即剩余平方和,代表回归模型未能解释的部分;SST 为总的离差平方和,即我们仅凭 y 的平均值去估计 y 时所产生的误差。
用模型能够解释的变异除以总的变异就是模型的拟合程度:
R2=SSA/SST=1-SSE
R2(R 的平方)也被称为决定系数或判定系数。
第二个问题,我们的模型是否显著预测了 y 的变化?
假设 y 与 x 的线性关系不明显,那么 SSA 相对 SSE 占有较大的比例的概率则越小。换句话说,在 y 与 x 无线性关系的前提下,SSA 相对 SSE 的占比越高的概率是越小的,这会呈现一定的概率分布。统计学家告诉我们它满足 F 分布,就像这样:
如果 SSA 相对 SSE 占比较大的情况出现了,比如根据 F 分布,这个值出现的概率小于 5%。那么,我们最好是拒绝 y 与 x 线性关系不显著的原始假设,认为二者存在显著的线性关系较为合适。
第三个问题,每个自变量是否能显著预测因变量的变化?换句话说,回归系数是否显著?
回归系数的显著性检验是围绕回归系数的抽样分布(t 分布)来进行的,推断过程类似于整个模型的检验过程,不赘言。
实际上,对于只有一个自变量的一元线性模型,模型的显著性检验和回归系数的检验是一致的,但对于多元线性模型来说,二者就不能等价了。
利用 statsmodels 进行最小二乘回归
#导入相应模块
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: import statsmodels.api as sm
#将数据导入 pandas 的 dataframe 对象,第一列(年份)作为行标签
In [4]: df=pd.read_csv('/Users/xiangzhendong/Downloads/vincentarelbundock-Rdatasets-1218370/csv/datasets/longley.csv', index_col=0)
#查看头部数据
In [5]: df.head()
Out[5]:
GNP.deflator GNP Unemployed Armed.Forces Population Year \
1947 83.0 234.289 235.6 159.0 107.608 1947
1948 88.5 259.426 232.5 145.6 108.632 1948
1949 88.2 258.054 368.2 161.6 109.773 1949
1950 89.5 284.599 335.1 165.0 110.929 1950
1951 96.2 328.975 209.9 309.9 112.075 1951
Employed
1947 60.323
1948 61.122
1949 60.171
1950 61.187
1951 63.221
#设置预测变量和结果变量,用 GNP 预测 Employed
In [6]: y=df.Employed #结果变量
In [7]: X=df.GNP #预测变量
#为模型增加常数项,即回归线在 y 轴上的截距
In [8]: X=sm.add_constant(X)
#执行最小二乘回归,X 可以是 numpy array 或 pandas dataframe(行数等于数据点个数,列数为预测变量个数),y 可以是一维数组(numpy array)或 pandas series
In [10]: est=sm.OLS(y,X)
使用 OLS 对象的 fit() 方法来进行模型拟合
In [11]: est=est.fit()
#查看模型拟合的结果
In [12]: est.summary()
Out[12]:
#查看最终模型的参数
In [13]: est.params
Out[13]:
const 51.843590
GNP 0.034752
dtype: float64
#选择 100 个从最小值到最大值平均分布(equally spaced)的数据点
In [14]: X_prime=np.linspace(X.GNP.min(), X.GNP.max(),100)[:,np.newaxis]
In [15]: X_prime=sm.add_constant(X_prime)
#计算预测值
In [16]: y_hat=est.predict(X_prime)
In [17]: plt.scatter(X.GNP, y, alpha=0.3) #画出原始数据
#分别给 x 轴和 y 轴命名
In [18]: plt.xlabel("Gross National Product")
In [19]: plt.ylabel("Total Employment")
In [20]: plt.plot(X_prime[:,1], y_hat, 'r', alpha=0.9) #添加回归线,红色
多元线性回归(预测变量不止一个)
我们用一条直线来描述一元线性模型中预测变量和结果变量的关系,而在多元回归中,我们将用一个多维(p)空间来拟合多个预测变量。下面表现了两个预测变量的三维图形:商品的销量以及在电视和广播两种不同媒介的广告预算。
数学模型是:
Sales = beta_0 + beta_1*TV + beta_2*Radio
图中,白色的数据点是平面上的点,黑色的数据点事平面下的点。平面的颜色是由对应的商品销量的高低决定的,高是红色,低是蓝色。
利用 statsmodels 进行多元线性回归
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import statsmodels.api as sm
In [4]: df_adv=pd.read_csv('g.csv',index_col=0)
In [6]: X=df_adv[['TV','Radio']]
In [7]: y=df_adv['Sales']
In [8]: df_adv.head()
Out[8]:
TV Radio Newspaper Sales
1 230.1 37.8 69.2 22.1
2 44.5 39.3 45.1 10.4
3 17.2 45.9 69.3 9.3
4 151.5 41.3 58.5 18.5
5 180.8 10.8 58.4 12.9
In [9]: X=sm.add_constant(X)
In [10]: est=sm.OLS(y,X).fit()
In [11]: est.summary()
Out[11]:
你也可以使用 statsmodels 的 formula 模块来建立多元回归模型
In [12]: import statsmodels.formula.api as smf
In [13]: est=smf.ols(formula='Sales ~ TV + Radio',data=df_adv).fit()
处理分类变量
性别或地域都属于分类变量。
In [15]: df= pd.read_csv('httd.edu/~tibs/ElemStatLearn/datasets/SAheart.data', index_col=0)
In [16]: X=df.copy()
利用 dataframe 的 pop 方法将 chd 列单独提取出来
In [17]: y=X.pop('chd')
In [18]: df.head()
Out[18]:
sbp tobacco ldl adiposity famhist typea obesity alcohol \
row.names
1 160 12.00 5.73 23.11 Present 49 25.30 97.20
2 144 0.01 4.41 28.61 Absent 55 28.87 2.06
3 118 0.08 3.48 32.28 Present 52 29.14 3.81
4 170 7.50 6.41 38.03 Present 51 31.99 24.26
5 134 13.60 3.50 27.78 Present 60 25.99 57.34
age chd
row.names
1 52 1
2 63 1
3 46 0
4 58 1
5 49 1
In [19]: y.groupby(X.famhist).mean()
Out[19]:
famhist
Absent 0.237037
Present 0.500000
Name: chd, dtype: float64
In [20]: import statsmodels.formula.api as smf
In [21]: df['famhist_ord']=pd.Categorical(df.famhist).labels
In [22]: est=smf.ols(formula="chd ~ famhist_ord", data=df).fit()
分类变量的编码方式有许多,其中一种编码方式是虚拟变量编码(dummy-encoding),就是把一个 k 个水平的分类变量编码成 k-1 个二分变量。在 statsmodels 中使用 C 函数实现。
In [24]: est=smf.ols(formula="chd ~ C(famhist)", data=df).fit()
In [26]: est.summary()
Out[26]:
处理交互作用
随着教育年限(education)的增长,薪酬 (wage) 会增加吗?这种影响对男性和女性而言是一样的吗?
这里的问题就涉及性别与教育年限的交互作用。
换言之,教育年限对薪酬的影响是男女有别的。
#导入相关模块
In [1]: import pandas as pd
In [2]: import numpy as np
In [4]: import statsmodels.api as sm
#导入数据,存入 dataframe 对象
In [5]: df=pd.read_csv('/Users/xiangzhendong/Downloads/pydatafromweb/wages.csv')
In [6]: df[['Wage','Education','Sex']].tail()
Out[6]:
Wage Education Sex
529 11.36 18 0
530 6.10 12 1
531 23.25 17 1
532 19.88 12 0
533 15.38 16 0
由于性别是一个二分变量,我们可以绘制两条回归线,一条是 sex=0(男性),一条是 sex=1(女性)
#绘制散点图
In [7]: plt.scatter(df.Education,df.Wage, alpha=0.3)
In [9]: plt.xlabel('education')
In [10]: plt.ylabel('wage')
#linspace 的作用是生成从最小到最大的均匀分布的 n 个数
In [17]: education_linspace=np.linspace(df.Education.min(), df.Education.max(),100)
In [12]: import statsmodels.formula.api as smf
In [13]: est=smf.ols(formula='Wage ~ Education + Sex', data=df).fit()
In [18]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]0, 'r')
In [19]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]1, 'g')
以上两条线是平行的。这是因为分类变量只影响回归线的截距,不影响斜率。
接下来我们可以为回归模型增加交互项来探索交互效应。也就是说,对于两个类别,回归线的斜率是不一样的。
In [32]: plt.scatter(df.Education,df.Wage, alpha=0.3)
In [33]: plt.xlabel('education')
In [34]: plt.ylabel('wage')
#使用*代表我们的回归模型中除了交互效应,也包括两个变量的主效应;如果只想看交互效应,可以用:代替,但通常不会只看交互效应
In [35]: est=smf.ols(formula='Wage ~ Sex*Education', data=df).fit()
In [36]: plt.plot(education_linspace, est.params[0]+est.params[1]0+est.params[2]education_linspace+est.params[3]0education_linspace, 'r')
In [37]: plt.plot(education_linspace, est.params[0]+est.params[1]1+est.params[2]education_linspace+est.params[3]1education_linspace, 'g')
参考资料:
DataRobot | Ordinary Least Squares in Python
DataRoboe | Multiple Regression using Statsmodels
AnalyticsVidhya | 7 Types of Regression Techniques you should know!
python中类的理解与总结?
9. 类
Python 的类机制通过最小的新语法和语义在语言中实现了类。它是 C++ 或者 Modula-3 语言中类机制的混合。就像模块一样,Python 的类并没有在用户和定义之间设立绝对的屏障,而是依赖于用户不去“强行闯入定义”的优雅。另一方面,类的大多数重要特性都被完整的保留下来:类继承机制允许多重继承,派生类可以覆盖(override)基类中的任何方法或类,可以使用相同的方法名称调用基类的方法。对象可以包含任意数量的私有数据。
用 C++ 术语来讲,所有的类成员(包括数据成员)都是公有( public )的(其它情况见下文 私有变量),所有的成员函数都是虚( virtual )的。用 Modula-3 的术语来讲,在成员方法中没有简便的方式引用对象的成员:方法函数在定义时需要以引用的对象做为第一个参数,调用时则会隐式引用对象。像在 Smalltalk 中一个,类也是对象。这就提供了导入和重命名语义。不像 C++ 和 Modula-3 中那样,大多数带有特殊语法的内置操作符(算法运算符、下标等)都可以针对类的需要重新定义。
在讨论类时,没有足够的得到共识的术语,我会偶尔从 Smalltalk 和 C++ 借用一些。我比较喜欢用 Modula-3 的用语,因为比起 C++,Python 的面向对象语法更像它,但是我想很少有读者听过这个。
python 中os.system()的用法?
os模块中的system()函数可以方便地运行其他程序或者脚本。
语法如下:os.system(command)
其参数含义如下所示:
command 要执行的命令,相当于在Windows的cmd窗口中输入的命令。如果要向程序或者脚本传递参数,可以使用空格分隔程序及多个参数。
扩展资料
Python在执行时,首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。这种机制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine与Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一种更高级的Virtual Machine。
这里的高级并不是通常意义上的高级,不是说Python的Virtual Machine比Java或.NET的功能更强大,而是说和Java 或.NET相比,Python的Virtual Machine距离真实机器的距离更远。或者可以这么说,Python的Virtual Machine是一种抽象层次更高的Virtual Machine。
基于C的Python编译出的字节码文件,通常是.pyc格式。
除此之外,Python还可以以交互模式运行,比如主流操作系统Unix/Linux、Mac、Windows都可以直接在命令模式下直接运行Python交互环境。直接下达操作指令即可实现交互操作。
参考资料来源:51CTO.com:使用os.system函数运行其他程序
文章题目:python使用虚函数的简单介绍
URL链接:http://azwzsj.com/article/dopoihs.html