【问题标题】:DataFrame append generates TypeErrorDataFrame append 生成 TypeError
【发布时间】:2019-03-26 00:24:36
【问题描述】:

我正在尝试编写一个函数来向/从 .h5 文件写入和读取事务详细信息。我想有效地使用一个文件来存储一些交易细节,并在必要时导出细节。这是我的代码:

import h5py
import numpy as np
import pandas as pd

from datetime import datetime
from os import listdir
from pandas import HDFStore


def maintainLedger(mode, tick, lastBuyy = 0, lastSell = 0, quan = 0, prof = 0):
    """THIS FUNCTION WRITES AND READS TRANSACTION DETAILS.
       mode = 0 - IF FILE EXITS, READ FILE
       mode = 1 - IF FILE EXITS, APPEND TO FILE"""

    # CHECK IF LEDGER FILE EXISTS, IF NOT CREATE A LEDGER FILE FOR THE FIRST TIME
    path = r'ledger'
    suff = r'h5'
    flie = listdir(path)
    flie = [item for item in flie if item.endswith(suff)]

    if len(flie) == 0:
        HDF5Data = HDFStore('ledger/ledger.h5')

        # GENERATE NEW VALUES OF DATE/TIME
        mi = int(datetime.now().minute)
        ho = int(datetime.now().hour)
        da = int(datetime.now().day)
        we = int(datetime.now().isocalendar()[1])
        mo = int(datetime.now().month)
        ye = int(datetime.now().year)

        newwData = np.array([mode, mi, ho, da, we, mo, ye, tick, lastBuyy, lastSell, quan, prof]).reshape(1, 12)
        newwData = pd.DataFrame(newwData, columns = ['mode', 'mi', 'ho', 'da', 'we', 'mo', 'ye', 'tick', 'laBu', 'laSe', 'quan', 'prof'])
        HDF5Data.put('data', newwData, format = 'table', data_columns = True)
        HDF5Data.close()

    elif len(flie) == 1:
        if mode == 0:
            # READ PREVIOUSLY SAVED DATA AS PANDAS DATAFRAME
            readData = pd.read_hdf('ledger/ledger.h5', mode = 'r')

            # DO SOMETHING...

        elif mode == 1:
            # GENERATE NEW VALUES OF DATE/TIME
            mi = int(datetime.now().minute)
            ho = int(datetime.now().hour)
            da = int(datetime.now().day)
            we = int(datetime.now().isocalendar()[1])
            mo = int(datetime.now().month)
            ye = int(datetime.now().year)

            # GATHER NEW DATA INTO NUMPY ARRAY AND CONVERT TO PANDAS DATAFRAME
            newwData = np.array([mode, mi, ho, da, we, mo, ye, tick, lastBuyy, lastSell, quan, prof]).reshape(1, 12)
            newwData = pd.DataFrame(newwData, columns = ['mode', 'mi', 'ho', 'da', 'we', 'mo', 'ye', 'tick', 'laBu', 'laSe', 'quan', 'prof'])

            # READ PREVIOUSLY SAVED DATA AS PANDAS DATAFRAME AND APPEND NEW DATA
            readData = pd.read_hdf('ledger/ledger.h5', mode = 'a')
            readData.append('data', newwData)

            tempData = pd.read_hdf('ledger/ledger.h5', mode = 'r')
            print(tempData)

        else:
            print('Please check input data for errors!')



if __name__ == '__main__':
    maintainLedger(1, "AAPL")

当我运行代码时,我收到以下错误:

TypeError: cannot concatenate object of type "<class 'str'>"; only pd.Series, pd.DataFrame, and pd.Panel (deprecated) objs are valid

我曾尝试寻找解决方案,但通过快速搜索,我找到了this,但并没有解决我的问题。有什么我做错了吗?任何建议将不胜感激。

