1

我有一个 Python 函数historical_data,它从 Yahoo Finance 提取每日历史价格和股息数据并将其输出到 pandasDataFrame中。

>>> nlsn = y.historical_data('NLSN')
>>> nlsn
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 366 entries, 2012-07-10 00:00:00 to 2011-01-27 00:00:00
Data columns:
Open         366  non-null values
High         366  non-null values
Low          366  non-null values
Close        366  non-null values
Volume       366  non-null values
Adj Close    366  non-null values
Dividends    366  non-null values
dtypes: float64(6), int64(1)
>>> nlsn['Adj Close']
Date
2012-07-10    26.77
2012-07-09    26.77
2012-07-06    26.64
2012-07-05    26.56
2012-07-03    26.57
...
2011-02-01    25.75
2011-01-31    26.07
2011-01-28    25.00
2011-01-27    25.40
Name: Adj Close, Length: 366

我只想持久地存储每日数据(而不是每天、每月、每周等)。但是,以下每日到每月的转换似乎不起作用:

>>> nlsn['Adj Close'].asfreq('M', method='bfill')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/michael/Projects/envs/fintools32/lib/python3.2/site-packages/pandas/core/generic.py", line 156, in asfreq
    return asfreq(self, freq, method=method, how=how)
  File "/home/michael/Projects/envs/fintools32/lib/python3.2/site-packages/pandas/tseries/resample.py", line 329, in asfreq
    return obj.reindex(dti, method=method)
  File "/home/michael/Projects/envs/fintools32/lib/python3.2/site-packages/pandas/core/series.py", line 2053, in reindex
    level=level, limit=limit)
  File "/home/michael/Projects/envs/fintools32/lib/python3.2/site-packages/pandas/core/index.py", line 791, in reindex
    limit=limit)
  File "/home/michael/Projects/envs/fintools32/lib/python3.2/site-packages/pandas/core/index.py", line 719, in get_indexer
    assert(self.is_monotonic)
AssertionError

我将这些股票价格汇总到每月的正确方法是什么?

我试过的

我尝试了所有不同的method参数(ffill、pad、bfill),所有这些似乎都会引发相同的断言错误。

我尝试检查源代码index.py,但似乎有一个有效的策略模式,有问​​题的类委托is_monotonic给它的_engine属性,我找不到_engine实际分配属性的位置。

4

1 回答 1

2

尝试nlsn['Adj Close'][::-1].asfreq('M', method='ffill')

如果你可以让你的函数返回升序 DatetimeIndex ,那么你就可以跳过这里的额外排序。

于 2012-07-11T14:21:44.670 回答