2015-10-12 34 views
1

我想每隔n分鐘查詢API並將響應解析爲數據幀。如何將Timer用於返回數據幀的函數?

TypeError: 'DataFrame' object is not callable

我曾嘗試:

  • 運行,返回一個GET請求
  • 功能運行,返回上面的函數但是,試圖這樣做時,我得到一個類型錯誤到熊貓數據幀

在#1中,我得到「'dict'對象不可調用」。
在#2中,我得到「'DataFrame not callable'」錯誤(如上所示)。
這兩個工作正常,如果我反而打印功能的結果但是我需要對結果進行計算,因此需要返回數據幀響應。

這似乎是我失去了一些明顯的東西。任何人都可以請澄清?

參考:

from threading import Timer, Thread 

def run_alert(time): 
t = Timer(time, print_query_results(*args)) 
t.start() 

EDIT#1:

數據幀對象是從格式化成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 
*  *  *   * 

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

你能分享關於'DataFrame'對象的更多細節嗎? – kmad1729

+0

計時器試圖調用'print_query_results(* args)',它在計算時不是函數 - 它是'print_query_results'中的'return'語句。將它傳遞給'lambda:print_query_results(* args)'也許吧? –

+0

我已添加進口和示例df輸出 –

回答

1

就像我在我說的註釋(實際上應該有適當的標籤,甚至import語句來準確顯示Timer/DataFrame是什麼),你的線程.Timer對象想要一些可調用的 - 這樣當時間過去時,它可以啓動一個線程塊計算。

當你通過Timerprint_query_results(*args),功能print_query_results被解釋傳遞給Timer之前評估,所以你得到一個dictDataFrame或任何函數返回 - 而不是一個功能。一種方法來解決,這將是

t = Timer(time, lambda: print_query_results(*args)) 

我們無法看到完整的方案,使超越這種解決辦法的建議,但在這些類型不匹配的情況下,通常有一個基本的概念問題,這值得一些重構。

+0

謝謝。我試過lambda,但它似乎沒有返回預期的輸出。你認爲這可能是因爲我在ipython筆記本中運行迭代函數嗎? –

+0

我認爲你應該更具體 - 說它沒有返回你所期望的太模糊。你期望什麼?爲什麼?你取得了什麼? –

+0

對不起,我會詳細說明。預期輸出是問題中所示的10x3數據幀,但不會返回任何內容。思考? –

相關問題