<jupyter_start><jupyter_text>Exploración general<jupyter_code>builder = lambda : validators_builder(coordinates_bounds[city])

condition = (posts["city"] == city) & (posts["property_type"] == property_type) \
                  & (posts["post_type"] == post_type)<jupyter_output><empty_output><jupyter_text>Rango de valores y campos faltantesEl campo menos comun es el de la administración, seguido por el de garages y la anteguedad<jupyter_code>%matplotlib inline

msno.bar(posts)<jupyter_output><empty_output><jupyter_text>Exploración de variables de texto<jupyter_code>post_words = posts["description"].apply(lambda e: nltk.word_tokenize(e)) \
        .apply(lambda e: list(filter(
    lambda e: e not in stopwords.words('spanish') and \
                e not in [',', '.', '!', '..', ':', ';'] and \
            e.isalpha(), e)))
post_words
## https://stackoverflow.com/questions/35004945/reduce-function-for-series

tokenized_words = list(chain.from_iterable(post_words.values))
word_cloud_text = " ".join(tokenized_words)
wordcloud = WordCloud(max_font_size=100, max_words=100, background_color="white",\
                    scale=10, width=900, height=600).generate(word_cloud_text)
plt.figure(figsize=(20,8))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
%matplotlib inline

plot_discrete_columns(posts)
%matplotlib inline

## Se filtran las publicaciones que tienen nulos o no complen con los validadores

plot_valid_bars(posts, builder)<jupyter_output><empty_output><jupyter_text>Campos en que se conoce el significado de NoneVarias publicaciones no continen algunos campos, pero la asusencia del campo no significa que se desconosca su valor, en estos casos voy a asumir que el valor es cero<jupyter_code>clean_posts = posts.copy()

clean_posts.loc[clean_posts["admon"].isna(), "admon"] = 0
clean_posts.loc[clean_posts["garages"].isna(), "garages"] = 0
## Antigueda es un string, así que voy a conservar las publicaciones pero en este caso le voy a poner desconocido

clean_posts.loc[clean_posts["antiguedad"].isna(), "antiguedad"] = "desconocido"
%matplotlib inline

## Se filtran las publicaciones que tienen nulos o no complen con los validadores

clean_posts = plot_valid_bars(clean_posts, builder)
clean_posts.head()
# Precio por metro 2

clean_posts.loc[:, "price_m2"] = clean_posts["price"]/clean_posts["surface"]
MSG = """
Hay {} publicaciones de {} validas
""".format(
    clean_posts.shape[0],
    post_type
)

print(MSG)
write_posts(clean_posts, output_path)<jupyter_output>First time running this script
/home/runner/notebooks/web-scraping/data/posts/2020-09-26/clean/casas/manizales-arriendo/posts.parquet
{'fraction_non_alphanumeric': 0.12269476853594279, 'fraction_numerical': 0.014301844185171246, 'mean_word_length': 5.661654135338346, 'pattern_counts': {'":': 0, '<': 16, '<?xml version=': 0, '>': 16, 'https://': 1, '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': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '74970', 'license': 'MIT', 'n_tokens_mistral': 937, 'n_tokens_neox': 897, 'n_words': 203, 'path': 'notebooks/generated/manizales/exploration/exploration_and_cleaning_casas_arriendo.ipynb', 'repo_name': 'ymontilla/WebScrapingCatastro', 'size': '2657'}