簡體   English   中英

熊貓數據框和速度

[英]Pandas dataframe and speed

我有一個熊貓數據框對象,該對象已預先分配了40萬個條目。 2列類型為datetime.datetime的時間戳記和一個浮點數。 當我嘗試在表中插入(覆蓋)行時,它看起來相當慢,具體取決於表的大小,我得到的像是0.044秒。 我已經創建了一個整數索引,並且正在使用該索引來訪問該行。 這是我的使用方式:

maxsize = 400000
data = pd.DataFrame({'ts' : date_list, 'val' : zeros}, index=range(maxsize))
# later on, the next statement is "slow"
data.iloc[0] = pd.Series({'ts' : datetime.datetime.now(), 'val': val})

根據我的調查,最后一條語句在我的計算機(i7-4650U)上大約需要0.044秒。 這似乎很慢。 我從根本上做錯什么嗎? 我可以使用HDF Store之類的東西來提高寫入速度,但同時也要保持較高的讀取速度嗎?

謝謝。

我認為您的解決方案是一個過程,而不是編程過程。 既然您擔心性能,為什么還要使用Python作為數據存儲處理程序? 從本質上講,Python將類似於一個客戶端,該客戶端與從外部源(即專用數據庫(如MySQL或SQLite)(使用ODBC / OLEDB))提取的數據進行交互。

因此,為什么不先使用索引的,關系的,SQL引擎的數據庫來結構化數據集(追加行,更新記錄,選擇列),然后將其導入Python數據框中以進行分析/圖形處理呢? 示例包括:

數據庫連接

conn = sqlite3.connect("databasename.sqlite")
df = pd.read_sql("SELECT [field1], [field2] from datatable", conn)
df

追加行

conn = sqlite3.connect('databasename.sqlite')
cur = conn.cursor()
sql =  "INSERT INTO datatable (field1, field2, field3) VALUES ('{0}','{1}','{2}');".format(items[0], items[1], items[2])

cur.execute(sql)
db.commit()

CSV導出/導入

conn = sqlite3.connect('databasename.sqlite')
cur = conn.cursor()
cur.execute("SELECT [field1], [field2] from datatable")

a = csv.writer(open('datafile.csv', 'w', newline=''))
for row in cur.fetchall() :
    a.writerow(row)

filepath = 'datafile.csv'  # OUTPUTTED PRIOR FROM DATABASE
tp = pd.io.parsers.read_csv(filepath, sep=',', iterator=True, chunksize=1000, encoding = "ISO-8859-1")
finaldf = pd.concat(list(tp), ignore_index=True)

您正在分配一個序列,該序列是object dtype,iow及其混合object 因此,當發生元素分配時,需要轉換日期時間。 所有這些都很便宜; 昂貴的是每個列都需要在內部復制以防止dtype更改。 在處理大量邊緣情況的作業中,它們是相當可觀的驗證。

In [23]: data = pd.DataFrame({'ts' : pd.date_range('20130101',freq='s',periods=maxsize), 'val' : 0}, index=range(maxsize))

In [24]: s = Series({'ts' : datetime.datetime.now(), 'val' : 1 })

In [25]: %timeit data.iloc[-1] = s
100 loops, best of 3: 10.6 ms per loop

您可以繞開許多操作,但要逐項分配。 這是非常快的,但是您必須確保dtypes兼容。

In [26]: def f():
    data.iat[-1,0] = s['ts']
    data.iat[-1,1] = s['val']
   ....:     

In [27]: data.tail()              
Out[27]: 
                               ts  val
399995        2013-01-05 15:06:35    0
399996        2013-01-05 15:06:36    0
399997        2013-01-05 15:06:37    0
399998        2013-01-05 15:06:38    0
399999 2015-02-24 06:03:58.344166    1

In [28]: %timeit f()
10000 loops, best of 3: 35.2 us per loop

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM