Python和Stata的数据交互

最近拿到了Stata的船新版本——Stata16,就迫不及待地玩了两天。总的来说,Stata16不论在UI上,还是在功能上,都比之前的版本进步了许多。

特别值得一说的是,Stata终于牵手Python了——用户可以在直接进入Python的交互模式,或者运行Python的脚本。这样就可以借他山之石以攻玉。比如说,我们用Python爬取的数据,然后交由Stata进行处理;或者将Stata中的数据交由Python的Matplotlib库绘制三维图像等。这是Stata发展历程中的一大进步。

当然,Stata与Python的结合过程中仍然存在大量问题,需要Stata的开发人员持续改进。这一篇我们将结合Stata的Python开发文档(链接:https://www.stata.com/python/api16/index.html),来介绍二者之间的数据交互问题。

1. 进入Python交互模式

首先,你得确保的电脑上已经安装了Python,并且Stata中执行Python的路径设置正确。然后,你可以通过在命令窗口输入:

python

接着你就进入了如下图的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财经数据接口包,在此向大家安利这个包,大家可以通过这个链接(https://tushare.pro/register?reg=224853)去注册使用。当然不注册也可以用。

由于Stata的Python API文档中关于Data类的介绍中已经举了一些使用Python获取Stata中数据的例子(链接https://www.stata.com/python/api16/Data.html#examples)。
在这里插入图片描述
因此,在这里,我就只介绍如何使用Python获取的数据存储到Stata中。这里我们主要使用的是sfi(Stata Function Interface)模块中的Data类。

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

看下面代码:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
 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上获取存款基准利率;
第9行,调用Data类中的addObs()方法,用于给当前Stata数据集(空)中创建若干个观察值,相当于Stata中的命令set obs 100。df.shape[0]将返回数据的行数。
第10~12行,由于我已经知道了df中有3列数,且它们的类型都是object,因此这里将使用addVarStrL()方法创建3个字符串变量,变量名分别为date,deposit_type和rate。尽管已经创建了变量,但此时Stata数据集中仍然没有存储数据。
第15~17行,将df中的数据使用store()方法存储到刚才创建的变量中。
第19行,退出Python交互模式。

结果如下:
在这里插入图片描述
3. 多个变量

上述数据中只有3列数据,所以可以不辞辛苦地对每一个变量分别进行处理,那么如果变量很多呢?一个个地设置变量类型,然后存储数据,那将太麻烦了。因此,要写个循环。

代码如下:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
 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]):
10    Data.addVarStrL(df.iloc[:, i].name)
11
12# 存储数据
13for i in range(0, df.shape[1]):
14    Data.store(df.iloc[:, i].name, None, df.iloc[:, i])
15
16end
17br

上述代码,是用于获取当日票房的数据的。比较简单,就不赘述了,结果如下:
在这里插入图片描述
4. 多数据类型

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

在这里需要知道,Pandas库是基于Numpy库进行构建的。因此Pandas中的DataFrame的基本数据类型就是Numpy的基本数据类型,如下:
在这里插入图片描述
基于此,获取沪深300的历史数据的过程如下:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
 1clear
 2
 3python:
 4from sfi import Data
 5import matplotlib.pyplot as plt
 6import numpy as np
 7import tushare as ts
 8
 9# 定义数据类型
10intList = [np.int8, np.int16, np.int32, np.int64,
11           np.uint8, np.uint16, np.uint32, np.uint64]
12floatList = [np.float16, np.float32, np.float64]
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:
23        Data.addVarInt(df.iloc[:, i].name)
24    elif df.iloc[:, i].dtype in floatList:
25        Data.addVarFloat(df.iloc[:, i].name)
26    else:
27        Data.addVarStrL(df.iloc[:, i].name)
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~12行用于将int型和float型的数据类型分别放到两个列表中。
第21~27行用于根据不同的数据类型来创建不同类型的变量;
第33~40行用于绘图。

获取数据结果如下:
在这里插入图片描述
绘制的图:
在这里插入图片描述
5. 还需要改进的地方

在Stata中运行Python代码是其一个长足的进步,但就目前来看,仍有许多改进的地方。

首先,SFI中没有将DataFrame数据直接转化为Stata可调用数据的相关API,还需要进一步的编程来实现,不是很方便;

其次,Data类中没有设置时间日期类型变量的方法。这就使得任何时间变量要么以字符串的形式保存,要么转化为时间戳以整数或浮点数的形式保存(SFI模块中的Datetime类可以处理此数据),因此,时间日期变量的处理就比较麻烦。

但中肯地说,瑕不掩瑜。

  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PythonStata都是数据分析领域常用的工具,它们各有优缺点,具体使用哪个要根据具体需求而定。下面是两者的比较: 1. 功能方面 Python是一门通用编程语言,可以用来进行数据分析、机器学习、Web开发等多种应用。Python有大量的数据分析库,如NumPy、Pandas、Scipy和Matplotlib等,还有一些强大的机器学习框架,如TensorFlow、Keras和PyTorch等。 Stata则是专业的统计分析软件,主要用于数据清洗、可视化和统计分析。Stata有丰富的数据操作和统计分析功能,特别擅长于面板数据分析和处理,也有一些可视化工具和机器学习功能。 2. 学习成本 Python作为一门通用编程语言,学习曲线相对较长,需要掌握基本的编程概念和语法,但是Python的社区非常活跃,有很多在线教程和课程,学习资源非常丰富。 Stata相对来说学习成本较低,因为它的语法比较简单明了,上手较快。同时Stata也有自己的官方文档和社区支持,可以帮助用户快速上手。 3. 数据处理速度 Python数据处理速度相对较慢,特别是在处理大规模数据时,需要使用一些优化技巧,如向量化和并行计算等。 Stata数据处理速度方面比较快,尤其是在数据清洗和面板数据分析方面表现出色。 综上所述,Python适合进行复杂的数据分析和机器学习任务,而Stata则适合进行简单的数据清洗和统计分析任务。但是,在实际应用中,两者也可以结合使用,根据具体需求选择不同的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值