Как пересчитать AAII еженедельные данные в ежедневные? - PullRequest
0 голосов
/ 09 ноября 2018

Я хотел бы импортировать следующий файл, который содержит данные в недельном формате (только по четвергам) и преобразовать его в ежедневный файл со значениями с четверга, заполненными до следующей среды, пропуская субботу и воскресенье.

https://www.aaii.com/files/surveys/sentiment.xls

Я могу импортировать это:

df = pd.read_excel("C:\\Users\\Public\\Portfolio\\exports\\sentiment.xls", sheet_name = "SENTIMENT", skiprows=3, parse_dates=['Date'], date_format='%m-%d-%y')

Вот результат:

df.info()

Но это насколько я могу получить. Даже самая простая повторная выборка не удалась с

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'RangeIndex'

Я пробовал df['Date'] = pd.to_datetime(df['Date']) и другие методы, но без постепенного успеха.

Мысли о том, как это сделать?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Вы можете попробовать как ..

df = pd.read_excel("sentiment.xls", sheet_name = "SENTIMENT", skiprows=3, parse_dates=['Date'], date_format='%m-%d-%y')

ваш столбец Date содержит значения NaN, поэтому при попытке преобразовать его в datetime он не может это сделать ..

>>> df['Date']
0                       NaN
1       1987-06-26 00:00:00
2       1987-07-17 00:00:00
3       1987-07-24 00:00:00
4       1987-07-31 00:00:00

Итак, вам нужно конвертировать дату и время, которое вам нужно использовать coerce, чтобы получить его ..

>>> df['Date'] = pd.to_datetime(df['Date'], errors='coerce')

Теперь ваши даты обрабатываются ..

>>> df['Date']
0             NaT
1      1987-06-26
2      1987-07-17
3      1987-07-24
4      1987-07-31
5      1987-08-07
6      1987-08-14
7      1987-08-21

Теперь установите индекс в столбец «Дата», прежде чем вы сможете повторить выборку, как указано в комментариях:

>>> df.set_index('Date', inplace=True)
>>> df.head()
            Bullish  Neutral  Bearish  Total  Mov Avg  Spread   Average  +St. Dev.  - St. Dev.    High     Low   Close
Date
NaT             NaN      NaN      NaN    NaN      NaN     NaN       NaN        NaN         NaN     NaN     NaN     NaN
1987-06-26      NaN      NaN      NaN    NaN      NaN     NaN  0.382642   0.484295    0.280989     NaN     NaN     NaN
1987-07-17      NaN      NaN      NaN    NaN      NaN     NaN  0.382642   0.484295    0.280989  314.59  307.63  314.59
1987-07-24     0.36     0.50     0.14    1.0      NaN    0.22  0.382642   0.484295    0.280989  311.39  307.81  309.27
1987-07-31     0.26     0.48     0.26    1.0      NaN    0.00  0.382642   0.484295    0.280989  318.66  310.65  318.66
0 голосов
/ 10 ноября 2018

Я думаю, что это правильный ответ, конвертируется в дневной, убирает неторговые дни и субботу / воскресенье.

import pandas as pd
from pandas.tseries.offsets import BDay
# read csv, use SENTIMENT sheet, drop the first three rows, parse dates to datetime, index on date
df = pd.read_excel("C:\\Users\\Public\\Portfolio\\exports\\sentiment.xls", sheet_name = "SENTIMENT", skiprows=3, parse_dates=['Date'], date_format='%m-%d-%y', index_col ='Date')
df = df[3:].asfreq('D', method='ffill') # skip 3 lines then expand to daily and fill forward
df = df[df.index.map(BDay().onOffset)] # strip non-trading weekdays
df = df[df.index.dayofweek < 5] # strip Saturdays and Sundays
print(df.head(250))

Возможно, есть более элегантный метод, но он выполняет свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...