【问题标题】:Pandas: import multiple dataframes, change headers and append them in loopPandas:导入多个数据帧,更改标题并将它们附加到循环中
【发布时间】:2021-07-27 15:04:17
【问题描述】:

我正在使用名为 ccxt 的库分析加密数据。 使用 ccxt,我可以轻松地将用于加密数据的烛台输入数据帧:

import pandas as pd
import numpy
import config
import ccxt
import json
import csv

exchange = ccxt.binance({
    'enableRateLimit': True, 
    'options': {'defaultType': 'future'}
})

 
name = exchange.fetch_ohlcv('BTC/USDT', limit=5, timeframe='1m')
btc = pd.DataFrame(name, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
 
print(btc)


单一加密输出:

       timestamp      open      high       low     close   volume
0  1620202740000  54945.31  54987.01  54945.30  54978.49  118.239
1  1620202800000  54978.49  55054.00  54972.04  55027.12  337.619
2  1620202860000  55027.12  55041.05  54950.05  54951.96  131.414
3  1620202920000  54951.96  55067.36  54951.95  55063.78  176.529
4  1620202980000  55063.79  55064.00  55000.00  55014.39  107.082

我想将多个密码导入具有两级标头的数据帧中,如下所示。

                      btc       btc        btc     btc     btc      eth        eth       eth      eth     eth                      
       timestamp     open      high       low     close   volume    open      high       low     close    volume  
0  1620202740000  54945.31  54987.01  54945.30  54978.49  118.239  54945.31  54987.01  54945.30  54978.49  4345
1  1620202800000  54978.49  55054.00  54972.04  55027.12  337.619  54945.31  54987.01  54945.30  54978.49  134.239   
2  1620202860000  55027.12  55041.05  54950.05  54951.96  131.414  54945.31  54987.01  54945.30  54978.49  14358.239
3  1620202920000  54951.96  55067.36  54951.95  55063.78  176.529  54945.31  54987.01  54945.30  54978.49  1148.239
4  1620202980000  55063.79  55064.00  55000.00  55014.39  107.082  54945.31  54987.01  54945.30  54978.49  18.239

这样我可以同时为多个加密创建列,例如

for x in ['btc', 'eth']:
    df.loc[:, (x, 'fast_ema_1min')] = df[x]['close'].rolling(window=1).mean()
    df.loc[:, (x, 'slow_ema_20min')] = df[x]['close'].rolling(window=20).mean()

我试过了

basket = [['BTC', 'BTC/USDT'], ['ETH', 'ETH/USDT'], ['ADA', 'ADA/USDT']]
appended_data = []
for i, name in basket:
    i = exchange.fetch_ohlcv(name, limit=5, timeframe='1m')
    i = pd.DataFrame(i, columns=[['_', name, name, name, name,name], ['timestamp', 'open', 'high', 'low', 'close', 'volume']])
    appended_data.append(i)
    print(appended_data)
print(appended_data.head(5)) 

但是,我得到了错误

AttributeError: 'list' object has no attribute 'head'

有人可以建议吗?谢谢。

【问题讨论】:

    标签: python pandas dataframe loops append


    【解决方案1】:

    您可以尝试保留聚合数据帧列表的代码,然后在循环后将它们连接起来,如下所示:

    pd.concat(appended_data, axis=1, ignore_index=True)
    

    【讨论】:

    • 谢谢@seabean我按照你的方法,我得到了这个错误```用户警告:不同级别之间的合并可能会产生意想不到的结果(左侧1级,右侧2级)warnings.warn (msg, UserWarning) 空 DataFrame 列:[] 索引:[] ```
    • @FlyUFalcon 通常,我们将从循环外的空数据帧开始,然后附加到数据帧。在您想要连接列的情况下,您可能需要使用一个列表来保存多个数据帧,然后在循环外连接列表。
    • @FlyUFalcon 见我上面的编辑。在循环之后连接数据帧列表。
    • @FlyUFalcon 无论如何,由于每个部分的时间戳可能与其他部分的时间戳不同,因此加入/连接它们会更加复杂。您可能需要将它们与相同的时间戳合并。
    【解决方案2】:

    感谢@SeaBean

    我设法解决了这个问题。

    appended_data = []
     
    basket = [['BTC', 'BTC/USDT'], ['ETH', 'ETH/USDT'], ['ADA', 'ADA/USDT']]
    for i, name in basket:
        i = exchange.fetch_ohlcv(name, limit=5, timeframe='1m')
        i = pd.DataFrame(i, columns=[['_', name, name, name, name,name], ['timestamp', 'open', 'high', 'low', 'close', 'volume']])
        appended_data.append(i)
        df = pd.concat(appended_data, axis=1, ignore_index=True)
    

    【讨论】:

    • 您可以将最后一行df = pd.concat(...) 放在循环之外,因为您只需要将数据帧的聚合列表连接一次,这可以在循环之后完成。
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2023-03-03
    • 2016-10-13
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多