Как просто установить датафрейм, чтобы он содержал результат? - PullRequest
0 голосов
/ 16 января 2020

query и get_fundamentals - это некоторые приложения api, не имеет значения, чтобы указать, какой api.
Ниже приведен мой фрагмент для использования фрейма данных.

code = "some"
caldate = [datetime.date(2003, 12, 31),datetime.date(2004, 12, 31),
           datetime.date(2005, 12, 31), datetime.date(2006, 12, 31)]
for curdate in caldate:
    q = query(valuation.market_cap).filter(valuation.code == code)
    y = get_fundamentals(q,date=curdate)
    print(y)

Вывод такой, как показано ниже:

Empty DataFrame
Columns: [market_cap]
Index: []
Empty DataFrame
Columns: [market_cap]
Index: []
   market_cap
0    215.2808
   market_cap
0    828.9395

Я ожидаю создать фрейм данных, содержащий все выходные данные.

container
   market_cap
0         NaN
1         NaN
2    215.2808
3    828.9395

type(container)
<class 'pandas.core.frame.DataFrame'>

У меня есть попытка (ошибка) с concat:

result = pd.DataFrame(columns=['market_cap'])
for curdate in caldate:
    q = query(valuation.market_cap).filter(valuation.code == code)
    y = get_fundamentals(q,date=curdate)
    pd.concat([result,y],axis = 0)

Вывод:

Empty DataFrame
Columns: [market_cap, market_cap]
Index: []
Empty DataFrame
Columns: [market_cap, market_cap]
Index: []
   market_cap  market_cap
0         NaN    215.2808
   market_cap  market_cap
0         NaN    828.9395
>>> result
Empty DataFrame
Columns: [market_cap]
Index: []

Еще одна попытка (ошибка):

result = pd.DataFrame(columns=['market_cap'])
for curdate in caldate:
    q = query(valuation.market_cap).filter(valuation.code == code)
    y = get_fundamentals(q,date=curdate)
    result = result.append(y)

Распечатайте результат, чтобы увидеть, что я получаю:

result
   market_cap
0    215.2808
0    828.9395

желаемый результат:

   market_cap
0         NaN
1         NaN
2    215.2808
3    828.9395

Первые два пустых были потеряны.

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

result = []
for curdate in caldate:
    q = query(valuation.market_cap).filter(valuation.code == code)
    y = get_fundamentals(q,date=curdate)['market_cap']
    if y.empty:
        result.append(numpy.nan)
    else:
        result.append(y[0])

container = pd.DataFrame()
container['market_cap'] = result 

Возможно, есть более простой и более pythoni c способ достичь моих ожиданий.

@ YOLO, распечатать (результат) в соответствии с вашим кодом.

result
                                        market_cap
0  Empty DataFrame
Columns: [market_cap]
Index: []
1  Empty DataFrame
Columns: [market_cap]
Index: []
2                         market_cap
0    215.2808
3                         market_cap
0    828.9395

Показать каждый элемент в результате.

>>> result["market_cap"][0]
Empty DataFrame
Columns: [market_cap]
Index: []
>>> result["market_cap"][1]
Empty DataFrame
Columns: [market_cap]
Index: []
>>> result["market_cap"][2]
   market_cap
0    215.2808
>>> result["market_cap"][3]
   market_cap
0    828.9395

Мои ожидания:

>>> result["market_cap"][0]
nan
>>> result["market_cap"][1]
nan
>>> result["market_cap"][2]
215.2808
>>> result["market_cap"][3]
828.9395

1 Ответ

0 голосов
/ 16 января 2020

Вы рядом. Должно сработать что-то похожее на ваш последний шаг:

result = [] 
for curdate in caldate:
    q = query(valuation.market_cap).filter(valuation.code == code)
    y = get_fundamentals(q,date=curdate) # assuming this returns a NaN or some numeric
    result.append(y)

result = pd.DataFrame(result, columns=['market_cap'])
...