<jupyter_start><jupyter_text>Stadtteile Dresden<jupyter_code>with open('./stadtteile-Dresden.json') as data_file:    
    stadtteil_json = json.load(data_file)
stadtteile_osm = []
for i, stadtteil in enumerate(stadtteil_json['features']):
    try:
        stadtteilname = stadtteil['properties']['name']
        stadtteile_osm.append(stadtteilname)
    except:
        continue
        
stadtteile_osm.sort()
stadtteile_osm<jupyter_output><empty_output><jupyter_text>Postleitzahlen Dresden<jupyter_code>plzs = "01057,01067,01069,01097,01099,01108,01109,01127,01129,01139,01156,01157,01159,01169,01187,01189,01217,01219,01227,01237,01239,01257,01259,01277,01279,01307,01309,01312,01324,01326,01327,01328,01329,01462,01465,01728"
ddplzs = plzs.split(',')<jupyter_output><empty_output><jupyter_text>QGIS Filter output<jupyter_code>for plz in ddplzs:
    print('"plz" LIKE "%s" OR' % plz.strip())<jupyter_output>"plz" LIKE "01057" OR
"plz" LIKE "01067" OR
"plz" LIKE "01069" OR
"plz" LIKE "01097" OR
"plz" LIKE "01099" OR
"plz" LIKE "01108" OR
"plz" LIKE "01109" OR
"plz" LIKE "01127" OR
"plz" LIKE "01129" OR
"plz" LIKE "01139" OR
"plz" LIKE "01156" OR
"plz" LIKE "01157" OR
"plz" LIKE "01159" OR
"plz" LIKE "01169" OR
"plz" LIKE "01187" OR
"plz" LIKE "01189" OR
"plz" LIKE "01217" OR
"plz" LIKE "01219" OR
"plz" LIKE "01227" OR
"plz" LIKE "01237" OR
"plz" LIKE "01239" OR
"plz" LIKE "01257" OR
"plz" LIKE "01259" OR
"plz" LIKE "01277" OR
"plz" LIKE "01279" OR
"plz" LIKE "01307" OR
"plz" LIKE "01309" OR
"plz" LIKE "01312" OR
"plz" LIKE "01324" OR
"plz" LIKE "01326" OR
"plz" LIKE "01327" OR
"plz" LIKE "01328" OR
"plz" LIKE "01329" OR
"plz" LIKE "01462" OR
"plz" LIKE "01465" OR
"plz" LIKE "01728" OR<jupyter_text>Daten lesen<jupyter_code>data = pd.read_csv('2015-08-09-17-49-immo-komplett.csv', encoding='utf-8', dtype={'PLZ': str})
data.index = data.ID
data.head()<jupyter_output><empty_output><jupyter_text>Daten Cleanen  Preise cleanen<jupyter_code>def preiscleaner(preis, mio=False):
    #print preis
    try:
        p = preis.split()
        p = float(p[0].replace('.', '').replace(',','.'))
        if mio:
            return p/1e6
        else:
            return int(p)
    except:
        return preis
data['Kaufpreis'] = data['Kaufpreis'].apply(preiscleaner, mio=True)
data['Kaltmiete'] = data['Kaltmiete'].apply(preiscleaner)<jupyter_output><empty_output><jupyter_text>Flächen cleanen<jupyter_code>def squaremetercleaner(squaremeter):
    #print squaremeter
    try:
        m = squaremeter.split()
        m = float(m[0].replace(',', '.'))
        return int(m)
    except:
        return 0.0    
data[u'Wohnfläche'] = data[u'Wohnfläche'].apply(squaremetercleaner)<jupyter_output><empty_output><jupyter_text>Zimmeranzahl<jupyter_code>data[u'Zimmer'] = data[u'Zimmer'].str.replace(',','.').astype('float')
data.head()<jupyter_output><empty_output><jupyter_text>Verkaufsvolumen<jupyter_code>verkaufgroup = data[data['Miete/Kauf']=='Kauf'].groupby('From').sum()
verkaufgroup.sort('Kaufpreis', ascending=True, inplace=True)
verkaufgroup['Kaufpreis'].dropna(inplace=True)
verkaufgroup['Kaufpreis'].tail(10)
verkaufgroup['Kaufpreis'][-10:].plot(kind='barh', title='Volumen Kauf-Immobilien in Dresden, Gruppiert nach Anbieter')

