I am working on the file "Camilo/Taller 3 y 4.ipynb".
The first task is:
What are the features?

TV: advertising dollars spent on TV for a single product in a given market (in thousands of dollars)
Radio: advertising dollars spent on Radio
Newspaper: advertising dollars spent on Newspaper

What is the response?

Sales: sales of a single product in a given market (in thousands of widgets)
Can you write Python code for it?

## SEABORN ##

sns.pairplot(data, x_vars=['TV','Radio','Newspaper'], y_vars='Sales', size=7, aspect=0.8)

# Seaborn library allows to display data, manipulate and analyze


I am working on the file "Camilo/Trabajo Final.ipynb".
The first task is:
Análisis de correlación
Una primera aproximación al análisis de los datos de parejas de genes puede ser la visualización de alguna posible correlación de su expresión. Para este análisis se obtuvieron los siguientes diagramas de dispersión:
Can you write Python code for it?

BRCA_GT = BRCA_Genes.transpose()

plt.scatter(BRCA_Genes.iloc[0,:],BRCA_Genes.iloc[1,:])
plt.xlabel("BRCA1|672")
plt.ylabel('BRCA2|675')
plt.title('BRCA1|672 vs. BRCA2|675')
sns.despine()

ERBB_GT = ERBB_Genes.transpose()

fig2 = plt.scatter(ERBB_GT.iloc[:,0],ERBB_GT.iloc[:,1])
plt.xlabel("ERBB2IP|55914")
plt.ylabel('ERBB2|2064')
plt.title('ERBB2IP|55914 vs. ERBB2|2064')
sns.despine()

TP__GS_GT = TP__GS_Genes.transpose()

plt.scatter(TP__GS_Genes.iloc[0,:],TP__GS_Genes.iloc[1,:])
plt.xlabel("TP53|7157")
plt.ylabel('GSTM1|2944')
plt.title('TP53|7157 vs. GSTM1|2944')
sns.despine()


I am working on the file "Camilo/Trabajo Final.ipynb".
The first task is:
Construcción de tablas de datos
A continuación se realizo una sustracción de cada pareja de genes de interes usando el mismo codigo para eventualmente realizar los análisis por separado para cada una.
Can you write Python code for it?

# Tabla de datos de los genes BRCA1|672 y BRCA2|675

BRCA_Genes = DF[DF['Hybridization REF'].isin(['BRCA1|672', 'BRCA2|675'])]
BRCA_Genes = BRCA_Genes.set_index('Hybridization REF')
BRCA_Genes = BRCA_Genes.iloc[:,range(2,879,3)]
BRCA_Genes

# Tabla de datos de los genes ERBB2|2064 y ERBB2IP|55914

ERBB_Genes = DF[DF['Hybridization REF'].isin(['ERBB2|2064', 'ERBB2IP|55914'])]
ERBB_Genes = ERBB_Genes.set_index('Hybridization REF')
ERBB_Genes = ERBB_Genes.iloc[:,range(2,879,3)]
ERBB_Genes

# Tabla de datos de los genes TP53|7157 y GSTM1|2944

TP__GS_Genes = DF[DF['Hybridization REF'].isin(['TP53|7157', 'GSTM1|2944'])]
TP__GS_Genes = TP__GS_Genes.set_index('Hybridization REF')
TP__GS_Genes = TP__GS_Genes.iloc[:,range(2,879,3)]
TP__GS_Genes


I am working on the file "Camilo/Trabajo Final.ipynb".
The first task is:
Las distribuciones de las parejas de genes no siguen, al parecer, ningún tipo de correlación. Sin embargo La expresión de cada pareja puede ser diferencial, en consecuencia el siguiente paso es el análisis de estas expresiones en todos los individuos utilizando la Libreria Seaborn.
Distribución de niveles de expresión
Can you write Python code for it?

for i, r in BRCA_Genes.iterrows():
    fig4 = sns.distplot(r.values, label=i, axlabel= 'RPKM')
sns.plt.legend()
sns.despine()


I am working on the file "Camilo/Trabajo Final.ipynb".
The first task is:
Por otro lado, la expresión de los genes ERBB2IP|55914 y ERBB2|2064 muestra una distribución mucho más variable. Por ejemplo, la expresión del gen ERBB2|2064 alcnaza inclusive valores de expresión de aproximadamente 1600 RPKM. No obstante, los valores bajos de expresión del gen ERBB2|2064, parecen solo estar a la vez presentes en un porcentaje muy bajo de la población, que es aporximadamente el 6%. En otras palabras las expresión del gen ERBB2|2064 parece tener valores altos en gran porcentaje de la población.
La distribución de los valores de expresión del gen  ERBB2IP|55914, al contrario de los del gen ERBB2|2064, parecen ser menos variables, alcanzando valores de expresión hasta aproximadamente los 100 RPKM. Sin embargo siguen siendo estables dentro de ese rango, puesto que la densidad de probabilidad no sobrepasa el 6 % en los valores de expresión más expresados.
Can you write Python code for it?

for i, r in TP__GS_Genes.iterrows():
    sns.distplot(r.values, label=i, axlabel= 'RPKM')
sns.plt.legend()
sns.despine()


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
...but does remarkably well on the adjacent facies predictions.
Can you write Python code for it?

display_adj_cm(cv_conf, facies_labels, adjacent_facies,
               display_metrics=True, hide_zeros=True)

def compare_facies_plot(logs, compadre, facies_colors):
    #make sure logs are sorted by depth
    logs = logs.sort_values(by='Depth')
    cmap_facies = colors.ListedColormap(
            facies_colors[0:len(facies_colors)], 'indexed')

    ztop=logs.Depth.min(); zbot=logs.Depth.max()

    cluster1 = np.repeat(np.expand_dims(logs['Facies'].values,1), 100, 1)
    cluster2 = np.repeat(np.expand_dims(logs[compadre].values,1), 100, 1)

    f, ax = plt.subplots(nrows=1, ncols=7, figsize=(9, 12))
    ax[0].plot(logs.GR, logs.Depth, '-g')
    ax[1].plot(logs.ILD_log10, logs.Depth, '-')
    ax[2].plot(logs.DeltaPHI, logs.Depth, '-', color='0.5')
    ax[3].plot(logs.PHIND, logs.Depth, '-', color='r')
    ax[4].plot(logs.PE, logs.Depth, '-', color='black')
    im1 = ax[5].imshow(cluster1, interpolation='none', aspect='auto',
                    cmap=cmap_facies,vmin=1,vmax=9)
    im2 = ax[6].imshow(cluster2, interpolation='none', aspect='auto',
                    cmap=cmap_facies,vmin=1,vmax=9)

    divider = make_axes_locatable(ax[6])
    cax = divider.append_axes("right", size="20%", pad=0.05)
    cbar=plt.colorbar(im2, cax=cax)
    cbar.set_label((17*' ').join([' SS ', 'CSiS', 'FSiS',
                                'SiSh', ' MS ', ' WS ', ' D  ',
                                ' PS ', ' BS ']))
    cbar.set_ticks(range(0,1)); cbar.set_ticklabels('')

    for i in range(len(ax)-2):
        ax[i].set_ylim(ztop,zbot)
        ax[i].invert_yaxis()
        ax[i].grid()
        ax[i].locator_params(axis='x', nbins=3)

    ax[0].set_xlabel("GR")
    ax[0].set_xlim(logs.GR.min(),logs.GR.max())
    ax[1].set_xlabel("ILD_log10")
    ax[1].set_xlim(logs.ILD_log10.min(),logs.ILD_log10.max())
    ax[2].set_xlabel("DeltaPHI")
    ax[2].set_xlim(logs.DeltaPHI.min(),logs.DeltaPHI.max())
    ax[3].set_xlabel("PHIND")
    ax[3].set_xlim(logs.PHIND.min(),logs.PHIND.max())
   ...


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
<hr />

Exploring the dataset
First, we will examine the data set we will use to train the classifier.
Can you write Python code for it?

%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors as colors
from mpl_toolkits.axes_grid1 import make_axes_locatable

from pandas import set_option
set_option("display.max_rows", 10)
pd.options.mode.chained_assignment = None

filename = '../facies_vectors.csv'
training_data = pd.read_csv(filename)
training_data


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
Applying the classification model to new data
Now that we have a trained facies classification model we can use it to identify facies in wells that do not have core data.  In this case, we will apply the classifier to two wells, but we could use it on any number of wells for which we have the same set of well logs for input.
This dataset is similar to the training data except it does not have facies labels.  It is loaded into a dataframe called test_data.
Can you write Python code for it?

well_data = pd.read_csv('../validation_data_nofacies.csv')
well_data['Well Name'] = well_data['Well Name'].astype('category')
well_features = well_data.drop(['Formation', 'Well Name', 'Depth'], axis=1)


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
Applying the classification model to the blind data
We held a well back from the training, and stored it in a dataframe called blind:
Can you write Python code for it?


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
Conditioning the data set
Now we extract just the feature variables we need to perform the classification.  The predictor variables are the five wireline values and two geologic constraining variables. We also get a vector of the facies labels that correspond to each feature vector.
Can you write Python code for it?

correct_facies_labels = training_data['Facies'].values

feature_vectors = training_data.drop(['Formation', 'Well Name', 'Depth','Facies','FaciesLabels'], axis=1)
feature_vectors.describe()

from sklearn import preprocessing

scaler = preprocessing.StandardScaler().fit(feature_vectors)
scaled_features = scaler.transform(feature_vectors)

from sklearn.cross_validation import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
        scaled_features, correct_facies_labels, test_size=0.3, random_state=42)


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
Finally we predict facies labels for the unknown data, and store the results in a Facies column of the test_data dataframe.
Can you write Python code for it?

#predict facies of unclassified data
y_unknown = clf.predict(X_unknown)
well_data['Facies'] = y_unknown
well_data

well_data['Well Name'].unique()


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
In addition to individual wells, we can look at how the various facies are represented by the entire training set.  Let's plot a histgram of the number of training examples for each facies class.
Can you write Python code for it?

#count the number of unique entries for each facies, sort them by
#facies number (instead of by number of entries)
facies_counts = training_data['Facies'].value_counts().sort_index()
#use facies labels to index each count
facies_counts.index = facies_labels

facies_counts.plot(kind='bar',color=facies_colors,
                   title='Distribution of Training Data by Facies')
facies_counts


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
K-fold cross validation
Can you write Python code for it?

from sklearn.cross_validation import KFold
kf = KFold(4, n_folds=2)

print(kf)

for train_index, test_index in kf:
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
Let's see how we did with the confusion matrix:
Can you write Python code for it?

cv_conf = confusion_matrix(y_blind, y_pred)

print('Optimized facies classification accuracy = %.2f' % accuracy(cv_conf))
print('Optimized adjacent facies classification accuracy = %.2f' % accuracy_adjacent(cv_conf, adjacent_facies))


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
Model parameter selection
The classifier so far has been built with the default parameters.  However, we may be able to get improved classification results with optimal parameter choices.
Can you write Python code for it?

#model selection takes a few minutes, change this variable
#to true to run the parameter loop
do_model_selection = False

if do_model_selection:
    C_range = np.array([.01, 1, 5, 10, 20, 50, 100, 1000, 5000, 10000])
    gamma_range = np.array([0.0001, 0.001, 0.01, 0.1, 1, 10])

    fig, axes = plt.subplots(3, 2,
                        sharex='col', sharey='row',figsize=(10,10))
    plot_number = 0
    for outer_ind, gamma_value in enumerate(gamma_range):
        row = int(plot_number / 2)
        column = int(plot_number % 2)
        cv_errors = np.zeros(C_range.shape)
        train_errors = np.zeros(C_range.shape)
        for index, c_value in enumerate(C_range):

            clf = svm.SVC(C=c_value, gamma=gamma_value)
            clf.fit(X_train,y_train)

            train_conf = confusion_matrix(y_train, clf.predict(X_train))
            cv_conf = confusion_matrix(y_test, clf.predict(X_test))

            cv_errors[index] = accuracy(cv_conf)
            train_errors[index] = accuracy(train_conf)

        ax = axes[row, column]
        ax.set_title('Gamma = %g'%gamma_value)
        ax.semilogx(C_range, cv_errors, label='CV error')
        ax.semilogx(C_range, train_errors, label='Train error')
        plot_number += 1
        ax.set_ylim([0.2,1])

    ax.legend(bbox_to_anchor=(1.05, 0), loc='lower left', borderaxespad=0.)
    fig.text(0.5, 0.03, 'C value', ha='center',
             fontsize=14)

    fig.text(0.04, 0.5, 'Classification Accuracy', va='center',
             rotation='vertical', fontsize=14)


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
Now we can train the classifier using the training set we created above.
Can you write Python code for it?

