Публичный аккаунт WeChat: «Python Reading Finance»
Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте сообщение в публичном аккаунте
Pandas — это драконий нож для обработки и анализа данных в Python, и все должны быть с ним знакомы, но есть некоторые навыки и моменты, на которые следует обратить внимание при использовании Pandas, особенно для больших наборов данных, если вы не использовали их должным образом, это может привести к тому, что Pandas будет работать очень медленно.
Для программистов/женщин время - это жизнь. В этой статье приведены некоторые распространенные методы оптимизации производительности панд. Надеюсь, это поможет вам!
1. Оптимизация чтения данных
Чтение данных является необходимым шагом перед анализом данных.Pandas также имеет множество встроенных функций чтения данных.Наиболее распространенным является использование функции pd.read_csv() для чтения данных из CSV-файлов.Какая разница в ее использовании? Какой способ быстрее? Давайте проведем эксперимент для сравнения.
Используемые здесь данные имеют в общей сложности 590 000 строк, которые сохранены в форматах xlsx, csv, hdf и pkl.Каждый формат протестирован 10 раз, и получены следующие результаты.
Можно видеть, что для одних и тех же данных данные в формате pkl имеют самую высокую скорость чтения, которая почти в 6 раз выше, чем данные в формате csv, за которыми следуют данные в формате hdf, а худшая скорость чтения данных в формате xlsx. формат (это просто набор данных размером всего около 15M).
Поэтому для ежедневных наборов данных (в основном в формате csv) вы можете использовать pandas для чтения, а затем передавать данные в формат pkl или hdf, а затем каждый раз, когда вы читаете данные, вы можете сэкономить время. код показывает, как показано ниже:
import pandas as pd
#读取csv
df = pd.read_csv('xxx.csv')
#pkl格式
df.to_pickle('xxx.pkl') #格式另存
df = pd.read_pickle('xxx.pkl') #读取
#hdf格式
df.to_hdf('xxx.hdf','df') #格式另存
df = pd.read_hdf('xxx.pkl','df') #读取
2. Оптимизация при выполнении операций агрегации
в настоящее время используетagg
иtransform
При работе попробуйте использовать встроенные функции Python для повышения эффективности работы. (Данные все еще используются в приведенном выше тестовом примере)
1. Встроенная функция agg+Python
2. agg+ не встроенная функция
Видно, что для метода agg эффективность работы повышается на 60 % при использовании встроенной функции.3, встроенная функция преобразования + Python
4, преобразование + не встроенная функция
правильноtransform
С точки зрения метода, при использовании встроенных функций эффективность работы повышается в два раза.
3. Оптимизация при выполнении построчных операций над данными
Предположим, теперь у нас есть такой набор данных о потреблении электроэнергии и цена на электроэнергию за соответствующий период, как показано на следующем рисунке:
Набор данных регистрирует потребление электроэнергии в час. Например, первая строка представляет потребление электроэнергии 0,586 кВтч в 0:00 13 января 2001 г. Цена на электроэнергию в разные периоды использования различна.Наша текущая цель — найти общую стоимость электроэнергии, поэтому нам нужно рассчитать удельную стоимость электроэнергии за соответствующий период времени × потребляемую мощность. Даны следующие три метода записи. Мы тестируем эти три метода обработки соответственно и сравниваем различия между тремя методами записи и различия в эффективности кода.
#编写求得相应结果的函数
def get_cost(kwh, hour):
if 0 <= hour < 7:
rate = 0.6
elif 7 <= hour < 17:
rate = 0.68
elif 17 <= hour < 24:
rate = 0.75
else:
raise ValueError(f'Invalid hour: {hour}')
return rate * kwh
#方法一:简单循环
def loop(df):
cost_list = []
for i in range(len(df)):
energy_used = df.iloc[i]['energy_kwh']
hour = df.iloc[i]['date_time'].hour
energy_cost = get_cost(energy_used, hour)
cost_list.append(energy_cost)
df['cost'] = cost_list
#方法二:apply方法
def apply_method(df):
df['cost'] = df.apply(
lambda row: get_cost(
kwh=row['energy_kwh'],
hour=row['date_time'].hour),
axis=1)
#方法三:采用isin筛选出各时段,分段处理
df.set_index('date_time', inplace=True)
def isin_method(df):
peak_hours = df.index.hour.isin(range(17, 24))
simple_hours = df.index.hour.isin(range(7, 17))
off_peak_hours = df.index.hour.isin(range(0, 7))
df.loc[peak_hours, 'cost'] = df.loc[peak_hours, 'energy_kwh'] * 0.75
df.loc[simple_hours,'cost'] = df.loc[simple_hours, 'energy_kwh'] * 0.68
df.loc[off_peak_hours,'cost'] = df.loc[off_peak_hours, 'energy_kwh'] * 0.6
Результаты теста:
Видно, чтоisin()
После фильтрации соответствующих данных скорость отдельного расчета почти в 606 раз выше, чем в простом цикле, что не означаетisin()
Насколько мощный, третий метод быстрый, потому что он использует векторизованный метод обработки данных (здесьisin()
это один из способов, есть и другие способы, можете попробовать), в этом суть. Что это обозначает?
Вот простая картинка, можно совместить эту картинку и код, чтобы понять, быстрее ли обрабатывать по одному, или отделить те, которые могут выполнять одну и ту же операцию и потом обрабатывать их пачками.
В-четвертых, используйте numba, чтобы добавить
Если ваша обработка данных включает в себя множество числовых расчетов, используйтеnumba
Это может значительно ускорить работоспособность кода,numba
Он также очень прост в использовании, и я покажу вам ниже. (Обработка кода не имеет практического значения, просто чтобы показать эффект)
Сначала нужно установитьnumba
модуль
>>>pip install numba
Давайте проверим это на простом примереnumba
эффект ускорения
import numba
@numba.vectorize
def f_with_numba(x):
return x * 2
def f_without_numba(x):
return x * 2
#方法一:apply逐行操作
df["double_energy"] = df.energy_kwh.apply(f_without_numba)
#方法二:向量化运行
df["double_energy"] = df.energy_kwh*2
#方法三:运用numba加速
#需要以numpy数组的形式传入
#否则会报错
df["double_energy"] = f_with_numba(df.energy_kwh.to_numpy())
По результатам испытаний вновь подчеркиваются преимущества векторизованной обработки, и в то же времяnumba
Процесс квантования, который быстро быстро увеличивается, является более эффективным. Болееnumba
Чтобы узнать о методе использования, обратитесь к документации numba.
Использованная литература:
1,pandas. Друзья звонили ему. org/panda сказал OC is/…
2,настоящие Python.com/fast-fullerenes не…
3.Блог Woohoo.cn на.com/wang kang/afraid/979…
Нелегко быть оригинальным. Если вы считаете, что это полезно, надеюсь, вы поставите лайк. Спасибо, старые утюги.
Отсканируйте код, чтобы подписаться на официальный аккаунт"Питон Чтение Финансов", получите галантерейные товары в первый раз, и вы также можете присоединиться к группе обмена обучением Python! !