plt.xlabel(u'mio €')
plt.tight_layout()
plt.savefig('Groupby-Anbieter-KaufpreisSumme.png', dpi=150)<jupyter_output><empty_output><jupyter_text>Anzahl an Immobilien<jupyter_code>fromgroup = data.groupby(['From','Miete/Kauf']).count()
fromgroup.sort('ID', ascending=True, inplace=True)
fromgroup['ID'][-10:].plot(kind='barh', title='Angebotene Immobilien in Dresden, Gruppiert nach Anbieter')

plt.xlabel('Anzahl')
plt.tight_layout()
plt.savefig('Groupby-Anbieter.png', dpi=150)<jupyter_output><empty_output><jupyter_text>Immopreis Predictor<jupyter_code>from sklearn.metrics import r2_score
from sklearn import linear_model
from sklearn.tree import DecisionTreeRegressor
from sklearn import preprocessing
mietwohnungen = data[(data['Miete/Kauf']=='Miete') & (data['Haus/Wohnung']=='Wohnung')]
kaufwohnungen = data[(data['Miete/Kauf']=='Kauf') & (data['Haus/Wohnung']=='Wohnung')]<jupyter_output><empty_output><jupyter_text>Kaltmieten über 5000€ sind unrealistisch und sind Fehler bei Eingabe auf immoscout24.de (Kauf statt Miete), die werfen wir raus.<jupyter_code>mietwohnungen = mietwohnungen[mietwohnungen.Kaltmiete < 5000.0]<jupyter_output><empty_output><jupyter_text>Verkaufspreis schätzen<jupyter_code>X = pd.concat([kaufwohnungen[[u'Wohnfläche', u'Zimmer']], pd.get_dummies(kaufwohnungen[u'Stadtteil'])], axis=1)
y = kaufwohnungen['Kaufpreis']
# Robustly fit linear model with RANSAC algorithm
regressor = linear_model.RANSACRegressor(linear_model.LinearRegression())
regressor.fit(X,y)
inlier_mask = regressor.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)
print(u'%.1f%% der Wohnungen als Ausreißer identifiziert' % (sum(outlier_mask)*100.0/(sum(outlier_mask)+sum(inlier_mask))))
y_pred = regressor.predict(X)
kaufwohnungen[u'Kaufpreis (geschätzt)'] = y_pred
r2_ransac = r2_score(y[inlier_mask], y_pred[inlier_mask])
sns.regplot(kaufwohnungen['Kaufpreis'][inlier_mask],
            kaufwohnungen[u'Kaufpreis (geschätzt)'][inlier_mask])
plt.scatter(kaufwohnungen['Kaufpreis'][outlier_mask],
            kaufwohnungen[u'Kaufpreis (geschätzt)'][outlier_mask],
            alpha=0.4,
            c='r')

plt.title(u'Schätzung des Kaufpreises (in mio €) von Eigentumswohnungen in Dresden\n(Stadtteil, Anzahl Zimmer, Wohnfläche)')
plt.text(0.85, 0.95, r'$R^2=%.2f$' % r2_ransac)
plt.xlim(0, 1.1)
plt.ylim(0, 1.1)
plt.tight_layout()
plt.savefig('LinReg-Kauf-Wohnung.png', dpi=150)
X.columns[2:]
len(stadtteile)
# Immoscout Datensatz durch gehen und schauen,
# ob die Stadtteile auch den Namen der offiziellen
# Stadtteile tragen
for stadtteil in X.columns[2:]:
    # Da bei einigen nur der Beginn der Namen gleich ist,
    # müssen wir leider alle durch gehen :)
    
    
    
    print(u'✓ %s' % (stadtteil))     
