Как избежать цикла for в этом скрипте Python - PullRequest
1 голос
/ 04 ноября 2019

Я выполняю некоторую задачу анализа данных, с помощью этого скрипта на Python я могу получить желаемые результаты, но он очень медленный, возможно, из-за цикла for, мне приходится обрабатывать миллионы строк данных, есть ли способ изменить этот скрипт на быстрый?

df=df.sort_values(by='ts')
df = df.set_index(pd.DatetimeIndex(df['ts']))
df = df.rename(columns={'ts': 'Time'})
x2=df.groupby(pd.Grouper(freq='1D', base=30, label='right'))
for name, df1 in x2:
    df1_split=np.array_split(df1,2)
    df_first=df1_split[0]
    df_second=df1_split[1]
    length_1=len(df_first)
    length_2=len(df_second)
    if len(df_first)>=5000:
        df_first_diff_max=abs(df_first['A'].diff(periods=1)).max()
        if df_first_diff_max<=10:
            time_first=df_first['Time'].values[0]
            time_first=pd.DataFrame([time_first],columns=['start_time'])
            time_first['End_Time']=df_first['Time'].values[-1]
            time_first['flag']=1
            time_first['mean_B']=np.mean(df_first['B'])
            time_first['mean_C']=np.mean(df_first['C'])
            time_first['mean_D']=np.mean(df_first['D'])
            time_first['E']=df_first['E'].values[0]
            time_first['F']=df_first['F'].values[0]
            result.append(time_first)
    if len(df_second)>=5000:
        df_second_diff_max=abs(df_second['A'].diff(periods=1)).max()
        if df_second_diff_max<=10:
            print('2')
            time_first=df_second['Time'].values[0]
            time_first=pd.DataFrame([time_first],columns=['start_time'])
            time_first['End_Time']=df_second['Time'].values[-1]
            time_first['flag']=2
            time_first['mean_B']=np.mean(df_second['B'])
            time_first['mean_C']=np.mean(df_second['C'])
            time_first['mean_D']=np.mean(df_second['D'])
            time_first['E']=df_second['E'].values[0]
            time_first['F']=df_second['F'].values[0]
            result.append(time_first)

final=pd.concat(result)

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Если вы хотите попробовать что-то другое с Pandas, вы можете попробовать использовать векторизацию. Вот ссылка на краткий обзор времени для перебора набора данных. Похоже, что Numpy имеет самый эффективный метод векторизации, но внутренние панды могут работать и для вас.

https://towardsdatascience.com/how-to-make-your-pandas-loop-71-803-times-faster-805030df4f06

  • Встроенная функция Pandas: iterrows () - в 321 раз быстрее
  • Метод apply () - в 811 раз быстрее
  • Векторизация панд - в 9280 раз быстрее
  • Numpy векторизация - в 71 803 раза быстрее

(все в соответствии с временем выполнения операций на кадре данных с 65 столбцами и 1140 строками)

0 голосов
/ 04 ноября 2019

Если вы хотите обрабатывать миллионы строк, возможно, вам следует попробовать использовать Hadoop или Spark, если у вас достаточно ресурсов.

Я думаю, что анализировать такое количество данных в одном узле - это немного сумасшествие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...