Есть ли более простой способ создать df из этой информации? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть информация, которая хранится в нескольких слоях * Формат 1007 *, который я хочу преобразовать в pandas фрейм данных, до сих пор я делал это таким образом, и я уверен, что есть гораздо более читаемое решение

На данный момент я просто создаю пустые списки и заполняю их, добавляя каждый требуемый элемент

переменные вызовов и помещений являются фреймами данных, а selected_expiration фильтрует эти фреймы данных:

    contract_symbols = []
    strikes = []
    option_types = []
    days_to_expiration = []
    bids = []
    asks = []
    deltas = []
    thetas = []
    vegas = []
    gammas = []
    is_itm = []
    open_interests = []
    theo_values = []
    time_values = []
    volumes = []
    volatilities = []
    descriptions = []

    for strike in calls[selected_expiration]:
        contract_symbols.append(
            calls[selected_expiration][strike][0]['symbol'])
        strikes.append(calls[selected_expiration][strike][0]['strikePrice'])
        option_types.append(calls[selected_expiration][strike][0]['putCall'])
        days_to_expiration.append(
            calls[selected_expiration][strike][0]['daysToExpiration'])
        bids.append(calls[selected_expiration][strike][0]['bid'])
        asks.append(calls[selected_expiration][strike][0]['ask'])
        deltas.append(calls[selected_expiration][strike][0]['delta'])
        thetas.append(calls[selected_expiration][strike][0]['theta'])
        vegas.append(calls[selected_expiration][strike][0]['vega'])
        gammas.append(calls[selected_expiration][strike][0]['gamma'])
        is_itm.append(calls[selected_expiration][strike][0]['inTheMoney'])
        open_interests.append(
            calls[selected_expiration][strike][0]['openInterest'])
        theo_values.append(
            calls[selected_expiration][strike][0]['theoreticalOptionValue'])
        time_values.append(calls[selected_expiration][strike][0]['timeValue'])
        volumes.append(calls[selected_expiration][strike][0]['totalVolume'])
        volatilities.append(
            calls[selected_expiration][strike][0]['volatility'])
        descriptions.append(
            calls[selected_expiration][strike][0]['description'])

    for strike in puts[selected_expiration]:
        contract_symbols.append(puts[selected_expiration][strike][0]['symbol'])
        strikes.append(puts[selected_expiration][strike][0]['strikePrice'])
        option_types.append(puts[selected_expiration][strike][0]['putCall'])
        days_to_expiration.append(
            puts[selected_expiration][strike][0]['daysToExpiration'])
        bids.append(puts[selected_expiration][strike][0]['bid'])
        asks.append(puts[selected_expiration][strike][0]['ask'])
        deltas.append(puts[selected_expiration][strike][0]['delta'])
        thetas.append(puts[selected_expiration][strike][0]['theta'])
        vegas.append(puts[selected_expiration][strike][0]['vega'])
        gammas.append(puts[selected_expiration][strike][0]['gamma'])
        is_itm.append(puts[selected_expiration][strike][0]['inTheMoney'])
        open_interests.append(
            puts[selected_expiration][strike][0]['openInterest'])
        theo_values.append(
            puts[selected_expiration][strike][0]['theoreticalOptionValue'])
        time_values.append(puts[selected_expiration][strike][0]['timeValue'])
        volumes.append(puts[selected_expiration][strike][0]['totalVolume'])
        volatilities.append(puts[selected_expiration][strike][0]['volatility'])
        descriptions.append(
            puts[selected_expiration][strike][0]['description'])

    data = {
        'symbol': contract_symbols,
        'strikePrice': strikes,
        'putCall': option_types,
        'daysToExpiration': days_to_expiration,
        'bid': bids,
        'ask': asks,
        'delta': deltas,
        'theta': thetas,
        'vega': vegas,
        'gamma': gammas,
        'inTheMoney': is_itm,
        'openInterest': open_interests,
        'theo_valuesreticalOptionValue': theo_values,
        'timeValue': time_values,
        'totalVolume': volumes,
        'volatility': volatilities,
        'description': descriptions,
    }

    chain = pd.DataFrame(data)

1 Ответ

0 голосов
/ 07 августа 2020

Я загрузил файл JSON для звонков с GitHub и выполнил небольшой анализ.

import pandas as pd
import requests

filename = 'https://raw.githubusercontent.com/Quaniful/Pub/master/C.json'

field_types = {
    'symbol'                 : 'string',
    'strikePrice'            : 'float',
    'putCall'                : 'string',
    'daysToExpiration'       : 'int',
    'bid'                    : 'float',
    'ask'                    : 'float',
    'delta'                  : 'float',
    'theta'                  : 'float',
    'vega'                   : 'float',
    'gamma'                  : 'float',
    'inTheMoney'             : 'boolean',
    'openInterest'           : 'int',
    'theoreticalOptionValue' : 'float',
    'timeValue'              : 'float',
    'totalVolume'            : 'int',
    'volatility'             : 'float',
    'description'            : 'string',
}

Теперь настройка завершена. Получим данные:

r = requests.get(filename)

ts = list()

# convert JSON response to list of tuples
ts = list()
for strike, ds in r.json().items():
    for d in ds:
        for key, value in d.items():
            t = (float(strike), key, value)
            ts.append(t)

# convert the list-of-tuples to a data frame; rename, and re-shape
calls = (pd.DataFrame(ts, columns=['strike', 'field', 'value'])
         .set_index(['strike', 'field'])
         .sort_index()
         .squeeze()
         .unstack(level='field')
         .reset_index(drop=True)
         .filter(field_types.keys())
         .astype(field_types, errors='raise')
        )

Теперь посмотрим на первую строку (транспонированную, чтобы поместиться на экране):

print(calls.iloc[0])

field
symbol                                      AAPL_080720C455
strikePrice                                             455
putCall                                                CALL
daysToExpiration                                          1
bid                                                    1.91
ask                                                    1.93
delta                                                  0.32
theta                                                -0.832
vega                                                  0.119
gamma                                                 0.038
inTheMoney                                            False
openInterest                                           7959
theoreticalOptionValue                                 1.92
timeValue                                              1.93
totalVolume                                           48222
volatility                                           28.018
description               AAPL Aug 7 2020 455 Call (Weekly)
Name: 0, dtype: object

Я не смог определить набор параметров в pd.read_json()

...