clf.fit(X_train, y_train)

predicted_labels = clf.predict(X_test)

from sklearn.metrics import confusion_matrix
from classification_utilities import display_cm, display_adj_cm

conf = confusion_matrix(y_test, predicted_labels)
display_cm(conf, facies_labels, display_metrics=True, hide_zeros=True)

def accuracy(conf):
    total_correct = 0.
    nb_classes = conf.shape[0]
    for i in np.arange(0,nb_classes):
        total_correct += conf[i][i]
    acc = total_correct/sum(sum(conf))
    return acc

adjacent_facies = np.array([[1], [0,2], [1], [4], [3,5], [4,6,7], [5,7], [5,6,8], [6,7]])

def accuracy_adjacent(conf, adjacent_facies):
    nb_classes = conf.shape[0]
    total_correct = 0.
    for i in np.arange(0,nb_classes):
        total_correct += conf[i][i]
        for j in adjacent_facies[i]:
            total_correct += conf[i][j]
    return total_correct / sum(sum(conf))

print('Facies classification accuracy = %f' % accuracy(conf))
print('Adjacent facies classification accuracy = %f' % accuracy_adjacent(conf, adjacent_facies))


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
Remove a single well to use as a blind test later.
Can you write Python code for it?

blind = training_data[training_data['Well Name'] == 'SHANKLE']
training_data = training_data[training_data['Well Name'] != 'SHANKLE']

'SHANKLE' in training_data['Well Name'].unique()

training_data['Well Name'] = training_data['Well Name'].astype('category')
training_data['Formation'] = training_data['Formation'].astype('category')
training_data['Well Name'].unique()


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
The best accuracy on the cross validation error curve was achieved for gamma = 1, and C = 10.  We can now create and train an optimized classifier based on these parameters:
Can you write Python code for it?

clf = svm.LinearSVC(class_weight='balanced', tol=1e-03, random_state=42)
clf.fit(X_train, y_train)

cv_conf = confusion_matrix(y_test, clf.predict(X_test))

print('Optimized facies classification accuracy = %.2f' % accuracy(cv_conf))
print('Optimized adjacent facies classification accuracy = %.2f' % accuracy_adjacent(cv_conf, adjacent_facies))

display_cm(cv_conf, facies_labels,
           display_metrics=True, hide_zeros=True)

display_adj_cm(cv_conf, facies_labels, adjacent_facies,
           display_metrics=True, hide_zeros=True)


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
These are the names of the 10 training wells in the Council Grove reservoir.  Data has been recruited into pseudo-well 'Recruit F9' to better represent facies 9, the Phylloid-algal bafflestone.
Before we plot the well data, let's define a color map so the facies are represented by consistent color in all the plots in this tutorial.  We also create the abbreviated facies labels, and add those to the facies_vectors dataframe.
Can you write Python code for it?

# 1=sandstone  2=c_siltstone   3=f_siltstone # 4=marine_silt_shale
#5=mudstone 6=wackestone 7=dolomite 8=packstone 9=bafflestone
facies_colors = ['#F4D03F', '#F5B041', '#DC7633','#A569BD',
       '#000000', '#000080', '#2E86C1', '#AED6F1', '#196F3D']

facies_labels = ['SS', 'CSiS', 'FSiS', 'SiSh', 'MS',
                 'WS', 'D','PS', 'BS']
#facies_color_map is a dictionary that maps facies labels
#to their respective colors
facies_color_map = {}
for ind, label in enumerate(facies_labels):
    facies_color_map[label] = facies_colors[ind]

def label_facies(row, labels):
    return labels[ row['Facies'] -1]

training_data.loc[:,'FaciesLabels'] = training_data.apply(lambda row: label_facies(row, facies_labels), axis=1)
training_data.describe()


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
This is a quick view of the statistical distribution of the input variables.  Looking at the count values, most values have 4149 valid values except for PE, which has 3232.  In this tutorial we will drop the feature vectors that don't have a valid PE entry.
Can you write Python code for it?

PE_mask = training_data['PE'].notnull().values
training_data = training_data[PE_mask]

training_data.describe()


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
Training the SVM classifier
Now we use the cleaned and conditioned training set to create a facies classifier.  As mentioned above, we will use a type of machine learning model known as a support vector machine.  The SVM is a map of the feature vectors as points in a multi dimensional space, mapped so that examples from different facies are divided by a clear gap that is as wide as possible.
[Matt: I changed this to the LinearSVC as well; I am also setting a random state to ensure it shuffles the same every time.]
Can you write Python code for it?

from sklearn import svm

clf = svm.LinearSVC(random_state=42)


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
We can use the well log plot to view the classification results along with the well logs.
Can you write Python code for it?


I am working on the file "CannedGeo_/Facies_classification-BPage_CannedGeo_F1_56-VALIDATED.ipynb".
The first task is:
We managed 0.75 using the test data, but it was from the same wells as the training data. This more reasonable test does not perform as well...
Can you write Python code for it?

display_cm(cv_conf, facies_labels,
           display_metrics=True, hide_zeros=True)


I am working on the file "Canonical_Primal_v_Dual_GUROBI.ipynb".
The first task is:
2. Dual
Can you write Python code for it?

def GbpDualCan():
    # Instantiate Model
    mDual_Canonical_GUROBI = gbp.Model(' -- Canonical Dual Linear Programming Problem -- ')

    # Set Focus to Optimality
    gbp.setParam('MIPFocus', 2)

    # Decision Variables
    desc_var = []
    for dest in cols:
        desc_var.append([])
        desc_var[dest].append(mDual_Canonical_GUROBI.addVar(vtype=gbp.GRB.CONTINUOUS,
                                        name='u'+str(dest+1)))
    # Update Model
    mDual_Canonical_GUROBI.update()

    #Objective Function
    mDual_Canonical_GUROBI.setObjective(gbp.quicksum(Bi[orig]*desc_var[orig][0]
                            for orig in rows),
                            gbp.GRB.MAXIMIZE)
    # Constraints
    for dest in cols:
        mDual_Canonical_GUROBI.addConstr(gbp.quicksum(Aij[orig][dest]*desc_var[dest][0]
                            for orig in rows) - Cj[dest] <= 0)
    # Optimize
    try:
        mDual_Canonical_GUROBI.optimize()
    except Exception as e:
        print '   ################################################################'
        print ' < ISSUE : ', e, ' >'
        print '   ################################################################'
    # Write LP file
    mDual_Canonical_GUROBI.write('LP.lp')
    print '\n*************************************************************************'
    print '    |   Decision Variables'
    for v in mDual_Canonical_GUROBI.getVars():
        print '    |  ', v.VarName, '=', v.x
    print '*************************************************************************'
    val = mDual_Canonical_GUROBI.objVal
    print '    |   Objective Value ------------------ ', val
    print '    |   Aij Sum -------------------------- ', AijSum
    print '    |   Cj Sum --------------------------- ', CjSum
    print '    |   Bi Sum --------------------------- ', BiSum
    print '    |   Matrix Dimensions ---------------- ', Aij.shape
    print '    |   Date/Time ------------------------ ', dt.datetime.now()
    print...


I am working on the file "Cap01/DSA-Python-Cap01-ComoUtilizarJupyterNotebook.ipynb".
The first task is:
Como Utilizar o Jupyter Notebook
Can you write Python code for it?

print("Hello World")

2 + 2

# Pressione as teclas shift e enter para executar esse código e assista o vídeo.

from IPython.display import IFrame
IFrame(src="https://www.youtube.com/embed/pu-pz77W1P8", width = "560", height = "315")


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-01-Numeros.ipynb".
The first task is:
Conversão
Can you write Python code for it?


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-01-Numeros.ipynb".
The first task is:
Função Type
Can you write Python code for it?

type(5)

type(5.0)

a = 'Eu sou uma string'
type(a)


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-01-Numeros.ipynb".
The first task is:
Funções abs, round e pow
Can you write Python code for it?

# Retorna o valor absoluto
abs(-8)

# Retorna o valor absoluto
abs(8)

# Retorna o valor com arredondamento
round(3.14151922,2)

# Potência
pow(4,2)

# Potência
pow(5,3)


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-01-Numeros.ipynb".
The first task is:
Hexadecimal e Binário
Can you write Python code for it?


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-01-Numeros.ipynb".
The first task is:
Números e Operações Matemáticas
Pressione as teclas shift e enter para executar o código em uma célula ou pressione o botão Play no menu superior
Can you write Python code for it?

# Soma
4 + 4

# Subtração
4 - 3

# Multiplicação
3 * 3

# Divisão
3 / 2

# Potência
4 ** 2

# Módulo
10 % 3


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-01-Numeros.ipynb".
The first task is:
Operações com números float
Can you write Python code for it?

3.1 + 6.4

4 + 4.0

4 + 4

# Resultado é um número float
4 / 2

# Resultado é um número inteiro
4 // 2

4 / 3.0

4 // 3.0


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-02-Variaveis.ipynb".
The first task is:
Concatenação de Variáveis
Can you write Python code for it?

nome = "Steve"

sobrenome = "Jobs"

fullName = nome + " " + sobrenome

fullName


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-02-Variaveis.ipynb".
The first task is:
Declaração Múltipla
Can you write Python code for it?

pessoa1, pessoa2, pessoa3 = "Maria", "José", "Tobias"

pessoa1

pessoa2

pessoa3

fruta1 = fruta2 = fruta3 = "Laranja"

fruta1

fruta2

# Fique atento!!! Python é case-sensitive. Criamos a variável fruta2, mas não a variável Fruta2.
# Letras maiúsculas e minúsculas tem diferença no nome da variável.
Fruta2


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-02-Variaveis.ipynb".
The first task is:
Não se pode usar palavras reservadas como nome de variável
False
class
finally
is
return
None
continue
for
lambda
try
True
def
from
nonlocal
while
and
del
global
not
with
as
elif
if
or
yield
assert
else
import
pass
break
except
in
raise
Can you write Python code for it?

# Não podemos usar palavras reservadas como nome de variável
break = 1


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-02-Variaveis.ipynb".
The first task is:
Operações com variáveis
Can you write Python code for it?

idade1 = 25

idade2 = 35

idade1 + idade2

idade2 - idade1

idade2 * idade1

idade2 / idade1

idade2 % idade1


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-02-Variaveis.ipynb".
The first task is:
Variáveis atribuídas a outras variáveis e ordem dos operadores
Can you write Python code for it?

largura = 2

altura = 4

area = largura * altura

area

perimetro = 2 * largura + 2 * altura

perimetro

# A ordem dos operadores é a mesma seguida na Matemática
perimetro = 2 * (largura + 2)  * altura

perimetro


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-02-Variaveis.ipynb".
The first task is:
Variáveis e Operadores
Can you write Python code for it?

# Atribuindo o valor 1 à variável var_teste
var_teste = 1

# Imprimindo o valor da variável
var_teste

# Imprimindo o valor da variável
print(var_teste)

# Não podemos utilizar uma variável que não foi definida. Veja a mensagem de erro.
my_var

var_teste = 2

var_teste

type(var_teste)

var_teste = 9.5

type(var_teste)

x = 1

x


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-03-Strings.ipynb".
The first task is:
Funções Built-in de Strings
Can you write Python code for it?

s

# Upper Case
s.upper()

# Lower case
s.lower()

# Dividir uma string por espaços em branco (padrão)
s.split()

# Dividir uma string por um elemento específico
s.split('y')


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-03-Strings.ipynb".
The first task is:
Funções String
Can you write Python code for it?

s = 'seja bem vindo ao universo de python'

s.capitalize()

s.count('a')

s.find('p')

s.center(20, 'z')

s.isalnum()

s.isalpha()

s.islower()

s.isspace()

s.endswith('o')

s.partition('!')


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-03-Strings.ipynb".
The first task is:
Imprimindo uma String
Can you write Python code for it?

print ('Testando Strings em Python')

print ('Testando \nStrings \nem \nPython')

print ('\n')


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-03-Strings.ipynb".
The first task is:
Nós também podemos usar a notação de índice e fatiar a string em pedaços específicos (o padrão é 1). Por exemplo, podemos usar dois pontos duas vezes em uma linha e, em seguida, um número que especifica a frequência para retornar elementos. Por exemplo:
Can you write Python code for it?


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-03-Strings.ipynb".
The first task is:
Podemos usar um : para executar um slicing que faz a leitura de tudo até um ponto designado. Por exemplo:
Can you write Python code for it?

# Retorna todos os elementos da string, começando pela posição (lembre-se que Python começa a indexação pela posição 0),
# até o fim da string.
s[1:]

