Stata16新特性解析:与Python的强强联合及数据处理能力提升

[id_[id_[id_27046[id_1[id_12456823[id_1634079130]0]9456945]66][id_58[id_[id_[id_191[id_907243790]6[id_491285379]54]956[id_1799136009]79]80679243]2[id_1375324424]653]7334[id_61920[id_1197785414]97]][id_1077044407]18910504]

Stata16新特性解析:与Python的强强联合及数据处理能力提升

[id_[id_1519461423]00338340]这是Stata发展历程中的一大进步。

[id_108602[id_14180[id_548313105]079]48]

[id_107111226]

进入 Python 的交互模式。从 Tushare 去获取数据。存在多个变量。有多种数据类型。还有需要改进的一些方面。

1. 进入Python交互模式

首先要确保你的电脑上安装了 Python,同时要保证 Stata 中执行 Python 的路径设置是正确的。接着,你能够通过在命令窗口输入以下内容:

1python

接着你就进入了如下图的Python交互模式:

你在命令窗口输入 Python 代码后,Stata 会自行调用 Python 解释器来进行解释,接着会输出结果。

比如,输入以下代码用于打印乘法口诀:

1for i in range(1, 10):
2    for j in range(1, i+1):
3        print("%d*%d=%-4.0d" % (j, i, i*j), end="")
4    print("")

注意缩进!!Python对于缩进有严格规定。结果如下:

最后,你可以输入end以结束Python交互模式。

2. 从Tushare获取数据

Tushare 是一个免费且开源的 python 财经数据接口包。我要向大家推荐这个包。大家可以通过这个链接()去进行注册并使用。并且,即便不注册,也能够使用这个包。

Stata 的 Python API 文档中关于 Data 类的介绍部分已经给出了一些通过 Python 获取 Stata 中数据的示例(链接#examples)。

在这里,我只介绍将使用 Python 获取的数据存储到 Stata 中的方法。我们主要运用的是 sfi(Stata Function Interface)模块里的 Data 类。

Data 类中的 add 族方法是用来向当前 Stata 数据集中添加观察值或变量的;get 族方法是用于获取当前 Stata 数据集中的观察值的;set 族方法是用于设置当前数据集的一些属性的;store 族方法是用于将数据保存到当前 Stata 数据集中的。

看下面代码:

 1# 获取Tushare存款利率数据
2clear
3python:
4from sfi import Data
5import tushare as ts
6
7# 创建数据集和变量
8df = ts.get_deposit_rate()
9Data.addObs(df.shape[0])
10Data.addVarStrL('date')
11Data.addVarStrL('deposit_type')
12Data.addVarStrL('rate')
13
14# 存储数据
15Data.store('date', None, df.iloc[:,0])
16Data.store('deposit_type', None, df['deposit_type'])
17Data.store('rate', None, df['rate'])
18
19end
20br

第3行,用于进入Python交互模式;

第4~5行,导入相关的包;

第8行,从Tushare上获取存款基准利率;

调用 Data 类中的 addObs()方法,此方法是用来给当前的 Stata 数据集(该数据集为空)创建若干个观察值的,其作用相当于 Stata 中的命令 set obs 100。而 df.shape[0]会返回数据的行数。

第 10 到 12 行,我已知 df 中有 3 列数,并且它们的类型皆为 object。所以在此处会使用 addVarStrL()方法来创建 3 个字符串变量,这 3 个变量的名字分别是 date、deposit_type 和 rate。即便已经创建了这些变量,然而在此时的 Stata 数据集中依然没有存储数据。

第 15 行到第 17 行,把 df 里的数据通过 store()这个方法,存储到之前所创建的那个变量里面。

第19行,退出Python交互模式。

结果如下:

3. 多个变量

上述数据仅有 3 列,所以能够不辞辛劳地对每一个变量逐一进行处理。倘若变量数量很多呢?逐一去设置变量类型,接着存储数据,那会非常麻烦。所以,需要写一个循环。

代码如下:

 1clear
2python:
3from sfi import Data
4import tushare as ts
5
6# 创建数据集和变量
7df = ts.day_boxoffice()
8Data.addObs(df.shape[0])
9for i in range(0, df.shape[1]):
10Data 给 df 中第 i 列的列名添加字符串变量
11
12# 存储数据
13for i in range(0, df.shape[1]):
14Data 将 df.iloc[:, i].name 进行存储。None, df.iloc[:, i])
15
16end
17br

上述代码是用来获取当日票房数据的。它比较简单,所以就不再详细说明了,其结果如下:

4. 多数据类型

你也许发现了,我们存到 Stata 里的数据是字符串形式。这是因为上述 df 中的数据类型为 object 类型,所以只能将其处理成字符串形式。那么,如果有些数据包含整数或者浮点数呢?

在这里需要知晓,Pandas 库是以 Numpy 库为基础构建的。所以,Pandas 中的 DataFrame 的基本数据类型就是 Numpy 的基本数据类型,具体如下:

基于此,获取沪深300的历史数据的过程如下:

 1clear
2
3python:
4from sfi import Data
5import matplotlib.pyplot as plt
6import numpy as np
7import tushare as ts
8
9# 定义数据类型
10np.int64 是 intList 中的一个元素。
11
12floatList 包含 np.float16、np.float32 和 np.float64 。 np.float16 在 floatList 中。 np.float32 在 floatList 中。 np.float64 在 floatList 中。
13
14# 获取数据
15df = ts.get_hist_data('hs300')
16df = df.reset_index()  # 将索引转化为列
17
18# 添加变量
19Data.addObs(df.shape[0]) 
20
21for i in range(0, df.shape[1]):
22    if df.iloc[:, i].dtype in intList:
23Data 向其中添加一个可变整数类型的数据,这个数据对应的是 df 数据框中第 i 列的列名
24    elif df.iloc[:, i].dtype in floatList:
25Data 为数据对象,它添加了一个浮点型变量,该变量的名称是 df 数据框中第 i 列的列名。
26    else:
27Data 为数据对象,它添加了一个变量字符串,该字符串为 df 数据框中第 i 列的列名。
28
29# 存储数据
30for i in range(0, df.shape[1]):
31    Data.store(df.iloc[:, i].name, None, df.iloc[:, i])
32
33# 绘制图形
34df[['close', 'ma5', 'ma10', 'ma20']].plot(
35    kind='line',
36    figsize=(16, 9), 
37    grid=True, 
38    title='HS300',
39    fontsize=12)
40plt.show()
41
42end
43br

第 9 行用于将 int 型数据类型放到一个列表中;第 10 行用于将 float 型数据类型放到一个列表中;第 11 行用于将 int 型数据类型放到另一个列表中;第 12 行用于将 float 型数据类型放到另一个列表中。

第21~27行用于根据不同的数据类型来创建不同类型的变量;

第33~40行用于绘图。

获取数据结果如下:

绘制的图:

5. 还需要改进的地方

Stata 中运行 Python 代码是一个很大的进步。然而,就当下而言,依然存在着许多需要改进的地方。

SFI 中不存在能直接将 DataFrame 数据转化为 Stata 可调用数据的相关 API,这意味着还需要进行额外的编程工作才能实现,使用起来不是很便利。

其次,Data 类不存在设置时间日期类型变量的方式。这导致任何时间变量要么以字符串的形式进行保存,要么被转化为时间戳,以整数或浮点数的形式来保存(SFI 模块中的 Datetime 类能够处理这类数据)。所以,时间日期变量的处理较为麻烦。

但中肯地说,瑕不掩瑜。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读