แรงจูงใจ
ชุดข้อมูลจำนวนมากมีขนาดใหญ่พอที่เราต้องคำนึงถึงความเร็ว / ประสิทธิภาพ ดังนั้นฉันจึงเสนอวิธีแก้ปัญหานี้ด้วยจิตวิญญาณนั้น มันเกิดขึ้นเพื่อรวบรัด
เพื่อประโยชน์ในการเปรียบเทียบให้วางindex
คอลัมน์
df = data_set.drop('index', 1)
วิธีแก้ไข
ฉันจะเสนอการใช้zip
และmap
list(zip(*map(df.get, df)))
[('2012-02-17', 24.75, 25.03),
('2012-02-16', 25.0, 25.07),
('2012-02-15', 24.99, 25.15),
('2012-02-14', 24.68, 25.05),
('2012-02-13', 24.62, 24.77),
('2012-02-10', 24.38, 24.61)]
นอกจากนี้ยังมีความยืดหยุ่นหากเราต้องการจัดการกับคอลัมน์ย่อยที่เฉพาะเจาะจง เราจะถือว่าคอลัมน์ที่เราแสดงแล้วเป็นส่วนย่อยที่เราต้องการ
list(zip(*map(df.get, ['data_date', 'data_1', 'data_2'])))
[('2012-02-17', 24.75, 25.03),
('2012-02-16', 25.0, 25.07),
('2012-02-15', 24.99, 25.15),
('2012-02-14', 24.68, 25.05),
('2012-02-13', 24.62, 24.77),
('2012-02-10', 24.38, 24.61)]
Quicker คืออะไร?
การเปิดออกrecords
จะเร็วที่สุดตามด้วยการบรรจบกันอย่างไม่มีอาการzipmap
และiter_tuples
ฉันจะใช้ห้องสมุดsimple_benchmarks
ที่ได้มาจากโพสต์นี้
from simple_benchmark import BenchmarkBuilder
b = BenchmarkBuilder()
import pandas as pd
import numpy as np
def tuple_comp(df): return [tuple(x) for x in df.to_numpy()]
def iter_namedtuples(df): return list(df.itertuples(index=False))
def iter_tuples(df): return list(df.itertuples(index=False, name=None))
def records(df): return df.to_records(index=False).tolist()
def zipmap(df): return list(zip(*map(df.get, df)))
funcs = [tuple_comp, iter_namedtuples, iter_tuples, records, zipmap]
for func in funcs:
b.add_function()(func)
def creator(n):
return pd.DataFrame({"A": random.randint(n, size=n), "B": random.randint(n, size=n)})
@b.add_arguments('Rows in DataFrame')
def argument_provider():
for n in (10 ** (np.arange(4, 11) / 2)).astype(int):
yield n, creator(n)
r = b.run()
ตรวจสอบผลลัพธ์
r.to_pandas_dataframe().pipe(lambda d: d.div(d.min(1), 0))
tuple_comp iter_namedtuples iter_tuples records zipmap
100 2.905662 6.626308 3.450741 1.469471 1.000000
316 4.612692 4.814433 2.375874 1.096352 1.000000
1000 6.513121 4.106426 1.958293 1.000000 1.316303
3162 8.446138 4.082161 1.808339 1.000000 1.533605
10000 8.424483 3.621461 1.651831 1.000000 1.558592
31622 7.813803 3.386592 1.586483 1.000000 1.515478
100000 7.050572 3.162426 1.499977 1.000000 1.480131
r.plot()
list(df.itertuples(index=False, name=None))