# A string original permanece inalterada
s

# Retorna tudo até a posição 3
s[:3]

s[:]

# Nós também podemos usar a indexação negativa e ler de trás para frente.
s[-1]

# Retornar tudo, exceto a última letra
s[:-1]


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-05-Dicionarios.ipynb".
The first task is:
Dicionários
Can you write Python code for it?

# Isso é uma lista
estudantes_lst = ["Mateus", 24, "Fernanda", 22, "Tamires", 26, "Cristiano", 25]

estudantes_lst

# Isso é um dicionário
estudantes_dict = {"Mateus":24, "Fernanda":22, "Tamires":26, "Cristiano":25}

estudantes_dict

estudantes_dict["Mateus"]

estudantes_dict["Pedro"] = 23

estudantes_dict["Pedro"]

estudantes_dict["Tamires"]

estudantes_dict.clear()

estudantes_dict

del estudantes_dict

estudantes_dict

estudantes = {"Mateus":24, "Fernanda":22, "Tamires":26, "Cristiano":25}

estudantes

len(estudantes)

estudantes.keys()

estudantes.values()

estudantes.items()

estudantes2 = {"Maria":27, "Erika":28, "Milton":26}

estudantes2

estudantes.update(estudantes2)

estudantes

dic1 = {}

dic1

dic1["key_one"] = 2

print(dic1)

dic1[10] = 5

dic1

dic1[8.2] = "Python"

dic1

dic1["teste"] = 5

dic1

dict1 = {}

dict1

dict1["teste"] = 10

dict1["key"] = "teste"

# Atenção, pois chave e valor podem ser iguais, mas representam coisas diferentes.
dict1

dict2 = {}

dict2["key1"] = "Big Data"

dict2["key2"] = 10

dict2["key3"] = 5.6

dict2

a = dict2["key1"]

b = dict2["key2"]

c = dict2["key3"]

a, b, c

# Dicionário de listas
dict3 = {'key1':1230,'key2':[22,453,73.4],'key3':['leite','maça','batata']}

dict3

dict3['key2']

# Acessando um item da lista, dentro do dicionário
dict3['key3'][0].upper()

# Operações com itens da lista, dentro do dicionário
var1 = dict3['key2'][0] - 2

var1

# Duas operações no mesmo comando, para atualizar um item dentro da lista
dict3['key2'][0] -= 2

dict3


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-06-Tuplas.ipynb".
The first task is:
Tuplas
Can you write Python code for it?

# Criando uma tupla
tupla1 = ("Geografia", 23, "Elefantes")

# Imprimindo a tupla
tupla1

# Tuplas não suportam append()
tupla1.append("Chocolate")

# Tuplas não suportam delete de um item específico
del tupla1["Gatos"]

# Tuplas podem ter um único item
tupla1 = ("Chocolate")

tupla1

tupla1 = ("Geografia", 23, "Elefantes")

tupla1[0]

# Verificando o comprimento da tupla
len(tupla1)

# Slicing, da mesma forma que se faz com listas
tupla1[1:]

tupla1.index('Elefantes')

# Tuplas não suportam atribuição de item
tupla1[1] = 21

# Deletando a tupla
del tupla1

tupla1

# Criando uma tupla
t2 = ('A', 'B', 'C')

t2

# Tuplas não suportam atribuição de item
t2[0] = 'D'

# Usando a função list() para converter uma tupla para lista
lista_t2 = list(t2)

lista_t2

lista_t2.append('D')

# Usando a função tuple() para converter uma lista para tupla
t2 = tuple(lista_t2)

t2


I am working on the file "Cap02/Notebooks/DSA-Python-Cap02-Exercicios.ipynb".
The first task is:
Exercícios Cap02
Can you write Python code for it?

# Exercício 1 - Imprima na tela os números de 1 a 10. Use uma lista para armazenar os números.

# Exercício 2 - Crie uma lista de 5 objetos e imprima na tela

# Exercício 3 - Crie duas strings e concatene as duas em uma terceira string

# Exercício 4 - Crie uma tupla com os seguintes elementos: 1, 2, 2, 3, 4, 4, 4, 5 e depois utilize a função count do
# objeto tupla para verificar quantas vezes o número 4 aparece na tupla

# Exercício 5 - Crie um dicionário vazio e imprima na tela

# Exercício 6 - Crie um dicionário com 3 chaves e 3 valores e imprima na tela

# Exercício 7 - Adicione mais um elemento ao dicionário criado no exercício anterior e imprima na tela

# Exercício 8 - Crie um dicionário com 3 chaves e 3 valores. Um dos valores deve ser uma lista de 2 elementos numéricos.
# Imprima o dicionário na tela.

# Exercício 9 - Crie uma lista de 4 elementos. O primeiro elemento deve ser uma string,
# o segundo uma tupla de 2 elementos, o terceiro um dcionário com 2 chaves e 2 valores e
# o quarto elemento um valor do tipo float.
# Imprima a lista na tela.

# Exercício 10 - Considere a string abaixo. Imprima na tela apenas os caracteres da posição 1 a 18.
frase = 'Cientista de Dados é o profissional mais sexy do século XXI'


I am working on the file "Cap03/Notebooks/DSA-Python-Cap03-01-If-Elif-Else.ipynb".
The first task is:
Condicionais Aninhados
Can you write Python code for it?

idade = 18
if idade > 17:
    print("Você pode dirigir!")

Nome = "Bob"
if idade > 13:
    if Nome == "Bob":
        print("Ok Bob, você está autorizado a entrar!")
    else:
        print("Desculpe, mas você não pode entrar!")

idade = 13
Nome = "Bob"
if idade >= 13 and Nome == "Bob":
    print("Ok Bob, você está autorizado a entrar!")

idade = 12
Nome = "Bob"
if (idade >= 13) or (Nome == "Bob"):
    print("Ok Bob, você está autorizado a entrar!")


I am working on the file "Cap03/Notebooks/DSA-Python-Cap03-01-If-Elif-Else.ipynb".
The first task is:
Condicional If
Can you write Python code for it?

# Condicional If
if 5 > 2:
    print("Python funciona!")

# Statement If...Else
if 5 < 2:
    print("Python funciona!")
else:
    print("Algo está errado!")

6 > 3

3 > 7

4 < 8

4 >= 4

if 5 == 5:
    print("Testando Python!")

if True:
    print('Parece que Python funciona!')

# Atenção com a sintaxe
if 4 > 3
    print("Tudo funciona!")

# Atenção com a sintaxe
if 4 > 3:
print("Tudo funciona!")


I am working on the file "Cap03/Notebooks/DSA-Python-Cap03-01-If-Elif-Else.ipynb".
The first task is:
Operadores Lógicos
Can you write Python code for it?

idade = 18
nome = "Bob"
if idade > 17:
    print("Você pode dirigir!")

idade = 18
if idade > 17 and nome == "Bob":
    print("Autorizado!")

# Usando mais de uma condição na cláusula if

disciplina = input('Digite o nome da disciplina: ')
nota_final = input('Digite a nota final (entre 0 e 100): ')

if disciplina == 'Geografia' and nota_final >= '70':
    print('Você foi aprovado!')
else:
    print('Lamento, acho que você precisa estudar mais!')

# Usando mais de uma condição na cláusula if e introduzindo Placeholders

disciplina = input('Digite o nome da disciplina: ')
nota_final = input('Digite a nota final (entre 0 e 100): ')
semestre = input('Digite o semestre (1 a 4): ')

if disciplina == 'Geografia' and nota_final >= '50' and int(semestre) != 1:
    print('Você foi aprovado em %s com média final %r!' %(disciplina, nota_final))
else:
    print('Lamento, acho que você precisa estudar mais!')


I am working on the file "Cap03/Notebooks/DSA-Python-Cap03-02-For.ipynb".
The first task is:
Loops Aninhados
Can you write Python code for it?

# Loops aninhados
for i in range(0,5):
    for a in range(0,5):
        print(a)

# Operando os valores de uma lista com loop for
listaB = [32,53,85,10,15,17,19]
soma = 0
for i in listaB:
    double_i = i * 2
    soma += double_i

print(soma)

# Loops em lista de listas
listas = [[1,2,3], [10,15,14], [10.1,8.7,2.3]]
for valor in listas:
    print(valor)

# Contando os itens de uma lista
lista = [5,6,10,13,17]
count = 0
for item in lista:
    count += 1

print(count)

# Contando o número de colunas
lst = [[1,2,3],[3,4,5],[5,6,7]]
primeira_linha = lst[0]
count = 0
for column in primeira_linha:
    count = count + 1

print(count)

# Pesquisando em listas
listaC = [5, 6, 7, 10, 50]

# Loop através da lista
for item in listaC:
    if item == 5:
        print("Número encontrado na lista!")

# Listando as chaves de um dicionário
dict = {'k1':'Python','k2':'R','k3':'Scala'}
for item in dict:
    print(item)

# Imprimindo chave e valor do dicionário. Usando o método items() para retornar os itens de um dicionário
for k,v in dict.items():
    print (k,v)


I am working on the file "Cap03/Notebooks/DSA-Python-Cap03-03-While.ipynb".
The first task is:
While
Can you write Python code for it?

# Usando o loop while para imprimir os valores de 0 a 9
counter = 0
while counter < 10:
    print(counter)
    counter = counter + 1

# Também é possível usar a claúsula else para encerrar o loop while
x = 0

while x < 10:
    print ('O valor de x nesta iteração é: ', x)
    print (' x ainda é menor que 10, somando 1 a x')
    x += 1

else:
    print ('Loop concluído!')


I am working on the file "Cap03/Notebooks/DSA-Python-Cap03-03-While.ipynb".
The first task is:
While e For juntos
Can you write Python code for it?

for i in range(2,30):
    j = 2
    counter = 0
    while j < i:
        if i % j == 0:
            counter = 1
            j = j + 1
        else:
            j = j + 1

    if counter == 0:
        print(str(i) + " é um número primo")
        counter = 0
    else:
        counter = 0


I am working on the file "Cap03/Notebooks/DSA-Python-Cap03-05-Metodos.ipynb".
The first task is:
Métodos
Can you write Python code for it?

# Criando uma lista
lst = [100, -2, 12, 65, 0]

# Usando um método do objeto lista
lst.append(10)

# Imprimindo a lista
lst

# Usando um método do objeto lista
lst.count(10)

# A função help() explica como utilizar cada método de um objeto
help(lst.count)

# A função dir() mostra todos os métodos e atributos de um objeto
dir(lst)

a = 'Isso é uma string'

# O método de um objeto pode ser chamado dentro de uma função, como print()
print (a.split())


I am working on the file "Cap03/Notebooks/DSA-Python-Cap03-Exercicios-Funcoes-Solucao.ipynb".
The first task is:
Exercícios - Métodos e Funções
Can you write Python code for it?

# Exercício 1 - Crie uma função que imprima a sequência de números pares entre 1 e 20 (a função não recebe parâmetro) e
# depois faça uma chamada à função para listar os números
def listaPar():
    for i in range(2, 21, 2):
        print(i)

listaPar()

# Exercício 2 - Crie uam função que receba uma string como argumento e retorne a mesma string em letras maiúsculas.
# Faça uma chamada à função, passando como parâmetro uma string
def listaString(texto):
    print(texto.upper())
    return

listaString('Rumo à Análise de Dados')

# Exercício 3 - Crie uma função que receba como parâmetro uma lista de 4 elementos, adicione 2 elementos a lista e
# imprima a lista
def novaLista(lista):
    print(lista.append(5))
    print(lista.append(6))

lista1 = [1, 2, 3, 4]
novaLista(lista1)
print(lista1)

# Exercício 4 - Crie uma função que receba um argumento formal e uma possível lista de elementos. Faça duas chamadas
# à função, com apenas 1 elemento e na segunda chamada com 4 elementos
def printNum( arg1, *lista ):
    print (arg1)
    for i in lista:
        print (i)
    return;

# Chamada à função
printNum( 100 )
printNum( 'A', 'B', 'C' )

# Exercício 5 - Crie uma função anônima e atribua seu retorno a uma variável chamada soma. A expressão vai receber 2
# números como parâmetro e retornar a soma deles
soma = lambda arg1, arg2: arg1 + arg2
print ("A soma é : ", soma( 452, 298 ))

# Exercício 6 - Execute o código abaixo e certifique-se que compreende a diferença entre variável global e local

total = 0
def soma( arg1, arg2 ):
    total = arg1 + arg2;
    print ("Dentro da função o total é: ", total)
    return total;

soma( 10, 20 );
print ("Fora da função o total é: ", total)

