我想每隔 n 分钟查询一次API,并将响应解析为数据帧。但是,在尝试执行此操作时,我收到 TypeError :
TypeError:' DataFrame'对象不可调用
我试过了:
在#1中,我得到了"' dict'对象不可调用"。在#2中,我得到"' DataFrame无法调用'"错误(如上所示)。
如果我打印函数的结果 BUT 我需要对结果进行计算,因此两者都工作正常,因此需要返回数据帧响应。< / p>
好像我错过了一些明显的东西。有人可以解释一下吗?
参考:
from threading import Timer, Thread
def run_alert(time):
t = Timer(time, print_query_results(*args))
t.start()
编辑#1:
DataFrame对象是格式化为10x3表的API的响应:
import numpy as np
import pandas as pd
from pandas.io.json import json_normalize
medium source pageviews
0 DIRECT (not set) xxx
1 ORGANIC google xxx
2 ORGANIC yahoo xxx
4 ORGANIC bing xxx
* * * *
编辑#2:
def print_query_results(ids, metrics, dimensions, filters, sort):
#get results from request
results = run_query(ids, metrics, dimensions, filters, sort)
#convert json into dataframe
cols = json_normalize(results['columnHeaders'])['name']
rows = json_normalize(results, 'rows')
cols_names = []
for name in cols:
cols_names.append(name.split(":")[1])
df = pd.DataFrame(rows)
df.columns = [cols_names]
df.rename(columns = {'pageviews':'pageviews'+" "+strftime('%I:%M %p')}, inplace=True)
df = df.convert_objects(convert_numeric=True)
return df
答案 0 :(得分:1)
就像我在评论中说的那样(并且应该有适当的标签甚至resizes
语句来准确显示Timer / DataFrame是什么),你的threading.Timer对象想要一些可调用的东西 - 所以当时间是过去了,它可以用一大块计算来启动一个线程。
当您通过import
Timer
时,解释器会在传递给print_query_results(*args)
之前评估函数print_query_results
,因此您获得了Timer
或a dict
或函数返回的任何内容 - 不是函数。解决这个问题的一种方法是
DataFrame
除了这种解决方法之外,我们看不到足够的程序提出建议,但在这些类型不匹配的情况下,通常存在一个潜在的概念问题,值得进行一些重构。