Pandas Dataframes 的 Python 字典 - 迭代和调用

Posted

技术标签:

【中文标题】Pandas Dataframes 的 Python 字典 - 迭代和调用【英文标题】:Python Dictionary of Pandas Dataframes - Iterating and Calling 【发布时间】:2019-08-20 05:25:59 【问题描述】:

我正在尝试编写一个程序,用户输入多个股票代码,这些代码将(最终)绘制成图表。

import pandas as pd
import pandas_datareader.data as web
from datetime import datetime, timedelta

tickers = ['QQQ', 'SQQQ', 'RYCVX', 'RYCWX']
days = (datetime.now() - timedelta(5)).strftime('%Y-%m-%d')
data = 

for t in tickers:
    data[t] = web.DataReader (t, 'yahoo', days, end = None)

结果:

'QQQ':                   High         Low  ...    Volume   Adj Close
Date                                ...                      
2019-08-14  185.949997  182.419998  ...  51000500  182.759995
2019-08-15  183.589996  181.160004  ...  36685000  182.550003
2019-08-16  185.949997  184.100006  ...  32781400  185.479996
2019-08-19  188.830002  187.500000  ...  22494100  188.429993

[4 rows x 6 columns], 
'SQQQ':                  High        Low       Open      Close    Volume  Adj Close
Date                                                                       
2019-08-14  36.900002  35.000000  35.320000  36.730000  32427000  36.730000
2019-08-15  37.689999  36.230000  36.520000  36.849998  19184200  36.849998
2019-08-16  35.939999  34.830002  35.939999  35.110001  14002600  35.110001
2019-08-19  33.970001  33.220001  33.590000  33.529999  11745300  33.529999, 
'RYCVX':                  High        Low       Open      Close  Volume  Adj Close
Date                                                                     
2019-08-14  89.489998  89.489998  89.489998  89.489998       0  89.489998
2019-08-15  90.290001  90.290001  90.290001  90.290001       0  90.290001
2019-08-16  92.489998  92.489998  92.489998  92.489998       0  92.489998
2019-08-19  94.290001  94.290001  94.290001  94.290001       0  94.290001, 
'RYCWX':             High   Low  Open  Close  Volume  Adj Close
Date                                                  
2019-08-14  9.92  9.92  9.92   9.92       0       9.92
2019-08-15  9.83  9.83  9.83   9.83       0       9.83
2019-08-16  9.59  9.59  9.59   9.59       0       9.59
2019-08-19  9.40  9.40  9.40   9.40       0       9.40

这将创建一个字典,其中股票代码是键,股票数据是值。我最初的想法是删除键:值对并分配给一个变量,但我刚刚了解到我最初的想法是不好的做法。我现在需要知道如何做的是:

    我需要能够从特定键调用列值,例如键 QQQ 的“高”列。如果将列分配给变量,我通常会如何调用它:
QQQ["High"]
    我需要一个循环来为每个数据帧迭代一个新列。如果将 df 分配给变量以创建新列,我会怎么做:
QQQ['15MA'] = QQQ['Close'].rolling(15).mean()

如何使调用和迭代适应字典?

【问题讨论】:

pop() 方法从字典中移除指定项并返回移除的值 是的,这就是重点。我想要一个函数来按键从字典中删除数据并将其分配给变量 动态创建变量不是最佳实践。为什么要创建变量,为什么不能使用字典键作为参考?为什么不能使用 get() 方法来获取 key 的值,而不是使用 pop 删除项目? 【参考方案1】:

首先使用函数外循环填充字典:

for t in tickers:
    data[t] = web.DataReader (t, 'yahoo', days, end = None)

datapop(t)

我认为您需要更改datapop 以通过[] 中的键进行选择:

def datapop(ticker):
    return data[ticker]

或者通过函数get,这更通用,因为如果没有找到key,可能会设置默认值:

def datapop(ticker):
    return data.get(ticker)

原因是pop 方法未选择,而是用于字典中的remove keys。

【讨论】:

for 循环自动将数据添加到字典中。不需要使用循环外的单独函数来填充字典。 “datapop”功能的重点是从字典中弹出数据并将 pandas df 分配给一个变量。请重新阅读我的原始帖子,如果您有任何问题或者我需要重新编写问题,请告诉我。 @dancassin - 但是为什么呢?分配给变量的原因是什么?因为不是recommended,所以这里最好用字典来存储DataFrames。 啊,谢谢你的链接。非常有帮助。也许我应该完全重写我的问题,因为这不仅是不好的做法,而且显然是重复的。 @dancassin - 是的,这取决于你,但我认为 DataFrames 的字典或带有df_big = pd.concat(df) 的大 DataFrame 在这里更好。 原问题已修改

以上是关于Pandas Dataframes 的 Python 字典 - 迭代和调用的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:在具有不同名称的字段上加入 DataFrames?

Python中DataFrames的DataFrame(Pandas)

python Pandas - 过滤DataFrames和Series

python 创建Pandas DataFrames

为啥我的 pandas DataFrame 列也是 Dataframes,而不是 Series?

[Python] Pandas load DataFrames