# Exercício 7 - Abaixo você encontra uma lista com temperaturas em graus Celsius
# Crie uma função anônima que converta cada temperatura para Fahrenheit
# Dica: para conseguir realizar este exercício, você deve criar sua função lambda, dentro de uma função
# (que será estudada no próximo capítulo). Isso permite...


I am working on the file "Cap03/Notebooks/DSA-Python-Cap03-Exercicios-Loops-Condiconais-Solucao.ipynb".
The first task is:
Exercícios - Loops e Condiconais - Solução
Can you write Python code for it?

# Exercício 1 - Crie uma estrutura que pergunte ao usuário qual o dia da semana. Se o dia for igual a Domingo ou
# igual a sábado, imprima na tela "Hoje é dia de descanso", caso contrário imprima na tela "Você precisa trabalhar!"
dia = input('Digite o dia da semana: ')
if dia == 'Domingo' or dia == 'Sábado':
    print("Hoje é dia de descanso")
else:
    print("Você precisa trabalhar!")

# Exercício 2 - Crie uma lista de 5 frutas e verifique se a fruta 'Morango' faz parte da lista
lista = ['Laranja', 'Maça', 'Abacaxi', 'Uva', 'Morango']
for fruta in lista:
    if fruta == 'Morango':
        print("Morango faz parte da lista de frutas")

# Exercício 3 - Crie uma tupla de 4 elementos, multiplique cada elemento da tupla por 2 e guarde os resultados em uma
# lista
tup1 = (1, 2, 3, 4)
lst1 = []
for i in tup1:
    novo_valor = i * 2
    lst1.append(novo_valor)
print(lst1)

# Exercício 4 - Crie uma sequência de números pares entre 100 e 150 e imprima na tela
for i in range(100, 151, 2):
    print(i)

# Exercício 5 - Crie uma variável chamada temperatura e atribua o valor 40. Enquanto temperatura for maior que 35,
# imprima as temperaturas na tela
temperatura = 40
while temperatura > 35:
    print(temperatura)
    temperatura = temperatura - 1

# Exercício 6 - Crie uma variável chamada contador = 0. Enquanto counter for menor que 100, imprima os valores na tela,
# mas quando for encontrado o valor 23, interrompa a execução do programa
contador = 0
while contador < 100:
    if contador == 23:
        break
    print(contador)
    contador += 1

# Exercício 7 - Crie uma lista vazia e uma variável com valor 4. Enquanto o valor da variável for menor ou igual a 20,
# adicione à lista, apenas os valores pares e imprima a lista
numeros = list()
i = 4
while (i <= 20):
    numeros.append(i)
    i = i+2
print(numeros)

# Exercício 8 - Transforme o resultado desta função range em uma lista: range(5, 45, 2)
nums = range(5, 45, 2)
print(list(nums))

# Exercício 9 - Faça a correção dos erros no código abaixo e execute o...


I am working on the file "Cap03/Notebooks/DSA-Python-Cap03-Exercicios-Loops-Condiconais.ipynb".
The first task is:
Exercícios - Loops e Condiconais
Can you write Python code for it?

# Exercício 1 - Crie uma estrutura que pergunte ao usuário qual o dia da semana. Se o dia for igual a Domingo ou
# igual a sábado, imprima na tela "Hoje é dia de descanso", caso contrário imprima na tela "Você precisa trabalhar!"

# Exercício 2 - Crie uma lista de 5 frutas e verifique se a fruta 'Morango' faz parte da lista

# Exercício 3 - Crie uma tupla de 4 elementos, multiplique cada elemento da tupla por 2 e guarde os resultados em uma
# lista

# Exercício 4 - Crie uma sequência de números pares entre 100 e 150 e imprima na tela

# Exercício 5 - Crie uma variável chamada temperatura e atribua o valor 40. Enquanto temperatura for maior que 35,
# imprima as temperaturas na tela

# Exercício 6 - Crie uma variável chamada contador = 0. Enquanto counter for menor que 100, imprima os valores na tela,
# mas quando for encontrado o valor 23, interrompa a execução do programa

# Exercício 7 - Crie uma lista vazia e uma variável com valor 4. Enquanto o valor da variável for menor ou igual a 20,
# adicione à lista, apenas os valores pares e imprima a lista

# Exercício 8 - Transforme o resultado desta função range em uma lista: range(5, 45, 2)
nums = range(5, 45, 2)

# Exercício 9 - Faça a correção dos erros no código abaixo e execute o programa. Dica: são 3 erros.
temperatura = float(input('Qual a temperatura? '))
if temperatura > 30
print('Vista roupas leves.')
else
    print('Busque seus casacos.')

# Exercício 10 - Faça um programa que conte quantas vezes a letra "r" aparece na frase abaixo. Use um placeholder na
# sua instrução de impressão

# “É melhor, muito melhor, contentar-se com a realidade; se ela não é tão brilhante como os sonhos, tem pelo menos a
# vantagem de existir.” (Machado de Assis)

frase = "É melhor, muito melhor, contentar-se com a realidade; se ela não é tão brilhante como os sonhos, tem pelo menos a vantagem de existir."


I am working on the file "Cap04/Notebooks/DSA-Python-Cap04-02-Arquivos-Parte2.ipynb".
The first task is:
Manipulando Arquivos CSV (comma-separated values )
Can you write Python code for it?

# Importando o módulo csv
import csv

with open('arquivos/numeros.csv','w') as arquivo:
    writer = csv.writer(arquivo)
    writer.writerow(('primeira','segunda','terceira'))
    writer.writerow((55,93,76))
    writer.writerow((62,14,86))

# Leitura de arquivos csv
with open('arquivos/numeros.csv','r') as arquivo:
    leitor = csv.reader(arquivo)
    for x in leitor:
        print ('Número de colunas:', len(x))
        print(x)

# Código alternativo para eventuais problemas com linhas em branco no arquivo
with open('arquivos/numeros.csv','r', encoding='utf8', newline = '\r\n') as arquivo:
    leitor = csv.reader(arquivo)
    for x in leitor:
        print ('Número de colunas:', len(x))
        print(x)

# Gerando uma lista com dados do arquivo csv
with open('arquivos/numeros.csv','r') as arquivo:
    leitor = csv.reader(arquivo)
    dados = list(leitor)

print (dados)

# Impriminfo a partir da segunda linha
for linha in dados[1:]:
    print (linha)


I am working on the file "Cap04/Notebooks/DSA-Python-Cap04-04-Datetime.ipynb".
The first task is:
Datetime
Esse módulo permite a manipulação de datas em Python.
Can you write Python code for it?

import datetime

agora = datetime.datetime.now()

agora

t = datetime.time(7, 43, 28)

print (t)

print ('Hora  :', t.hour)
print ('Minute:', t.minute)
print ('Segundo:', t.second)
print ('Microsegundo:', t.microsecond)

print(datetime.time.min)

hoje = datetime.date.today()

print (hoje)
print ('ctime:', hoje.ctime())
print ('Ano:', hoje.year)
print ('Mês :', hoje.month)
print ('Dia :', hoje.day)

d1 = datetime.date(2015, 4, 28)
print ('d1:', d1)

d2 = d1.replace(year=2016)
print ('d2:', d2)

# Diferença em dias entre duas datas
d2 - d1


I am working on the file "Cap04/Notebooks/DSA-Python-Cap04-05-Map.ipynb".
The first task is:
Map
Can you write Python code for it?

# Criando duas funções

# Função 1 - Recebe uma temperatura como parâmetro e retorna a temperatura em Fahrenheit
def fahrenheit(T):
    return ((float(9)/5)*T + 32)

# Função 2 - Recebe uma temperatura como parâmetro e retorna a temperatura em Celsius
def celsius(T):
    return (float(5)/9)*(T-32)

# Criando uma lista
temperaturas = [0, 22.5, 40, 100]

# Aplicando a função a cada elemento da lista de temperaturas.
# Em Python 3, a funçãp map() retornar um iterator
map(fahrenheit, temperaturas)

# Função map() reotrnando a lista de temperaturas convertidas em Fahrenheit
list(map(fahrenheit, temperaturas))

# Usando um loop for para imprimir o resultado da função map()
for temp in map(fahrenheit, temperaturas):
    print(temp)

# Convertendo para Celsius
map(celsius, temperaturas)

list(map(celsius, temperaturas))

# Usando lambda
map(lambda x: (5.0/9)*(x - 32), temperaturas)

list(map(lambda x: (5.0/9)*(x - 32), temperaturas))

# Somando os elementos de 2 listas
a = [1,2,3,4]
b = [5,6,7,8]

list(map(lambda x,y:x+y, a, b))

# Somando os elementos de 3 listas
a = [1,2,3,4]
b = [5,6,7,8]
c = [9,10,11,12]

list(map(lambda x,y,z:x+y+z, a, b, c))


I am working on the file "Cap04/Notebooks/DSA-Python-Cap04-09-Zip.ipynb".
The first task is:
Zip
Can you write Python code for it?

# Criando duas listas
x = [1,2,3]
y = [4,5,6]

# Unindo as listas. Em Python3 retorna um iterator
zip(x, y)

# Perceba que zip retorna tuplas. Neste caso, uma lista de tuplas
list(zip(x,y))

# Atenção quando as sequências tiverem número diferente de elementos
list(zip('ABCD', 'xy'))

# Criando duas listas
a = [1,2,3]
b = [4,5,6,7,8]

list(zip(a,b))

# Criando 2 dicionários
d1 = {'a':1,'b':2}
d2 = {'c':4,'d':5}

# Zip vai unir as chaves
list(zip(d1,d2))

# Zip pode unir os valores (itens)
list(zip(d1, d2.values()))

# Criando uma função para trocar valores entre 2 dicionários
def trocaValores(d1, d2):
    dicTemp = {}

    for d1key, d2val in zip(d1,d2.values()):
        dicTemp[d1key] = d2val

    return dicTemp

trocaValores(d1, d2)


I am working on the file "Cap04/Notebooks/DSA-Python-Cap04-10-Enumerate.ipynb".
The first task is:
Enumerate
Can you write Python code for it?

# Criando uma lista
seq = ['a','b','c']

enumerate(seq)

list(enumerate(seq))

# Imprimindo os valores de uma lista com a função enumerate() e seus respectivos índices
for indice, valor in enumerate(seq):
    print (indice, valor)

for indice, valor in enumerate(seq):
    if indice >= 2:
        break
    else:
        print (valor)

lista = ['Marketing', 'Tecnologia', 'Business']

for i, item in enumerate(lista):
    print(i, item)

for i, item in enumerate('Isso é uma string'):
    print(i, item)

for i, item in enumerate(range(10)):
    print(i, item)


I am working on the file "Cap04/Notebooks/DSA-Python-Cap04-11-Erros-e-Excecoes.ipynb".
The first task is:
Erros e Exceções
Can you write Python code for it?

