Как вернуть несколько pandas фреймов данных с уникальными именами из для l oop? - PullRequest
2 голосов
/ 23 апреля 2020

Я пытаюсь использовать для l oop для создания нескольких фреймов данных. Я вижу желаемый результат, если я помещаю вывод print() внутрь для l oop. Однако, когда я изменяю это на return выход для доступа к кадрам данных извне функции, я могу получить только первый кадр данных. Я не понимаю, что происходит, и буду признателен за вашу помощь!

Код:

# Global libraries
from datetime import datetime
import pandas as pd

# Local libraries
from instruments import metadata    

# Get the data
def data():

    # Get list of instruments
    nifty = metadata()

    # Specify the date range for the data pull
    from_date = datetime.today().strftime('%Y-%m-%d 09:00:00')
    to_date = datetime.today().strftime('%Y-%m-%d 15:30:00')

    # Interval is the candle interval (minute, day, 5 minute etc.).
    interval = 'minute'

    # Iterate through the metadata
    for stock in nifty:

        # Set the instrument token for the data pull
        instrument_token = stock['instrument_token']

        # Call the api (I've removed login information for kite from this script) 
        hist =  kite.historical_data(instrument_token,
                                    from_date,
                                    to_date,
                                    interval,
                                    continuous=False,
                                    oi=False)


        # Put the data in a pandas dataframe as a timeseries
        data = pd.DataFrame(hist).set_index('date')


        # Format data
        data.columns = map(str.capitalize, data.columns)
        data['Expiry'] = stock['expiry']
        data = data[['Open','High','Low','Close','Volume','Expiry']]
        data.index.names = ['Datetime']

        # return data as a print statement - this works and I see the correct output
        print(data)

        # return data - this does not work as intended. If I call the function, I only get the first dataframe 
        return data

Пример данных для переменной nifty:

[{'tick_size': 0.05, 'expiry': datetime.date(2020, 4, 30), 'exchange_token': '56059', 'instrument_type': 'FUT', 'segment': 'NFO-FUT', 'strike': 0.0, 'last_pri
ce': 0.0, 'name': 'NIFTY', 'lot_size': 75, 'tradingsymbol': 'NIFTY20APRFUT', 'exchange': 'NFO', 'instrument_token': 14351106}, {'tick_size': 0.05, 'expiry': d
atetime.date(2020, 6, 25), 'exchange_token': '95734', 'instrument_type': 'FUT', 'segment': 'NFO-FUT', 'strike': 0.0, 'last_price': 0.0, 'name': 'NIFTY', 'lot_
size': 75, 'tradingsymbol': 'NIFTY20JUNFUT', 'exchange': 'NFO', 'instrument_token': 24507906}]

Пример данные в переменной hist:

[{'volume': 220650, 'low': 9158.45, 'close': 9173.7, 'date': datetime.datetime(2020, 4, 23, 9, 15, tzinfo=tzoffset(None, 19800)), 'high': 9200, 'open': 9200},
 {'volume': 92475, 'low': 9173, 'close': 9176.75, 'date': datetime.datetime(2020, 4, 23, 9, 16, tzinfo=tzoffset(None, 19800)), 'high': 9180, 'open': 9173}]

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

Заранее спасибо за помощь!

1 Ответ

2 голосов
/ 23 апреля 2020

Вот простой пример:

# sample data
df = pd.DataFrame(np.random.rand(10,3), columns=list('abc'))

def data(df):
    # empty dict
    d = {}
    # iterate
    for col in df.columns:
        # assign key and value
        d[col] = df[col]
    # return d
    return d
new_dict = data(df)
# call each individual dataframe from the dict based on the key you assigned
# print(new_dict['a'])
# print(new_dict['b']

# bonus dict comprehension
# new_dict1 = {k:v for k,v in df.items()}

Вот как это может выглядеть для вашей функции (не проверено):

def data():

    # Get list of instruments
    nifty = metadata()

    # Specify the date range for the data pull
    from_date = datetime.today().strftime('%Y-%m-%d 09:00:00')
    to_date = datetime.today().strftime('%Y-%m-%d 15:30:00')

    # Interval is the candle interval (minute, day, 5 minute etc.).
    interval = 'minute'

    d = {} # empty dict <----------------

    # Iterate through the metadata
    for stock in nifty:

        # Set the instrument token for the data pull
        instrument_token = stock['instrument_token']

        # Call the api (I've removed login information for kite from this script) 
        hist =  kite.historical_data(instrument_token,
                                    from_date,
                                    to_date,
                                    interval,
                                    continuous=False,
                                    oi=False)


        # Put the data in a pandas dataframe as a timeseries
        data = pd.DataFrame(hist).set_index('date')


        # Format data
        data.columns = map(str.capitalize, data.columns)
        data['Expiry'] = stock['expiry']
        data = data[['Open','High','Low','Close','Volume','Expiry']]
        data.index.names = ['Datetime']

        d[stock['tradingsymbol']] = data # assign key and vale to empty dict <--------------------

        # return data as a print statement - this works and I see the correct output
        print(data)

        # return data - this does not work as intended. If I call the function, I only get the first dataframe 
    return d # retrun outside of for loop <-----------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...