如何使用具有返回数据帧的函数的Timer?

时间:2015-10-12 05:17:17

标签: python google-analytics-api

我想每隔 n 分钟查询一次API,并将响应解析为数据帧。但是,在尝试执行此操作时,我收到 TypeError

  

TypeError:' DataFrame'对象不可调用

我试过了:

  • 运行返回get请求的函数
  • 运行将上述内容返回到pandas数据帧的函数

在#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

1 个答案:

答案 0 :(得分:1)

就像我在评论中说的那样(并且应该有适当的标签甚至resizes语句来准确显示Timer / DataFrame是什么),你的threading.Timer对象想要一些可调用的东西 - 所以当时间是过去了,它可以用一大块计算来启动一个线程。

当您通过import Timer时,解释器会在传递给print_query_results(*args)之前评估函数print_query_results,因此您获得了Timer或a dict或函数返回的任何内容 - 不是函数。解决这个问题的一种方法是

DataFrame

除了这种解决方法之外,我们看不到足够的程序提出建议,但在这些类型不匹配的情况下,通常存在一个潜在的概念问题,值得进行一些重构。