X.columns
sum(X[u'Äußere Neustadt (Antonstadt)'])
X_my = np.zeros(103)
X_my[0] = 121.0
X_my[1] = 3.0
X_my[-1] = 1
y_my = regressor.predict(X_my)[0][0]
print('Geschätzter Marktwert: %.3f€' % (1000.0*y_my))<jupyter_output>Geschätzter Marktwert: 372.454€<jupyter_text>Kaltmiete schätzen Nur mit Wohnfläche und Anzahl der Zimmer<jupyter_code>X = mietwohnungen[[u'Wohnfläche', u'Zimmer']]
y = mietwohnungen['Kaltmiete']
reg = linear_model.LinearRegression()
reg.fit(X, y)
y_pred = reg.predict(X)
mietwohnungen[u'Kaltmiete geschätzt'] = y_pred
r_2 = r2_score(y, y_pred)
sns.regplot(mietwohnungen['Kaltmiete'] ,mietwohnungen[u'Kaltmiete geschätzt'])
plt.title(u'Schätzung der Kaltmiete von Mietwohnungen in Dresden\n(Anzahl Zimmer, Fläche)')
plt.text(2600, 2100, r'$R^2=%.2f$' % r_2)
plt.xlim(0, 3000)
plt.ylim(0, 3000)<jupyter_output><empty_output><jupyter_text>Vorhersage<jupyter_code>m = 155 # m2
z = 4  # Zimmer
print('Kaltmiete für %iR-Wohnung %im^2 in Dresden: %i€' % (z, m, reg.predict([m, z])))
for z in range(2, 6):
    for m in range(40, 200, 10):
        print('Kaltmiete für %iR-Wohnung %im^2 in Dresden: %i€' % (z, m, reg.predict([m, z])))<jupyter_output>Kaltmiete für 2R-Wohnung 40m^2 in Dresden: 265€
Kaltmiete für 2R-Wohnung 50m^2 in Dresden: 362€
Kaltmiete für 2R-Wohnung 60m^2 in Dresden: 458€
Kaltmiete für 2R-Wohnung 70m^2 in Dresden: 554€
Kaltmiete für 2R-Wohnung 80m^2 in Dresden: 650€
Kaltmiete für 2R-Wohnung 90m^2 in Dresden: 746€
Kaltmiete für 2R-Wohnung 100m^2 in Dresden: 843€
Kaltmiete für 2R-Wohnung 110m^2 in Dresden: 939€
Kaltmiete für 2R-Wohnung 120m^2 in Dresden: 1035€
Kaltmiete für 2R-Wohnung 130m^2 in Dresden: 1131€
Kaltmiete für 2R-Wohnung 140m^2 in Dresden: 1227€
Kaltmiete für 2R-Wohnung 150m^2 in Dresden: 1324€
Kaltmiete für 2R-Wohnung 160m^2 in Dresden: 1420€
Kaltmiete für 2R-Wohnung 170m^2 in Dresden: 1516€
Kaltmiete für 2R-Wohnung 180m^2 in Dresden: 1612€
Kaltmiete für 2R-Wohnung 190m^2 in Dresden: 1709€
Kaltmiete für 3R-Wohnung 40m^2 in Dresden: 225€
Kaltmiete für 3R-Wohnung 50m^2 in Dresden: 322€
Kaltmiete für 3R-Wohnung 60m^2 in Dresden: 418€
Kaltmiete für 3R-Wohnung 70m^2 in Dresden: 514€
Kaltmiete für 3R-Wohnu[...]<jupyter_text>Zusätzlich noch Lage (Postleitzahl)<jupyter_code>X2 = pd.concat([X, pd.get_dummies(mietwohnungen[u'PLZ'])], axis=1)
reg2 = linear_model.LinearRegression()
reg2.fit(X2, y)
y2_pred = reg2.predict(X2)
mietwohnungen[u'Kaltmiete geschätzt (mit Lage)'] = y2_pred
r_22 = r2_score(y, y2_pred)
sns.regplot(mietwohnungen['Kaltmiete'] ,mietwohnungen[u'Kaltmiete geschätzt (mit Lage)'])
plt.title(u'Schätzung der Kaltmiete von Mietwohnungen in Dresden\n(Lage, Anzahl Zimmer, Fläche)')
plt.text(2600, 2100, r'$R^2=%.2f$' % r_22)
plt.xlim(0, 3000)
plt.ylim(0, 3000)<jupyter_output><empty_output><jupyter_text>Outlier detection<jupyter_code># Robustly fit linear model with RANSAC algorithm
model_ransac = linear_model.RANSACRegressor(linear_model.LinearRegression(), residual_threshold=250.0)
model_ransac.fit(X2, y)
inlier_mask = model_ransac.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)
print(u'%.1f%% der Wohnungen als Ausreißer identifiziert' % (sum(outlier_mask)*100.0/(sum(outlier_mask)+sum(inlier_mask))))
y2_pred_ransac = model_ransac.predict(X2)
mietwohnungen[u'Kaltmiete geschätzt (mit Lage)'] = y2_pred_ransac.astype('int')
r_22_ransac = r2_score(y[inlier_mask], y2_pred_ransac[inlier_mask])
sns.regplot(mietwohnungen['Kaltmiete'][inlier_mask],
            mietwohnungen[u'Kaltmiete geschätzt (mit Lage)'][inlier_mask])