# Erro
print('Olá)

# Criando uma função
def numDiv (num1, num2):
    resultado = num1 / num2
    print(resultado)

# Execução não gera erro
numDiv(4,2)

# Execução gerando erro
numDiv(4,0)


I am working on the file "Cap04/Notebooks/DSA-Python-Cap04-11-Erros-e-Excecoes.ipynb".
The first task is:
Try, Except, Finally
Can you write Python code for it?

8 + 's'

# Utilizando try e except
try:
    8 + 's'
except TypeError:
    print("Operação não permitida")

# Utilizando try, except e else
try:
    f = open('arquivos/testandoerros.txt','w')
    f.write('Gravando no arquivo')
except IOError:
    print ("Erro: arquivo não encontrado ou não pode ser salvo.")
else:
    print ("Conteúdo gravado com sucesso!")
    f.close()

# Utilizando try, except e else
try:
    f = open('arquivos/testandoerros','r')
except IOError:
    print ("Erro: arquivo não encontrado ou não pode ser lido.")
else:
    print ("Conteúdo gravado com sucesso!")
    f.close()

try:
    f = open('arquivos/testandoerros.txt','w')
    f.write('Gravando no arquivo')
except IOError:
    print ("Erro: arquivo não encontrado ou não pode ser salvo.")
else:
    print ("Conteúdo gravado com sucesso!")
    f.close()
finally:
    print ("Comandos no bloco finally são sempre executados!")

def askint():
    try:
        val = int((input("Digite um número: ")))
    except UnboundLocalError:
        print ("Você não digitou um número!")
    finally:
        print ("Obrigado!")
        print (val)

askint()

def askint():
        try:
            val = int(input("Digite um número: "))
        except:
            print ("Você não digitou um número!")
            val = int(input("Tente novamente. Digite um número: "))
        finally:
            print ("Obrigado!")
        print (val)

askint()

def askint():
    while True:
        try:
            val = int(input("Digite um número: "))
        except:
            print ("Você não digitou um número!")
            continue
        else:
            print ("Obrigado por digitar um número!")
            break
        finally:
            print("Fim da execução!")
        print (val)

askint()

tuple = (1,2,3,4,5)
try:
    tuple.append(6)
    for each in tuple:
        print(each)
except AttributeError as e:
    print('Erro: ', e)
except IOError as e:
    print('Erro de I/O:', e)


I am working on the file "Cap04/Notebooks/DSA-Python-Cap04-ExercicioS.ipynb".
The first task is:
Exercícios
Can you write Python code for it?

# Exercício 1 - Crie uma lista de 3 elementos e calcule a terceira potência de cada elemento.

# Exercício 2 - Reescreva o código abaixo, usando a função map(). O resultado final deve ser o mesmo!
palavras = 'A Data Science Academy oferce os melhores cursos de análise de dados do Brasil'.split()
resultado = [[w.upper(), w.lower(), len(w)] for w in palavras]
for i in resultado:
    print (i)

# Exercício 3 - Calcule a matriz transposta da matriz abaixo.
# Caso não saiba o que é matriz transposta, visite este link: https://pt.wikipedia.org/wiki/Matriz_transposta
# Matriz transposta é um conceito fundamental na construção de redes neurais artificiais, base de sistemas de IA.
matrix = [[1, 2],[3,4],[5,6],[7,8]]

# Exercício 4 - Crie duas funções, uma para elevar um número ao quadrado e outra para elevar ao cubo.
# Aplique as duas funções aos elementos da lista abaixo.
# Obs: as duas funções devem ser aplicadas simultaneamente.
lista = [0, 1, 2, 3, 4]

# Exercício 5 - Abaixo você encontra duas listas. Faça com que cada elemento da listaA seja elevado
# ao elemento correspondente na listaB.
listaA = [2, 3, 4]
listaB = [10, 11, 12]

# Exercício 6 - Considerando o range de valores abaixo, use a função filter() para retornar apenas os valores negativos.
range(-5, 5)

# Exercício 7 - Usando a função filter(), encontre os valores que são comuns às duas listas abaixo.
a = [1,2,3,5,7,9]
b = [2,3,5,6,7,8]

# Exercício 8 - Considere o código abaixo. Obtenha o mesmo resultado usando o pacote time.
# Não conhece o pacote time? Pesquise!
import datetime
print (datetime.datetime.now().strftime("%d/%m/%Y %H:%M"))

# Exercício 9 - Considere os dois dicionários abaixo.
# Crie um terceiro dicionário com as chaves do dicionário 1 e os valores do dicionário 2.
dict1 = {'a':1,'b':2}
dict2 = {'c':4,'d':5}

# Exercício 10 - Considere a lista abaixo e retorne apenas os elementos cujo índice for maior que 5.
lista = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']


I am working on the file "Cap05/Notebooks/DSA-Python-Cap05-03-Metodos.ipynb".
The first task is:
Métodos
Can you write Python code for it?

# Criando uma classe chamada Circulo
class Circulo():

    # O valor de pi é constante
    pi = 3.14

    # Quando um objeto desta classe for criado, este método será executado e o valor default do raio será 5.
    def __init__(self, raio = 5):
        self.raio = raio

    # Esse método calcula a área. Self utiliza os atributos deste mesmo objeto
    def area(self):
        return (self.raio * self.raio) * Circulo.pi

    # Método para gerar um novo raio
    def setRaio(self, novo_raio):
        self.raio = novo_raio

    # Método para obter o raio do círculo
    def getRaio(self):
        return self.raio

# Criando o objeto circ. Uma instância da classe Circulo()
circ = Circulo()

# Executando um método da classe Circulo
circ.getRaio()

# Criando outro objeto chamado circ1. Uma instância da classe Circulo()
# Agora sobrescrevendo o valor do atributo
circ1 = Circulo(7)

# Executando um método da classe Circulo
circ1.getRaio()

# Imprimindo o raio
print ('O raio é: ', circ.getRaio())

# Imprimindo a area
print('Area igual a: ', circ.area())

# Gerando um novo valor para o raio do círculo
circ.setRaio(3)

# Imprimindo o novo raio
print ('Novo raio igual a: ', circ.getRaio())


I am working on the file "Cap05/Notebooks/DSA-Python-Cap05-04-Heranca.ipynb".
The first task is:
Herança
Can you write Python code for it?

# Criando a classe Animal - Super-classe
class Animal():

    def __init__(self):
        print("Animal criado")

    def Identif(self):
        print("Animal")

    def comer(self):
        print("Comendo")

# Criando a classe Cachorro - Sub-classe
class Cachorro(Animal):

    def __init__(self):
        Animal.__init__(self)
        print("Objeto Cachorro criado")

    def Identif(self):
        print("Cachorro")

    def latir(self):
        print("Au Au!")

# Criando um objeto (Instanciando a classe)
rex = Cachorro()

# Executando o método da classe Cachorro (sub-classe)
rex.Identif()

# Executando o método da classe Animal (super-classe)
rex.comer()

# Executando o método da classe Cachorro (sub-classe)
rex.latir()


I am working on the file "Cap05/Notebooks/DSA-Python-Cap05-Exercicios.ipynb".
The first task is:
Exercícios
Can you write Python code for it?

# Exercício 1 - Crie um objeto a partir da classe abaixo, chamado roc1, passando 2 parâmetros e depois faça uma chamada
# aos atributos e métodos
from math import sqrt

class Rocket():

    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def move_rocket(self, x_increment=0, y_increment=1):
        self.x += x_increment
        self.y += y_increment

    def print_rocket(self):
        print(self.x, self.y)

# Exercício 2 - Crie uma classe chamada Pessoa() com os atributos: nome, cidade, telefone e e-mail. Use pelo menos 2
# métodos especiais na sua classe. Crie um objeto da sua classe e faça uma chamada a pelo menos um dos seus métodos
# especiais.

# Exercício 3 - Crie a classe Smartphone com 2 atributos, tamanho e interface e crie a classe MP3Player com os
# atributos capacidade. A classe MP3player deve herdar os atributos da classe Smartphone.


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-02-Insert no SQLite.ipynb".
The first task is:
Criando o Banco de Dados e Inserindo Dados
Can you write Python code for it?

# Reemove o arquivo com o banco de dados SQLite (caso exista)
import os
os.remove("dsa.db") if os.path.exists("dsa.db") else None

import sqlite3

# Criando uma conexão
conn = sqlite3.connect('dsa.db')

# Criando um cursor
c = conn.cursor()

# Função para criar uma tabela
def create_table():
    c.execute('CREATE TABLE IF NOT EXISTS produtos(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, date TEXT, '\
              'prod_name TEXT, valor REAL)')

# Função para inserir uma linha
def data_insert():
    c.execute("INSERT INTO produtos VALUES(10, '2020-05-02 14:32:11', 'Teclado', 90 )")
    conn.commit()
    c.close()
    conn.close()

# Criar tabela
create_table()

# Inserir dados
data_insert()


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-04-Select no SQLite.ipynb".
The first task is:
Leitura de dados
Can you write Python code for it?

import sqlite3
import random
import time
import datetime

# Criando uma conexão
conn = sqlite3.connect('dsa.db')

# Criando um cursor
c = conn.cursor()

# Função para criar uma tabela
def create_table():
    c.execute('CREATE TABLE IF NOT EXISTS produtos(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, date TEXT, '\
              'prod_name TEXT, valor REAL)')

# Função para inserir uma linha
def data_insert():
    c.execute("INSERT INTO produtos VALUES(002, '02-05-2020', 'teclado', 130 )")
    conn.commit()
    c.close()
    conn.close()

# Usando variáveis para inserir dados
def data_insert_var():
    new_date = datetime.datetime.now()
    new_prod_name = 'monitor'
    new_valor = random.randrange(50,100)
    c.execute("INSERT INTO produtos (date, prod_name, valor) VALUES (?, ?, ?, ?)",
              (new_date, new_prod_name, new_valor))
    conn.commit()

# Leitura de dados
def leitura_todos_dados():
    c.execute("SELECT * FROM PRODUTOS")
    for linha in c.fetchall():
        print(linha)

# Leitura de registros específicos
def leitura_registros():
    c.execute("SELECT * FROM PRODUTOS WHERE valor > 60.0")
    for linha in c.fetchall():
        print(linha)

# Leitura de colunas específicos
def leitura_colunas():
    c.execute("SELECT * FROM PRODUTOS")
    for linha in c.fetchall():
        print(linha[3])

# Select nos dados
leitura_todos_dados()

# Leitura de registros específicos
leitura_registros()

# Leitura de colunas específicas
leitura_colunas()

# Encerrando a conexão
c.close()
conn.close()


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-06-Criando Graficos com Matplotlib e SQLite.ipynb".
The first task is:
Gráficos
Can you write Python code for it?

# Instala a versão exata do pacote matplotlib
!pip install -q -U matplotlib==3.2.1

import matplotlib as mat
mat.__version__

import sqlite3
import random
import datetime
import matplotlib.pyplot as plt
%matplotlib notebook

# Criando uma conexão
conn = sqlite3.connect('dsa.db')

# Criando um cursor
c = conn.cursor()

# Função para criar uma tabela
def create_table():
    c.execute('CREATE TABLE IF NOT EXISTS produtos(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, date TEXT, '\
              'prod_name TEXT, valor REAL)')

# Função para inserir uma linha
def data_insert():
    c.execute("INSERT INTO produtos VALUES(now, 'Teclado', 130 )")
    conn.commit()
    c.close()
    conn.close()

# Usando variáveis para inserir dados
def data_insert_var():
    new_date = datetime.datetime.now()
    new_prod_name = 'monitor'
    new_valor = random.randrange(50,100)
    c.execute("INSERT INTO produtos (date, prod_name, valor) VALUES (?, ?, ?, ?)",
              (new_date, new_prod_name, new_valor))
    conn.commit()

# Leitura de dados
def leitura_todos_dados():
    c.execute("SELECT * FROM PRODUTOS")
    for linha in c.fetchall():
        print(linha)

# Leitura de registros específicos
def leitura_registros():
    c.execute("SELECT * FROM PRODUTOS WHERE valor > 60.0")
    for linha in c.fetchall():
        print(linha)

# Leitura de colunas específicos
def leitura_colunas():
    c.execute("SELECT * FROM PRODUTOS")
    for linha in c.fetchall():
        print(linha[3])

# Update
def atualiza_dados():
    c.execute("UPDATE produtos SET valor = 70.00 WHERE valor > 80.0")
    conn.commit()

# Delete
def remove_dados():
    c.execute("DELETE FROM produtos WHERE valor = 62.0")
    conn.commit()

# Gerar gráfico com os dados no banco de dados
def dados_grafico():
    c.execute("SELECT id, valor FROM produtos")
    ids = []
    valores = []
    dados = c.fetchall()
    for linha in dados:
        ids.append(linha[0])
        valores.append(linha[1])

   ...


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-07-Criando um Banco de Dados no MongoDB.ipynb".
The first task is:
Dados no MongoDB são representados (e armazenados) usando documentos JSON (Java Script Object Notation). Com o PyMongo usamos dicionários para representar documentos.
Can you write Python code for it?

post1 = {"codigo": "ID-9987725",
        "prod_name": "Geladeira",
        "marcas": ["brastemp", "consul", "elecrolux"],
        "data_cadastro": datetime.datetime.utcnow()}

type(post1)

collection = db.posts

post_id = collection.insert_one(post1)

post_id.inserted_id

# Quando um documento é inserido uma chave especial, "_id", é adicionada
# automaticamente se o documento ainda não contém uma chave "_id".
post_id

post2 = {"codigo": "ID-2209876",
        "prod_name": "Televisor",
        "marcas": ["samsung", "panasonic", "lg"],
        "data_cadastro": datetime.datetime.utcnow()}

collection = db.posts

post_id = collection.insert_one(post2).inserted_id

post_id

collection.find_one({"prod_name": "Televisor"})

# A função find() retorna um cursor e podemos então navegar pelos dados
for post in collection.find():
    print(post)

# Verificando o nome do banco de dados
db.name

# Listando as coleções disponíveis
# db.collection_names()
db.list_collection_names()


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-07-Criando um Banco de Dados no MongoDB.ipynb".
The first task is:
Uma nota importante sobre coleções (e bancos de dados) no MongoDB é que eles são criados posteriormente - nenhum dos comandos acima executou efetivamente qualquer operação no servidor MongoDB. Coleções e bancos de dados são criados quando o primeiro documento é inserido.
Can you write Python code for it?


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-08-Retornando Dados do MongoDB.ipynb".
The first task is:
Retornando Dados no MongoDB com PyMongo
Can you write Python code for it?

# Importamos o Módulo PyMongo
import pymongo

# Criando a conexão com o MongoDB (neste caso, conexão padrão)
client_con = pymongo.MongoClient()

# Listando os bancos de dados disponíveis
# client_con.database_names()
client_con.list_database_names()

# Definindo o objeto db
db = client_con.cadastrodb

# Listando as coleções disponíveis
# db.collection_names()
db.list_collection_names()

# Criando uma coleção
db.create_collection("mycollection")

# Listando as coleções disponíveis
# db.collection_names()
db.list_collection_names()

# Inserindo um documento na coleção criada
db.mycollection.insert_one({
   'titulo': 'MongoDB com Python',
   'descricao': 'MongoDB é um Banco de Dados NoSQL',
   'by': 'Data Science Academy',
   'url': 'http://www.datascienceacademy.com.br',
   'tags': ['mongodb', 'database', 'NoSQL'],
   'likes': 100
})

# Retornando o documento criado
db.mycollection.find_one()

# Preparando um documento
doc1 = {"Nome":"Donald","sobrenome":"Trump","twitter":"@POTUS"}

# Inserindo um documento
db.mycollection.insert_one(doc1)

# Preparando um documento
doc2 = {"Site":"http://www.datascienceacademy.com.br",
        "facebook":"facebook.com/dsacademybr"}

# Inserindo um documento
db.mycollection.insert_one(doc2)

# Retornando os documentos na coleção
for rec in db.mycollection.find():
    print(rec)

# Conectando a uma coleção
col = db["mycollection"]

type(col)

# Contando os documentos em uma coleção
# col.count()
col.estimated_document_count()

# Encontrando um único documento
redoc = col.find_one()

redoc


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-09-Mini-Projeto1.ipynb".
The first task is:
'Logistics' é o filme mais longo da história (até este momento), com 857 horas (51420 minutos). Dirigido por Daniel Andersson e Erika Magnusson, o filme acompanha todo o ciclo de vida de um pedômetro (dispositivo de rastreamento de passos) em ordem cronológica reversa.
7- Qual a Relação Entre Duração e Gênero?
Relação entre duração do filme e gênero.
Can you write Python code for it?

# Consulta SQL
consulta7 = '''
            SELECT AVG(runtime_minutes) Runtime, genres
            FROM titles
            WHERE type = 'movie'
            AND runtime_minutes != 'NaN'
            GROUP BY genres
            '''

# Resultado
resultado7 = pd.read_sql_query(consulta7, conn)

# Retorna gêneros únicos
generos_unicos = retorna_generos(resultado7)

# Visualiza
generos_unicos

# Calcula duração por gênero
genero_runtime = []
for item in generos_unicos:
    consulta = 'SELECT runtime_minutes Runtime FROM  titles  WHERE genres LIKE '+ '\''+'%'+item+'%'+'\' AND type=\'movie\' AND Runtime!=\'NaN\''
    resultado = pd.read_sql_query(consulta, conn)
    genero_runtime.append(np.median(resultado['Runtime']))

# Prepara o dataframe
df_genero_runtime = pd.DataFrame()
df_genero_runtime['genre'] = generos_unicos
df_genero_runtime['runtime'] = genero_runtime

# Remove índice 18 (news)
df_genero_runtime = df_genero_runtime.drop(index = 18)

# Ordena os dados
df_genero_runtime = df_genero_runtime.sort_values(by = 'runtime', ascending = False)

# Plot

# Tamanho da figura
plt.figure(figsize = (16,8))

# Barplot
sns.barplot(y = df_genero_runtime.genre, x = df_genero_runtime.runtime, orient = "h")

# Loop
for i in range(len(df_genero_runtime.index)):
    plt.text(df_genero_runtime.runtime[df_genero_runtime.index[i]],
             i + 0.25,
             round(df_genero_runtime["runtime"][df_genero_runtime.index[i]], 2))

plt.ylabel('Gênero')
plt.xlabel('\nMediana de Tempo de Duração (Minutos)')
plt.title('\nRelação Entre Duração e Gênero\n')
plt.show()


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-09-Mini-Projeto1.ipynb".
The first task is:
3- Qual a Mediana de Avaliação dos Filmes Por Gênero?
Mediana de avaliação dos filmes.
Can you write Python code for it?

# Consulta SQL
consulta3 = '''
            SELECT rating, genres FROM
            ratings JOIN titles ON ratings.title_id = titles.title_id
            WHERE premiered <= 2022 AND type = 'movie'
            '''

# Resultado
resultado3 = pd.read_sql_query(consulta3, conn)

# Visualiza
display(resultado3)

# Vamos criar uma função para retornar os genêros
def retorna_generos(df):
    df['genres'] = df['genres'].str.lower().values
    temp = df['genres'].dropna()
    vetor = CountVectorizer(token_pattern = '(?u)\\b[\\w-]+\\b', analyzer = 'word').fit(temp)
    generos_unicos =  vetor.get_feature_names()
    generos_unicos = [genre for genre in generos_unicos if len(genre) > 1]
    return generos_unicos

# Aplica a função
generos_unicos = retorna_generos(resultado3)

# Visualiza
generos_unicos

# Cria listas vazias
genero_counts = []
genero_ratings = []

# Loop
for item in generos_unicos:

    # Retorna a contagem de filmes por gênero
    consulta = 'SELECT COUNT(rating) FROM ratings JOIN titles ON ratings.title_id=titles.title_id WHERE genres LIKE '+ '\''+'%'+item+'%'+'\' AND type=\'movie\''
    resultado = pd.read_sql_query(consulta, conn)
    genero_counts.append(resultado.values[0][0])

     # Retorna a avaliação de filmes por gênero
    consulta = 'SELECT rating FROM ratings JOIN titles ON ratings.title_id=titles.title_id WHERE genres LIKE '+ '\''+'%'+item+'%'+'\' AND type=\'movie\''
    resultado = pd.read_sql_query(consulta, conn)
    genero_ratings.append(np.median(resultado['rating']))

# Prepara o dataframe final
df_genero_ratings = pd.DataFrame()
df_genero_ratings['genres'] = generos_unicos
df_genero_ratings['count'] = genero_counts
df_genero_ratings['rating'] = genero_ratings

# Visualiza
df_genero_ratings.head(20)

# Drop do índice 18 (news)
# Não queremos essa informação como gênero
df_genero_ratings = df_genero_ratings.drop(index = 18)

# Ordena o resultado
df_genero_ratings = df_genero_ratings.sort_values(by = 'rating', ascending = False)

# Plot

# Figura
plt.figure(figsize = (16,10))

#...


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-09-Mini-Projeto1.ipynb".
The first task is:
4- Qual a Mediana de Avaliação dos Filmes Em Relação ao Ano de Estréia?
Mediana de avaliação dos filmes.
Can you write Python code for it?

# Consulta SQL
consulta4 = '''
            SELECT rating AS Rating, premiered FROM
            ratings JOIN titles ON ratings.title_id = titles.title_id
            WHERE premiered <= 2022 AND type = 'movie'
            ORDER BY premiered
            '''

# Resultado
resultado4 = pd.read_sql_query(consulta4, conn)

display(resultado4)

# Calculamos a mediana ao longo do tempo (anos)
ratings = []
for year in set(resultado4['premiered']):
    ratings.append(np.median(resultado4[resultado4['premiered'] == year]['Rating']))

type(ratings)

ratings[1:10]

# Lista de anos
anos = list(set(resultado4['premiered']))

anos[1:10]

# Plot
plt.figure(figsize = (16,8))
plt.plot(anos, ratings)
plt.xlabel('\nAno')
plt.ylabel('Mediana de Avaliação')
plt.title('\nMediana de Avaliação dos Filmes Em Relação ao Ano de Estréia\n')
plt.show()


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-09-Mini-Projeto1.ipynb".
The first task is:
8- Qual o Número de Filmes Produzidos Por País?
Número de filmes produzidos por país.
Can you write Python code for it?

# Consulta SQL
consulta8 = '''
            SELECT region, COUNT(*) Number_of_movies FROM
            akas JOIN titles ON
            akas.title_id = titles.title_id
            WHERE region != 'None'
            AND type = \'movie\'
            GROUP BY region
            '''

# Resultado
resultado8 = pd.read_sql_query(consulta8, conn)

display(resultado8)

# Shape
resultado8.shape

# Número de linhas
resultado8.shape[0]

# Listas auxiliares
nomes_paises = []
contagem = []

# Loop para obter o país de acordo com a região
for i in range(resultado8.shape[0]):
    try:
        coun = resultado8['region'].values[i]
        nomes_paises.append(pycountry.countries.get(alpha_2 = coun).name)
        contagem.append(resultado8['Number_of_movies'].values[i])
    except:
        continue

# Prepara o dataframe
df_filmes_paises = pd.DataFrame()
df_filmes_paises['country'] = nomes_paises
df_filmes_paises['Movie_Count'] = contagem

# Ordena o resultado
df_filmes_paises = df_filmes_paises.sort_values(by = 'Movie_Count', ascending = False)

# Visualiza
df_filmes_paises.head(10)

# Plot

# Figura
plt.figure(figsize = (20,8))

# Barplot
sns.barplot(y = df_filmes_paises[:20].country, x = df_filmes_paises[:20].Movie_Count, orient = "h")

# Loop
for i in range(0,20):
    plt.text(df_filmes_paises.Movie_Count[df_filmes_paises.index[i]]-1,
             i + 0.30,
             round(df_filmes_paises["Movie_Count"][df_filmes_paises.index[i]],2))

plt.ylabel('País')
plt.xlabel('\nNúmero de Filmes')
plt.title('\nNúmero de Filmes Produzidos Por País\n')
plt.show()


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-09-Mini-Projeto1.ipynb".
The first task is:
Agora começamos a Análise Exploratória dos Dados.

1- Quais São as Categorias de Filmes Mais Comuns no IMDB?
Quais são os principais tipos (categorias) dos títulos (filmes)?
Can you write Python code for it?

# Cria a consulta SQL
consulta1 = '''SELECT type, COUNT(*) AS COUNT FROM titles GROUP BY type'''

# Extrai o resultado
resultado1 = pd.read_sql_query(consulta1, conn)

# Visualiza o resultado
display(resultado1)

# Vamos calcular o percentual para cada tipo
resultado1['percentual'] = (resultado1['COUNT'] / resultado1['COUNT'].sum()) * 100

# Visualiza o resultado
display(resultado1)

# Vamos criar um gráfico com apenas 4 categorias:
# As 3 categorias com mais títulos e 1 categoria com todo o restante

# Cria um dicionário vazio
others = {}

# Filtra o percentual em 5% e soma o total
others['COUNT'] = resultado1[resultado1['percentual'] < 5]['COUNT'].sum()

# Grava o percentual
others['percentual'] = resultado1[resultado1['percentual'] < 5]['percentual'].sum()

# Ajusta o nome
others['type'] = 'others'

# Visualiza
others

# Filtra o dataframe de resultado
resultado1 = resultado1[resultado1['percentual'] > 5]

# Append com o dataframe de outras categorias
resultado1 = resultado1.append(others, ignore_index = True)

# Ordena o resultado
resultado1 = resultado1.sort_values(by = 'COUNT', ascending = False)

# Visualiza
resultado1.head()

# Ajusta os labels
labels = [str(resultado1['type'][i])+' '+'['+str(round(resultado1['percentual'][i],2)) +'%'+']' for i in resultado1.index]

# Plot

# Mapa de cores
# https://matplotlib.org/stable/tutorials/colors/colormaps.html
cs = cm.Set3(np.arange(100))

# Cria a figura
f = plt.figure()

# Pie Plot
plt.pie(resultado1['COUNT'], labeldistance = 1, radius = 3, colors = cs, wedgeprops = dict(width = 0.8))
plt.legend(labels = labels, loc = 'center', prop = {'size':12})
plt.title("Distribuição de Títulos", loc = 'Center', fontdict = {'fontsize':20,'fontweight':20})
plt.show()


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-09-Mini-Projeto1.ipynb".
The first task is:
Agora executamos o pacote para download dos datasets.
Can you write Python code for it?

# Instala o pacote
# https://pypi.org/project/pycountry/
!pip install -q pycountry

# Imports
import re
import time
import sqlite3
import pycountry
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import cm
from sklearn.feature_extraction.text import CountVectorizer
import warnings
warnings.filterwarnings("ignore")
sns.set_theme(style = "whitegrid")


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-09-Mini-Projeto1.ipynb".
The first task is:
Carregando os Dados
Primeiro temos que baixar os dados!
Can you write Python code for it?

%%time
!imdb-sqlite

# Conecta no banco de dados
conn = sqlite3.connect("imdb.db")

# Extrai a lista de tabelas
tabelas = pd.read_sql_query("SELECT NAME AS 'Table_Name' FROM sqlite_master WHERE type = 'table'", conn)

# Tipo do objeto
type(tabelas)

# Visualiza o resultado
tabelas.head()

# Vamos converter o dataframe em uma lista
tabelas = tabelas["Table_Name"].values.tolist()

# Vamos percorrer a lista de tabelas no banco de dados e extrair o esquema de cada uma
for tabela in tabelas:
    consulta = "PRAGMA TABLE_INFO({})".format(tabela)
    resultado = pd.read_sql_query(consulta, conn)
    print("Esquema da tabela:", tabela)
    display(resultado)
    print("-"*100)
    print("\n")


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-09-Mini-Projeto1.ipynb".
The first task is:
Usamos o Countvectorizer para converter a coluna de gêneros em um vetor one-hot encoded para contar o número de filmes em cada gênero.
Can you write Python code for it?

# Vamos criar um vetor usando expressão regular para filtrar as strings

# https://docs.python.org/3.8/library/re.html
padrao = '(?u)\\b[\\w-]+\\b'

# https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html
vetor = CountVectorizer(token_pattern = padrao, analyzer = 'word').fit(temp)

type(vetor)

# Aplica a vetorização ao dataset sem valores NA
bag_generos = vetor.transform(temp)

type(bag_generos)

# Retorna gêneros únicos
generos_unicos =  vetor.get_feature_names()

# Cria o dataframe de gêneros
generos = pd.DataFrame(bag_generos.todense(), columns = generos_unicos, index = temp.index)

# Visualiza
generos.info()

# Drop da coluna n
generos = generos.drop(columns = 'n', axis = 0)

# Calcula o percentual
generos_percentual = 100 * pd.Series(generos.sum()).sort_values(ascending = False) / generos.shape[0]

# Visualiza
generos_percentual.head(10)

# Plot
plt.figure(figsize = (16,8))
sns.barplot(x = generos_percentual.values, y = generos_percentual.index, orient = "h", palette = "terrain")
plt.ylabel('Gênero')
plt.xlabel("\nPercentual de Filmes (%)")
plt.title('\nNúmero (Percentual) de Títulos Por Gênero\n')
plt.show()


I am working on the file "Cap06/Notebooks/DSA-Python-Cap06-09-Mini-Projeto1.ipynb".
The first task is:
https://pypi.org/
https://pypi.org/project/imdb-sqlite/
Can you write Python code for it?

# Instala o pacote
!pip install -q imdb-sqlite


I am working on the file "Cap07/DesafioDSA/Missao1/missao1.ipynb".
The first task is:
Missão: Implementar um algoritmo para determinar se uma string possui todos os caracteres exclusivos.
Nível de Dificuldade: Baixo
Premissas

Podemos assumir que a string é ASCII?
     * Sim
     * Nota: As cadeias de caracteres Unicode podem exigir tratamento especial dependendo do seu idioma
Podemos supor que há distinção entre maiúsculas e minúsculas?
     * Sim
Podemos usar estruturas de dados adicionais?
     * Sim

Teste Cases

None -> False
'' -> True
'foo' -> False
'bar' -> True

Algoritmo: Hash Map Lookup
Manteremos um mapa hash (conjunto) para rastrear os caracteres únicos que encontramos.
Passos:
* Faça um scan cada caracter
* Para cada caracter:
     * Se o caracter não existir em um mapa de hash, adicione o caractere a um mapa de hash
     * Senão, retorne False
* Retornar Verdadeiro
Nota:
* Também podemos usar um dicionário, mas parece mais lógico usar um set, pois ele não contém elementos duplicados
Solução
Can you write Python code for it?

class UniqueChars(object):

    def has_unique_chars(self, string):
        # Implemente aqui sua solução


I am working on the file "Cap07/DesafioDSA/Missao2/missao2.ipynb".
The first task is:
Missão: Gerar uma lista de números primos.
Nível de Dificuldade: Médio
Premissas

É correto que 1 não seja considerado um número primo?
     * Sim
Podemos assumir que as entradas são válidas?
     * Não
Podemos supor que isso se encaixa na memória?
     * Sim

Teste Cases

None -> Exception
Not an int -> Exception
20 -> [False, False, True, True, False, True, False, True, False, False, False, True, False, True, False, False, False, True, False, True]

Algoritmo
Para um número ser primo, ele deve ser 2 ou maior e não pode ser divisível por outro número diferente de si mesmo (e 1).
Todos os números não-primos são divisíveis por um número primo.

Use uma matriz (array) para manter o controle de cada número inteiro até o máximo
Comece em 2, termine em sqrt (max)
     * Podemos usar o sqrt (max) em vez do max porque:
         * Para cada valor que divide o número de entrada uniformemente, há um complemento b onde a * b = n
         * Se a> sqrt (n) então b <sqrt (n) porque sqrt (n ^ 2) = n
     * "Cross off" todos os números divisíveis por 2, 3, 5, 7, ... configurando array [index] para False

Animação do Wikipedia:

Solução
Can you write Python code for it?

import math

class PrimeGenerator(object):

    def generate_primes(self, max_num):
        # Implemente aqui sua solução

    def _cross_off(self, array, prime):
       # Implemente aqui sua solução

    def _next_prime(self, array, prime):
        # Implemente aqui sua solução


I am working on the file "Cap07/DesafioDSA/Missao3/missao3.ipynb".
The first task is:
Missão: Implementar um algoritmo para mover um robô do canto superior esquerdo para o canto inferior direito de uma grade.
Nível de Dificuldade: Médio
Premissas

Existem restrições de como o robô se move?
     * O robô só pode se mover para a direita e para baixo
Algumas células são inválidas (fora dos limites)?
     * Sim
Podemos supor que as células inicial e final são células válidas?
     * Sim
Isso é uma grade retangular? ou seja, a grade não é irregular?
     * Sim
Haverá sempre uma maneira válida para o robô chegar ao canto inferior direito?
     * Não, retorno None
Podemos assumir que as entradas são válidas?
     * Não
Podemos supor que isso se encaixa na memória?
     * Sim

Teste Cases
<pre>
o = célula válida
x = célula inválida

   0  1  2  3
0  o  o  o  o
1  o  x  o  o
2  o  o  x  o
3  x  o  o  o
4  o  o  x  o
5  o  o  o  x
6  o  x  o  x
7  o  x  o  o
</pre>

Caso geral

Saída esperada = [(0, 0), (1, 0), (2, 0),
                  (2, 1), (3, 1), (4, 1),
                  (5, 1), (5, 2), (6, 2),
                  (7, 2), (7, 3)]

Nenhum caminho válido, por exemplo, linha 7, col 2 é inválido
Nenhuma entrada
Matriz vazia

Solução
Can you write Python code for it?

class Grid(object):

    def find_path(self, matrix):
        # Implemente aqui sua solução


I am working on the file "Cap07/DesafioDSA/Missao4/missao4.ipynb".
The first task is:
Missão: Implementar o Algoritmo de Ordenação "Selection sort".
Nível de Dificuldade: Alto
Premissas

As duplicatas são permitidas?
     * Sim
Podemos assumir que a entrada é válida?
     * Não
Podemos supor que isso se encaixa na memória?
     * Sim

Teste Cases

None -> Exception
[] -> []
One element -> [element]
Two or more elements

Algoritmo
Animação do Wikipedia:

Podemos fazer isso de forma recursiva ou iterativa. Iterativamente será mais eficiente, pois não requer sobrecarga de espaço extra com as chamadas recursivas.

Para cada elemento
     * Verifique cada elemento à direita para encontrar o min
     * Se min < elemento atual, swap

Solução
Can you write Python code for it?

class SelectionSort(object):

    def sort(self, data):
        # Implemente aqui sua solução


I am working on the file "Cap07/DesafioDSA/Missao4/missao4.ipynb".
The first task is:
Teste da Solução
Can you write Python code for it?

%%writefile missao4.py
from nose.tools import assert_equal, assert_raises

class TestSelectionSort(object):

    def test_selection_sort(self, func):
        print('None input')
        assert_raises(TypeError, func, None)

        print('Input vazio')
        assert_equal(func([]), [])

        print('Um elemento')
        assert_equal(func([5]), [5])

        print('Dois ou mais elementos')
        data = [5, 1, 7, 2, 6, -3, 5, 7, -10]
        assert_equal(func(data), sorted(data))

        print('Sua solução foi executada com sucesso! Parabéns!')

def main():
    test = TestSelectionSort()
    try:
        selection_sort = SelectionSort()
        test.test_selection_sort(selection_sort.sort)
    except NameError:
        pass

if __name__ == '__main__':
    main()

%run -i missao4.py


I am working on the file "Cap07/DesafioDSA/Missao5/missao5.ipynb".
The first task is:
Análise Geral de Compras
Can you write Python code for it?


I am working on the file "Cap07/DesafioDSA/Missao5/missao5.ipynb".
The first task is:
Consumidores Mais Populares (Top 5)
Can you write Python code for it?


I am working on the file "Cap07/DesafioDSA/Missao5/missao5.ipynb".
The first task is:
Informações Demográficas Por Gênero
Can you write Python code for it?


I am working on the file "Cap07/DesafioDSA/Missao5/missao5.ipynb".
The first task is:
Itens Mais Populares
Can you write Python code for it?


I am working on the file "Cap08/DesafioDSA_Solucao/Missao1/missao1.ipynb".
The first task is:
Teste da Solução
Can you write Python code for it?

%%writefile missao1.py

from nose.tools import assert_equal

class TestUniqueChars(object):

    def test_unique_chars(self, func):
        assert_equal(func(None), False)
        assert_equal(func(''), True)
        assert_equal(func('foo'), False)
        assert_equal(func('bar'), True)
        print('Sua solução foi executada com sucesso! Parabéns!')

def main():
    test = TestUniqueChars()
    try:
        unique_chars = UniqueChars()
        test.test_unique_chars(unique_chars.has_unique_chars)
    except NameError:
        pass

if __name__ == '__main__':
    main()

%run -i missao1.py


I am working on the file "Cap08/DesafioDSA_Solucao/Missao1/missao1_solucao.ipynb".
The first task is:
Missão: Implemente um algoritmo para determinar se uma string possui todos os caracteres exclusivos.
Nível de Dificuldade: Baixo
Premissas

Podemos assumir que a string é ASCII?
     * Sim
     * Nota: As cadeias de caracteres Unicode podem exigir tratamento especial dependendo do seu idioma
Podemos supor que há distinção entre maiúsculas e minúsculas?
     * Sim
Podemos usar estruturas de dados adicionais?
     * Sim

Teste Cases

None -> False
'' -> True
'foo' -> False
'bar' -> True

Algoritmo: Hash Map Lookup
Manteremos um mapa hash (conjunto) para rastrear os caracteres únicos que encontramos.
Passos:
* Faça um scan cada caracter
* Para cada caracter:
     * Se o caracter não existir em um mapa de hash, adicione o caractere a um mapa de hash
     * Senão, retorne False
* Retornar Verdadeiro
Nota:
* Também podemos usar um dicionário, mas parece mais lógico usar um set, pois ele não contém elementos duplicados
Solução
Can you write Python code for it?

class UniqueChars(object):

    def has_unique_chars(self, string):
        if string is None:
            return False
        chars_set = set()
        for char in string:
            if char in chars_set:
                return False
            else:
                chars_set.add(char)
        return True


I am working on the file "Cap08/DesafioDSA_Solucao/Missao1/missao1_solucao.ipynb".
The first task is:
Teste da Solução
Can you write Python code for it?

%%writefile missao1.py
from nose.tools import assert_equal

class TestUniqueChars(object):

    def test_unique_chars(self, func):
        assert_equal(func(None), False)
        assert_equal(func(''), True)
        assert_equal(func('foo'), False)
        assert_equal(func('bar'), True)
        print('Sua solução foi executada com sucesso! Parabéns!')

def main():
    test = TestUniqueChars()
    try:
        unique_chars = UniqueChars()
        test.test_unique_chars(unique_chars.has_unique_chars)
    except NameError:
        pass

if __name__ == '__main__':
    main()

%run -i missao1.py


I am working on the file "Cap08/DesafioDSA_Solucao/Missao2/missao2.ipynb".
The first task is:
Teste da Solução
Can you write Python code for it?

%%writefile missao2.py

from nose.tools import assert_equal, assert_raises

class TestMath(object):

    def test_generate_primes(self):
        prime_generator = PrimeGenerator()
        assert_raises(TypeError, prime_generator.generate_primes, None)
        assert_raises(TypeError, prime_generator.generate_primes, 98.6)
        assert_equal(prime_generator.generate_primes(20), [False, False, True,
                                                           True, False, True,
                                                           False, True, False,
                                                           False, False, True,
                                                           False, True, False,
                                                           False, False, True,
                                                           False, True])
        print('Sua solução foi executada com sucesso! Parabéns!')

def main():
    test = TestMath()
    test.test_generate_primes()

if __name__ == '__main__':
    main()

%run -i missao2.py


I am working on the file "Cap08/DesafioDSA_Solucao/Missao2/missao2_solucao.ipynb".
The first task is:
Missão: Gerar uma lista de números primos.
Nível de Dificuldade: Médio
Premissas

É correto que 1 não seja considerado um número primo?
     * Sim
Podemos assumir que as entradas são válidas?
     * Não
Podemos supor que isso se encaixa na memória?
     * Sim

Teste Cases

None -> Exception
Not an int -> Exception
20 -> [False, False, True, True, False, True, False, True, False, False, False, True, False, True, False, False, False, True, False, True]

Algoritmo
Para um número ser primo, ele deve ser 2 ou maior e não pode ser divisível por outro número diferente de si mesmo (e 1).
Todos os números não-primos são divisíveis por um número primo.

Use uma matriz (array) para manter o controle de cada número inteiro até o máximo
Comece em 2, termine em sqrt (max)
     * Podemos usar o sqrt (max) em vez do max porque:
         * Para cada valor que divide o número de entrada uniformemente, há um complemento b onde a * b = n
         * Se a> sqrt (n) então b <sqrt (n) porque sqrt (n ^ 2) = n
     * "Cross off" todos os números divisíveis por 2, 3, 5, 7, ... configurando array [index] para False

Animação do Wikipedia:

Solução
Can you write Python code for it?

import math

class PrimeGenerator(object):

    def generate_primes(self, max_num):
        if max_num is None:
            raise TypeError('max_num não pode ser None')
        array = [True] * max_num
        array[0] = False
        array[1] = False
        prime = 2
        while prime <= math.sqrt(max_num):
            self._cross_off(array, prime)
            prime = self._next_prime(array, prime)
        return array

    def _cross_off(self, array, prime):
        for index in range(prime*prime, len(array), prime):
            array[index] = False

    def _next_prime(self, array, prime):
        next = prime + 1
        while next < len(array) and not array[next]:
            next += 1
        return next


I am working on the file "Cap08/DesafioDSA_Solucao/Missao3/missao3.ipynb".
The first task is:
Teste da Solução
Can you write Python code for it?

%%writefile missao3.py

from nose.tools import assert_equal

class TestGridPath(object):

    def test_grid_path(self):
        grid = Grid()
        assert_equal(grid.find_path(None), None)
        assert_equal(grid.find_path([[]]), None)
        max_rows = 8
        max_cols = 4
        matrix = [[1] * max_cols for _ in range(max_rows)]
        matrix[1][1] = 0
        matrix[2][2] = 0
        matrix[3][0] = 0
        matrix[4][2] = 0
        matrix[5][3] = 0
        matrix[6][1] = 0
        matrix[6][3] = 0
        matrix[7][1] = 0
        result = grid.find_path(matrix)
        expected = [(0, 0), (1, 0), (2, 0),
                    (2, 1), (3, 1), (4, 1),
                    (5, 1), (5, 2), (6, 2),
                    (7, 2), (7, 3)]
        assert_equal(result, expected)
        matrix[7][2] = 0
        result = grid.find_path(matrix)
        assert_equal(result, None)
        print('Sua solução foi executada com sucesso! Parabéns!')

def main():
    test = TestGridPath()
    test.test_grid_path()

if __name__ == '__main__':
    main()

%run -i missao3.py


I am working on the file "Cap08/DesafioDSA_Solucao/Missao3/missao3_solucao.ipynb".
The first task is:
Missão: Implementar um algoritmo para mover um robô do canto superior esquerdo para o canto inferior direito de uma grade.
Nível de Dificuldade: Médio
Premissas

Existem restrições de como o robô se move?
     * O robô só pode se mover para a direita e para baixo
Algumas células são inválidas (fora dos limites)?
     * Sim
Podemos supor que as células inicial e final são células válidas?
     * Sim
Isso é uma grade retangular? ou seja, a grade não é irregular?
     * Sim
Haverá sempre uma maneira válida para o robô chegar ao canto inferior direito?
     * Não, retorno None
Podemos assumir que as entradas são válidas?
     * Não
Podemos supor que isso se encaixa na memória?
     * Sim

Teste Cases
<pre>
o = célula válida
x = célula inválida

   0  1  2  3
0  o  o  o  o
1  o  x  o  o
2  o  o  x  o
3  x  o  o  o
4  o  o  x  o
5  o  o  o  x
6  o  x  o  x
7  o  x  o  o
</pre>

Caso geral

Saída esperada = [(0, 0), (1, 0), (2, 0),
                  (2, 1), (3, 1), (4, 1),
                  (5, 1), (5, 2), (6, 2),
                  (7, 2), (7, 3)]

Nenhum caminho válido, por exemplo, linha 7, col 2 é inválido
Nenhuma entrada
Matriz vazia

Algoritmo
To get to row r and column c [r, c], we will need to have gone:

Right from [r, c-1] if this is a valid cell - [Path 1]
Down from [r-1, c] if this is a valid cell - [Path 2]

If we look at [Path 1], to get to [r, c-1], we will need to have gone:

Right from [r, c-2] if this is a valid cell
Down from [r-1, c-1] if this is a valid cell

Continue this process until we reach the start cell or until we find that there is no path.
Base case:

If the input row or col are < 0, or if [row, col] is not a valid cell
Return False

Recursive case:
We'll memoize the solution to improve performance.

Use the memo to see if we've already processed the current cell
If any of the following is True, append the current cell to the path and set our result to True:
We are at the start cell
We get a True result from a recursive call on:
[row, col-1]
[row-1, col]

Update the memo
Return...
Can you write Python code for it?

class Grid(object):

    def find_path(self, matrix):
        if matrix is None or not matrix:
            return None
        cache = {}
        path = []
        if self._find_path(matrix, len(matrix) - 1,
                           len(matrix[0]) - 1, cache, path):
            return path
        else:
            return None

    def _find_path(self, matrix, row, col, cache, path):
        if row < 0 or col < 0 or not matrix[row][col]:
            return False
        cell = (row, col)
        if cell in cache:
            return cache[cell]
        cache[cell] = (row == 0 and col == 0 or
                       self._find_path(matrix, row, col - 1, cache, path) or
                       self._find_path(matrix, row - 1, col, cache, path))
        if cache[cell]:
            path.append(cell)
        return cache[cell]


I am working on the file "Cap08/DesafioDSA_Solucao/Missao3/missao3_solucao.ipynb".
The first task is:
Teste da Solução
Can you write Python code for it?

%%writefile missao3.py
from nose.tools import assert_equal

class TestGridPath(object):

    def test_grid_path(self):
        grid = Grid()
        assert_equal(grid.find_path(None), None)
        assert_equal(grid.find_path([[]]), None)
        max_rows = 8
        max_cols = 4
        matrix = [[1] * max_cols for _ in range(max_rows)]
        matrix[1][1] = 0
        matrix[2][2] = 0
        matrix[3][0] = 0
        matrix[4][2] = 0
        matrix[5][3] = 0
        matrix[6][1] = 0
        matrix[6][3] = 0
        matrix[7][1] = 0
        result = grid.find_path(matrix)
        expected = [(0, 0), (1, 0), (2, 0),
                    (2, 1), (3, 1), (4, 1),
                    (5, 1), (5, 2), (6, 2),
                    (7, 2), (7, 3)]
        assert_equal(result, expected)
        matrix[7][2] = 0
        result = grid.find_path(matrix)
        assert_equal(result, None)
        print('Sua solução foi executada com sucesso! Parabéns!')

def main():
    test = TestGridPath()
    test.test_grid_path()

if __name__ == '__main__':
    main()

%run -i missao3.py


I am working on the file "Cap08/DesafioDSA_Solucao/Missao4/missao4.ipynb".
The first task is:
Teste da Solução
Can you write Python code for it?

%%writefile missao4.py

from nose.tools import assert_equal, assert_raises

class TestSelectionSort(object):

    def test_selection_sort(self, func):
        print('None input')
        assert_raises(TypeError, func, None)

        print('Input vazio')
        assert_equal(func([]), [])

        print('Um elemento')
        assert_equal(func([5]), [5])

        print('Dois ou mais elementos')
        data = [5, 1, 7, 2, 6, -3, 5, 7, -10]
        assert_equal(func(data), sorted(data))

        print('Sua solução foi executada com sucesso! Parabéns!')

def main():
    test = TestSelectionSort()
    try:
        selection_sort = SelectionSort()
        test.test_selection_sort(selection_sort.sort)
    except NameError:
        pass

if __name__ == '__main__':
    main()

%run -i missao4.py


I am working on the file "Cap08/DesafioDSA_Solucao/Missao4/missao4_solucao.ipynb".
The first task is:
Missão 2: Implementar o Algoritmo de Ordenação "Selection sort".
Nível de Dificuldade: Alto
Premissas

As duplicatas são permitidas?
     * Sim
Podemos assumir que a entrada é válida?
     * Não
Podemos supor que isso se encaixa na memória?
     * Sim

Teste Cases

None -> Exception
[] -> []
One element -> [element]
Two or more elements

Algoritmo
Animação do Wikipedia:

Podemos fazer isso de forma recursiva ou iterativa. Iterativamente será mais eficiente, pois não requer sobrecarga de espaço extra com as chamadas recursivas.

Para cada elemento
     * Verifique cada elemento à direita para encontrar o min
     * Se min < elemento atual, swap

Solução
Can you write Python code for it?

class SelectionSort(object):

    def sort(self, data):
        if data is None:
            raise TypeError('Dados não podem ser None')
        if len(data) < 2:
            return data
        for i in range(len(data) - 1):
            min_index = i
            for j in range(i + 1, len(data)):
                if data[j] < data[min_index]:
                    min_index = j
            if data[min_index] < data[i]:
                data[i], data[min_index] = data[min_index], data[i]
        return data

    def sort_iterative_alt(self, data):
        if data is None:
            raise TypeError('Dados não podem ser None')
        if len(data) < 2:
            return data
        for i in range(len(data) - 1):
            self._swap(data, i, self._find_min_index(data, i))
        return data

    def sort_recursive(self, data):
        if data is None:
            raise TypeError('Dados não podem ser None')
        if len(data) < 2:
            return data
        return self._sort_recursive(data, start=0)

    def _sort_recursive(self, data, start):
        if data is None:
            return
        if start < len(data) - 1:
            swap(data, start, self._find_min_index(data, start))
            self._sort_recursive(data, start + 1)
        return data

    def _find_min_index(self, data, start):
        min_index = start
        for i in range(start + 1, len(data)):
            if data[i] < data[min_index]:
                min_index = i
        return min_index

    def _swap(self, data, i, j):
        if i != j:
            data[i], data[j] = data[j], data[i]
        return data


I am working on the file "Cap08/DesafioDSA_Solucao/Missao4/missao4_solucao.ipynb".
The first task is:
Teste da Solução
Can you write Python code for it?


I am working on the file "Cap08/DesafioDSA_Solucao/Missao5/missao5_solucao.ipynb".
The first task is:
Análise de Compra
Can you write Python code for it?

# Cálculos básicos
average_item_price = purchase_file["Valor"].mean()
total_item_price = purchase_file["Valor"].sum()
total_item_count = purchase_file["Valor"].count()
item_id = len(purchase_file["Item ID"].unique())

# Dataframe para os resultados
summary_calculations = pd.DataFrame({"Número de Itens Únicos" : item_id,
                                     "Número de Compras" : total_item_count,
                                     "Total de Vendas" : total_item_price,
                                     "Preço Médio" : [average_item_price]})

# Data Munging
summary_calculations = summary_calculations.round(2)
summary_calculations ["Preço Médio"] = summary_calculations["Preço Médio"].map("${:,.2f}".format)
summary_calculations ["Total de Vendas"] = summary_calculations["Total de Vendas"].map("${:,.2f}".format)
summary_calculations = summary_calculations.loc[:, ["Número de Itens Únicos", "Preço Médio", "Número de Compras", "Total de Vendas"]]

summary_calculations

purchase_file["Item ID"].unique()