#python #pandas #dataframe #matplotlib
#python #панды #фрейм данных #matplotlib
Вопрос:
Столбцы:
Company
Location
DateTime
Details
Результат: сбой перед запуском / частичный сбой / сбой / успех
Напишите программу для выполнения следующих действий:
- Создайте круговой график, который показывает распределение результатов миссии.
- Создайте график с горизонтальной полосой, показывающий общее количество миссий для каждой компании, с наибольшим количеством вверху и наименьшим количеством внизу.
- Создайте тот же график с горизонтальной полосой, но с миссиями, сгруппированными по успеху и неудаче, с успехом в зеленом и неудачей в красном.
Для 3. Я должен получить график, как показано ниже:
Но я получаю следующее:
Я не понимаю, что я делаю не так, как я могу это исправить? Вот мой код:
import pandas as pd
import matplotlib.pyplot as plt
#Read the data file into dataframe
df = pd.read_csv("data.csv")
#Length of dataframe
total = len(df)
#Success percentage
success = (len(df[df['Outcome'] == 'Success'])/total) * 100
#Failure percentage
failure = (len(df[df['Outcome'] == 'Failure'])/total) * 100
#Partial failure percentage
partial_failure = (len(df[df['Outcome'] == 'Partial Failure'])/total) * 100
#Prelaunch failure percentage
prelaunch_failure = (len(df[df['Outcome'] == 'Prelaunch Failure'])/total) * 100
dict_1 = {}
# Iterate through company column
for k in df['Company']:
if k in dict_1:
dict_1[k] = 1
else:
dict_1[k] = 1
sorted_dict = {}
#Sort dictionary
sorted_keys = sorted(dict_1, key=dict_1.get, reverse=True)
for w in sorted_keys:
# Add sorted values in the new dictionary
sorted_dict[w] = dict_1[w]
dict_3 = {}
dict_4 = {}
#Iterate through unique Companies
for c in df['Company'].unique():
failure = 0
#Get only the outcome column of each company
comp_proj = df.loc[df['Company'] == c, 'Outcome']
for h in comp_proj:
if h == 'Failure' or h == 'Partial Failure' or h == 'Prelaunch Failure':
failure = failure 1
dict_3[c] = failure
dict_2 = {}
for l in dict_2.keys():
dict_4[l] = dict_3[l]
# Plot Pie Chart
figure1, ax1 = plt.subplots(figsize=(10,15))
status = [success,failure,partial_failure,prelaunch_failure]
label = ["success","failure","partial","prelaunch"]
ax1.pie(status,labels=label)
ax1.set_ylabel("Outcome")
plt.savefig('plot 1.png')
# Plot the first bar chart
figure2, ax2 = plt.subplots(figsize=(15,15))
ax2.barh(range(len(sorted_dict)), sorted_dict.values(), align='center')
ax2.set_yticks(range(len(sorted_dict)))
ax2.set_yticklabels(sorted_dict.keys())
ax2.set_ylabel("Company")
ax2.invert_yaxis()
plt.savefig('plot 2.png')
# Plot the second bar chart
figure3, ax3 = plt.subplots(figsize=(15,15))
ax3.barh(range(len(sorted_dict)), sorted_dict.values(), align='center', color='green')
ax3.barh(range(len(dict_4)), dict_4.values(), align='center', color='red')
ax3.set_yticks(range(len(sorted_dict)))
ax3.set_yticklabels(sorted_dict.keys())
ax3.set_ylabel("Company")
ax3.legend(["Success", "Failure"])
ax3.invert_yaxis()
plt.savefig('plot 3.png')
Образец данных:
Комментарии:
1. Пожалуйста, поделитесь базовыми данными (их образцом). В противном случае очень сложно проверить, что вы сделали.
2. Просто поделился частью данных для вашего удобства.
3. строка с отступом «dict_3 [c] = сбой» должна решить проблему.
4. @SAL Я так не думаю, это ничего не изменило. :/
5. dict_4, который вы используете для управления красными полосами, ничего не содержит. Вы устанавливаете dict_2 пустым, затем заполняете dict_4, используя пустой набор ключей. Вам нужно распечатать ваши промежуточные значения, чтобы убедиться, что они соответствуют вашим ожиданиям.