我尝试使用Python进行统计分析。在
在Stata中,我可以定义本地宏并根据需要展开它们:
program define reg2
syntax varlist(min=1 max=1), indepvars(string) results(string)
if "`results'" == "y" {
reg `varlist' `indepvars'
}
if "`results'" == "n" {
qui reg `varlist' `indepvars'
}
end
sysuse auto, clear
所以不是:
^{pr2}$我可以做:
local options , indepvars(weight foreign price) results(y)
reg2 mpg `options'
甚至:
local vars weight foreign price
local options , indepvars(`vars') results(y)
reg2 mpg `options'
Stata中的宏可以帮助我编写干净的脚本,而不必重复代码。在
在Python中,我尝试了字符串插值,但这在函数中不起作用。在
例如:
def reg2(depvar, indepvars, results):
print(depvar)
print(indepvars)
print(results)
以下情况很好:
reg2('mpg', 'weight foreign price', 'y')
但是,这两种方法都失败了:
regargs = 'mpg', 'weight foreign price', 'y'
reg2(regargs)
regargs = 'depvar=mpg, covariates=weight foreign price, results=y'
reg2(regargs)
我发现了一个类似的问题,但它不能回答我的问题:
还有一个关于R的问题:
但是,我找不到任何专门针对Python的东西。在
我想知道Python中是否有类似于Stata宏的东西?在
用Python的方式来做。
Stata中宏的广泛使用反映了一种不同的编程理念。 与Python不同,Python是一种面向对象的通用编程语言, Stata的
ado
语言(不是mata
)需要宏才能作为 不仅仅是一种简单的脚本语言。在宏几乎可以在Stata中的任何地方使用(甚至在宏定义中),有两个目的:
使用宏,用户可以简化他们的代码,这反过来又会减少 有可能出错并保持整洁。缺点是使用宏 呈现语言的语法流畅。在
要回答您的问题,Pyexpander 在Python中提供了一些此类功能,但实际上它不是 代替。对于不同的用例,您将需要不同的方法来模拟 宏观扩张。与Stata相比,没有一个统一的方法在任何地方进行。在
我的建议是熟悉Python的约定,而不是 试着用“Stata way”编程。例如,记住 Stata中的局部宏和全局宏对应于Python(local)中的变量 在函数中,全局外部),而Stata中的变量对应于
Pandas.Series
或Pandas.DataFrame
的列。类似地,Stataado
程序对应于Python中的函数。在@g.d.d.c的答案中提供的解决方案可能是实现目标的一个很好的工具 有人想要什么。但是,如果您愿意,这里需要额外的步骤 重复使用你的代码。在
以你的玩具为例:
假设您希望重用以下代码片段,但是 变量:
^{pr2}$你怎么可能那样做?在
首先,创建一个函数:
但是,请注意,虽然字符串插值可以“扩展”字符串,但这里 这种方法行不通,因为回归分析的目标函数 不接受
'weight, price, cons'
类型的统一字符串。在相反,您需要用回归函数定义一个列表:
您还可以通过构造装饰器将这个概念提升到下一个层次:
并在
reg2()
函数中使用:这个例子可能非常简单,但它展示了Python的强大功能:
如您所见,decorator进一步抽象了一些东西,但是使用了固定的语法。在
在Python世界中,字典和类在 重复使用代码/结果。例如,字典可以相当于 Stata的
return
空间,用于存储多个宏、标量等考虑一下我们的玩具装饰器
load_and_reg2
稍作修改的版本,它 现在将单个对象保存在字典D
中并返回它:然后您可以轻松地执行以下操作:
类可以以代价引入更多的灵活性 一些额外的复杂性:
此版本的玩具装饰器返回:
看起来您只需要
*
和**
运算符来调用函数:使用
*
将列表或元组展开为位置参数,或使用**
将字典扩展为需要它们的函数的关键字参数。在对于关键字示例,您需要稍微更改声明:
^{pr2}$相关问题 更多 >
编程相关推荐