我有一个循环,它运行n次,并在每次迭代中生成1个新的数据帧.如何在每次迭代结束时创建新的数据框时自动创建新的Google工作表(在同一工作簿中)?

我使用此代码将一个数据帧写入我手动创建的Google工作表:

#Code to write one dataframe to Google Sheets:

cell_range_insert= 'B7'
values = df1.to_json()
body = {'values': values}
response_date= service.spreadsheets().values().append(
    spreadsheetId=spreadsheet_id,
    valueInputOption='RAW',
    range=cell_range_insert,
    body=dict(
        majorDimension= 'ROWS',
        values=df1.T.reset_index().T.values.tolist()
    )
).execute()

#Code to generate one dataframe in each iteration:

Ticker_List= ["AAPL", "GOOG", "AMZN"]
for Ticker in Ticker_List:
    values = [['=GOOGLEFINANCE("' + str(Ticker) + '", "ALL",  "1/1/2014", "2/6/2018" ,"DAILY")']]
    cell_range_insert = 'B7'
    body = {'values': values}
    
    #Send formula to Google Sheet
    service.spreadsheets().values().update(
        spreadsheetId=spreadsheet_id,
        valueInputOption='USER_ENTERED',
        range=cell_range_insert,
        body=body
    ).execute()
    
    # Readback stock data from Google Sheets:
    response = service.spreadsheets().values().get(
        spreadsheetId=spreadsheet_id,
        majorDimension='ROWS',
        range='Sheet1'
    ).execute()

    # Readback data from Google Sheets and assign it to dataframe df:
    columns = response['values'][1]
    data = response['values'][2:]

    df = pd.DataFrame(data, columns=columns)
    

推荐答案

在您的情况下,下面的流程如何.

  1. 插入新的工作表,并使用batchUpdate方法将公式放入每个新工作表的单元格"B7".
  2. 使用值从每个新图纸检索值.batchGet方法.

当此流反映在脚本中时,它将变成如下所示.

修改的脚本:

spreadsheet_id = "###" # Please set your Spreadsheet ID.
requests = []
Ticker_List = ["AAPL", "GOOG", "AMZN"]
start_sheet_id = 123456
for i, Ticker in enumerate(Ticker_List):
    sheet_id = start_sheet_id + i
    formula = '=GOOGLEFINANCE("' + str(Ticker) + '", "ALL",  "1/1/2014", "2/6/2018" ,"DAILY")'
    requests.extend(
        [
            {"addSheet": {"properties": {"title": Ticker, "sheetId": sheet_id}}},
            {
                "updateCells": {
                    "start": {"sheetId": sheet_id, "rowIndex": 6, "columnIndex": 1},
                    "rows": [
                        {
                            "values": [
                                {"userEnteredValue": {"formulaValue": formula}}
                            ]
                        }
                    ],
                    "fields": "userEnteredValue",
                }
            },
        ]
    )

service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body={"requests": requests}).execute()

time.sleep(5) # This is required to be used.

res = service.spreadsheets().values().batchGet(spreadsheetId=spreadsheet_id, ranges=[f"'{e}'!B7:G" for e in Ticker_List]).execute()

# Put the values to dataframe.
for e in res["valueRanges"]:
    values = e["values"]
    columns = values[0]
    data = values[1:]
    df = pd.DataFrame(data, columns=columns)
    print(df)
  • 运行此脚本时,将插入3个新图纸作为"AAPL", "GOOG", "AMZN"的图纸名称.并将公式放入每个插入页的单元格"B7"中.这是使用batchUpdate方法运行的.
  • batchUpdate方法完成后,将等待5秒钟.在这种情况下,请根据您的实际情况进行调整.10秒可能合适.
  • 等待后,将从每个插入的图纸中检索值.并且,这些值被放入数据帧中.

注:

  • 在此脚本中,使用了2个工作表API配额.
  • 关于数据帧,此脚本来自您的显示脚本.因此,请根据您的实际情况进行修改.

参考文献:

Python相关问答推荐

人口全部乱序 - Python—Matplotlib—映射

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

如何使用大量常量优化代码?

Python日志(log)库如何有效地获取lineno和funcName?

如何在表单中添加管理员风格的输入(PDF)

对列中的数字进行迭代,得到n次重复开始的第一个行号

判断字典中是否有多个值对

如何仅使用数据帧操作获得特定的唯一数据帧组合?

Django/Python-UpdateView中的Delete函数正在复制,而不是删除

获取给出特定产品的所有可能组合的数量

在每个子列表(2D列表)中返回2个以上的重复项

如何在Python中返回多行SQL查询

在给定一组约束的情况下使用所有唯一组合创建数据帧

如何使用矢量化操作确定Pandas 数据帧中顺序条目的最终状态?

在Python中使用";swmm_api";包中的";lid_use";时出错?

安装Spacy 2.3.5时出现错误消息-需要Microsoft Visual C++14.0或更高版本,即使已安装生成工具也是如此

如何将按钮移动到按钮在GRadio中使用或更改的框之前?

查找polars框架列和字符串变量之间的相似性时出错

将Hangman游戏中的&替换为所有比赛的玩家猜测

如何在Django中使用使用数学过滤器的If Else条件?