【问题标题】:Python Pandas - How to iterate every N rows until end of dataframePython Pandas - 如何迭代每 N 行直到数据帧结束
【发布时间】:2021-12-19 03:29:22
【问题描述】:

如何在 Pandas 数据框中一次迭代 100 行?一次应用 lambda 函数时,forex_python 包似乎出错了。

这是我尝试过但似乎不起作用的方法:

import pandas as pd
from forex_python.converter import CurrencyRates
c = CurrencyRates()
row_processed = 0

for row in df.iterrows():
    try:
        df['USD_rate'] = df.apply(lambda x: c.get_rate(x['Currency'],'USD', x['Date']), axis = 1)
        row_processed += 1
        if row_processed == 100:
            row_processed = 0
            time.sleep(5)
    except:
        continue 

【问题讨论】:

  • 迭代数据框是您最不想做的事情。也许提供一个你所拥有的和预期输出的样本,看看论坛是否可以提出替代方案
  • 是下载配额限制了你吗?例如,无论在后台使用什么服务来检索数据,都对请求量不满意?在这种情况下不需要速度(因此需要睡眠呼叫)
  • @Riley 是的 - 请求的数量似乎导致它出错。是的 - 这就是睡眠呼叫存在的原因。

标签: python python-3.x pandas dataframe


【解决方案1】:

更新:

在列表中获取您的货币基础和日期。

currencies = ['USD', 'GBP']
dates = pd.date_range(start='2021-06-01', periods=2)

# collect the dataframes
df_hold = []

for currency in currencies:
    for d in dates:
        try:
            url = 'https://theforexapi.com/api/{}/?base={}'.format(d, currency)
            r = requests.get(url).json()
            df_hold.append(pd.DataFrame(r))
        except:
            continue

# concat dataframe
pd.concat(df_hold)

           date base  rates
AUD  2021-06-01  USD  1.292
BGN  2021-06-01  USD  1.600
BRL  2021-06-01  USD  5.202
CAD  2021-06-01  USD  1.203
CHF  2021-06-01  USD  0.899
..          ...  ...    ...
SGD  2021-06-02  GBP  1.873
THB  2021-06-02  GBP 44.074
TRY  2021-06-02  GBP 12.150
USD  2021-06-02  GBP  1.415
ZAR  2021-06-02  GBP 19.422

[124 rows x 3 columns]

【讨论】:

  • 这段代码返回了什么?字典词典?我正在尝试弄清楚如何将代码的输出放入数据框中。
  • 更新了我的答案。让我知道它是否有效。如果需要,您可以在遍历货币和日期时添加睡眠步骤。
  • 谢谢乔纳森。我还研究并发现使用 df = pd.json_normalize(r) 可以轻松地将 json 转换为 pandas 数据帧
【解决方案2】:

如果我理解正确,您想一次操作100 行,然后休眠5 秒并再次继续。以下是你可以做到的:

from forex_python.converter import CurrencyRates
c = CurrencyRates()
for g_name, df_group in df.groupby(df.index//100):
    try:
        condition = df.index.isin(df_group.index)
        df['USD_rate'] = np.where(condition, df_group.apply(lambda x: c.get_rate(x['Currency'], x['Date']), axis = 1), np.nan)
        time.sleep(5)
    except:
        continue

【讨论】:

  • 这在技术上是可行的,但是,您的代码仍然向我提供错误“货币汇率来源未就绪” - 这可能不是您的代码,而可能是 API 或包的问题。我什至将 time.sleep 提高到 10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2022-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
相关资源
最近更新 更多