【问题标题】:Python / Pandas TablesPython / Pandas 表
【发布时间】:2015-07-09 17:16:07
【问题描述】:

首先:感谢您迄今为止的大力帮助!我有一个关于在 iPython 中处理表格格式的问题。

我目前运行此脚本来打印增强的 Dickey-Fuller (ADF) 平稳性测试:

print "Stationarity"
print sm.tsa.stattools.adfuller(df['temperature'], maxlag=None, autolag='BIC', regression='c')

输出是这样的:

Stationarity
(-6.4532219513246361, 1.5054094590984612e-08, 0, 41, {'5%': -2.9351348158036012, '1%': -3.6009833671885199, '10%': -2.6059629803688282}, 1227.2605520289471*)

*(不确定这个值是什么Link to Documentation

现在,我的问题是:

  1. 如何自动计算多个变量?是否可以创建一个包含应用 ADF 测试的不同列(df['variable1']、df['variable1']、df['variable1']、df['variable1']、...)的列表每个项目?

  2. 如何将返回的数据放入表结构中?像这样:

ADF 测试

变量 nobs t 检验 p 值 1% 5% 10% 温度 41 6.4532 1.5054094590984612e-08 -3.600 -2.9351 -2.6059 变量 2 ... 变量 3 ...

(顺便问一下:如何将“1.5054094590984612e-08”转换成准确的数字?)

感谢您的支持!

【问题讨论】:

  • 您能否发布原始输入数据,至于您的第一个问题,我认为这应该可行,如果col_list 是您的变量列表,那么df[col_list].apply(sm.tsa.stattools.adfuller, maxlag=None, autolag='BIC', regression='c') 您可以将这些分配给新列,然后转置如果您希望将列作为索引值。
  • 酷 - 问题 #1 现在似乎已经解决了!我实现了脚本并且它有效。你能帮我解决第二个问题吗?
  • 您能否提供一些原始数据或指向您的数据的链接,我不知道这是什么输入
  • 作为输入,您基本上只需要一个值列表(时间序列)。我不能在这里透露数据,但可以想象它是 1 到 30 之间的 1000 多个值的列表。
  • 所以只是一个日期时间索引和随机值?

标签: python pandas dataframe


【解决方案1】:

所以我基本上敲了一些虚拟数据,基本上我为每个col构建一个dict来存储adf测试结果,然后为每个结果构建一个df:

In [12]:

df = pd.DataFrame(index = pd.date_range(start=dt.datetime(2014,1,1), end = dt.datetime(2014,6,1)))
import statsmodels.tsa.stattools as ts
df['a'] = np.random.randint(0,30,len(df.index))
df['b'] = np.random.randint(0,30,len(df.index))
​
result={}
for col in df:
    result[col] = ts.adfuller(df[col], maxlag=None, autolag='BIC', regression='c')
result
Out[12]:
{'a': (-14.5378299332063,
  5.2041541962613174e-27,
  0,
  151,
  {'1%': -3.4744158894942156,
   '10%': -2.5770812758212358,
   '5%': -2.8808783827710589},
  983.29106640612281),
 'b': (-12.247140023284922,
  9.7254933298555022e-23,
  0,
  151,
  {'1%': -3.4744158894942156,
   '10%': -2.5770812758212358,
   '5%': -2.8808783827710589},
  983.89321857804237)}
In [29]:

df_result = pd.DataFrame()
​
for k,v in result.items():
    df_result = df_result.append(pd.DataFrame(
            data={'nobs':v[3], 't-test':v[0], 'p-value':v[1], '1%':v[4]['1%'], '5%':v[4]['5%'], '10%':v[4]['10%']},
            index=[k]))
df_result.index.name = 'temperature'
df_result
Out[29]:
                   1%       10%        5%  nobs       p-value    t-test
temperature                                                            
a           -3.474416 -2.577081 -2.880878   151  5.204154e-27 -14.53783
b           -3.474416 -2.577081 -2.880878   151  9.725493e-23 -12.24714

【讨论】:

  • 它似乎可以工作,除了它将所有项目四舍五入。 “-3.474416”是“-3”,“-2.577081”是“-2”...
  • 这可能是一个显示问题,当您像上面的代码一样打印result 时会发生什么?
  • 这些值是正确的(小数点后 16 位)。我不知道为什么 df_results 表中的值是四舍五入的
  • 我认为这是一个显示问题,df['1%'] 显示什么或更好df['1%'].iloc[0] 显示?。
  • pd.options.display.float_format = '{:,.4f}'.format 解决了这个问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 2015-12-15
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多