查看原文
其他

爬虫俱乐部的精彩答疑——local function

爬虫俱乐部 Stata and Python数据分析 2023-01-01

本文作者:李嘉琪,中南财经政法大学金融学院

本文编辑:智淼

技术总编:方一卓


Stata&Python云端课程来啦!

      好消息好消息,爬虫俱乐部开辟小鹅通战场!!爬虫俱乐部隆重推出小鹅通网络课程,将Stata基础课程Stata进阶课程Python课程都上传至小鹅通平台,欢迎大家多多支持订阅!报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台留言哦。如需了解详情,可以通过课程链(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~

引言

Stata&Python授课哪家强,当属爬虫俱乐部!

Stata&Python网络答疑哪家强,当属爬虫俱乐部!

优质的课程内容虽然重要,但及时且详细答疑更加重要!

同学们学习网课的过程中,会出现大大小小的问题。从基础Stata和Python的安装、Stata与Python的交互、到Stata&Python网络爬虫,同学们都积极学习、踊跃提问,答疑老师也及时回复、各显神通。在强大的答疑老师团队的支持下,来自山东财经大学、河南师范大学、中南财经政法大学、上海对外经贸大学等学校的学生的学习热情日益高涨。同学们的问题逐渐深入、逐渐有难度,而专业、强大、负责、高效和细致入微的答疑服务,给了同学们很好的学习体验,也收获了学员们的一致好评

其中,小编汇总爬虫俱乐部的答疑问题,发现很多同学对于local的使用有疑问。今天,小编就以答疑群中的答疑案例为基础,讲解local的使用。01
local的基本用local是"局部宏"的意思 ,按照官方的help 文档,local的常见用法为:1 local  lclname [=exp | :macro_fcn | "[string]" | `"[string]"']

lclname为local的名称,后面为local储存的内容,可以是表达式、扩展的函数、"字符串"、`"字符串"'。其实,宏的内容可以是任何东西。local有如下特点:暂时存放、平行世界、局部可见、释放内存。

Stata 在执行命令时,若看到local,会先会进行翻译,即读取local的内容,再将其传给命令,替换命令中的local,再执行命令,Stata并不care其内容是数字还是字符串,或者可以说local并没有数字或字符串的概念,它只是机械地进行替换,将local的内容替换到命令中。引用local时,我们需要用到反引号与单引号,形如`lclname'。其中,反单引号(backquote),又称反引号,是西文字符中的附加符号,主要用于计算机相关领域。位置在键盘中数字键“1”的左边,其上档符号是“~ ”。

02
local可以存放什么

local的内容可以是任何东西,local存放的内容没有数字或者字符的概念,存进去是什么东西就是什么东西。

或许你可以把内存是理解为一个五星级酒店,每个房间就是内存单元,你自己定义房间的名称lclname,然后可以在房间里面存放东西。房间有单人间、双人间、多人间,可以住人,也可以住狗。

以下演示local的使用。

1local x = 1   //=是赋值符号,表示将1赋值给x
2disp `x'
3*结果为1
4
5local one = 2
6local two = `
one'+1
7disp `two'
   
8*结果为3
9*上述命令也可以进行简化,写为
10local one = 2
11disp `= `one'+1'
12*结果为3
13
14local name 爬虫俱乐部No.1
15dis "`name'" 
16*结果是  爬虫俱乐部No.1
17
18local x 2+3
19disp `x'
20*结果是 5
21
22local x 2+3
23disp "`
x'" //但是display "`x'"相当于执行了 display "2+3",此时 display将2+3视作字符串输出。
24*结果是 2+3 
25
26local command display
27`command' 1+2   //相当于执行 display 1+2
28结果是3
29
30clear 
31local add1 https://
32local add2 bbs.
33local add3 pinggu.org/
34copy `add1'`add2'`add3' d:/temp.txt, replace
35*相当于执行 copy https://bbs.pinggu.org/ d:/temp.txt,replace
36
37local 1 2
38local 2 3
39local 3 4
40disp ```1'''   //disp ```1''' 首先被翻译程disp ``2'',然后被翻译成disp `3',最后被翻译成disp 4。翻译的顺序:由内向外,从左到右


03
local的扩展函数extended function


当使用help查看extended function的写法时,可以发现扩展函数的用法多种多样。

我们只对其中一部分进行简要介绍。


a. Macro function for formatting results

首先,我们可以使用扩展函数来返回display命令的结果,其中可以使用format选项来格式化结果。

1clear all
2disp sqrt(2)  //sqrt(2)表示对2开根号
3*结果是1.4142136
4
5local sqrt1: disp sqrt(2
6disp `sqrt1'
7*1.4142136
8
9local sqrt1: disp %12.10f sqrt(2)  //%12.10f表示将sqrt(2)设置为小数点后保留10位的格式
10disp "`sqrt1'"
11*结果是1.4142135624


1clear all
2local date: disp %dCY-N-D mdy(7,11,2020)
3disp `date'   //Stata翻译为disp 2020-07-11 ,其中"-"识别为减号,因此结果是2002
4*结果是2002
5disp "`date'"
6*结果是2020-07-11

b.Macro functions for extracting data attributes

用法是variable label varname。即返回与varname关联的变量标签。

1clear all
2sysuse auto, clear
3foreach variable in make price mpg ///
4rep78 headroom trunk weight length ///
5turn displacement gear_ratio foreign{
6    local lbl : variable label `variable'
7    disp "the label of `variable' is `lbl'"
8}

运行结果如下图:


c.Macro function for copying a macro

使用方法:copy { local | global } mname,即复制原来local mname的内容,储存到新的local中。

1local m 2
2 local mm : copy local m   
3 disp `mm'
4 *结果是2


d. Macro functions for parsing

具体用法1是 word count string,即返回字符串中的单词的个数,每个单词由空格分隔。其中,注意字符串不能放在双引号中,因为单词计数将返回1。

1local m: word count this is a test
2disp `m'
3*结果是4,即四个单词
具体用法2是 word # of string,即返回字符串的第#标记。 1local mystring = "this is a test"
2forvalues i = 1(1)4 {
3    local lbl: word `i' of `mystring'
4    disp "`lbl'
"
5}
6*结果是
7this
8is
9a
10test


e.local extended function:文件和文件夹列表

关于这个部分将在下面进行详细的介绍。


04
存放某一个路径下的文件的常见错误
dir可以显示存放在某处的、名称包含某个规律的文件夹或是文件,按照help 文件,语法结构为:1dir ["]dirname["] {files|dirs|other} ["]pattern["] [, nofail respectcase]
使用local储存时,语法结构可以简化为:
1local xxx: dir "路径名" files "文件筛选规则"
而我们常用的操作如下:1cd D:\
2local myfiles: dir "." files "*.do"  //.表示当前文件夹,files表示查找的是文件,"*.do"表示查找的是do文件
3disp `myfiles'    //结果:文档的名字都连着
4disp `"`myfiles'
"'   //结果:每个文档名称的左右都有引号,且中间有空格
5
6local d: dir "
d:/" dirs "*"  //"d:/"表示d盘,dirs表示查找的是文件夹,"*"表示查找的文件夹没有特定的特点,即查找全部文件夹。
7disp `"
`d'"'
这是一个非常好用的操作,但是很多同学都犯了一个同样的小错误。当然,既然是常见错误,就不会只有一位同学有问题。就在当天,无独有偶,另一位同学问了同样的问题。就像答疑老师所说,在定义宏扩展函数时,dir "." files 中的引号一定要加上,因为. 指当前路径,不带引号无法识别。
05
local的局部性a.local的局部性可以理解为local只在运行过程中存在。简单的来讲,一段程序运行完了,当时定义的local 就不存在了;在循环里面定义的local,出了循环就不存在了。当你选中以下全部程序同时运行:1sysuse auto,clear
2count if foreign
3local n3 = r(N)   //将count的返回值赋给n3,其中r(N)=22
4forvalues v=18(1)`n3'  {   //从11开始,到22结束,步长为11
5  display `v'
6}
7disp `n3'

出现的结果如下所示:

如果再运行如下程序:

1disp `n3'

则没有结果:

这就充分展示了,local有局部性,只在运行过程中存在,即局部存在。第二次运行disp `n3'时,local已经不存在了。


b.答疑案例

由于local的局部性特点,在运行程序的时候,就要保证定义local的命令行使用local的程序是同时被选中运行的。有些同学没有注意到,就会出现如下问题。


06
local符号

有些同学得知local可以存放任意的东西,因此摩拳擦掌尝试使用local简化计量过程,下面这位同学就运行了以下程序,但是却出现了报错。


然后这位同学思考无果,就来询问答疑老师。答疑老师指出,应该对x使用local引用符号,即应该修改为如下程序:

1sysuse auto
2local x weight length foeign
3reg mpg `x'

上面这位同学忘记了加local引用符号,而下面的同学则是写错了local的符号。

正确的 local 符号为`',这不是一对单引号,而是分为左边的反单引号和右面的单引号。在大多数键盘上,反单引号位置在键盘中数字键“1”的左边,其上档符号是“~ ”。单引号位于回车键的左边。如下图箭头所示:


其实出现这样错误的同学有很多,在此处就不再一一列举。也正是因为这是通病,所以希望大家多多注意呀。

07
绝对引用复合双引号的使用(`"  "')

复合双引号是在引号(` ')里面加上双引号(" ")。有同学不明白什么时候使用复合双引号,于是在答疑群积极询问。

该问题对应的课程是"新浪公告的爬取",已经学到的同学们可以在这里复习一下。

该同学问为什么课程案例中的 stk 不需要使用复合双引号,答疑老师第一时间做出了讲解。原来,当宏里面存放的东西含有 ' 或者 " 等会混淆计算机的符号时,就需要使用复合双引号加以区分。这里的股票代码 stk 只是数字,此处不需要使用复合双引号。

今天对local的介绍就到这里啦。其实,当需要在 Stata 中做重复性工作时,local 的使用能精简我们的代码,大幅提高我们的工作效率。

当然,local的好用程度不仅是上面展示的这样。while 循环、foreach 循环、forvalue 循环等也都包含了local的使用。也就是说,当循环需要遍历某个对象,对这个对象的每个元素进行同样的操作,这时可以用local存储元素,每循环一次,便更新一次local的内容。local的巧用还需要大家在学习过程中慢慢探索~

END



最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!


往期推文推荐爬虫俱乐部精彩答疑——Python中的三种文件读取方法
爬虫俱乐部的精彩答疑--认真仔细方能写出好程序
爬虫俱乐部Python精彩答疑——更换Jupyter Notebook浏览器及dropna()参数详解
爬虫俱乐部的精彩答疑--如何打开Excel中扩展名与文件源码不符的文件

解锁《梦华录》之东京繁华生活

爬虫俱乐部的精彩答疑——DOS命令

爬虫俱乐部的精彩答疑之换行问题

爬虫俱乐部的精彩答疑--路径设置乱码怎么破?

爬虫俱乐部的精彩答疑--putdocx的二三事

爬虫俱乐部精彩答疑之Python篇

爬虫俱乐部的精彩答疑--花式重命名变量

      今天你还是“刘畊宏女孩”吗?

爬虫俱乐部在山东财经大学金融学院暑期Stata网课上的精彩答疑

JupyterNotebook——如何更换默认文档目录

Stata绘图系列——玩转绘图通用选项(一)

出人意料!这所大学的A级学科总数竟超越清华北大!

Stata数据读入——打开方式不同?

数据类型——Dict、Set与Frozenset简析

Stata小贴士之外部命令安装路径

有一种夏天叫做宫崎骏的夏天


关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存