Как сделать pandas dataframe постоянным и использовать его вне функции?

#python #pandas

#python #pandas

Вопрос:

Я вызываю API для coinmarketcap.com и преобразовать объект JSON, который возвращается в фрейм данных pandas. Мне было интересно, есть ли какой-либо способ сохранить столбцы фрейма данных как постоянные и использовать его вне функции?

 def get_cmc_supply():
    url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest'
    parameters = {
      'start': '13',
      'limit': '13',
      'convert': 'USD',
    }
    header = {
      'Accepts': 'application/json',
      'X-CMC_PRO_API_KEY': '###################',
    }

    data = requests.get(url, headers = header,timeout=10).json()

    records = []

    for item in data["data"]:
        records.append(
            {
                "name": item['symbol'],
                "supply": item['circulating_supply'],
            }
        )

    df = pd.DataFrame.from_records(records)
    df = df.rename(columns={"name":"symbol"})
    df = df.set_index('symbol')
    return df

get_cmc_supply()
  

Как я могу сохранить его df , чтобы я мог получить к нему доступ вне функции, не вызывая снова функцию get_cmc_supply() и не получая новые исходные данные из вызова API?

Комментарии:

1. Что значит хранить его как «постоянный»? Вы можете записать его в файл с помощью to_csv() , если это то, что вы спрашиваете

2. Под ‘constant’ я подразумеваю регистрацию значений, которые были возвращены из вызова API. Есть ли какой-либо способ без записи его в файл .csv?

3. Как только это фрейм данных, вы можете ссылаться на любой столбец. Если существует фрейм данных с именем df, df[‘columnname’] вызовет значения в столбце с именем columnname.

4. Если вы выполните поиск по фразе «Python читает JSON в Pandas», вы найдете ресурсы, которые могут объяснить это намного лучше, чем мы можем в ответе здесь.

5. Я не смог найти ничего, что могло бы решить эту проблему.

Ответ №1:

Если я понимаю, вы хотите сохранить DataFrame вне функции, чтобы вам не приходилось создавать его заново.

Установите фрейм данных вне функции.

 df = get_cmc_supply()
  

Теперь вы можете использовать его, когда захотите.

Если вы хотите сохранить его для дальнейшего использования после закрытия программы, вы можете использовать pickle.

Выберите фрейм данных (df) для использования в другой раз

 filename = "your_file_name.pickle"
with open(filename, "wb") as f:
    pickle.dump(df, f)
  

Используйте это для просмотра файла «your_file_name.pickle». Откройте существующие необработанные данные из файла pickle.

 filename = "your_file_name.pickle"
infile = open(filename, "rb")
df = pickle.load(infile)
infile.close()
  

Если вы действительно хотите сделать фрейм данных неизменяемым, ознакомьтесь с static frame.

Комментарии:

1. Спасибо вам за ваше решение. Есть ли какой-нибудь способ сделать это (статичным) без использования pickle или статического фрейма?

2. Скажите мне, что вы подразумеваете под «статическим»?

3. Я просто читаю ваши комментарии выше, и я не уверен, чего вы пытаетесь достичь. Не могли бы вы уточнить, что вы пытаетесь сделать? ‘constant’ и ‘static’ могут интерпретироваться по-разному. Спасибо!

4. Допустим, например, вышеупомянутая функция возвращает следующий фрейм данных: символ поставки BTC 1.766170e 07 ETH 1.057840e 08 XRP 4.200497e 10 BCH 1.774465e 07 EOS 9.428902e 08 LTC 6.147143e 07 BNB 1.411755e 08 USDT 2.676666e 09 XLM 1.936421e 10 ADA 2.592707e 10 Как я могу сохранить эти значения? Потому что, если я захочу получить доступ к этому фрейму данных вне функции, я бы выполнил df = get_cmc_supply() , который снова запустит функцию и выполнит другой вызов API, и будет возвращен новый объект json с новыми данными. Спасибо

5. Как только вы запустите функцию, вызвав df = get_cmc_supply(), функция вернет фрейм данных, а используемый вами df будет фреймом данных. Попробуйте ввести df.head() под вызовом функции. или print(df.head()) Вы должны увидеть результаты вызова функции.