Domanda

Ho un frame di dati panda con più voci, e voglio calcolare la correlazione tra il reddito di un certo tipo di negozi. Ci sono un certo numero di negozi con dati di conto, la classificazione delle aree di attività (teatro, negozi di stoffa, cibo ...) e altri dati.

Ho cercato di creare una nuova cornice di dati e inserire una colonna con il reddito di tutti i tipi di negozi che appartengono alla stessa categoria, e il frame di dati di ritorno ha solo la prima colonna riempita e il resto è pieno di Nan. Il codice che mi stanco:

corr = pd.DataFrame()
for at in activity:
    stores.loc[stores['Activity']==at]['income']

Io voglio farlo, in modo da poter usare per .corr() ha dato la matrice di correlazione tra la categoria dei negozi.

Dopo di che, vorrei sapere come posso tracciare i valori della matrice (da -1 a 1, dal momento che voglio usare correlazione di Pearson) con matplotlib.

È stato utile?

Soluzione

Suggerisco una sorta di gioco sul seguente:

Utilizzando i dati UCI Abalone per questo esempio ...

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Read file into a Pandas dataframe
from pandas import DataFrame, read_csv
f = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'
df = read_csv(f)
df=df[0:10]
df

 entrare descrizione dell'immagine qui

funzione di matrice di correlazione plotting:

# Correlazione funzione plotting matriciale

def correlation_matrix(df):
    from matplotlib import pyplot as plt
    from matplotlib import cm as cm

    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    cmap = cm.get_cmap('jet', 30)
    cax = ax1.imshow(df.corr(), interpolation="nearest", cmap=cmap)
    ax1.grid(True)
    plt.title('Abalone Feature Correlation')
    labels=['Sex','Length','Diam','Height','Whole','Shucked','Viscera','Shell','Rings',]
    ax1.set_xticklabels(labels,fontsize=6)
    ax1.set_yticklabels(labels,fontsize=6)
    # Add colorbar, make sure to specify tick locations to match desired ticklabels
    fig.colorbar(cax, ticks=[.75,.8,.85,.90,.95,1])
    plt.show()

correlation_matrix(df)

 entrare descrizione dell'immagine qui

Spero che questo aiuti!

Altri suggerimenti

Un'altra alternativa è quella di utilizzare la funzione di mappa termica in Seaborn per tracciare la covarianza. Questo esempio utilizza il set di dati automatico dal pacchetto ISLR in R (lo stesso come nell'esempio che avete mostrato).

import pandas.rpy.common as com
import seaborn as sns
%matplotlib inline

# load the R package ISLR
infert = com.importr("ISLR")

# load the Auto dataset
auto_df = com.load_data('Auto')

# calculate the correlation matrix
corr = auto_df.corr()

# plot the heatmap
sns.heatmap(corr, 
        xticklabels=corr.columns,
        yticklabels=corr.columns)

 entrare descrizione dell'immagine qui

Se si voleva essere ancora più di fantasia, è possibile utilizzare Pandas Stile , ad esempio:

cmap = cmap=sns.diverging_palette(5, 250, as_cmap=True)

def magnify():
    return [dict(selector="th",
                 props=[("font-size", "7pt")]),
            dict(selector="td",
                 props=[('padding', "0em 0em")]),
            dict(selector="th:hover",
                 props=[("font-size", "12pt")]),
            dict(selector="tr:hover td:hover",
                 props=[('max-width', '200px'),
                        ('font-size', '12pt')])
]

corr.style.background_gradient(cmap, axis=1)\
    .set_properties(**{'max-width': '80px', 'font-size': '10pt'})\
    .set_caption("Hover to magify")\
    .set_precision(2)\
    .set_table_styles(magnify())

 entrare descrizione dell'immagine qui

Perché non semplicemente fare questo:

import seaborn as sns
import pandas as pd

data = pd.read_csv('Dataset.csv')

plt.figure(figsize=(40,40)) 
# play with the figsize until the plot is big enough to plot all the columns
# of your dataset, or the way you desire it to look like otherwise

sns.heatmap(data.corr())

È possibile modificare l' tavolozza dei colori utilizzando il parametro cmap:

sns.heatmap(data.corr(), cmap='BuGn')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top