首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: JSON数据到Pandas,鸟巢列表理解

Python: JSON数据到Pandas,鸟巢列表理解
EN

Stack Overflow用户
提问于 2020-06-16 22:16:34
回答 1查看 108关注 0票数 0

我使用YahooFinancials来获取几家公司的股票价格和成交量。我可以提取价格和成交量来分离数据,但是我想把价格和数量都放到相同的数据中,而不必在事实发生后将它们合并。我相信我需要的是一个嵌套列表理解,但我不太确定如何实现这一点?

我的代码如下:

代码语言:javascript
复制
import pandas as pd
from pandas.io.json import json_normalize
import numpy as np
from yahoofinancials import YahooFinancials
import matplotlib.pyplot as plt
import seaborn as sns

from datetime import date, timedelta
import warnings

%matplotlib inline
%config InlineBackend.figure_format = 'retina'

plt.style.use('seaborn')

start = date(2007,1,1)
end = date(2020,6,4)
today = date.today()
tomorrow = str(end + timedelta(days=1))

portfolio = ['AMZN', 'GOOGL', 'MSFT']
yahoo_financials = YahooFinancials(portfolio)

data = yahoo_financials.get_historical_price_data(start_date=str(start), end_date=str(today), time_interval='daily')

prices = pd.DataFrame({a: {x['formatted_date']: x['adjclose'] for x in data[a]['prices']} for a in portfolio})

volume = pd.DataFrame({a: {x['formatted_date']: x['volume'] for x in data[a]['prices']} for a in portfolio})

理想情况下,输出如下所示:

代码语言:javascript
复制
date      AMZNPrice AMZNVolume GOOGLPrice GOOGLVolume MSFTPrice MSFTVolume
6/9/2020    2600.860107 5176000 1452.079956 1681200 189.800003  29783900
6/10/2020   2647.449951 4946000 1464.699951 1588100 196.839996  43872300
6/11/2020   2557.959961 5800100 1401.900024 2357200 186.270004  52854700
6/12/2020   2545.02002  5429600 1412.920044 1832900 187.740005  43345700
6/15/2020   2572.679932 3865100 1420.73999  1523400 188.940002  32712500
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-16 22:36:10

试试这个:

代码语言:javascript
复制
data = yahoo_financials.get_historical_price_data(start_date=str(start), end_date=str(today), time_interval='daily')

dfs = []
for s in portfolio:
    df = pd.json_normalize(data[s]['prices'])
    df['stock'] = s
    df = df[['stock', 'formatted_date', 'adjclose', 'volume']]
    dfs.append(df)

df = pd.concat(dfs)
df = pd.pivot(df, index='formatted_date', columns='stock', values=['adjclose', 'volume'])
df.columns = ['_'.join(col) for col in df.columns.values]
print(df)

输出:

代码语言:javascript
复制
                adjclose_AMZN  adjclose_GOOGL  adjclose_MSFT  volume_AMZN  volume_GOOGL  volume_MSFT
formatted_date
2007-01-03          38.700001      234.029022      22.123693   12405100.0    15397500.0   76935100.0
2007-01-04          38.900002      241.871872      22.086641    6318400.0    15759400.0   45774500.0
2007-01-05          38.369999      243.838837      21.960684    6619700.0    13730400.0   44607200.0
2007-01-08          37.500000      242.032028      22.175547    6783000.0     9499200.0   50220200.0
2007-01-09          37.779999      242.992996      22.197784    5703000.0    10752000.0   44636600.0
...                       ...             ...            ...          ...           ...          ...
2020-06-09        2600.860107     1452.079956     189.800003    5176000.0     1681200.0   29783900.0
2020-06-10        2647.449951     1464.699951     196.839996    4946000.0     1588100.0   43872300.0
2020-06-11        2557.959961     1401.900024     186.270004    5800100.0     2357200.0   52854700.0
2020-06-12        2545.020020     1412.920044     187.740005    5429600.0     1832900.0   43345700.0
2020-06-15        2572.679932     1420.739990     188.940002    3865100.0     1523400.0   32712500.0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62418443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档