Python улучшено использование фреймов данных - PullRequest
0 голосов
/ 01 мая 2020

Я написал следующий модуль, он работает. Но я верю, что это можно улучшить.

Сначала я импортирую файл JSON в labelled_data и dictionary_revised. Затем я go вычисляю и вычисляю оценку сходства слов и сохраняю этот процент в labelled_data ['SimilarityScore']. Затем я использую модуль ниже для дальнейшего сужения labelled_data в меньший набор данных, который затем добавляю к dictionary_revised и сохраняю.

Однако, когда я смотрю на следующий модуль, он просто не выглядит лучшим использование данных. Любые предложения по улучшению?

Кроме того, лучше использовать «лямбду» или использовать метод «для индекса, ...»? Для меня лямбда-путь означает, что я перебираю фрейм данных несколько раз, чтобы вычислить разные проценты.

Спасибо за помощь.

#95%
series95Obj = s1.apply(lambda x: True if x['SimilarityScore'] >= 0.95 else False, axis=1)
numOf95Rows = len(series95Obj[series95Obj == True].index)

#85% 
series85Obj = s1.apply(lambda x: True if (x['SimilarityScore'] >= 0.85 and x['SimilarityScore'] < 0.95) else False, axis=1)
numOf85Rows = len(series85Obj[series85Obj == True].index)

#75%
series75Obj = s1.apply(lambda x: True if (x['SimilarityScore'] >= 0.75 and x['SimilarityScore'] < 0.85) else False, axis=1)
numOf75Rows = len(series75Obj[series75Obj == True].index)

#below 75%  
numOfLess75Rows = intTotalEvaluated - (numOf95Rows + numOf85Rows + numOf75Rows)

Количество по строкам:

for index, row in labelled_data.iterrows():
    if 0.95 <= row['SimilarityScore'] < 1.00:
        numOf95Rows += 1
    elif 0.85 <= row['SimilarityScore'] < 0.95:
        numOf85Rows += 1
    elif 0.75 <= row['SimilarityScore'] < 0.85:
        numOf75Rows += 1
    elif row['SimilarityScore'] < 0.75:
        numOfLess75Rows += 1
    else:
        pass    

Полный модуль:

 #Export source labelled data and export as JSON
  def update_dictionary(labelled_data, dictionary_revised, evaluationScore = 0.75, updateDictionaryScore = 0.75):

now = datetime.datetime.now()
currentDate = now.strftime('%m-%d-%Y')
dFile = 'Dictionary_' +  currentDate + '.json'
aFile = 'Analysis_Output_' + currentDate + '.xlsx'

#set min similarity score for output
score = labelled_data['SimilarityScore'] > evaluationScore

#dataframe used for calculating overall percentages
s1 = labelled_data[score]

#dataframe used for final dictionary update
scoreFinal = s1['SimilarityScore'] >= updateDictionaryScore
s2 = s1[scoreFinal]

#total evaluated
intTotalEvaluated = labelled_data.shape[0]   

#95%
series95Obj = s1.apply(lambda x: True if x['SimilarityScore'] >= 0.95 else False, axis=1)
numOf95Rows = len(series95Obj[series95Obj == True].index)

#85% 
series85Obj = s1.apply(lambda x: True if (x['SimilarityScore'] >= 0.85 and x['SimilarityScore'] < 0.95) else False, axis=1)
numOf85Rows = len(series85Obj[series85Obj == True].index)

#75%
series75Obj = s1.apply(lambda x: True if (x['SimilarityScore'] >= 0.75 and x['SimilarityScore'] < 0.85) else False, axis=1)
numOf75Rows = len(series75Obj[series75Obj == True].index)

#below 75%  
numOfLess75Rows = intTotalEvaluated - (numOf95Rows + numOf85Rows + numOf75Rows)

#drop columns
del s2['QueryText']
del s2['DateAdded']

#rename and rearrange columns
s2.rename(columns={'SimilarText': 'QueryText'}, inplace=True)
s2.rename(columns={'Subjectmatter': 'Category'}, inplace=True)
s3 = s2.reindex(columns=['QueryText', 'Category','SimilarityScore'])
s3['DateAdded'] = currentDate

#calculate the number of net new rows being added to the dictionary
intNetNewAdded = s3.shape[0]

#append results
results = dictionary_revised.append(s3, ignore_index=True)
#save to JSON file
results.to_json(dFile, orient='records')

return 1,currentDate, dFile, aFile, intTotalEvaluated, numOf95Rows, numOf85Rows, numOf75Rows, numOfLess75Rows, intNetNewAdded

Вот небольшой пример исходного словаря:

[
  {
    "QueryText": "store",
    "Subjectmatter": "Shopping"
  },
  {
    "QueryText": "travel",
    "Subjectmatter": "Travel & Vacation"
  },
  {
    "QueryText": "paycheck",
    "Subjectmatter": "HR"
  },
  {
    "QueryText": "holidays",
    "Subjectmatter": "Travel & Vacation"
  },
  {
    "QueryText": "benefits",
    "Subjectmatter": "HR & Benefits"
  },
  {
    "QueryText": "library",
    "Subjectmatter": "Information"
  }
  {
    "QueryText": "store",
    "Subjectmatter": "Shopping"
  },
  {
    "QueryText": "expense",
    "Subjectmatter": "Finance"
  },
  {
    "QueryText": "jobs",
    "Subjectmatter": "Career & Jobs"
  }
]

1 Ответ

0 голосов
/ 01 мая 2020
  1. Для подсчета чисел по строкам вы можете заменить свой l oop на этот оптимизированный код в Pandas:
df_numOf95Rows = labelled_data[(labelled_data['SimilarityScore']>=0.95) & (labelled_data['SimilarityScore']<1.0)]
numOf95Rows = df_numOf95Rows.shape[0]

Вы можете применить то же самое для numOf75Rows, numOf85Rows, numOfLess75Rows.

Для последней части вашего кода, где вы используете условия для заполнения True или False, вы можете использовать функцию where() из Series. Вы можете найти больше информации здесь . Вообще говоря, функция apply очень медленная, старайтесь избегать ее, если это возможно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...