【问题讨论】:

  • 当您询问错误时,请说明错误发生的位置!有些读者是魔术师,可以猜出在哪里,但我们大多数人都需要一些帮助。
  • 我没有看到concatenate 调用,但看到了看起来可能会使用它的readData.append。查看它的文档,我看到:DataFrame.append(other, ...,其中other 应该是一个数据框或系列。你给了一个字符串,'data',而不是。
  • 如果我的猜测是正确的,那么您的主题行是错误的。引发错误的不是HDFStore append,而是Dataframe append
  • @hpaulj 我认为这是我附加数据的方式是问题所在。我已经找到了问题的解决方案。请参阅下面的更新代码。
  • @hpaulj 您对引发错误的 DataFrame 附加步骤是正确的。

标签: python-3.x pandas dataframe h5py hdfstore


【解决方案1】:
import h5py
import numpy as np
import pandas as pd

from datetime import datetime
from os import listdir
from pandas import HDFStore


def maintainLedger(mode, tick = 'QUERY', lastBuyy = 0, lastSell = 0, quan = 0, prof = 0):
    """THIS FUNCTION WRITES AND READS TRANSACTION DETAILS.
       mode = 0 - IF FILE EXITS, READ FILE
       mode = 1 - IF FILE EXITS, APPEND TO FILE"""

    # CHECK IF LEDGER FILE EXISTS, IF NOT CREATE A LEDGER FILE FOR THE FIRST TIME
    path = r'ledger'
    suff = r'h5'
    flie = listdir(path)
    flie = [item for item in flie if item.endswith(suff)]

    if len(flie) == 0:
        # GENERATE NEW VALUES OF DATE/TIME
        mi = int(datetime.now().minute)
        ho = int(datetime.now().hour)
        da = int(datetime.now().day)
        we = int(datetime.now().isocalendar()[1])
        mo = int(datetime.now().month)
        ye = int(datetime.now().year)

        # GATHER NEW DATA INTO NUMPY ARRAY AND CONVERT TO PANDAS DATAFRAME
        newwData = np.array([mode, mi, ho, da, we, mo, ye, tick, lastBuyy, lastSell, quan, prof]).reshape(1, 12)
        newwData = pd.DataFrame(newwData, columns = ['mode', 'mi', 'ho', 'da', 'we', 'mo', 'ye', 'tick', 'laBu', 'laSe', 'quan', 'prof'])

        # SAVE ALL DATA INTO .H5 FORMAT
        HDF5Data = HDFStore('ledger/ledger.h5')
        HDF5Data.put('data', newwData, format = 'table', data_columns = True)
        HDF5Data.close()

    elif len(flie) == 1:
        if mode == 0:
            """THIS OPTION ENABLES CODE TO READ DATA."""

            # READ PREVIOUSLY SAVED DATA AS PANDAS DATAFRAME
            readData = pd.read_hdf('ledger/ledger.h5', mode = 'r')

            # DO SOMETHING...
            print(readData)

        elif mode == 1:
            """THIS OPTION ENABLES CODE TO APPEND DATA."""

            # GENERATE NEW VALUES OF DATE/TIME
            mi = int(datetime.now().minute)
            ho = int(datetime.now().hour)
            da = int(datetime.now().day)
            we = int(datetime.now().isocalendar()[1])
            mo = int(datetime.now().month)
            ye = int(datetime.now().year)

            # GATHER NEW DATA INTO NUMPY ARRAY AND CONVERT TO PANDAS DATAFRAME
            newwData = np.array([mode, mi, ho, da, we, mo, ye, tick, lastBuyy, lastSell, quan, prof]).reshape(1, 12)
            newwData = pd.DataFrame(newwData, columns = ['mode', 'mi', 'ho', 'da', 'we', 'mo', 'ye', 'tick', 'laBu', 'laSe', 'quan', 'prof'])

            # READ PREVIOUSLY SAVED DATA AS PANDAS DATAFRAME AND APPEND NEW DATA
            readData = pd.read_hdf('ledger/ledger.h5', mode = 'r')
            readData = readData.append(newwData)

            # SAVE ALL DATA INTO .H5 FORMAT
            HDF5Data = HDFStore('ledger/ledger.h5')
            HDF5Data.put('data', readData, format = 'table', data_columns = True)
            HDF5Data.close()

        else:
            print('Please check input data for errors!')



if __name__ == '__main__':
    maintainLedger(1, 'MSFT')

【讨论】:

    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 2020-08-21
    • 2019-02-05
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多