plt.scatter(mietwohnungen['Kaltmiete'][outlier_mask],
            mietwohnungen[u'Kaltmiete geschätzt (mit Lage)'][outlier_mask],
            alpha=0.1,
            c='r')

plt.title(u'Schätzung der Kaltmiete von Mietwohnungen in Dresden\n(Lage, Anzahl Zimmer, Fläche)')
plt.text(2600, 2100, r'$R^2=%.2f$' % r_22_ransac)
plt.xlim(0, 3000)
plt.ylim(0, 3000)
plt.tight_layout()
plt.savefig('LinReg.png', dpi=150)<jupyter_output><empty_output><jupyter_text>Vorhersage für alle Postleitzahlen  Datencheck: Sind alle PLZ vorhanden?<jupyter_code>len(X2.columns[2:]) == len(ddplzs)
for plz in X2.columns[2:]:
    if plz in ddplzs:
        print(u'%s ✓' % plz)
    else:
        print(u'%s ✗' % plz)
X2.head(1)<jupyter_output><empty_output><jupyter_text>Prediction<jupyter_code>for raum in range(2, 6):
    kaltmietenDD = pd.DataFrame()
    A = pd.Series(raum*25.0 * np.ones(len(ddplzs)))
    Z = pd.Series(raum * np.ones(len(ddplzs)))

    X_pred = pd.concat([A, Z, pd.get_dummies(ddplzs)], axis=1)

    kaltmieten = model_ransac.predict(X_pred)

    kaltmietenDD = pd.DataFrame(data={'Wohnfläche': A, 'Zimmer': Z, 'PLZ': ddplzs, 'Kaltmiete': kaltmieten.flatten()})

    kaltmietenDD['KaltmieteProQm'] = kaltmietenDD['Kaltmiete'] / kaltmietenDD['Wohnfläche']

    kaltmietenDD[['PLZ', 'KaltmieteProQm']].to_csv('Kaltmieten%sR.csv' % raum, index=False, float_format='%.2f')
kaltmietenDD.head()<jupyter_output><empty_output><jupyter_text>Top 10 günstige Wohnungen finden<jupyter_code>mietwohnungen[u'Differenz zur Schätzung'] = mietwohnungen[u'Kaltmiete'] - mietwohnungen[u'Kaltmiete geschätzt (mit Lage)']
topmietwohnungen = mietwohnungen.sort(u'Differenz zur Schätzung')<jupyter_output><empty_output><jupyter_text>3 Raum<jupyter_code>topmietwohnungen[topmietwohnungen['Zimmer']==3][['Titel', u'Wohnfläche', 'Kaltmiete', u'Differenz zur Schätzung', 'Stadtteil', 'Zimmer']].head(10)<jupyter_output><empty_output><jupyter_text>4 Raum<jupyter_code>topmietwohnungen[topmietwohnungen['Zimmer']==4][['Titel', u'Wohnfläche', 'Kaltmiete', u'Differenz zur Schätzung', 'Stadtteil', 'Zimmer']].head(10)<jupyter_output><empty_output><jupyter_text>5 Raum<jupyter_code>topmietwohnungen[topmietwohnungen['Zimmer']==5][['Titel', u'Wohnfläche', 'Kaltmiete', u'Differenz zur Schätzung', 'Stadtteil', 'Zimmer']].head(10)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15137381275440978, 'fraction_numerical': 0.06478968792401628, 'mean_word_length': 6.530651340996169, 'pattern_counts': {'":': 0, '<': 87, '<?xml version=': 0, '>': 86, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '22', 'dir': 'jupyter-structured-clean-dedup', 'id': '233746', 'license': 'WTFPL', 'n_tokens_mistral': 5770, 'n_tokens_neox': 5218, 'n_words': 875, 'path': 'immoanalyze.ipynb', 'repo_name': 'MsPiggi/immoscraper-master', 'size': '11792'}