<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Letis Pires on Medium]]></title>
        <description><![CDATA[Stories by Letis Pires on Medium]]></description>
        <link>https://medium.com/@letispires?source=rss-51224278bc56------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*E5OQTBwuTenTUUl7YJyrAw.png</url>
            <title>Stories by Letis Pires on Medium</title>
            <link>https://medium.com/@letispires?source=rss-51224278bc56------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 03:33:57 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@letispires/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[[en] From Zero to Web3: My Journey at ETHGlobal]]></title>
            <link>https://medium.com/@letispires/en-from-zero-to-web3-my-journey-at-ethglobal-710d249f8bb6?source=rss-51224278bc56------2</link>
            <guid isPermaLink="false">https://medium.com/p/710d249f8bb6</guid>
            <dc:creator><![CDATA[Letis Pires]]></dc:creator>
            <pubDate>Wed, 20 Aug 2025 08:38:24 GMT</pubDate>
            <atom:updated>2025-08-20T10:59:17.902Z</atom:updated>
            <content:encoded><![CDATA[<p>I showed up at my first ETHGlobal hackathon without even knowing what a crypto wallet was. Zero. Niente. I came from the “traditional tech” world, and Web3 for me was always a big <em>“I’ll figure it out someday.” </em>Spoiler: in just three days, I fell in love with this whole universe, launched a project, made new connections, and left thinking <em>“why didn’t I do this sooner?”</em></p><p>Today I want to share how my first two ETHGlobal events in 2025 went (Prague in May and Cannes in July) — through the lens of someone who wasn’t into blockchain at all. If you’re in tech, great. If you’re not, that’s fine too — I’ll show you that you don’t need to be in tech to join. I’ll talk about the overall experience, the application, the venue, the food, the project, the sponsors, the swags, the scholarship… and did I already mention the food?! 🤤</p><h3>But first: what’s a hackathon?</h3><p>It’s basically an intensive sprint to build a project. In about 36 hours (depending on the event), you form a team, pick a problem, build an MVP, and present it. People come from all kinds of backgrounds: product, design, data, marketing, front-end/back-end dev, blockchain dev… The magic is in that mix — everyone brings their own expertise to turn an idea into something real in a very short time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*UQVgZX02A7U_oKUiUPMwEw.gif" /></figure><h3>And what’s ETHGlobal?</h3><p>ETHGlobal is a non-profit organization that, since 2016, has been connecting people from all over the world to build on top of Ethereum. It became known for hosting some of the biggest hackathons in the ecosystem — in-person, across multiple cities, and also ETHOnline. But it goes beyond just a weekend: they provide workshops, mentorship, and programs that bring builders, companies, and protocols closer together.</p><p>Their mission: helping ideas turn into products and pushing Web3 into real life.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*qQMkKYh4jXllAEfg.jpeg" /></figure><h3><strong>Starting with the application…</strong></h3><p>First step: go to the <a href="https://ethglobal.com/events">ETHGlobal events page</a>, pick a city (or the online edition), and hit <em>Apply</em>. The form will ask about your profile, links (GitHub/portfolio), and a short note on what you enjoy building.</p><p>Once you’re approved, you’ll get an email and need to secure your spot with a stake in ETH — basically a deposit to confirm attendance. It’s not a fee: as long as you participate and submit a project, you get it back (usually within ~3 weeks after the event). In my case, it was 0.02 ETH, but the amount can vary by edition, so always check the event info page.</p><p>To stake, you’ll need a <strong>wallet</strong>. I used <strong>Phantom</strong> (which is now multichain and supports Ethereum), but MetaMask and Coinbase Wallet work great too. The flow is simple:</p><ol><li>Install the app/extension</li><li>Write down your <strong>seed phrase</strong> somewhere safe (offline!)</li><li>Add a bit of ETH to your wallet</li><li>Connect it to the Hacker Dashboard to complete the stake</li></ol><blockquote>💡 Tip: if you’ve never done this before, set up your wallet ahead of time and try a small test transaction first, just to get the hang of it.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2fcVZj7M2Fl8mqlA.png" /></figure><p><a href="https://phantom.com/learn/blog/buying-crypto-in-phantom-just-got-faster-and-easier">Here’s a link</a> where you can see how to buy crypto directly in Phantom.</p><h3><strong>About the event</strong></h3><p>ETHGlobal runs several hackathons throughout the year, each one in a different city or country. I joined Prague (May) and Cannes (July) in 2025. If traveling isn’t an option right now, there’s also <strong>ETHOnline</strong>, the 100% online — and massive — edition. This year it’ll take place from October 10 to 31, 2025, which means more time to bring an idea to life at your own pace.</p><p>For the in-person hackathons, the structure usually looks like this:</p><ul><li><strong>Friday:</strong> workshops all day + opening ceremony in the evening; that’s when teams form and the hacking begins.</li><li><strong>Saturday:</strong> full-on building marathon.</li><li><strong>Sunday:</strong> submission in the morning, demos and finalists on stage in the afternoon.</li></ul><p>In practice, it’s ~36 hours of hacking (from Friday around 9pm until Sunday around 9am). And you’re not alone: besides your team, there are mentors and sponsors around to brainstorm ideas, review architecture, suggest technologies, and help you define the MVP scope.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hlV_WAYvoG2IG-Un.jpeg" /><figcaption>Building Pomodoki at ETHGlobal Prague 2025</figcaption></figure><blockquote><strong>“But I don’t know anything about blockchain/Web3, won’t I get stuck?”</strong><br> That was literally me. At my first event, I didn’t even know what a wallet was. The key was building a complementary team: the Web3 experts took care of the on-chain side, while I focused on product, frontend development, UX, and storytelling. In just 36 hours you learn a ton, push yourself out of your comfort zone, and still leave with an honest list of “next things to study.”</blockquote><h3>Sponsors and Prizes</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*_iedJckpdlfiXcj82hcYTA.gif" /></figure><p>At ETHGlobal, you’re competing on two fronts:</p><ul><li><strong>🏆 ETHGlobal Awards (the “Top 10”)</strong><br> The organization selects the 10 best projects of the edition. These teams become finalists and present a live demo to the entire audience and the judges. Beyond the visibility, finalists usually receive a <strong>Finalist Pack</strong>, which includes: access to ETHGlobal Plus for 12 months, 1000 USDC per team member, $500 in flight credits for the next hackathon, on-chain/NFT credentials proving you were a finalist, invitations sessions with founders, infrastructure credits to keep building.</li><li><strong>💰 Sponsor Bounties</strong><br>These are challenge tracks set by each sponsor — for example, using their SDK, protocol, API, or building integrations. You pick the bounties you want to compete for, integrate their stack into your project, and submit to their track. Usually there are 1st/2nd/3rd places (sometimes special mentions), with prizes in cash, credits, and perks. You can win bounties without being a finalist — or be a finalist without winning a bounty (that was our case). And yes, it’s possible to take home multiple bounties if your project checks all the boxes.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*r-vJStKUCKBxSd3l.png" /><figcaption>ETHGlobal Prague 2025: Pomodoki among the finalists, with a live demo.</figcaption></figure><p><strong>In short:</strong> money and perks are great, but the biggest prize is visibility. Being in the Top 10 and/or winning bounties puts your project on the radar of communities, companies, and investors — and many things born over a single weekend end up becoming real products in the following months. (Our project, for example, is turning into a startup today — and it all started back at ETHGlobal Prague.)</p><h3>💰 <strong>Scholarships &amp; Opportunities</strong></h3><p>Keep an eye out — ETHGlobal and its partners/sponsors often provide <strong>travel scholarships and support</strong>. Sometimes it’s help with accommodation, flights, small grants, or even spots at a Hacker House. The best way not to miss anything is to follow <a href="https://x.com/ETHGlobal">ETHGlobal</a> and the sponsors on X (Twitter), join the Discord, and turn on notifications for announcement channels.</p><p>At ETHGlobal Cannes, for example, they opened ~100 spots for the Hacker House. We managed to get one, and it was great: a hotel close to the venue, comfy, and zero stress with transportation. In other editions (like New York), partners such as <a href="https://x.com/flow_blockchain">Flow</a> have also announced scholarships and specific support for builders.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zvPWadVO6sA9OOPT.jpeg" /><figcaption>100 builders at the first Hacker House in Cannes.</figcaption></figure><p><strong>How to increase your chances:</strong></p><ul><li>Have a mini “press kit” ready: who you are, what you want to build, links (GitHub/portfolio), and why you want to join that edition.</li><li>Apply as soon as applications open (the windows can be short).</li><li>Show past participation or contributions (even small ones) — this helps a lot.</li><li>If you got accepted but need support, write to the event team and explain your situation.</li><li>Start networking early: connect with mentors, sponsors, and organizers on X/LinkedIn/Discord and send a message. It’s that classic story: you already have the “no” — many scholarships pop up because someone remembered you at the right time.</li></ul><p>💌 <strong>Short message that works (adapt &amp; send):</strong></p><blockquote>Hi! I got accepted to [ETHGlobal ___] and will be building [idea in 1 line]. I’m looking for support/a housing scholarship. Can I share a short deck/links with you? Thanks! 🙌</blockquote><h3><strong>About the project</strong></h3><p>With <a href="https://pomodoki.com/">Pomodoki</a>, our strategy was <em>simplicity with solid execution</em>: a clear, straightforward idea, smooth UX, and an easy onboarding so anyone could start using it without friction. At a hackathon, winning isn’t about promising the world — it’s about showing quick value. Focus on one main flow you can demo in just a few clicks, and tell a story: <strong>problem → solution → why now</strong>.</p><p><strong>General hack rules</strong></p><ul><li><strong>Everything is built from scratch</strong> during the event.</li><li><strong>No pre-existing personal projects</strong>: you can’t just bring something finished and polish it.</li><li><strong>Eligibility</strong>: only accepted and registered hackers are eligible for prizes.</li></ul><p><strong>Want to compete for the Top 10 (finalists)?</strong><br> You’ll need to follow these steps:</p><ul><li><strong>Auditable code:</strong> have a public repo (with a decent README, instructions, and license).</li><li><strong>Open source:</strong> keep the repo open so judges can review it.</li><li><strong>Complete submission on the Dashboard:</strong> include a clear description, stack used, links, video, and any extra instructions.</li><li><strong>Finalist Judging live:</strong> if selected, present at the scheduled time on Sunday.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*fyUtEvvqSQR3PYf_.jpeg" /><figcaption>After presenting Pomodoki’s demo to the judges (without even imagining we’d be finalists 😅)</figcaption></figure><p>As soon as the submission deadline closes, judging begins. For the finalist round, the format is usually ~4 minutes of demo followed by ~3 minutes of Q&amp;A (this may vary by edition). To get there, make sure everything is polished on the dashboard: public repo, clear description, short video, and all the key info about your MVP.</p><p>On Sunday afternoon, if you’re selected as a finalist, you’ll get a confirmation email — that’s the signal to rush to the <strong>Finalists Room</strong>, do the tech check, align your pitch, and get your live presentation setup ready. Finalists go on stage first; only after the demos does the event announce the winners of the sponsor bounties.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*S5Ht4nj3Se2giVmM.jpeg" /><figcaption>Email received on Sunday at ETHGlobal Prague.</figcaption></figure><h3><strong>About the space</strong></h3><p>Ah, the infrastructure! The venues are big and super comfortable: food available all day (and even late at night — long live the snacks!), unlimited water and coffee, well-equipped stations, and even a space to crash 😴.</p><p>Before experiencing it, my idea of a hackathon was: pizza and pressure. But not here. They strike a great balance with plenty of relaxation sessions, healthy food, and a cozy environment. All of that makes the hackathon feel lighter, healthier, and way more fun.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hc_ejXUcjqXw9E14.png" /><figcaption>Food and Spaces in Prague and Cannes</figcaption></figure><p>They serve breakfast, lunch, and dinner — almost always with local food. It’s amazing and also a chance to get a taste of the country beyond the event itself. On Saturday, there are usually city-inspired unwind activities: yoga, a little movie session, ice cream carts, local snacks… the perfect reset in the middle of a hackathon.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Ka8JkT21-CXYGb6V.png" /><figcaption>Gelato powered by The Graph at ETHGlobal Cannes 2025.</figcaption></figure><p>And there’s the bonus of getting to know the place. In Cannes, for example, the event was held at the <strong>Palais des Festivals</strong>, right in front of the beach (which meant we could enjoy the seaside at the end of the day). On Friday, there were even fireworks — absolutely beautiful. ✨</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*35Zzr7R7MLbw-NnT.png" /><figcaption>ETHGlobal Cannes 2025</figcaption></figure><p>Another thing that really struck me: <strong>so many women</strong>. I honestly expected to see very few, since it’s historically such a male-dominated space — so it was truly beautiful to see so many women there. In Prague, for example, there was even a women-only chill space, super warm and welcoming. ✨</p><h3><strong>Swags</strong></h3><p>Ah, the swags… what can I even say?! Simply amazing! Always customized for each city and with really great quality. Think t-shirts you’ll actually wear, stickers, pins, tote bags, backpacks… In both Cannes and Prague, the items had the vibe of each place — and I still use them to this day.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*UiZQ9d4kTJKmFab7" /><figcaption>kit hacker do ETHGlobal em Cannes 2025</figcaption></figure><h3>🌟 <strong>ETHGlobal Spotlight</strong></h3><p>Beyond the hackathon itself, there’s also the <strong>Spotlight</strong> — a showcase of four early-stage projects that are already usable by the public. The idea is simple: put the products directly in the hands of builders and mentors to test live and collect feedback. Usually, these are projects that have either been finalists or already look “ready for the real world.”</p><p>In Cannes, at the very first Spotlight edition there, we presented <a href="https://x.com/pomodoki_app"><strong>Pomodoki</strong></a>. It was amazing: we got tons of qualified feedback, understood our target audience better, and walked away with a clearer roadmap. Alongside us were three other incredible projects:</p><ul><li><a href="https://x.com/decycle_io"><strong>Decycle</strong></a><strong>:</strong> smart recycling bins that reward users in <strong>$TRASH</strong> tokens based on the type and weight of the material.</li><li><a href="https://x.com/ZKPassport"><strong>ZKPassport</strong></a><strong>:</strong> identity verification with full privacy, powered by zero-knowledge proofs.</li><li><a href="https://x.com/signalswtf"><strong>Signals</strong></a><strong>:</strong> a continuous prediction market where you can bet in real time on BTC price ranges.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*IdTv04Dt9aitMGuH.png" /><figcaption>ETHGlobal Spotlight in Cannes 2025.</figcaption></figure><p><strong>The result?</strong> People testing the product all day long, asking exactly the right questions, and giving us tons of practical insights. It’s the kind of exposure that can speed up months of product development in just one weekend.</p><h3><strong>Why join?</strong></h3><p>For the visibility, the scale of the event, and the network you build. The numbers speak for themselves:</p><ul><li><strong>Prague 2025:</strong> ~825 participants, 600+ builders, 217 submissions.</li><li><strong>Cannes 2025</strong> (its very first edition): ~1,150 participants, 835 registered builders, people from <strong>67 countries</strong>.</li></ul><p>That’s a huge crowd watching demos, giving feedback, and reaching out to chat — the perfect environment to gain traction for your project. (That’s exactly what happened with Pomodoki.)</p><p>—</p><p><strong>To wrap up, a few recommendations…</strong></p><ul><li>Start connecting <strong>before</strong> the event: join the event’s Discord, introduce yourself in the right channels, look for people with skills that complement yours, and don’t be shy about sending DMs — remember, you already have the “no.”</li><li>Follow ETHGlobal’s official accounts and the sponsors on X, and turn on notifications so you don’t miss announcements about housing, scholarships, or side activities.</li><li>Take a look at the tech you plan to use; you don’t need to be an expert, but having some basic understanding will save you a lot of time.</li></ul><p>Don’t be afraid to cut scope. Build around a simple idea, and focus on execution and user experience.</p><p>That’s it! Thanks for reading this far. And if this article helped you, drop a comment below — maybe we’ll see each other at the next ETHGlobal?! 🚀✨</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/498/1*-zC2Km9XtLdMv02RJTIJGA.gif" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=710d249f8bb6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ Do zero à web3: minha experiência no ETHGlobal]]></title>
            <link>https://medium.com/@letispires/do-zero-%C3%A0-web3-minha-experi%C3%AAncia-no-ethglobal-2fc4edda9b34?source=rss-51224278bc56------2</link>
            <guid isPermaLink="false">https://medium.com/p/2fc4edda9b34</guid>
            <dc:creator><![CDATA[Letis Pires]]></dc:creator>
            <pubDate>Wed, 20 Aug 2025 08:09:34 GMT</pubDate>
            <atom:updated>2025-08-20T08:09:34.193Z</atom:updated>
            <content:encoded><![CDATA[<p>Eu cheguei no meu primeiro hackathon do ETHGlobal sem saber nem o que era carteira no mundo crypto. Zero. Niente. Eu vinha do universo “tech tradicional”, e Web3 pra mim era um grande “um dia eu vejo”. Spoiler: em três dias eu consegui me apaixonar por esse universo e, de quebra, saí com um projeto no ar, novas conexões e a sensação de “por que eu não vim antes?”.</p><p>E hoje quero te contar como foram meus primeiros dois eventos ETHGlobal em 2025 (Praga em maio, e Cannes em julho) pela minha lente de quem não era de blockchain. <strong>Se você é de tech, ótimo. Se não é, chega mais — eu te mostro, na prática, que não precisa ser de tech pra participar.</strong> Vou falar de experiência geral, aplicação, local, comida, projeto, sponsors, swags, scholarship, etc… já falei comida?!🤤</p><h3><strong>Mas, antes: o que é um hackathon?</strong></h3><p>É um intensivão de desenvolvimento de um projeto. Em cerca de 36 horas (varia conforme o evento), você forma um time, escolhe um problema, constrói um MVP e apresenta. Tem gente de tudo quanto é perfil: produto, design, dados, marketing, dev front/back, dev blockchain... O legal está justamente nessa combinação: cada pessoa contribui com sua experiência para transformar a ideia em algo concreto em pouco tempo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*UQVgZX02A7U_oKUiUPMwEw.gif" /></figure><h3>E o que é a ETHGlobal?</h3><p>O <strong>ETHGlobal</strong> é uma organização sem fins lucrativos que, desde 2016, conecta pessoas do mundo todo para construir em cima do Ethereum. Ficou conhecida por organizar alguns dos maiores hackathons do ecossistema — presenciais, em várias cidades, e também o ETHOnline — e vai além do fim de semana: oferece workshops, mentorias e programas que aproximam builders, empresas e protocolos.<br>A missão é: ajudar ideias a virarem produtos e impulsionar a Web3 para a vida real.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VP0JyRgftje_RIvY7HBksA.jpeg" /></figure><h3>Começando com a inscrição…</h3><p>Primeiro passo: entre na <a href="https://ethglobal.com/events">página de eventos da ETHGlobal</a>, escolha a cidade ou edição online e clique em Apply. O formulário pede seu perfil, links (GitHub/portfolio) e um breve contexto do que você curte construir.</p><p>Depois da aprovação, você recebe um e-mail e precisa garantir sua vaga com uma stake em ETH, um depósito só para confirmar presença. Não é uma taxa: participando e submetendo um projeto, você recebe o reembolso (geralmente em ~3 semanas após o evento). No meu caso, foi 0.02 ETH; esse valor pode variar por edição, então sempre confira a página informativa do evento.</p><p>Para fazer a stake, você vai precisar de uma <strong>wallet</strong>. Eu usei <strong>Phantom</strong> (que hoje é multichain e suporta <strong>Ethereum</strong>), mas <strong>MetaMask</strong> e <strong>Coinbase Wallet</strong> também funcionam super bem. O fluxo é simples:</p><ol><li>Instale o app/extensão,</li><li><strong>Anote a seed phrase</strong> em um lugar seguro (offline!)</li><li>Adicione um pouco de <strong>ETH</strong> na sua wallet,</li><li>E então conecte-a ao <strong>Hacker Dashboard</strong> para concluir a stake.</li></ol><blockquote><em>Dica: se nunca mexeu com isso, cria a wallet antes do evento e faz um teste com um valor pequeno, só pra pegar o jeito.</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-zHIDkJMAZXhxZ2xFI2Tcw.png" /></figure><p>Aqui <a href="https://phantom.com/learn/blog/buying-crypto-in-phantom-just-got-faster-and-easier">nesse link</a> você pode ver como comprar crypto no Phantom.</p><h3>Sobre o evento</h3><p>Acontecem vários ETHGlobal ao longo do ano, sempre em um país/cidade diferente. Eu fui a Praga (maio) e Cannes (julho) em 2025. Se viajar não rolar agora, tem o ETHOnline, a edição 100% online — e gigante. Este ano será de 10 a 31 de outubro de 2025, ou seja, mais tempo pra tirar uma ideia do papel e fazer com calma.</p><p>No presencial, o formato é o seguinte:</p><ul><li>Sexta: workshops o dia inteiro e abertura à noite; rola a formação de times e começa o “valendo!”.</li><li>Sábado: maratona de desenvolvimento.</li><li>Domingo: entrega pela manhã e, à tarde, demos e finalistas no palco.</li></ul><p>Na prática, são ~36 horas de hacking (de sexta, ~21h, até domingo, ~9h). E você não está sozinho(a): além do seu time, tem mentores e patrocinadores disponíveis pra discutir ideias, revisar arquitetura, indicar tecnologias e ajudar a fechar o escopo do MVP.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bTptzM-iNkFuaYQHlCgJmw.jpeg" /><figcaption>Construindo o Pomodoki no ETHGlobal Praga 2025.</figcaption></figure><blockquote><strong><em>“Mas eu não sei nada de blockchain/Web3, vou travar?”<br></em></strong>Fui exatamente essa pessoa. No meu primeiro evento eu nem sabia o que era uma wallet. O segredo foi montar um time complementar: quem dominava Web3 puxou a parte on-chain; eu foquei em produto, marketing, UX e storytelling. Em 36 horas você aprende muito, se desafia e ainda volta pra casa com uma lista honesta de “próximos estudos”.</blockquote><h3>Patrocinadores e prêmios</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*_iedJckpdlfiXcj82hcYTA.gif" /></figure><p>No ETHGlobal você concorre em duas frentes:</p><ol><li><strong>Premiação do ETHGlobal (os “Top 10”)</strong> — a organização escolhe 10 melhores projetos da edição. Esses times viram finalistas e apresentam uma demo ao vivo para todo o público e jurados. Além da visibilidade, os finalistas costumam receber um Finalist Pack, com benefícios como: acesso ao ETHGlobal Plus por 12 meses, 1000 USDC por membro do time, $500 em crédito de voo para o próximo hackathon, credenciais on-chain/NFT comprovando que você foi finalista, convites/mentorias com founders e créditos de infraestrutura para continuar o build.</li><li><strong>Bounties dos patrocinadores </strong>— são trilhas com desafios específicos de cada sponsor (usar um SDK, protocolo, API, compor integrações). Você escolhe as bounties que quer disputar, integra a stack no seu projeto e submete na trilha deles. Normalmente há 1º/2º/3º lugar (às vezes menções especiais), com prêmios em dinheiro, créditos e perks. Dá pra ganhar bounties mesmo sem ser finalista, ou vice -versa (nosso caso, a gente foi finalista mas não ganhou a bounty) — e dá pra levar mais de uma se o projeto cobrir bem os requisitos.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HmT4j3I_FjagrUWm5tDgwQ.png" /><figcaption>ETHGlobal Praga 2025: Pomodoki entre os finalistas, com demonstração ao vivo.</figcaption></figure><p><strong>Resumo: </strong>grana e benefícios ajudam, mas o maior prêmio é a visibilidade. Estar entre os 10 e/ou ganhar bounties coloca seu projeto no radar de comunidades, empresas e investidores — e muita coisa que nasce no fim de semana vira produto de verdade nos meses seguintes (O nosso projeto por exemplo, está virando startup hoje, e ele começou lá no ETHGlobal em Praga).</p><h3>💰 Scholarship (bolsas) e oportunidades</h3><p>Fica de olho porque sempre pintam <strong>bolsas de viagem e apoios de parceiros/sponsors</strong> — às vezes é ajuda com hospedagem, passagem, grants pequenos ou Hacker House. O caminho mais certeiro pra não perder nada é seguir a ETHGlobal e os patrocinadores <a href="https://x.com/ETHGlobal">no X (Twitter)</a>, entrar no Discord e ativar as notificações dos canais de anúncios.</p><p>No ETHGlobal Cannes, por exemplo, abriram ~100 vagas para a Hacker House. A gente conseguiu uma dessas e foi ótimo: hotel pertinho do venue, confortável e zero estresse com deslocamento. Em outras edições (tipo Nova York), parceiros como a Flow também anunciam bolsas e apoios específicos pra builders.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HCnEwYigwDl-ut9_sp-Rsw.jpeg" /><figcaption>100 builders no primeiro hacker house em Cannes.</figcaption></figure><p><strong>Como aumentar suas chances:</strong></p><ul><li>Tenha um mini “press kit” pronto: quem você é, o que quer construir, links (GitHub/portfolio) e por que participar daquela edição.</li><li>Aplique assim que abrir (as janelas podem ser curtas).</li><li>Mostre histórico de participação ou contribuições (mesmo pequenas) — isso ajuda muito.</li><li>Se foi aceito(a) no hackathon mas precisa de ajuda, escreva pro time do evento explicando a situação.</li><li>Ative o networking desde já: conecte-se com mentores, sponsors e organizadores no X/LinkedIn/Discord e mande mensagem. É aquela história: o “não” você já tem — muitas bolsas surgem justamente porque alguém lembrou de você na hora certa.</li></ul><p><strong>Mensagem curtinha que funciona (adaptar e colar):</strong></p><blockquote><em>Oi! Fui aceito(a) no [ETHGlobal ___] e vou construir [ideia em 1 linha]. Estou buscando apoio/bolsa de hospedagem. Posso te mandar um mini deck/links? Obrigado(a)! 🙌</em></blockquote><h3>Sobre o projeto</h3><p>No nosso caso com o <a href="https://pomodoki.com/">Pomodoki</a>, a estratégia foi simplicidade com boa execução: uma ideia simples e clara, UX legal e onboarding acessível pra qualquer pessoa começar a usar sem fricção. Em hackathon, ganhar não é prometer o mundo — é mostrar valor rápido. Foque em 1 fluxo principal que você consegue demonstrar em poucos cliques e conte uma história: problema → solução → por que agora.</p><h4>Regras gerais do hack</h4><ul><li><strong>Tudo do zero durante o evento</strong>: a construção acontece no fim de semana.</li><li><strong>Nada de projeto pessoal pré-existente</strong>: não vale levar algo pronto e só “dar uma polida”.</li><li><strong>Elegibilidade</strong>: só quem foi aceito(a) e está registrado(a) como hacker no evento concorre a prêmios.</li></ul><h4>Quer disputar os Top 10 (finalistas)?</h4><p>Pra concorrer, precisa seguir o seguinte:</p><ul><li><strong>Código auditável</strong>: tenha um <strong>repositório público</strong> (com README decente, instruções e licença).</li><li><strong>Open source</strong>: deixe o repo aberto para os jurados avaliarem.</li><li><strong>Submissão completa no Dashboard</strong>: descrição clara, stack usada, links, <strong>vídeo</strong> e qualquer instrução extra.</li><li><strong>Finalist Judging ao vivo</strong>: apresente no horário indicado se for selecionado(a) no domingo.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6uaunfRtEgDEUhi_ImgzZg.jpeg" /><figcaption>Depois de apresentar a demo do Pomodoki pros judges (sem nem imaginar que seríamos finalistas 😅)</figcaption></figure><p>Assim que fecha o prazo de submissão, começa a avaliação. No julgamento de finalistas, o formato geralmente é ~4 minutos de demo seguidos de ~3 minutos de Q&amp;A (pode variar por edição). Para chegar lá, deixe tudo redondo no dashboard: repositório público, descrição clara, vídeo curto e as infos essenciais do seu MVP.</p><p>No domingo à tarde, se você for selecionado(a) como finalista, chega um e-mail de confirmação — é o sinal para correr para a Finalists Room, fazer o tech check, alinhar o pitch e organizar o setup da apresentação ao vivo. Os finalistas apresentam primeiro; só depois das demos o evento anuncia os vencedores das bounties dos patrocinadores.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6Xh33Lp9oG0lES3qq8axYg.jpeg" /><figcaption>E-mail recebido no domingo no ETHGlobal em Praga.</figcaption></figure><h3>Sobre o espaço</h3><p>Ah, a infraestrutura! Os venues são grandes e super confortáveis: comida o dia todo (e de madrugada — viva os snacks!), água e café à vontade, estações bem equipadas e até espaço pra dormir.</p><p>Antes de conhecer o evento, meu conceito de hackathon era: pizza e pressão. Mas ali não. Eles conseguem equilibrar tudo muito bem, com várias sessões de descompressão, comidas saudáveis e um ambiente confortável. E toda essa estrutura deixa o peso do hackathon bem mais leve, mais saudavel e divertido.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tNHvbr-C8wiRZ3pRSGXeTw.png" /><figcaption>Comida e espaços em Praga e Cannes</figcaption></figure><p>Eles servem café da manhã, almoço e jantar, quase sempre com comidas locais — incrível e uma chance de conhecer um pouco do país além do evento. No sábado, normalmente rolam atividades de descompressão ligadas à cidade: yoga, cineminha, carrinho de sorvete, snacks típicos… dá um reset ótimo no meio do hackathon.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*04C1tpwDDxnUcTlCz1VedQ.png" /><figcaption>Gelato powered by The graph no ETHGlobal Cannes 2025.</figcaption></figure><p>E tem o bônus de conhecer o lugar. Em Cannes, por exemplo, o evento foi no Palais des Festivals, bem em frente à praia (ou seja, dava pra curtir no final do dia). Na sexta, ainda teve fogos de artifício; foi lindo demais.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_UjhAh2MP2FWy5ocAvhLag.png" /><figcaption>ETHGlobal Cannes 2025</figcaption></figure><p>Outra coisa que me marcou:<strong> muitas mulheres</strong>. Eu esperava ver poucas, por ser um ambiente historicamente masculino, então foi lindo demais ver tanta mulher. Em Praga, por exemplo, ainda havia um espaço de chill só para mulheres, super acolhedor.</p><h3>Swags</h3><p>Os swags… o que dizer dos swags?! simplesmente, incríveis! Sempre personalizados de acordo com a cidade e com uma qualidade ótima. Pense em camisetas que você realmente vai usar, adesivos, pins, tote bags, mochila, scarpe… Em Cannes e Praga vieram peças com a cara de cada lugar, e eu uso eles até hoje.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GMRt4g-lSMh4JhMd" /><figcaption>kit hacker do ETHGlobal em Cannes 2025</figcaption></figure><h3>🌟 ETHGlobal Spotlight</h3><p>Além do evento, agora também tem o Spotlight, que é uma vitrine com quatro projetos em estágio inicial já usáveis pelo público. A ideia é simples: colocar os produtos na mão de builders e mentores para testar ao vivo e coletar feedbacks. Geralmente entram projetos que já passaram por finais ou têm cara de “prontos para o mundo real”.</p><p>Em Cannes, na primeira edição por lá, levamos o Pomodoki. Foi incrível: recebemos muito feedback qualificado, entendemos melhor quem é nosso público-alvo e saímos com um roadmap mais claro. Ao nosso lado estavam outros três projetos incríveis:</p><ul><li><a href="https://x.com/decycle_io"><strong>Decycle</strong></a>: reciclagem em lixeiras inteligentes com recompensa em <strong>$TRASH</strong> de acordo com tipo e peso do material.</li><li><a href="https://x.com/ZKPassport"><strong>ZKPassport</strong></a>: verificação de identidade preservando a privacidade (zero-knowledge).</li><li><a href="https://x.com/signalswtf"><strong>Signals</strong></a>: mercado de previsão contínuo, onde dá pra apostar em faixas de preço do BTC em tempo real.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-x85-HwBd4XiehlzfYnDig.png" /><figcaption>ETHGlobal Spotlight em Cannes 2025.</figcaption></figure><p>Resultado? Gente testando o dia todo, perguntas que pegam no ponto certo e um monte de insights práticos. É o tipo de exposição que acelera meses de produto em um fim de semana.</p><h3>Por que participar?</h3><p>Pela visibilidade, pelo tamanho do evento e pela rede de contatos que se cria. Os números falam por si: em Praga 2025 foram cerca de 825 participantes, mais de 600 pessoas construindo projetos e 217 submissões; em Cannes 2025, a primeira edição por lá, houve cerca de 1.150 participantes, 835 pessoas inscritas para construir e gente de 67 países. É muita gente assistindo apresentações, avaliando e chamando para conversar — o cenário perfeito para dar tração ao seu projeto (foi assim com o Pomodoki).</p><p>—</p><h3>Para fechar, algumas recomendações…</h3><p>Comece os contatos antes do evento: entre no servidor do evento, apresente-se nos canais corretos, procure pessoas com perfis que se complementem ao seu e mande mensagem sem vergonha — é aquela história, o “não” você já tem. Siga os perfis oficiais do ETHGlobal e dos patrocinadores na rede social X e ative as notificações para não perder avisos de alojamento, bolsas e atividades paralelas. Dê uma olhada nas tecnologias que pretende usar; não precisa virar especialista, mas chegar com noção do básico economiza muito tempo.</p><p>Não tenha medo de cortar escopo, construa em uma ideia simples, foque em execução e experiência do usuário.</p><p>É isso! Obrigada por ler até aqui. E se esse artigo te ajudou, conta nos comentários. Quem sabe a gente se encontra no próximo ETHGlobal?!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/498/1*-zC2Km9XtLdMv02RJTIJGA.gif" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2fc4edda9b34" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Search Algorithms (Algoritmos de pesquisa) — parte 1]]></title>
            <link>https://medium.com/@letispires/search-algorithms-algoritmos-de-pesquisa-parte-1-c33b677d4727?source=rss-51224278bc56------2</link>
            <guid isPermaLink="false">https://medium.com/p/c33b677d4727</guid>
            <dc:creator><![CDATA[Letis Pires]]></dc:creator>
            <pubDate>Sat, 13 Jan 2024 17:22:11 GMT</pubDate>
            <atom:updated>2024-01-15T19:39:21.161Z</atom:updated>
            <content:encoded><![CDATA[<h3>Search Algorithms (Algoritmos de pesquisa) — parte 1</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pkTKaUiz-SBLihfA.png" /></figure><p>O que exatamente é um <strong>Algoritmo de pesquisa?</strong> É um tipo de algoritmo utilizado em inteligência artificial para encontrar a melhor solução para um problema explorando diferentes possibilidades no que chamamos de espaço de busca.</p><p>Imagine que você tem um monte de opções e deseja descobrir a melhor, considerando certas restrições. É aí que entram os algoritmos de busca.</p><p>Esses algoritmos passam por um grande número de possibilidades organizando-os em um tipo de gráfico, geralmente uma árvore. Eles então avaliam o melhor caminho, ou solução, com base em um determinado conjunto de regras. O objetivo é encontrar a solução ótima que atenda aos critérios do algoritmo.</p><p>Existem dois tipos principais de algoritmos de pesquisa:</p><h4><strong>Pesquisa Desinformada (Uninformed Search)</strong></h4><p>São algoritmos que não utilizam heurísticas específicas para orientar a busca. Eles exploram todas as ações possíveis de um estado, expandindo os nós uniformemente. Eles podem explorar muitos caminhos irrelevantes antes de encontrar uma solução. Alguns exemplos incluem:</p><ul><li>BFS — Pesquisa em amplitude</li><li>DFS — Pesquisa em profundidade</li><li>Uniform cost</li></ul><h4><strong>Pesquisa informada (</strong>Informed Search)</h4><p>São algoritmos que possuem informações sobre o objetivo durante a pesquisa, o que permite que a pesquisa priorize a expansão em direção ao estado final desejado, em vez de explorar caminhos que podem ter um custo favorável, mas não levam ao objetivo ou ao melhor solução geral. Em outras palavras, esses algoritmos utilizam regras (heurísticas) que ajudam a estimar onde está o objetivo. Exemplos incluem:</p><ul><li>Greedy Search</li><li>A* Search</li></ul><p>Esses algoritmos podem ser usados em diversas aplicações, como sistemas de navegação, como Google Maps, para calcular a rota mais eficiente entre dois pontos. Resolver puzzles, de forma a encontrar a melhor sequência de movimentos ou ações que conduza ao objetivo do jogo. Exploração do labirinto, encontrando um caminho para a saída.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rMHANALmCyYOgLlUe6Bvaw.jpeg" /></figure><h4><strong>Acesso ao Google Drive de resumos e exercícios</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DVqP_PjrMn1O4Xd3pLtpRA.jpeg" /></figure><p>Agora estou disponibilizando exercícios relacionados a esses algoritmos e outros materiais de estudo em meu Google Drive. Durante minha jornada como estudante e criador de conteúdo, compartilharei continuamente resumos e conteúdos exclusivos com vocês.</p><p>Para apoiar esse projeto e continuar trazendo mais conteúdo, defini um valor simbólico. Se você tiver interesse em acessar esses materiais e quiser apoiar meu projeto, <a href="https://docs.google.com/forms/d/e/1FAIpQLSe5eP4fIbNY4xmSUPv2VJS2_LMoXYftGOi4swmIPFfbf55S_A/viewform?usp=sf_link">clique nesse link </a>.</p><p>E antes de mais nada, agradeço por todo apoio de vocês sempre😍💖. Eu espero que esses recursos sejam úteis pra vocês assim como foram pra mim 😊✨</p><h4>Vídeo no Youtube — versão em inglês</h4><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FaHuxvn2CpDQ%3Fstart%3D1%26feature%3Doembed%26start%3D1&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DaHuxvn2CpDQ&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FaHuxvn2CpDQ%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/045a165a3f184d31fa26a377bc80a0f6/href">https://medium.com/media/045a165a3f184d31fa26a377bc80a0f6/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c33b677d4727" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Código Limpo — Parte 01]]></title>
            <link>https://medium.com/leti-pires/c%C3%B3digo-limpo-parte-01-ffcb90215b4a?source=rss-51224278bc56------2</link>
            <guid isPermaLink="false">https://medium.com/p/ffcb90215b4a</guid>
            <dc:creator><![CDATA[Letis Pires]]></dc:creator>
            <pubDate>Mon, 30 Aug 2021 23:09:40 GMT</pubDate>
            <atom:updated>2021-09-03T13:23:36.115Z</atom:updated>
            <content:encoded><![CDATA[<h3>5 dicas para manter o seu código mais limpo</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*EGTJK38pL_40wA17BVAPjg.jpeg" /></figure><blockquote>“Qualquer tolo consegue escrever código que um computador entenda. Bons programadores escrevem código que humanos possam entender.” Martin Fowler.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/564/1*4yNUPEfrrXNmeMjLN1pnSA.png" /></figure><p>Terminei recentemente a leitura do livro “Código Limpo”, de Robert C. Martin e simplesmente explodiu minha mente! ✨Porque quem nunca se sentiu aliviado ao ver um código confuso funcionar?!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/498/1*dEDv63JW4nGv6OdxGFssLg.gif" /></figure><p>E a frase acima, escrita pelo autor do livro, Uncle Bob (tio Bob) descreve muito bem o que é abordado no livro, sobre valores para um profissional se tornar um programador melhor. Acho que deveria ser uma leitura obrigatória para todos desenvolvedores✨!</p><p>Em resumo, o autor mostra o que é um código ruim com exemplos reais e também a forma mais adequada para manter um código limpo, legível, simples, com clareza e consistência, de forma que qualquer humano consiga ler.</p><p>Mesmo um código ruim pode funcionar. Mas se ele não for limpo, pode acabar com uma empresa de desenvolvimento.</p><p>Você sabe quem escreveu código pensando em fazer o seu melhor, pensando em outras pessoas que lerão ele. Quantas vezes você se pegou lendo um código e gastando muitas horas apenas para entendê-lo? Quantas vezes você pressionou Ctrl + F para pesquisar uma variável no arquivo?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/1*r3XzMnjRWH0Cvtf408Ahsg.gif" /></figure><p>O autor tenta deixar bem claro que o objetivo não é vender seu padrão de desenvolvimento como uma verdade absoluta, ao invés disso, Robert tenta mostrar como trabalha e o que acha uma boa prática, além de mostrar o que não gosta e consultar programadores responsáveis por projetos e linguagens conhecidas para reforçar seu ponto de vista.</p><p>No livro, Robert também frisa um ponto com relação aos detalhes. Porque detalhes importam sim! Como diria o ditado dinamarquês “Honestidade nas pequenas coisas não é uma pequena coisa”. Ou seja, devemos prestar atenção as pequenas coisas e também ser honesto com elas. Ser honesto com nosso código, com nossos colegas e acima de tudo com nós mesmos sobre o estado do nosso código. Fizemos o melhor para deixar o mais limpo possível?</p><p>Um ponto importante que está no prefácio escrito por <strong>James O. Coplien</strong> e que vai de encontro com os princípios defendidos por Robert C. Martin é que <strong>80%</strong> do que fazemos em desenvolvimento de software pode ser considerado como <strong>reparo</strong>. Sendo assim, o que podemos fazer para facilitar esta situação? Para isso, eles trazem uma filosofia japonesa de controle de qualidade chamada <strong>Total Productive Maintenance (TPM). </strong>O foco deste controle de qualidade está na manutenção e não na produção.</p><p>Em detalhes, a filosofia é composta por 5 conceitos:</p><ol><li><strong>Ordenação:</strong> nomear variáveis, funções e arquivos de forma apropriada para que você consiga encontrar o que está procurando.</li><li><strong>Sistematizar:</strong> manter cada coisa em seu lugar. Um trecho de código deve estar onde você espera encontrar, caso não esteja, mova para o local certo.</li><li><strong>Limpeza:</strong> manter o seu código limpo, indentar corretamente, remover blocos antigos de código e que foram comentados.</li><li><strong>Padronização:</strong> seguir um padrão, em que todo o time faz as coisas da mesma forma, no mesmo estilo.</li><li><strong>Disciplina:</strong> mantenha disciplina, siga as regras e esteja aberto a mudanças pessoais para se adaptar ao que foi combinado.</li></ol><p>De forma resumida, construa programas que sejam mais fáceis de refatorar e fazer manutenção, pois escrever um código limpo e legível é tão importante quanto fazer ele funcionar.</p><p>Bom, mas daí você pode me perguntar: mas o que é um código sujo?? Pra entender um pouco mais sobre código limpo, é importante saber o conceito de código sujo e quais os seus impactos.</p><h3>O que é código sujo e quais seus efeitos?</h3><blockquote>“Todos já nos sentimos aliviados ao vermos nosso programa confuso funcionar e decidimos que uma bagunça que funciona é melhor do que nada. Todos nós já dissemos que revisaríamos e limparíamos o código depois. É claro que naquela época não conhecíamos a lei de LeBlanc: Mais tarde é igual a nunca.”</blockquote><p>Se você já teve alguma experiência com programação e códigos, vai perceber quando ver um código bom e um código ruim. No código ruim parece que você está andando em uma mata fechada, pois tem pouquíssima previsibilidade do que está por vir, além de andar em cima de uma areia movediça onde qualquer movimento brusco, você afunda ainda mais em diversos detalhes de implementação confusos e desnecessários.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*hB6kZ9Y9EKA6iskZTeJF1Q.gif" /></figure><p>Com um código ruim, a produtividade cai, fica muito mais difícil de fazer manutenção, continua gerando códigos ruins, novas funcionalidades são substituídas por correções de bugs, acaba-se criando um novo projeto pois o inicial gerou muitos problemas.</p><h3>O que é Código limpo?</h3><p>Como mencionado anteriormente, Código limpo é um código legível, simples e com clareza. Um código é dito limpo quando não é preciso se esforçar para entender o que o código está fazendo, dispensam-se comentários no código para poder explicá-lo.</p><p>Segundo Michael Feathers, código limpo é “[…] se importar. Um código limpo é um código que foi cuidado por alguém. Alguém que calmamente o manteve simples e organizado; alguém que prestou atenção necessária aos detalhes, alguém que se importou”.</p><p>Mas também não basta saber escrever um código limpo. É preciso manter o código limpo com o passar do tempo, porque se tem uma coisa que é bastante comum de acontecer é começar um projeto bonitinho do zero, mas com o passar do tempo ele virar uma completa bagunça.</p><p>Há uma regra do escotismo que diz:</p><blockquote>“Deixe a área do acampamento mais limpa do que como você a encontrou”. Regra do escotismo.</blockquote><p>Trazendo a regra para o mundo da programação, a regra significa <strong>deixar o código mais limpo do que estava antes de mexer nele</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*jK4iuNJHQTdXUxXXHYCkPw.gif" /></figure><p>E para complementar o conceito de Clean Code abordado até aqui, recomendo assistir ao vídeo da série Dicionário de programador do canal Código Fonte TV:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fln6t3uyTveQ%3Fstart%3D456%26feature%3Doembed%26start%3D456&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dln6t3uyTveQ&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fln6t3uyTveQ%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/36ff7126089262a8c5c299d7533a87cc/href">https://medium.com/media/36ff7126089262a8c5c299d7533a87cc/href</a></iframe><h3>5 princípios para manter um código limpo</h3><p>No livro, o autor mostra vários princípios e boas práticas pra manter o código limpo. Trouxe alguns desses princípios e passos mencionados pelo autor, para te ajudar a manter um código limpo, simples e legível:</p><h3>1. Nomes significativos:</h3><p>Escolher bons nomes leva tempo, mas economiza mais. A definição de nome é essencial para o bom entendimento de um código. Aqui, não importa o tipo de nome, seja ele: variável, função, parâmetro, classe, método.</p><p>Ao definir um nome, é preciso ter em mente <strong>2 pontos principais</strong>:</p><ol><li>Ele deve ser preciso e passar logo de cara sua ideia central. Ou seja, deve ir direto ao ponto;</li><li>Não se deve ter medo de nomes grandes. Se a sua função ou parâmetro precisa de um nome extenso para demonstrar o que realmente representa, é o que deve ser feito.</li></ol><p>Além disso, é importante evitar informações erradas, fazer distinções de nomes significativas, usar nomes “buscáveis”, não utilizar abreviações. Em geral, classes devem ser representadas por substantivos (Cliente, Produto, NotaFiscal, etc.) e métodos devem ser representadas por verbos ou frases verbais (salvar, adicionar, enviarNotaFiscal).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/408/1*1KNncsTtxvFK7zIOC4FLQw.png" /></figure><p>Palavras comuns são redundantes. O nome de uma variável jamais deve conter a palavra “variável”. O nome de uma tabela jamais deve conter a palavra “tabela”. Imagine que você encontre uma classe Customer e outra CustomerObject. Qual seria a melhor para possuir o histórico de pagamento de um cliente?</p><p>Também é importante utilizar nomes pronunciáveis. Se não puder pronunciá-lo, não terá como discutir sobre tal nome sem parecer um idiota. “Bem, aqui no bê cê erre três cê ene tê, temos um pê esse zê quê int, viram?”</p><p>No exemplo abaixo, é possível ver uma variável criada chamada “genymdhms”. Mas o que ela significa?</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2e8b0859abeee45d9b10caeb40109f73/href">https://medium.com/media/2e8b0859abeee45d9b10caeb40109f73/href</a></iframe><p>Viu?! Eu não consigo entender o que ela está me dizendo, e também é difícil de pronunciar. A forma representada abaixo fica muito mais claro.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/23739949bbe2ec8f68ff16fe02fc7746/href">https://medium.com/media/23739949bbe2ec8f68ff16fe02fc7746/href</a></iframe><p>Por fim, usar números sequenciais em nomes (a1, a2, a3…) é o oposto da seleção de nomes expressivos. Eles não geram confusão, simplesmente não oferecem nenhuma informação.</p><h3>2. Funções</h3><p>Uma função deve fazer apenas uma coisa e devem ser pequenas. Basicamente se sua função está grande ou faz mais de uma coisa, refatore seu código, extraia funcionalidades diferentes de dentro da sua função e crie uma nova.</p><p>Não tenha medo de criar nomes extensos, pois eles são melhores que um pequeno e enigmático. Um nome longo e descritivo é melhor que um comentário extenso e descritivo. Use uma convenção de nomenclatura que possibilite uma fácil leitura de nomes de funções com várias palavras, e então, use estas para dar a função um nome que explique o que ela faz.</p><p>No livro, o autor fala que a quantidade ideal de parâmetros para uma função é zero(nulo). Depois vem um mônade, díade… Isso porque quando uma função retorna várias coisas, ficamos sem entender e faz com que leiamos novamente.</p><h3>3. Comentários</h3><blockquote>“Não insira comentários num código ruim, reescreva-o.” Brian W. Kernighan</blockquote><p>Comentário não é justificativa para ter um código sujo, bons códigos são auto documentados. Segundo o livro, não deve ser feito:</p><ul><li><strong>Comentários longos: </strong>usado para descrever versões e modificações do código. Há casos onde é registrado no comentário a data de alteração do código, o que mudou e quem mudou, esse é trabalho para as ferramentas de controle de versão e não para um comentário.</li><li><strong>Comentários ruidosos:</strong> dizem o óbvio e não fornecem novas informações.</li></ul><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/fe2c943cce15f74ac2a9afe5e98e1275/href">https://medium.com/media/fe2c943cce15f74ac2a9afe5e98e1275/href</a></iframe><ul><li><strong>Código comentado</strong>: código comentado para ser usado futuramente não existe, é um código que esta se depreciando.</li></ul><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e2b43a709922bee9e6b6daf284408492/href">https://medium.com/media/e2b43a709922bee9e6b6daf284408492/href</a></iframe><p>Esse princípio afirma que comentários podem ser feitos, porém, se forem realmente necessários.</p><p><strong>Mas por que não usar comentários?</strong></p><p>Segundo o tio Bob, porque eles mentem. Quanto mais antigo um comentário for e quanto mais longe estiver do código o qual ele descreve, mais provável que esteja errado. Não é realístico que programadores consigam sempre manter atualizados.</p><p>Logo, se for para comentar, que seja somente o necessário e que seja revisado juntamente com o código que o acompanha.</p><p>Os pontos citados pelo autor sobre comentários em código são ótimos, em muitos casos comentários são adicionados para aliviar a consciência do programador após ter feito um código ruim, sendo assim, ao invés de escrever um comentário, reescreva seu código.</p><p>Houve uma época em que explicar o código em comentários poderia ser prático. Mas com os sistemas de controle de código, eles nos lembrarão. Não precisamos dos comentários, porque não perderemos.</p><h3>4. Números mágicos</h3><p>Números mágicos são valores numéricos ou textuais no código que não são auto descritivos.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/22856e60578529129bfb6a4fd1beb27e/href">https://medium.com/media/22856e60578529129bfb6a4fd1beb27e/href</a></iframe><p>Ao invés de usar números no meio do código é aconselhável criar constantes com nomes significativos, como no exemplo abaixo:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/493a70fbde36c26efa8e360bf14e1a84/href">https://medium.com/media/493a70fbde36c26efa8e360bf14e1a84/href</a></iframe><h3>5. Formatação</h3><p>A formatação do código também é muito importante para legibilidade do mesmo. Para manter o código limpo, pode-se seguir as seguintes práticas:</p><ul><li>Espaçamento vertical entre conceitos (linhas em branco);</li><li>Declaração de variáveis o mais próximo possível de onde serão usadas;</li><li>Se uma função chama outra, elas devem ficar verticalmente próximas;</li><li>Manter linhas curtas. O limite adotado pelo autor é de 120 o comprimento máximo da linha;</li><li>Utilizar a indentação.</li></ul><p>Abaixo, um exemplo do uso errado, não legível do código, sem formatação, sem indentação, espaçamentos…</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ccde45522aa8369a884bc883fb952e7f/href">https://medium.com/media/ccde45522aa8369a884bc883fb952e7f/href</a></iframe><p>Agora olha como fica seguindo uma formatação padrão:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/46b3dca7c433a18db5e571f302c7406c/href">https://medium.com/media/46b3dca7c433a18db5e571f302c7406c/href</a></iframe><p>Por fim, o capítulo 17 fecha o livro com uma lista de “mau cheiros no código” e descobertas. Condensa as ideias do livro num formato direto e centrado no problema — ideal para revisão. E com 29 páginas, é como uma referência boa e concisa.</p><h3>Para saber mais:</h3><p>Se quiser entender mais sobre o conceito de Clean Code, recomendo o vídeo da Alura que também adentra nos princípios de SOLID.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FXV9B4LX_re8&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DXV9B4LX_re8&amp;image=http%3A%2F%2Fi.ytimg.com%2Fvi%2FXV9B4LX_re8%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/5930bcad0b69682decdbc1a1476eff67/href">https://medium.com/media/5930bcad0b69682decdbc1a1476eff67/href</a></iframe><p>Também recomendo ouvirem o “P de podcast” que fala sobre Código Limpo: <a href="https://anchor.fm/pdepodcast/episodes/Cdigo-limpo-ej4e73">https://anchor.fm/pdepodcast/episodes/Cdigo-limpo-ej4e73</a></p><p>E aí, me conta aqui nos comentários se já leu esse livro e o que achou👇.</p><p>Me siga nas redes sociais ▶️ <a href="https://beacons.page/letipires">https://beacons.page/letipires</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ffcb90215b4a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/leti-pires/c%C3%B3digo-limpo-parte-01-ffcb90215b4a">Código Limpo — Parte 01</a> was originally published in <a href="https://medium.com/leti-pires">Letis Pires</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Modelagem de Tópicos em Python utilizando o Modelo de Alocação Latente de Dirichlet (LDA)]]></title>
            <link>https://medium.com/leti-pires/modelagem-de-t%C3%B3picos-em-python-utilizando-o-modelo-de-aloca%C3%A7%C3%A3o-latente-de-dirichlet-lda-3276a469f421?source=rss-51224278bc56------2</link>
            <guid isPermaLink="false">https://medium.com/p/3276a469f421</guid>
            <dc:creator><![CDATA[Letis Pires]]></dc:creator>
            <pubDate>Thu, 10 Jun 2021 20:52:24 GMT</pubDate>
            <atom:updated>2021-06-26T13:54:40.969Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Repost: Blog da Sauter Digital</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BHKD_TNsOGEuKIGmJleEVA.png" /></figure><p>A modelagem de tópicos é um método que extrai tópicos ocultos de grandes volumes de texto. Ela utiliza as aplicações do processamento de linguagem natural para extrair os tópicos que as pessoas estão mais discutindo, dentre os volumes de texto apresentados.</p><p>E o modelo Latent Dirichlet Allocation (LDA) é um algoritmo utilizado para modelagem de tópicos que tem implementações no pacote Gensim do Python.</p><p>Esse processo é bem importante para as empresas que querem criar estratégias de monetização e melhoria de serviços, por exemplo, seja analisando avaliações de clientes, feedbacks de usuários, notícias, redes sociais, etc.</p><p>Sendo assim, o objetivo deste artigo é de criar um algoritmo automatizado que possa ler documentos e gerar os tópicos mais discutidos.</p><p>Para isso, é de extrema importância que os dados tenham qualidade no pré-processamento do texto e na melhor estratégia para encontrar o número de tópicos. Isso pode garantir uma qualidade maior, clareza e significância nos tópicos extraídos.</p><p>Esta análise foi realizada com dados extraídos de um repositório do Github nomeado “Manchetes Brasil”, de Paula Dornhofer Paro Costa (Costa, PDP), 2017. Essa base conta com dados de 500 manchetes de jornais brasileiros em datas específicas de dezembro de 2016 a agosto de 2017. Os jornais são: Valor Econômico, O Globo, Folha de S. Paulo e O Estado de S. Paulo.</p><p>O link para a base de dados pode ser acessada no link: <a href="https://github.com/pdpcosta/manchetesBrasildatabase">https://github.com/pdpcosta/manchetesBrasildatabase</a></p><p>Como será estruturado este documento:</p><ol><li>Importação de pacotes</li><li>Coleta de dados</li><li>Limpeza de dados</li><li>Modelagem de bigramas e trigramas</li><li>Transformação de dados: corpus e dicionário</li><li>Aplicação do modelo LDA</li><li>Métricas: coerência e complexidade</li><li>Encontrando o número ideal de tópicos</li><li>Conclusão</li><li>Referências</li></ol><p><strong>1. IMPORTAÇÃO DE BIBLIOTECAS</strong></p><p>Para começar, foi necessário importar algumas bibliotecas importantes, dentre elas o pandas, numpy, matplotlib, nltk, re e gensim:</p><pre>import re <br>import numpy as np <br>import pandas as pd <br>from pprint import pprint <br>import unicodedata  </pre><pre># Importando a library Natural Language Toolkit - NLTK para tratamento de linguagem natural. <br>import nltk <br>nltk.download(&#39;wordnet&#39;) <br>nltk.download(&#39;punkt&#39;)  </pre><pre>#Importando as stopwords <br>from nltk.corpus import stopwords <br>nltk.download(&#39;stopwords&#39;) <br>language = &#39;portuguese&#39;  <br>stopwords = stopwords.words(language) <br>stopwords = list(set(stopwords))  </pre><pre>#Gensim <br>import gensim <br>import gensim.corpora as corpora <br>from gensim.utils import simple_preprocess <br>from gensim.models import CoherenceModel  </pre><pre>#Plotagem <br>import matplotlib.pyplot as plt <br>import matplotlib.colors as mcolors <br>from wordcloud import WordCloud, STOPWORDS <br>%matplotlib inline  <br>import logging <br>logging.basicConfig(format=&#39;%(asctime)s : %(levelname)s : %(message)s&#39;, level=logging.ERROR)  </pre><pre>import warnings warnings.filterwarnings(&quot;ignore&quot;,category=DeprecationWarning)</pre><p><strong>2. COLETA DE DADOS</strong></p><p>O conjunto de dados utilizado, como foi mencionado anteriormente, é a base de manchetes brasileiras.</p><p>Portanto, foi importado para dentro do Google Colab o arquivo csv, através do código abaixo. O arquivo contém colunas de dia, mês, ano, jornal e as headlines(notícias).</p><p>Para visualizar, foi aplicado o método head() que traz os 5 primeiros dados do nosso dataset:</p><pre>caminho = &#39;/content/manchetesBrasildatabase.csv&#39;<br>dataframe = pd.read_csv(caminho, quotechar=&quot;&#39;&quot;, header = None, names = [&quot;Day&quot;, &quot;Month&quot;, &quot;Year&quot;, &quot;Company&quot;, &quot;Headline&quot;])<br>dataframe.head()</pre><p>Para este artigo, foi realizada a modelagem de tópicos somente para o jornal Folha de São Paulo, portanto, aplicou-se o método loc() para selecionar somente este jornal, atribuindo a uma nova variável, como mostra abaixo:</p><pre>dataframe_folha = dataframe.loc[dataframe[&#39;Company&#39;] == &#39;Folha&#39;] dataframe_folha</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/868/1*CCSxHzjGpzlPQSuquh7djA.png" /></figure><p>Sendo assim, o dataframe ficou com 127 colunas e 5 colunas.</p><p><strong>3. LIMPEZA DOS DADOS</strong></p><p>Como é possível visualizar na coluna Headline, os textos apresentam pontuações, acentuações, letras maiúsculas, stopwords… Para aplicação do modelo LDA é necessário que as palavras estejam sem essas distrações.</p><p>Além disso, para ser consumido pelo LDA, é necessário fazer uma quebra de cada frase em palavras através da tokeinização.</p><p>Portando o seguinte processo foi realizado:</p><p><em>a) Conversão da coluna para lista, remoção de novas linhas e distrações:</em></p><pre># Convertendo para lista data = dataframe_folha.Headline.values.tolist()</pre><pre># Removendo novas linhas <br>data = [re.sub(&#39;\s+&#39;, &#39; &#39;, sent) for sent in data]</pre><pre># Removendo distrações <br>data = [re.sub(&quot;\&#39;&quot;, &quot;&quot;, sent) for sent in data]</pre><p><em>b) Substituição de letras maiúsculas por letras minúsculas:</em></p><pre>#Aplicando função para deixar somente letras minúsculas.<br>def to_lowercase(words):<br>   new_words = []     <br>   for word in words: <br>     new_word = word.lower()         <br>     new_words.append(new_word)     <br>   return new_words</pre><p><em>c) Remoção de caracteres NON-ASCII:</em></p><pre>#Aplicando função para remover os caracteres Non ASCII<br>def remove_non_ascii(words):</pre><pre>&quot;&quot;&quot;Remove non-ASCII characters from list of tokenized words&quot;&quot;&quot;<br>    new_words = []<br>    for word in words:<br>       new_word = unicodedata.normalize(&#39;NFKD&#39;, word).encode(&#39;ascii&#39;, &#39;ignore&#39;).decode(&#39;utf-8&#39;, &#39;ignore&#39;)<br>       new_words.append(new_word)<br>    return new_words</pre><p><em>d) Remoção de stop words:</em></p><p>As stop words (ou palavras de parada) são palavras que podem ser consideradas irrelevantes para um conjunto de documentos. Ex: e, os, de, para, com, sem, foi.</p><pre>def remove_stopwords(texts):<br>    return [[word for word in simple_preprocess(str(doc)) if word not in stopwords] for doc in texts]</pre><pre># Removendo Stop Words<br>data_words_nostops = remove_stopwords(data_words)</pre><p>Somente aplicando as stopwords do NLTK não é suficiente para as palavras em português, pois não possui uma base tão boa. Por isso, aplicou-se o método <strong>append()</strong> para algumas palavras identificadas na análise, adicionando-as à biblioteca de stopwords.</p><pre>#Adicionando novas stopwords em português <br>stopwords = nltk.corpus.stopwords.words(&#39;portuguese&#39;) stopwords.append(&#39;ja&#39;) <br>stopwords.append(&#39;viu&#39;) <br>stopwords.append(&#39;vai&#39;) <br>stopwords.append(&#39;ne&#39;) <br>stopwords.append(&#39;ai&#39;) <br>stopwords.append(&#39;ta&#39;) <br>stopwords.append(&#39;gente&#39;) <br>stopwords.append(&#39;nao&#39;) <br>stopwords.append(&#39;aqui&#39;) <br>stopwords.append(&#39;tambem&#39;) <br>stopwords.append(&#39;vc&#39;) <br>stopwords.append(&#39;voce&#39;) <br>stopwords.append(&#39;entao&#39;) <br>stopwords.append(&#39;ate&#39;) <br>stopwords.append(&#39;agora&#39;) <br>stopwords.append(&#39;ser&#39;) <br>stopwords.append(&#39;sempre&#39;) <br>stopwords.append(&#39;ter&#39;) <br>stopwords.append(&#39;so&#39;) <br>stopwords.append(&#39;porque&#39;) <br>stopwords.append(&#39;sobre&#39;) <br>stopwords.append(&#39;ainda&#39;) <br>stopwords.append(&#39;la&#39;) <br>stopwords.append(&#39;tudo&#39;) <br>stopwords.append(&#39;ninguem&#39;) <br>stopwords.append(&#39;de&#39;)</pre><p><em>e) Remoção de pontuação e tokeinização através do simple_preprocess do Geisim:</em></p><pre>#Removendo pontuação e fazendo a tokeinização (para conseguir aplicar o modelo LDA)</pre><pre>def sent_to_words(sentences):<br>     for sentence in sentences:<br>         yield(gensim.utils.simple_preprocess(str(sentence), deacc=True))  # deacc=True removes punctuations  </pre><pre>data_words = list(sent_to_words(data))</pre><p><strong>4. MODELAGEM DE BIGRAMAS E TRIGRAMAS</strong></p><p>Os bigramas são duas palavras que ocorrem juntas num mesmo documentos e os trigramas são 3 palavras que ocorrem frequentemente juntas. Como exemplo temos a palavra ‘São Paulo’.</p><p>O Gensim apresenta um modelo Phrases que implementa esses bigramas e trigramas. Pra isso, é preciso passar dois argumentos importantes: o min_count e o threshold.</p><blockquote><em>“Quanta mais altos os valores desses parâmetros, mais difícil será para as palavras serem combinadas com os bigramas.” (*PRABHAKARAN, 2020)</em></blockquote><pre>def make_bigrams(texts):<br>     return [bigram_mod[doc] for doc in texts]<br>def make_trigrams(texts):<br>     return [trigram_mod[bigram_mod[doc]] for doc in texts]  </pre><pre># Formando Bigrams <br>data_words_bigrams = make_bigrams(data_words_nostops) data_words_bigrams</pre><p><strong>5. TRANSFORMAÇÃO DE DADOS: CORPUS E DICIONÁRIO</strong></p><p>Para dar entrada no modelo LDA é necessário ter um dicionário (id2world) e o corpus. O código abaixo realiza essa passagem:</p><pre># Criando dicionário id2word = corpora.Dictionary(data_words_bigrams)  </pre><pre># Criando corpus <br>texts = data_words_bigrams  </pre><pre># Frequencia do documento do termo <br>corpus = [id2word.doc2bow(text) for text in texts]  </pre><pre># visualizando <br>print(corpus[:1])</pre><pre><strong>#RESULTADO</strong> [[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]]</pre><p><strong>6. APLICAÇÃO DO MODELO LDA</strong></p><p>Com o corpus e o dicionário, é possível criar o modelo LDA. Além disso, é necessário incluir o número de topicos para treinar o modelo.</p><p>Outros parâmetros passados são:</p><ul><li>alpha e eta, que segundo a documentação do Gensim tem um padrão;</li><li>chunksize que representa o numero de documentos que serão usados em um bloco de treinamento;</li><li>update every mostra a frequência em que os parâmetros são atualizados;</li><li>passes representa o total de passes para treinamento.</li></ul><pre># Construindo LDA Model<br>lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus, <br>                                            id2word=id2word,<br>                                            num_topics=10,<br>                                            random_state=100,<br>                                            update_every=1,<br>                                            chunksize=100,<br>                                            passes=10,<br>                                            alpha=&#39;auto&#39;,<br>                                            per_word_topics=True)</pre><pre># Imprindo as palavras chaves nos 10 tópicos pprint(lda_model.print_topics()) <br>doc_lda = lda_model[corpus]</pre><p>Neste modelo utilizou-se 10 tópicos diferentes, no qual cada tópico representa uma combinação de palavras-chave e cada uma possui uma contribuição com um nível de importância diferente (peso).</p><pre>#RESULTADO:<br>[(0,<br>  &#39;0.052*&quot;lava&quot; + 0.052*&quot;jato&quot; + 0.026*&quot;ameaca&quot; + 0.026*&quot;economia&quot; + &#39;   &#39;0.026*&quot;novo&quot; + 0.026*&quot;pf&quot; + 0.022*&quot;manteve&quot; + 0.022*&quot;repasse&quot; + &#39;   &#39;0.022*&quot;ilicito&quot; + 0.022*&quot;retomada&quot;&#39;),<br>(1,<br> &#39;0.042*&quot;lula&quot; + 0.031*&quot;trump&quot; + 0.031*&quot;diz&quot; + 0.028*&quot;menos&quot; + &#39;   &#39;0.021*&quot;politica&quot; + 0.021*&quot;mesquita&quot; + 0.021*&quot;ministros&quot; + 0.021*&quot;maior&quot; + &#39;   &#39;0.018*&quot;deflagra&quot; + 0.018*&quot;decreto&quot;&#39;),<br>(2,<br>&#39;0.042*&quot;pais&quot; + 0.023*&quot;crise&quot; + 0.023*&quot;presidente&quot; + 0.020*&quot;rio&quot; + &#39;   &#39;0.020*&quot;dias&quot; + 0.020*&quot;afirma&quot; + 0.020*&quot;cada&quot; + 0.017*&quot;colega&quot; + &#39;   &#39;0.017*&quot;elmar&quot; + 0.017*&quot;nascimento&quot;&#39;),<br>(3,<br>&#39;0.027*&quot;ataque&quot; + 0.026*&quot;deve&quot; + 0.023*&quot;deixa&quot; + 0.023*&quot;mortos&quot; + &#39;   &#39;0.023*&quot;helio&quot; + 0.023*&quot;schwartsman&quot; + 0.023*&quot;aposentadoria&quot; + 0.023*&quot;vira&quot; &#39;   &#39;+ 0.023*&quot;ato&quot; + 0.023*&quot;venezuela&quot;&#39;),<br>(4,<br>&#39;0.058*&quot;contra&quot; + 0.044*&quot;brasil&quot; + 0.034*&quot;coreia&quot; + 0.034*&quot;cria&quot; + &#39;   &#39;0.034*&quot;plano&quot; + 0.034*&quot;fuga&quot; + 0.034*&quot;embaixada&quot; + 0.027*&quot;maduro&quot; + &#39;   &#39;0.024*&quot;reformas&quot; + 0.021*&quot;temer&quot;&#39;),<br>(5,<br>&#39;0.038*&quot;stf&quot; + 0.025*&quot;oab&quot; + 0.025*&quot;pressiona&quot; + 0.025*&quot;convocar&quot; + &#39;   &#39;0.025*&quot;auxiliares&quot; + 0.025*&quot;apuracao&quot; + 0.025*&quot;acelerar&quot; + 0.025*&quot;juizes&quot; + &#39;   &#39;0.010*&quot;gera&quot; + 0.005*&quot;sabe&quot;&#39;),<br>(6,<br>&#39;0.037*&quot;temer&quot; + 0.029*&quot;admite&quot; + 0.029*&quot;plebiscito&quot; + 0.029*&quot;barbosa&quot; + &#39;   &#39;0.029*&quot;celso&quot; + 0.025*&quot;agradar&quot; + 0.025*&quot;trabalhadores&quot; + 0.025*&quot;tenta&quot; + &#39;   &#39;0.025*&quot;pacote&quot; + 0.025*&quot;empresarios&quot;&#39;),<br>(7,<br>&#39;0.054*&quot;odebrecht&quot; + 0.020*&quot;pt&quot; + 0.020*&quot;quer&quot; + 0.020*&quot;vitoria&quot; + &#39;   &#39;0.020*&quot;mulher&quot; + 0.020*&quot;corte&quot; + 0.017*&quot;refens&quot; + 0.017*&quot;psdb&quot; + &#39;   &#39;0.017*&quot;haddad&quot; + 0.017*&quot;atraso&quot;&#39;),<br>(8,<br>&#39;0.048*&quot;ano&quot; + 0.032*&quot;doria&quot; + 0.028*&quot;sp&quot; + 0.027*&quot;bi&quot; + 0.024*&quot;eike&quot; + &#39;   &#39;0.024*&quot;cuba&quot; + 0.021*&quot;prioriza&quot; + 0.021*&quot;zeladoria&quot; + 0.021*&quot;centro&quot; + &#39;   &#39;0.021*&quot;aposentado&quot;&#39;),<br>(9,<br>&#39;0.029*&quot;anos&quot; + 0.025*&quot;esquerda&quot; + 0.025*&quot;recorde&quot; + 0.025*&quot;deficit&quot; + &#39;   &#39;0.022*&quot;deve&quot; + 0.022*&quot;passado&quot; + 0.022*&quot;govwerno&quot; + 0.022*&quot;idade&quot; + &#39;   &#39;0.022*&quot;minima&quot; + 0.022*&quot;subir&quot;&#39;)]</pre><p>Podemos interpretar os tópicos da seguinte forma: o tópico 0 apresenta o seguinte:</p><pre>&#39;0.052*&quot;lava&quot; + 0.052*&quot;jato&quot; + 0.026*&quot;ameaca&quot; + 0.026*&quot;economia&quot; + &#39;   &#39;0.026*&quot;novo&quot; + 0.026*&quot;pf&quot; + 0.022*&quot;manteve&quot; + 0.022*&quot;repasse&quot; + &#39;   &#39;0.022*&quot;ilicito&quot; + 0.022*&quot;retomada&#39;</pre><p>Ou seja, as 10 principais palavras chave que contribuem para o tópico são: lava, jato, ameaca, economia… e o peso de ‘lava’ é 0.052.</p><p>Dessa forma, olhando para essas palavras, é possível identificar qual o tópico macro seria? Entendendo mais do contexto, podemos dizer que o tópico seria ‘política’.</p><p>Da mesma forma podemos analisar as outras palavras chave e inferir o tópico sobre elas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/901/1*C-xptVNj2kbjrDo8P6vRmQ.png" /></figure><p><strong>7. MÉTRICAS: COERÊNCIA E PERPLEXIDADE</strong></p><p>A coerência e perplexidade fornecem uma medida para julgar se o modelo de tópico pode ser bom ou não. A coerência do modelo segundo referências externas, é o que melhor tem fornecido resultados úteis.</p><pre># Calculando a perplexidade print(&#39;\nPerplexity: &#39;, lda_model.log_perplexity(corpus))  # a measure of how good the model is. lower the better.</pre><pre># Calculando o score de coerência <br>coherence_model_lda = CoherenceModel(model=lda_model, texts=data_words_bigrams, dictionary=id2word, coherence=&#39;c_v&#39;)<br>coherence_lda = coherence_model_lda.get_coherence() print(&#39;\nCoherence Score: &#39;, coherence_lda)</pre><p><strong>8. ENCONTRANDO O NÚMERO IDEAL DE TÓPICOS</strong></p><p>A forma utilizada para entender qual a quantidade de tópicos pode ser ideal para o modelo é escolhendo o maior valor de coerência fornecido.</p><blockquote><em>“A escolha de um ‘k’ que marca o fim de um rápido crescimento da coerência do tópico geralmente oferece tópicos significativos e interpretáveis.” (*PRABHAKARAN, 2020)</em></blockquote><p>A função abaixo treina vários modelos LDA e fornece as pontuações de coerência.</p><pre># Função para determinar a melhor quantidade de tópicos para a modelagem<br>def compute_coherence_values(dictionary, corpus, texts, limit, start=3, step=3):<br>    &quot;&quot;&quot;     Compute c_v coherence para vários números de tópicos<br>            Parâmetros passados:<br>            ----------<br>            dicionário : Gensim dicionário<br>            corpus : Gensim corpus<br>            texto : Lista com os textos de entrada<br>            limite : número máximo de tópicos</pre><pre>Retorno:<br>            -------<br>            model_list : Lista de modelos de tópicos de LDA <br>            coherence_values : Valor de coerência correspondente ao modelo LDA com o respectivo número de tópicos.<br>            &quot;&quot;&quot;     <br>            coherence_values = []<br>            model_list = [] <br>            for num_topics in range(start, limit, step): <br>              model =gensim.models.ldamodel.LdaModel(corpus=corpus, num_topics=num_topics, id2word=id2word)<br>              model_list.append(model)         <br>              coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence=&#39;c_v&#39;) <br>             coherence_values.append(coherencemodel.get_coherence())            <br>            <br>            return model_list, coherence_values</pre><pre>#Pode demorar pra executar <br>model_list, coherence_values = compute_coherence_values(dictionary=id2word, corpus=corpus, texts=data_words_bigrams, start=3, limit=40, step=6)</pre><pre># Mostrando gráfico <br>limit=40; start=3; step=6; <br>x = range(start, limit, step) <br>plt.plot(x, coherence_values) <br>plt.xlabel(&quot;Num Topics&quot;) <br>plt.ylabel(&quot;Coherence score&quot;) <br>plt.legend((&quot;coherence_values&quot;), loc=&#39;best&#39;) <br>plt.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*LSOrDapHdDx6Kj4fbdmb2g.png" /></figure><pre># Lista dos valores de coerência, para melhor identificar o ponto de inflexão do gráfico <br>for m, cv in zip(x, coherence_values):<br>     print(&quot;A quantidade de tópicos =&quot;, m, &quot; tem um valor de coerência de &quot;, round(cv, 4))</pre><pre>#RESULTADO <br>A quantidade de tópicos = 3  tem um valor de coerência de  0.683 <br>A quantidade de tópicos = 9  tem um valor de coerência de  0.6061 <br>A quantidade de tópicos = 15  tem um valor de coerência de  0.4835 <br>A quantidade de tópicos = 21  tem um valor de coerência de  0.4506 <br>A quantidade de tópicos = 27  tem um valor de coerência de  0.4127 <br>A quantidade de tópicos = 33  tem um valor de coerência de  0.4037 <br>A quantidade de tópicos = 39  tem um valor de coerência de  0.4201</pre><p>Pelo gráfico podemos entender que quanto menor o número de tópicos, maior é o CV.</p><p>Portanto, para as próximas etapas vou utilizar num_topics igual a 3, ou a posição 0 da lista acima.</p><pre># Selecionando o modelo  e imprimindo os tópicos. <br>optimal_model = model_list[0] <br>model_topics = optimal_model.show_topics(formatted=False)<br>pprint(optimal_model.print_topics(num_words=10))</pre><pre>#RESULTADO <br>[(0,<br>   &#39;0.011*&quot;presidente&quot; + 0.007*&quot;ataque&quot; + 0.007*&quot;deixa&quot; +<br> 0.007*&quot;temer&quot; + &#39;   &#39;0.007*&quot;diz&quot; + 0.006*&quot;pais&quot; + 0.005*&quot;ano&quot; +<br> 0.005*&quot;reformas&quot; + 0.005*&quot;apoio&quot; &#39;   &#39;+ 0.005*&quot;esquerda&quot;&#39;),<br>  (1,<br>   &#39;0.010*&quot;deve&quot; + 0.010*&quot;governo&quot; + 0.008*&quot;trump&quot; + 0.007*&quot;apos&quot; + &#39;   &#39;0.006*&quot;maduro&quot; + 0.006*&quot;pais&quot; + 0.006*&quot;contra&quot; + 0.006*&quot;camara&quot; + &#39;   &#39;0.005*&quot;stf&quot; + 0.005*&quot;brasil&quot;&#39;),<br>  (2,<br>   &#39;0.013*&quot;diz&quot; + 0.011*&quot;temer&quot; + 0.009*&quot;crise&quot; + 0.009*&quot;menos&quot; + 0.008*&quot;doria&quot; &#39;   &#39;+ 0.006*&quot;preciso&quot; + 0.005*&quot;odebrecht&quot; + 0.005*&quot;lula&quot; + 0.005*&quot;sociedade&quot; + &#39;   &#39;0.005*&quot;poder&quot;&#39;)]</pre><p><strong>9. ENCONTRANDO PALAVRAS CHAVE EM CADA DOCUMENTO</strong></p><p>A modelagem de tópicos também permite determinar de qual tópico o documento trata.</p><p>A função abaixo encontra esses tópicos e mostra em um dataframe apresentável:</p><pre>def format_topics_sentences(ldamodel=lda_model, corpus=corpus, texts=data):<br>     # Saída inicial<br>     sent_topics_df = pd.DataFrame()<br>      # Obtém o tópico principal em cada documento<br>     for i, row in enumerate(ldamodel[corpus]):<br>         row = sorted(row, key=lambda x: (x[1]), reverse=True)<br>         # Obtém o tópico dominante, contribuição em percentual e palavras-chave para cada documento<br>         for j, (topic_num, prop_topic) in enumerate(row):<br>             if j == 0:  # =&gt; tópico dominante<br>                 wp = ldamodel.show_topic(topic_num)<br>                 topic_keywords = &quot;, &quot;.join([word for word, prop in wp])<br>                 sent_topics_df = sent_topics_df.append(pd.Series([int(topic_num), round(prop_topic,4), topic_keywords]), ignore_index=True)<br>             else:<br>                 break<br>     sent_topics_df.columns = [&#39;Tópico dominante&#39;, &#39;Percentual de Contribuição&#39;, &#39;Palavras Chave&#39;]<br>      # Adiciona o texto original no final da saída<br>     contents = pd.Series(texts)<br>     sent_topics_df = pd.concat([sent_topics_df, contents], axis=1)<br>     return(sent_topics_df)</pre><pre>df_topic_sents_keywords = format_topics_sentences(ldamodel=optimal_model, corpus=corpus, texts=data)  </pre><pre># Formatando<br> df_dominant_topic = df_topic_sents_keywords.reset_index()<br> df_dominant_topic.columns = [&#39;Número do documento&#39;, &#39;Tópico dominante&#39;, &#39;Perc. de Contribuição do Tópico&#39;, &#39;Palavras Chave&#39;, &#39;Transcription&#39;]  </pre><pre># Mostre <br>df_dominant_topic.head(10)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pwYbQe8GNKWY1Bps50hs8A.png" /></figure><p><strong>10. CONCLUSÃO</strong></p><p>Por fim, gerou-se uma Wordcloud pra visualizar melhor os tópicos encontrados, através do modelo ótimo. A partir disso, é possível visualizar a relevância de cada palavra dentro de cada tópico.</p><pre># Criando wordclouds<br> cols = [color for name, color in mcolors.XKCD_COLORS.items()]<br> cloud = WordCloud(stopwords=stopwords,<br>                   background_color=&#39;white&#39;,<br>                   width=2500,<br>                   height=1800,<br>                   max_words=20,<br>                   colormap=&#39;tab10&#39;,<br>                   color_func=lambda *args,**kwargs: cols[i],<br>                   prefer_horizontal=1.0)<br> topics = optimal_model.show_topics(formatted=False)<br> fig, axes = plt.subplots(1, 3, figsize=(10,10), sharex=True, sharey=True)<br> for i, ax in enumerate(axes.flatten()):<br>     fig.add_subplot(ax)<br>     topic_words = dict(topics[i][1])<br>     cloud.generate_from_frequencies(topic_words, max_font_size=600)<br>     plt.gca().imshow(cloud)<br>     plt.gca().set_title(&#39;Tópico &#39; + str(i), fontdict=dict(size=16))<br>     plt.gca().axis(&#39;off&#39;)<br> plt.subplots_adjust(wspace=0, hspace=0)<br> plt.axis(&#39;off&#39;)<br> plt.margins(x=0, y=0)<br> plt.tight_layout()<br> plt.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ojZM_Mg3cqDTF-iMN7ceCA.png" /></figure><p><strong>11. REFERÊNCIAS</strong></p><ul><li>Gensim Topic Modelling: <a href="https://www.machinelearningplus.com/nlp/topic-modeling-gensim-python/#:~:text=%2C">https://www.machinelearningplus.com/nlp/topic-modeling-gensim-python/#:~:text=%2C</a> per_word_topics%3DTrue-,13.,certain weightage to the topic.</li><li>Como modelar tópicos através de Latent Dirichlet Allocation (LDA) através da biblioteca Gensim: <a href="https://medium.com/somos-tera/como-modelar-t%C3%B3picos-atrav%C3%A9s-de-latent-dirichlet-allocation-lda-atrav%C3%A9s-da-biblioteca-gensim-1fa17357ad4b">https://medium.com/somos-tera/como-modelar-tópicos-através-de-latent-dirichlet-allocation-lda-através-da-biblioteca-gensim-1fa17357ad4b</a></li><li>Topic Modeling and Latent Dirichlet Allocation (LDA) in Python: <a href="https://towardsdatascience.com/topic-modeling-and-latent-dirichlet-allocation-in-python-9bf156893c24">https://towardsdatascience.com/topic-modeling-and-latent-dirichlet-allocation-in-python-9bf156893c24</a></li><li>Evaluate Topic Models: Latent Dirichlet Allocation (LDA): <a href="https://towardsdatascience.com/evaluate-topic-model-in-python-latent-dirichlet-allocation-lda-7d57484bb5d0">https://towardsdatascience.com/evaluate-topic-model-in-python-latent-dirichlet-allocation-lda-7d57484bb5d0</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3276a469f421" width="1" height="1" alt=""><hr><p><a href="https://medium.com/leti-pires/modelagem-de-t%C3%B3picos-em-python-utilizando-o-modelo-de-aloca%C3%A7%C3%A3o-latente-de-dirichlet-lda-3276a469f421">Modelagem de Tópicos em Python utilizando o Modelo de Alocação Latente de Dirichlet (LDA)</a> was originally published in <a href="https://medium.com/leti-pires">Letis Pires</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Usando API Pytrends do Google para as trends do twitter — Encontrando tópicos de crescente…]]></title>
            <link>https://medium.com/leti-pires/usando-api-pytrends-do-google-para-as-trends-do-twitter-encontrando-t%C3%B3picos-de-crescente-ec325fccf1d4?source=rss-51224278bc56------2</link>
            <guid isPermaLink="false">https://medium.com/p/ec325fccf1d4</guid>
            <dc:creator><![CDATA[Letis Pires]]></dc:creator>
            <pubDate>Tue, 01 Jun 2021 00:16:34 GMT</pubDate>
            <atom:updated>2021-06-01T00:20:36.571Z</atom:updated>
            <content:encoded><![CDATA[<h3>Usando a API Pytrends para as trends do Twitter — Encontrando tópicos de crescente popularidade e mais discutidos</h3><p>Repost: Blog da Sauter Digital</p><h3>Introdução</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/509/1*U8X9J2of_g4tjOGPh2DwdA.png" /></figure><p>O Google Trends é uma ferramenta de propriedade do Google que analisa a popularidade dos termos em vários idiomas e regiões. Por exemplo, no site você pode encontrar palavras chaves das tendências, explorar tópicos relacionados, analisar popularidade de termos e mais. É uma ferramenta muito útil se você quer fazer previsões ou entender melhor o comportamento humano. O livro “Todo mundo mente”, cita muito sobre o Google Trends, mostrando que o que as pessoas falam nem sempre é o que elas buscam no Google. Inclusive, recomendo muito essa leitura!</p><p>Dessa forma, existe a biblioteca Pytrends python que pode ser utilizada para encontrar e explorar melhor as tendências. Pytrends, segundo a documentação <a href="https://pypi.org/project/pytrends/">Pytrends PyPI</a>, é uma API não oficial do Google Trends que pode ser usada para extrair informações úteis usando uma interface simples.</p><h3>Objetivos</h3><p>Sendo assim, este artigo tem como objetivo mostrar o uso da ferramenta para tópicos de crescente popularidade e principais resultados da pesquisa. No entanto, ao invés de fazer busca por termos gerais, foi utilizado um dataset com trends extraídas do Twitter.</p><h3>Especificações técnicas</h3><p>O código foi desenvolvido em Python, com auxílio da API do Google e como IDE utilizou-se o Google Colab.</p><h3>Instalação</h3><p>A primeira etapa é instalar a biblioteca pytrends através do código abaixo. A documentação você encontra no link <a href="https://pypi.org/project/pytrends/">https://pypi.org/project/pytrends/</a></p><pre>pip install pytrends</pre><h3>Implementação</h3><p>Depois de instalar a biblioteca, é necessário fazer uma conexão com o Google, utilizando os seguintes comandos:</p><pre>#Importando o método TrendReq do módulo de requisição do Pytrends <br>from pytrends.request import TrendReq</pre><pre>#Execute o método TrendReq passando os parâmetros de linguagem e fuso horário<br>pytrends = TrendReq(hl=&#39;pt-BR&#39;, tz=360)</pre><p>Em seguida é necessário construir uma carga útil. Essa carga irá conter informações de solicitação que ajudam o serviço a entender quais dados se deseja obter. Abaixo, um exemplo de como construir uma carga útil:</p><pre># Contruindo lista de palavras-chave <br>kw_list = [&quot;covid&quot;, &quot;bolsonaro&quot;, &quot;bbb&quot;] </pre><pre># Consturindo a carga útil <br>pytrends.build_payload (kw_list, timeframe = &#39;2015-01-01 2021-01-01&#39;, geo = &#39;BR&#39; )</pre><p>No exemplo acima, o kw_list representa uma lista de palavras para obter os dados, geo é a localização geográfica e o timeframe é o prazo de interesse.</p><h3>Aplicando à base de dados do Twitter</h3><p>Como mencionado no início, utilizarei trends extraídas do twitter para gerar os tópicos de popularidade crescente e principais resultados da pesquisa. Por isso, inicialmente realizei algumas importações.</p><pre>import pandas as pd<br>from pytrends.request import TrendReq<br>pytrends = TrendReq(hl=&#39;pt-BR&#39;, tz=360)</pre><pre>#Para limpeza de texto<br>import unicodedata<br>import re</pre><pre>#Coletando os dados<br>path = &#39;&lt;https://raw.githubusercontent.com/letpires/trends_twitter_pytrends/main/trends_twitter.csv%20-%20P%C3%A1gina1.csv&gt;&#39;<br>trends = pd.read_csv(path,encoding=&quot;ISO-8859-1&quot;, decimal=&quot;,&quot;, na_values=&quot;-&quot;, engine=&quot;python&quot;)<br>trends.head()</pre><p>É posssível perceber que algumas trends vieram com caracteres especiais, por isso, optei por removê-los, utilizando a função abaixo, extraída do StackOverflow:</p><pre>&quot;&quot;&quot;<br>A remoção de acentos foi baseada em uma resposta no Stack Overflow.<br>&lt;http://stackoverflow.com/a/517974/3464573&gt;<br>&quot;&quot;&quot;</pre><pre>def removerAcentosECaracteresEspeciais(palavra):</pre><pre>    # Unicode normalize transforma um caracter em seu equivalente em latin.<br>    nfkd = unicodedata.normalize(&#39;NFKD&#39;, palavra)<br>    palavraSemAcento = u&quot;&quot;.join([c for c in nfkd if not unicodedata.combining(c)])</pre><pre>    # Usa expressão regular para retornar a palavra apenas com números, letras e espaço<br>    return re.sub(&#39;[^a-zA-Z \\\\\\]&#39;, &#39;&#39;, palavraSemAcento)</pre><p>Aplicando a função acima no dataframe, podemos obter o seguinte resultado:</p><pre>#Aplicando a função para remover caracteres especiais<br>trends[&#39;trend&#39;] = trends.apply(lambda row: removerAcentosECaracteresEspeciais(row[&#39;trend&#39;]), axis=1)<br>trends.head()</pre><p>Em seguida, fiz a transformação dessas trends em lista, para poder passar pela API do Google:</p><pre># Convertendo para lista<br>df_list = trends[&quot;trend&quot;].tolist()<br>df_list</pre><p>Em seguida, apliquei o parâmetro related_topics para extrair as informações. Esse parâmetro retorna um dicionário contendo uma palavra chave e duas subchaves (‘rising’ e “top). Para extrair tópicos com popularidade crescente, temos o resultado do rising e para principais pesquisas tem-se os resultados do top .</p><p>A função abaixo extrai em forma de dataframe somente os principais tópicos de cada pesquisa:</p><pre>def related_topics_top(trend):<br>		    #Colocando carga útil<br>        pytrends.build_payload(kw_list=[trend], timeframe=&#39;now 1-d&#39;, geo=&#39;BR&#39;, gprop=&#39;&#39;)<br>        related = pytrends.related_topics()<br>        try:<br>						#Transformando as informações me dataframe<br>            top = pd.DataFrame.from_dict(related[trend][&#39;top&#39;])<br>            <br>            return top<br>        except Exception as e:<br>            top = None<br>            raise e</pre><p>Como temos uma lista de palavras do twitter, fiz uma iteração sobre cada um, através do código abaixo:</p><pre>#Aplicando a função related_topics_top para cada item da lista</pre><pre>df_final = pd.DataFrame()</pre><pre>for item in df_list:<br>    print(&#39;----ITEM:&#39;, item)<br>    related = related_topics_top(item)</pre><pre>    #Inserindo o &#39;trend&#39; nos dataframes<br>    related.insert(0, &#39;trend&#39;, item, allow_duplicates=True)<br>    df_final = df_final.append(related.head()).reset_index(drop=True)</pre><pre>print(&#39;--- DF Final ---&#39;)<br>df_final</pre><p>O resultado obtido foi o seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Os5pP3TBjNIqBtfQbJyPag.png" /></figure><p>Esses resultados não parecem tão interessantes visto que a palavra Xama está em 2 das linhas de topic title. Abaixo, a função para extrair somente os tópicos de popularidade crescente.</p><pre>def related_topics_rising(trend):<br>	      <br>	#Colocando carga útil<br>        pytrends.build_payload(kw_list=[trend], timeframe=&#39;now 1-d&#39;, geo=&#39;BR&#39;, gprop=&#39;&#39;)<br>        related_rising = pytrends.related_topics()<br>        try:<br>	#Transformando as informações me dataframe<br>        rising = pd.DataFrame.from_dict(related_rising[trend][&#39;rising&#39;])<br>        return rising<br>        <br>except Exception as e:<br>            rising = None<br>            raise e</pre><pre>#Aplicando a função related_topics_rising para cada item da lista<br>df_final_rising = pd.DataFrame()</pre><pre>for item in df_list:<br>    print(&#39;----ITEM:&#39;, item)<br>    related2 = related_topics_rising(item)<br>    #Inserindo o &#39;trend&#39; nos dataframes<br>    related2.insert(0, &#39;trend&#39;, item, allow_duplicates=True)<br>    df_final_rising = df_final_rising.append(related2.head()).reset_index(drop=True)</pre><pre>print(&#39;--- DF Final ---&#39;)<br>df_final_rising</pre><p>O resultado obtido para tópicos de popularidade crescente foram:</p><p>No conjunto de resultados “crescentes”, podemos ver que as pesquisas instantâneas de seleção inglesa e Manchester estão entre os principais tópicos crescentes relacionados ao Harry Kane.</p><h3>Conclusão:</h3><p>Um ponto de atenção é com relação ao uso excessivo da API Pytrends, porque o Google pode limitar seu acesso. No entanto, esse limite da taxa de solicitação não é conhecido, segundo a página Pytrendd PyPI. Quando realizei esse trabalho, tive um problema similar de requisições. Segundo o site <a href="https://medium.com/the-data-science-publication/how-to-use-the-pytrends-api-to-get-google-trends-data-4378acbaaa8a">https://medium.com/the-data-science-publication/how-to-use-the-pytrends-api-to-get-google-trends-data-4378acbaaa8a</a>, um usuário relatou que 1400 solicitações sequenciais em um período de 4 horas o levou ao imite.</p><p>Nesse link você encontra outras pessoas que relataram o mesmo problema — <a href="https://github.com/GeneralMills/pytrends/issues/231">https://github.com/GeneralMills/pytrends/issues/231</a></p><p>Nesse link você encontra o código completo no meu Github — <a href="https://github.com/letpires/trends_twitter_pytrends">https://github.com/letpires/trends_twitter_pytrends</a></p><p><em>Referências:</em></p><p><a href="https://medium.com/the-data-science-publication/how-to-use-the-pytrends-api-to-get-google-trends-data-4378acbaaa8a">https://medium.com/the-data-science-publication/how-to-use-the-pytrends-api-to-get-google-trends-data-4378acbaaa8a</a></p><p><a href="https://pypi.org/project/pytrends/">https://pypi.org/project/pytrends/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ec325fccf1d4" width="1" height="1" alt=""><hr><p><a href="https://medium.com/leti-pires/usando-api-pytrends-do-google-para-as-trends-do-twitter-encontrando-t%C3%B3picos-de-crescente-ec325fccf1d4">Usando API Pytrends do Google para as trends do twitter — Encontrando tópicos de crescente…</a> was originally published in <a href="https://medium.com/leti-pires">Letis Pires</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[6 livros sobre ciência de dados (não técnicos)]]></title>
            <link>https://medium.com/leti-pires/6-livros-sobre-ci%C3%AAncia-de-dados-n%C3%A3o-t%C3%A9cnicos-6074e270daff?source=rss-51224278bc56------2</link>
            <guid isPermaLink="false">https://medium.com/p/6074e270daff</guid>
            <dc:creator><![CDATA[Letis Pires]]></dc:creator>
            <pubDate>Mon, 24 May 2021 22:57:39 GMT</pubDate>
            <atom:updated>2021-08-09T12:51:06.065Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Repost: Blog da Sauter Digital</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Sy0wDEZf3fuf_qP4aT7uzg.png" /></figure><p>Quando eu estava entendendo melhor sobre a profissão de Cientista de Dados, eu comecei a pesquisar por livros que me mostrassem o que era e como se relacionava com as coisas, mas que não fossem livros técnicos. E essa listinha que trouxe aqui, são alguns que encontrei e que são muito recomendados. Alguns eu já li e outros estão na minha lista.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/402/1*QueMULOF4IkLQKFbCxIOfg.gif" /></figure><p><strong>COMO MENTIR COM ESTATÍSTICA, DE DARRELL HUFF</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/855/0*h5R1M1Ity6zlmrpX.png" /></figure><p>O livro foi lançado em 1954 nos Estados Unidos e é um clássico quando o assunto é estatística. O autor apresenta várias situações em que números, gráficos e estatísticas são apresentadas de forma equivocada, mostrando como pode afetar uma pessoa desatenta. É a prova de que quem quiser manipular dados a seu favor, pode agir com facilidade. Apesar de ser escrito em 1954 com alguns fatos ocorridos nos Estados Unidos, mostra a semelhança com situações ainda do presente.</p><p>Quando eu vi esse livro eu pensei “quem vai ensinar alguém a mentir com estatística?”, e isso foi o que me motivou ainda mais a ler esse livro. Na verdade, o livro mostra um pouco mais como funcionam os estudos estatísticos e como NÃO sermos manipulados por eles.</p><p>O livro é bem didático, apresentando casos com situações profundas sobre métodos estatísticos utilizados e com situações não muito complexas. Em cada situação podemos entender melhor o método de análise, tendenciosidade, período histórico, condições para levantamento dos dados…</p><blockquote><em>“Em uma lata com milho e ervilha, como descobrimos quantos milhos há na lata? A forma mais precisa seria contá-los. Muito trabalhoso? Podemos então contar uma parcela dos grãos de milhos e calcular a proporção para a lata inteira. Se essa porção, chamada de amostra, for grande o suficiente, será uma boa representação do total contido na lata. Se não for suficiente, será menos precisa e confiável, mas ainda assim permanecerá com o falso ar de “precisão científica”. Dessa forma, as conclusões, a partir dessas amostras tendenciosas e/ou reduzidas, representam grande parte do que lemos ou que acreditamos saber.</em></blockquote><p>Dica extra: você pode conferir esses dois posts que fiz no meu Instagram (@leticiapyres) falando sobre o livro:</p><p><a href="https://www.instagram.com/p/CHgYHgKl9hi/">https://www.instagram.com/p/CHgYHgKl9hi/</a> | <a href="https://www.instagram.com/p/CKom2lKg-Dq/">https://www.instagram.com/p/CKom2lKg-Dq/</a></p><p><strong>TODO MUNDO MENTE, DE SETH STEPHENS-DAVIDOWITZ</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/855/0*R1MQA6cv7sVrFCCn.png" /></figure><p>O livro é resultado de uma pesquisa feita pelo próprio autor. Seth Stephens já trabalhou na Google e é cientista de dados e doutor em economia pela Harvard. O livro foi lançado na versão em português em 2018 e mostra que o ‘Google pode saber mais de você do que você mesmo”.</p><p>O autor prova, através do Big Data, que todo mundo mente, seja pra amigos, conhecidos e até mesmo família. Analisando os dados do Google Trends, ele mostra a controvérsia de pesquisas feitas por órgãos de competência, por exemplo. Além disso, ele aborda o tema, e as mentiras que contamos de maneira divertida.</p><p>A abordagem serve para mostrar que o Big Data vem para revolucionar a maneira como as pesquisas sobre opinião, bem como sobre comportamento, podem ser melhor tratadas com a enorme quantidade de dados que há hoje a disposição na rede.</p><p>Portanto você pode até dizer para todo mundo que não é racista, mas sem que ninguém saiba, você faz perguntas preconceituosas para o Google, ou seja o Google sabe quem você realmente é.</p><p><strong>ESTATÍSTICA: O QUE É, PARA QUE SERVE, COMO FUNCIONA, DE CHARLES WHEELA</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/852/0*gpYcKv0to6tngVip.png" /></figure><p>O economista Charles Wheelan apresenta a estatística de um jeito não muito técnico, trazendo exemplos reais com assuntos que interessam a todos. O livro ajuda a entender conceitos estatísticos importantes para a vida cotidiana como inferência, correlação e análise de dados, mas sem trazer muita matemática, gráficos e equações. Dessa forma, o autor torna a estatística acessível não só para os que estudam estatística, mas qualquer um que deseje compreender melhor os desafios do mundo em que vivemos.</p><p>Ele mostra que com os dados certos e ferramentas estatísticas adequadas, podemos responder algumas perguntas, como: quais substâncias ou comportamentos causam câncer, o que está provocando o aumento da incidência de autismo e como a Netflix sabe quais filmes você gosta.</p><p><strong>O SINAL E O RUÍDO, DE NATE SILVER</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/856/0*MwImLTcMlgeX21i0.png" /></figure><p>O livro foi publicado em 2012 por Nate Silver, que ficou conhecido por ter criado um modelo preditivo que rendeu ótimo desempenho nas eleições dos EUA em 2008 e 2012.</p><p>No livro, o autor chama de ruído, quando precisamos tomar decisões ou fazer previsões de dados existentes, mas não sabemos o quão correto é. E o ruído pode atrapalhar o sinal, fazendo tomar decisões incorretas.</p><p>De modo geral, o autor mostra que muitas das previsões feitas hoje são falhas e nos mostra o que pode estar por trás desses erros.</p><p>Além disso, também examina casos que tiveram sucessos e fracassos pra determinar o que as melhores predições apresentam em comum, como avaliar o desempenho de um político em campanha, o estrago esperado de um furacão ou um avanço de uma epidemia perigosa.</p><p>Sendo assim, o autor Silver demonstra que a interpretação correta de dados numéricos é essencial para a segurança e o progresso de nossa sociedade.</p><p><strong>DATA SCIENCE PARA NEGÓCIOS, DE FOSTER PROVOST &amp; TOM FAWCETT</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/855/0*r9zB6qakTp93FEOK.png" /></figure><p>O livro aborda alguns assuntos de principais algoritmos como k-NN, árvores de decisão, regressão logística mas sem ser muito técnico. Um ponto interessante do livro é que o autor traz uma diversidade de explicações, utilizando recursos visuais pra explicar os algoritmos. Além disso, o autor traz essas explicações com aplicações práticas, o que torna mais tangível a teoria.</p><p>De modo geral, o livro apresenta os princípios fundamentais de Data Science, orientando através de um pensamento analítico a extrair conhecimento e valor de negocio a partir dos dados que obtemos.</p><p><strong>STORYTELLING COM DADOS, DE COLE NUSSBAUMER KNAFLIC</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/854/0*-VjMEM18W7m-CB62.png" /></figure><p>O livro é muito indicado pra quem pensa em trabalhar ou quer melhorar e otimizar as apresentações e visualizações de dados. Além disso, a autora traz várias dicas e insights, mostrando exemplos reais de como como otimizar a visualização de gráficos e atribuir mais contexto as apresentações de resultados.</p><p>As principais ideias do livro são: entender o contexto (o quê, quem, onde, como e porque), escolher uma apresentação visual adequada ao público, eliminar saturação das imagens, focar atenção no que deseja, pensar qual a função da apresentação e a meta, contar uma história.</p><p><strong>(EXTRA)</strong> <strong>MACHINE LEARNING: GUIA DE REFERÊNCIA RÁPIDA, DE MATT HARRISON</strong></p><p>Como bônus, trouxe um livro mais técnico que me ajudou muito a desenvolver projetos de Machine Learning. Você pode conferir um projeto que fiz com base no livro, nesse link: <a href="https://medium.com/leti-pires/predi%C3%A7%C3%A3o-da-necessidade-de-leitos-de-uti-no-hospital-s%C3%ADrio-liban%C3%AAs-811c88062f15?source=collection_home---4------2-----------------------">Predição da necessidade de leitos de UTI no Hospital Sírio Libanês</a>.</p><p><strong>Curtiu? Então compartilha, comenta, curte e me segue nas redes sociais:</strong></p><p><a href="https://beacons.page/letipires">https://beacons.page/letipires</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6074e270daff" width="1" height="1" alt=""><hr><p><a href="https://medium.com/leti-pires/6-livros-sobre-ci%C3%AAncia-de-dados-n%C3%A3o-t%C3%A9cnicos-6074e270daff">6 livros sobre ciência de dados (não técnicos)</a> was originally published in <a href="https://medium.com/leti-pires">Letis Pires</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Entre em contato]]></title>
            <link>https://medium.com/leti-pires/entre-em-contato-2967271a79ca?source=rss-51224278bc56------2</link>
            <guid isPermaLink="false">https://medium.com/p/2967271a79ca</guid>
            <dc:creator><![CDATA[Letis Pires]]></dc:creator>
            <pubDate>Wed, 24 Mar 2021 20:53:27 GMT</pubDate>
            <atom:updated>2022-01-10T10:35:24.475Z</atom:updated>
            <content:encoded><![CDATA[<p>só me chamar :)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*90IEsi-ViOV1Vxs4mkwGhg.png" /></figure><p>Quer me ajudar com algum projeto envolvendo dados? Tem alguma ideia? Encontrou algum erro? Ou tem uma vaga pra mim?! Não é nada disso? Tudo bem, podemos bater um papo sobre Data Science e todo seu universo :).</p><p><strong>Instagram:</strong> <a href="https://www.instagram.com/letispires/">https://www.instagram.com/letispires/</a></p><p><strong>LinkedIn:</strong> <a href="https://www.linkedin.com/in/leticia-pires/">linkedin.com/in/leticia</a>-pires</p><p><strong>Github:</strong> <a href="https://github.com/gerolaleticia">github.com/l</a>etpires</p><p><strong>Comunidade no Discord:</strong> <a href="https://discord.gg/7TVrKPMrYd">https://discord.gg/7TVrKPMrYd</a></p><p><strong>Youtube:</strong> <a href="https://www.youtube.com/channel/UC7C3taM54q4rsEIDPFNVsLg">https://www.youtube.com/channel/UC7C3taM54q4rsEIDPFNVsLg</a></p><p><strong>Twitch:</strong> <a href="https://www.twitch.tv/leti_pires">https://www.twitch.tv/leti_pires</a></p><p><strong>E-mail:</strong> <a href="/service/mailto:leticiapyres@gmail.com">leticiapyres@gmail.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2967271a79ca" width="1" height="1" alt=""><hr><p><a href="https://medium.com/leti-pires/entre-em-contato-2967271a79ca">Entre em contato</a> was originally published in <a href="https://medium.com/leti-pires">Letis Pires</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Predição da necessidade de leitos de UTI no Hospital Sírio Libanês]]></title>
            <link>https://medium.com/leti-pires/predi%C3%A7%C3%A3o-da-necessidade-de-leitos-de-uti-no-hospital-s%C3%ADrio-liban%C3%AAs-811c88062f15?source=rss-51224278bc56------2</link>
            <guid isPermaLink="false">https://medium.com/p/811c88062f15</guid>
            <dc:creator><![CDATA[Letis Pires]]></dc:creator>
            <pubDate>Tue, 23 Mar 2021 19:29:52 GMT</pubDate>
            <atom:updated>2021-04-06T00:33:09.860Z</atom:updated>
            <content:encoded><![CDATA[<h4>Machine Learning na COVID-19</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*grfeeTktgtQK9pYLcpfeLQ.png" /></figure><p>Esse foi o tema do meu primeiro projeto de Machine Learning que desenvolvi no Bootcamp de Data Science Aplicada da Alura (que orgulho que me deu 🤩). E hoje vim aqui compartilhar um pouco mais sobre o projeto e como foi estruturado.</p><p>O livro que utilizei como referência para esse estudo (além das aulas do curso) foi o “Machine Learning: Guia de Referência Prática”. Esse livro simplesmente me salvou! (Vou fazer um post só sobre ele, mas de modo geral ele auxilia a seguir um fluxo de ideias pro projeto, desde a limpeza dos dados até a avaliação dos modelos preditivos).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/560/1*k_rzynFbUPsjJVz2xlSGkA.png" /></figure><h3>Introdução</h3><p>A pandemia de COVID-19 atingiu o mundo inteiro, sobrecarregando os sistemas de saúde — despreparados para uma solicitação tão intensa e demorada de leitos de UTI, profissionais, equipamentos de proteção individual e recursos de saúde. Países como o Brasil, que já possui sistema de saúde superlotados, vem sofrendo com a falta de leitos de Unidade de Terapia Intensiva (UTI) na internação de seus pacientes.</p><p>Com base nesses acontecimentos e até mesmo na prevenção de sobrecarga do sistema de saúde das redes privadas, o Hospital Sírio-Libanês, busca prevenir e até mesmo predizer, com base em dados clínicos de seus pacientes, conforme forem sendo admitidos no ambiente hospitalar, a necessidade ou não de internação nas UTIs nas próximas horas. A proposta feita pelo Hospital Sírio Libanês está disposta <a href="https://www.kaggle.com/S%C3%ADrio-Libanes/covid19">nesse link do Kaggle</a>.</p><p>Sendo assim, o objetivo desse projeto foi de prever quais pacientes precisariam ser admitidos na unidade de terapia intensiva e assim, definir qual a necessidade de leitos de UTI do hospital, a partir dos dados clínicos individuais disponíveis.</p><p>A ideia deste artigo é ser um ponto de referência e geração de insights para seus projetos. Você pode ter acesso completo ao notebook desse projeto clicando no link abaixo:</p><p><a href="https://github.com/letpires/ICU_prediction_sirio_libanes/blob/main/Leticia_Pires.ipynb">letpires/ICU_prediction_sirio_libanes</a></p><p>Para contextualizar, o conjunto de dados está dividido em janelas pacientes que fizeram admissão na UTI, como mostra a figura abaixo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*xZEzzJ-1iR3WTKNRKJ4adg.png" /></figure><p>Para realizar o projeto, alguns critérios foram obrigatórios. Não pude utilizar os dados quando o paciente deu entrada na UTI -&gt; ICU = 1, pois estes já terão ido diretamente para a UTI nas 2 primeiras horas, não importando para a predição.</p><p>O projeto ficou dividido nas seguintes etapas:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1019/1*Bc59iztNbCzmDHghni5Y_g.png" /><figcaption>Etapas do projeto.</figcaption></figure><h3>1. Importações</h3><p>Para começar, importei algumas bibliotecas importantes para esse trabalho. Dentre elas, utilizei: pandas, numpy, seaborn, matplotlib, sklearn, yellowbrick e xgboost:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/638/1*MQJNDo74qB-KHGOTndGGYw.png" /></figure><h3>2. Coleta de dados</h3><p>Carreguei o arquivo csv com os atributos das amostras do Covid 19. Esse arquivo contém várias colunas, incluindo uma coluna relacionada à UTI (ICU em inglês).</p><p>Para visualizar os dados, apliquei o método head() que nos trazer os 5 primeiros dados do nosso dataset:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/644/1*_qKtmTtj3C2rvF-2RWsErg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1017/1*I3QYnzd6hTSf7220gn-5uw.png" /></figure><p>O dataset acima não está completo, pois ele possui 231 colunas. Explicando melhor sobre o dataset, temos pacientes positivos para COVID-19 internados no Hospital Sírio Libânes de São Paulo-SP e Brasília-DF. De forma geral, temos até 5 entradas que representam dados de um mesmo paciente. Essas entradas são referentes à diferentes janelas de tempo (0–2, 2–4, 4–6, 6–12, &gt;12) em que os pacientes foram acompanhados. Para cada uma das janelas, foram dosados diversos marcadores biológicos e sinais vitais.</p><p>Resumidamente, o layout dos dados estruturados e a estrutura do banco é a seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ap1lwAH5cWVLa6a_6Z45eQ.png" /><figcaption><strong>Layout do dados e Estrutura de repetição dos dados no banco usado no desafio.</strong></figcaption></figure><h3>3. Limpeza dos dados</h3><p>Depois de conhecer melhor os dados, realizei uma limpeza neles.</p><p>É importante garantir que os dados estejam em um formato adequado para criar o modelo posteriormente. A maioria dos modelos do scikit learn exige que nossos atributos sejam numéricos. Além disso, muitos modelos falham caso recebam dados ausentes (NaN).</p><p>Para isso, inicialmente apliquei a função fill_table (criei funções para facilitar no desenvolvimento do projeto) para agrupar a coluna PATIENT_VISIT_IDENTIFIER e preencher dados faltantes através dos métodos bfill() e ffill().</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/978/1*ActBJUVrYh6y3ysX6Qj9-w.png" /></figure><p>Em seguida, realizei uma query por todas as colunas/linhas que possuem WINDOW==&#39;0-2&#39; eICU==1, que deverão ser removidas da base de dados, como mencionado lá no início. Em seguida, utilizei o dropna para remover dados NaN.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/804/1*Hw8cHLv-gkqX0Opet-rkAg.png" /></figure><p>Em seguida, identifiquei que o dataset ainda apresentava colunas do tipo string, AGE_PERCENTIL e WINDOW . Como mencionei, essas colunas podem atrapalhar no modelo depois. Então para resolver, utilizei uma solução encontrada no livro de Matt Harrison. Criei colunas dummy a partir de colunas de string, e aplicando o get_dummies, foi criada uma coluna pra cada valor, sendo preenchido por 0 e 1.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/898/1*j51jjJ-LspGsHb7AMTKEMg.png" /></figure><p>Além disso, inicialmente também foi aplicado a funçãoprepare_window para ficar somente com o quadro de pacientes que entram nas primeiras 2 horas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/919/1*GWPNcMzb8qvG9gEd58l9bA.png" /></figure><p>Depois de fazer a limpeza inicial dos dados, fiz um novo tratamento, pois talvez nem todas as colunas sejam necessárias, podendo atrapalhar nas predições.</p><blockquote>Segundo Harrison (2020), “removemos qualquer coluna com uma correlação perfeita ou com uma correlação positiva ou negativa bem alta. A multicolinearidade pode causar impactos na interpretação da importância dos atributos e dos coeficientes em alguns modelos”.</blockquote><p>Então removi todas as colunas com correlação perfeita ou alta correlação. Para fazer isso utilizei a técnica elaborado pelos instrutores do Bootcamp, Thiago Gonçalves e Alan Spadinni nas aulas do Módulo 6, que consiste na criação de correlação de todas as linhas a partir da quarta coluna e antepenúltima (sem considerar WINDOW e ICU). Em seguida é gerado uma correlação e transformação dos valores para absoluto (não negativos).</p><blockquote>“A correlação vai de -1 a 1. Altas correlações aproximam de -1 e +1. Quando é próxima de -1 ocorre o inverso, então uma variável cresce e outra sobre. Quando é próxima de +1, é proporcional, quando uma sobre a outra também sobe.”</blockquote><p>Em seguida o any busca dentro dentro da matriz de correlação variáveis com alta correlação (valores acima do valor_corte) e através do laço for, isso é repetido pra todas as colunas. E caso seja verdadeiro, fica armazenado dentro de uma lista.</p><p>No entanto, fazendo somente essas ações não é possível, visto que, todas as colunas seriam excluídas. Por isso, podemos observar através da figura abaixo que a coluna na diagonal é igual a 1, e o triângulo superior é um espelho do inferior. Sendo assim, aplicando o where, np.ones(matriz com 1s) e np.triu(elimina triângulo abaixo da diagonal igual a 1).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/786/1*5FASOA5bnxpZ_3vEYzSTWg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Uh1b9Vse4HPLgOlJSFOOzw.png" /></figure><h3>4. Separação das amostras</h3><p>Segundo Harrison (2020) sempre devemos fazer treinamento e testes em dados distintos. Caso contrário, você não saberá realmente quão bem seu modelo poderá ser generalizado para dados que ainda não tenham sido vistos antes.</p><p>Utilizei o scikit-learn para fazer essa separação dos dados através do método train_test_split :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/897/1*79NvejAyZkZYi_168GyUug.png" /></figure><h3>5. Criando o modelo</h3><p>Para o projeto decidi fazer a análise utilizando 4 modelos de classificação: Regressão Logística, Árvore de Decisão, Floresta Aleatória e o XGBoost.</p><p>No entanto, para exemplificar aqui, vou utilizar somente o modelo de Floresta Aleatória (ou Random Forest), que aparentemente se apresentou melhor na análise.</p><p>Uma floresta aleatória é um conjunto de árvores de decisão. Ao criar árvores treinadas com sub-amostras e atributos aleatórios de dados, a variância é reduzida. A ideia das florestas aleatórias é criar uma “floresta” de árvores de decisão treinadas em diferentes colunas de dados de treinamento.</p><p>Então, inicialmente passei a biblioteca RandomForestClassifier . Apliquei um n_estimators = 100 , que representa a adição de mais árvores, evitando uma superadequação.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/939/1*yYAGWIcEUKIusDVXZM1Z-Q.png" /></figure><p>Em seguida, para treinar o modelo, é necessário passar o método .fit com os dados de treino e para fazer a predição aplicar o método .predict com o x_test.</p><p>Como comentei anteriormente, automatizei esse processo dentro de funções. Então apliquei a separação dos dados de treino e teste, treinamento e predição em cada função de métrica, como mostra o tópico seguinte.</p><h3>6. Métricas e avaliação de classificação</h3><p>A fim de avaliar o comportamento do modelo, utilizei as seguintes métricas: acurácia, matriz de confusão, recall, precisão, F1 e curva ROC.</p><p><strong>6.1. Acurácia</strong></p><p>A acurácia representa a porcentagem de classificações corretas do modelo. Ou seja, quanto maior a acurácia, mais próximo da referência ou valor real. Através da função abaixo, separei meus dados de treino e teste, treinei o modelo, fiz a predição e calculei a acurácia.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EOoULSWF_FqDRETLPbAFBg.png" /></figure><p>Passando os dados e o modelo de Floresta Aleatória na função, tem-se o seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/780/1*s2TiHfpqPhoRYATzVKW8tA.png" /></figure><p>O valor de acurácia obtido do modelo foi de 65,91%. Ou seja, de todas as classificações, somente 65,91% foram corretas.</p><p><strong>6.2. Matriz de Confusão</strong></p><p>Outra métrica importante para avaliar os modelos de Machine Learning é a Matriz de Confusão. Ela pode ajudar a compreender o desempenho de um classificador. Um classificador binário pode ter quatro resultados de classificação:</p><ul><li>VP: verdadeiro positivo (a pessoa precisa de UTI e o modelo acertou)</li><li>VN: verdadeiro negativo (acerto para quando a pessoa não precisa de UTI)</li><li>FP: falso positivo (O modelo diz que é 1, mas a label é 0)</li><li>FN: falso negativo (o modelo diz que é 0, mas a label é 1)</li></ul><p>As duas primeiras classificações representam a maneira correta.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/518/1*9jVbw8dhglOGkA5QK4sRxA.png" /></figure><p>Para entender mais sobre matriz de confusão, clique nesse <a href="https://medium.com/data-hackers/entendendo-o-que-%C3%A9-matriz-de-confus%C3%A3o-com-python-114e683ec509">link</a>.</p><p>A função abaixo separa os dados de treino e teste, treina o modelo, faz a predição e cria o gráfico de matriz de confusão.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RpZGuHRKwHvqd2VpztP8TA.png" /></figure><p>O resultado da matriz gerada é o seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/468/1*6u9x_G9mAGFdxQKdMDayLw.png" /></figure><p>Em resumo, o modelo acertou 24 vezes para pacientes que devem ser internados na UTI (verdadeiro positivo) e 34 vezes para pacientes que não devem ser internados (verdadeiro negativo).</p><p>No entanto, o modelo previu 13 vezes para pacientes que devem ser internados (falso positivo), que na realidade não devem. E previu 17 vezes para pacientes que não deveriam ser internados (falso negativo), sendo que deveriam ser.</p><p>É insano prever que uma pessoa não precisa de leito, sendo que precisa. Assim como também, superlotar leitos de UTI com pessoas que não precisariam estar ali.</p><p><strong>6.3. Precisão, Recall e F1</strong></p><p>Aprofundando mais as métricas, podemos utilizar o ClassificationReport para encontrar a precisão, recall e F1. A função abaixo roda_modelo gera essas métricas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/818/1*Jp6sVNPVg9wEPMgIaRdfTg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/873/1*NGwlIJboGl1HCfZQlzzrQw.png" /></figure><p>O resultado obtido foi o seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/438/1*fm-DvNT3sflWk9LMtTEZEA.png" /></figure><p>Para valores igual a 0 (pacientes que não precisam de UTI), possuimos uma precisão de 73% e para valores igual a 1 (pacientes que precisam de UTI) a precisão é de 67%. Segundo <a href="https://medium.com/@vitorborbarodrigues/m%C3%A9tricas-de-avalia%C3%A7%C3%A3o-acur%C3%A1cia-precis%C3%A3o-recall-quais-as-diferen%C3%A7as-c8f05e0a513c#:~:text=O%20recall%20pode%20ser%20usada,prejudiciais%20que%20os%20Falsos%20Positivos.&amp;text=O%20F1%2DScore%20%C3%A9%20simplesmente,e%20recall">este artigo</a>, a <strong>PRECISÃO</strong> pode ser usada em situação em que os falsos positivos são considerados mais prejudiciais que os falsos negativos, ou seja, será importante para o caso de estarmos internando mais pessoas do que o necessário, superlotando o hospital e fazendo com que pessoas que precisem de fato, fiquem sem leitos de UTI.</p><p>Já o <strong>RECALL</strong> pode ser usada em uma situação em que os Falsos Negativos são considerados mais prejudiciais que os Falsos Positivos. Por exemplo, o modelo deve de qualquer maneira encontrar todos os pacientes que precisam de UTI, mesmo que classifique os que não precise (situação de Falso Positivo). Ou seja, o modelo deve ter alto recall ou alta sensibilidade, pois imagina classificar pacientes que precisam de UTI como pacientes que não precisam, seria um problema muito grave.</p><p>No caso, nosso recall apresentou para 0, um desempenho alto de 70%, enquanto para a classe 1, 71%.</p><p>O <strong>f1 score</strong> nos mostra uma média harmônica entre precisão e recall. Para 0, apresentou 72% e para 1, 69% (representa que ou recall ou precisão estão baixos).</p><p><strong>6.4. Curva ROC</strong></p><p>Outra métrica utilizada é o roc_auc, ou área sob a curva ROC (Receiver Operator Characteristic). A curva ROC mostra o desempenho do classificador, exibindo taxa de verdadeiros positivos à medida que a taxa de falsos positivos muda. A regra geral é que o gráfico deve ter uma protuberância em direção ao canto superior esquerdo. Um traçado que esteja à esquerda e acima de outro sinaliza um desempenho melhor.</p><p>A função abaixo plota a curva ROC:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/842/1*p66YBe16X_AUFVXt5SE9Gw.png" /></figure><p>Chamando a função…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*w7j8pywCOTDhM7Mx1xvnUg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/563/1*63DASdYXi-XkYm1DVuXkBA.png" /></figure><p>O valor AUC ficou em 0.79, que pode ser considerado um bom desempenho. Modelos com AUC igual a 0 representam previsões 100% erradas. Quanto mais próximo de 1, melhor o modelo é.</p><p>Comparando com os outros modelos utilizados no projeto, este apresentou um valor de AUC melhor, mas o modelo ainda depende de hiperparâmetros para melhorar seu desempenho. Pra otimizar o modelo, utilizamos a curva de validação.</p><h3><strong>8. Seleção do modelo</strong></h3><p>Existem duas formas possíveis de avaliar um modelo. Através da Curva de Validação e Curva de Aprendizagem.</p><ul><li><strong>Curva de Validação: </strong>é uma forma de determinar um valor apropriado para um hiperparâmetro. Uma curva de validação é um gráfico que mostra como o desempenho do modelo responde a mudanças no valor do hiperparâmetro. O gráfico mostra tanto os dados de treinamento como de validação. As pontuações dos dados de validação nos permitem inferir como o modelo responderia a dados não vistos anteriormente. Em geral, escolhemos um hiperparâmetro que maximize a pontuação dos dados de validação.</li><li><strong>Curva de Aprendizagem:</strong> pode nos ajudar a seguinte pergunta: Quantos dados sserão necessários para selecionar o melhor modelo para o projeto? O gráfico mostra as instâncias de treinamento e a pontuação para validação cruzada a medida que criamos modelos com mais amostras. Se a pontuação da validação cruzada continuar a subir, por exemplo, poderá ser sinal de que mais dados ajudariam o modelo a ter melhor desempenho. Se houver variabilidade (uma área sombreada grande) na pontuação de dados de treinamento, é sinal de que o modelo sofre de erros de viés e é simples demais (há subadequação). Se houver variabilidade na pontuação para validação cruzada, é porque o modelo está sujeito a erros de variância e é complicado demais (há superadequação).</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YsafgW570NpC7swuhEeTug.png" /><figcaption>Curva de Validação e Curva de Aprendizagem, respectivamente.</figcaption></figure><p>Através da função abaixo, criei o gráfico de Curva de Validação para o modelo citado:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xZ_HVpwr5d-y9UkShQkfXg.png" /></figure><p>Aplicando a função…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/989/1*UEBXDH4FYIFU_R_sGKpdpg.png" /></figure><p>O resultado obtido para a Curva de Validação foi o seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/925/1*jz1veXB1HKPBtsSXvuvodg.png" /></figure><p>A linha azul representa os dados de treino. Essa linha mostra, que a cada valor max_depth, a pontuação se aproxima de 1.00, que pode levar a um <strong>overfitting.</strong> O overfitting ocorre quando o modelo se adaptou muito bem aos dados com os quais está sendo treinado, porém, não generaliza bem para novos dados. Ou seja, o modelo decorou o conjunto de dados de treino, mas não aprendeu de fato o que diferencia aqueles dados para quando enfrentar novos testes. E isso, podemos perceber através da linha verde (que representa os dados de teste), que fica sempre no intervalo de 0.60 a 0.85.</p><p>E a função abaixo representa o gráfico da Curva de Aprendizagem para o modelo citado:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/834/1*sFe3ic5XnKSLr9lz7C8Kkg.png" /></figure><p>Aplicando a função…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/913/1*gTJQgJRTqzH6FwcVhpEy3Q.png" /></figure><p>O resultado obtido para a Curva de Aprendizagem foi o seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/909/1*dHxz3pgLS5_u2T_rLZlBAw.png" /></figure><p>Na Curva de Aprendizagem do modelo, percebe-se que a curva de Validação Cruzada (verde) começa a subir, o que pode ser um sinal de que mais dados ajudariam o modelo a ter um desempenho melhor. Mas parece manter constante depois mesmo adicionando dados.</p><p>A pontuação da validação cruzada (curva verde) apresenta uma variabilidade (área sombreada grande), indicando que o modelo está sujeito a erros de variância e é complicado demais, ou seja, há superadequação.</p><p>E os dados de treinamento (linha azul) apresenta um desempenho constante. Adicionar mais dados, não vai influenciar no modelo.</p><h3>7. Validação Cruzada</h3><p>A validação cruzada é uma técnica para avaliar a capacidade de generalização de um modelo, a partir de um conjunto de dados. Ou seja, busca-se estimar o quão preciso é este modelo na prática, o seu desempenho para um novo conjunto de dados.</p><p>Uma das maneiras de fazer a divisão desses dados é usando o método holdout, ele consiste em dividir os dados em 70–30 de maneira aleatória. Ou seja, 70% dos dados para treino e 30% para teste.</p><p>Para fazer isso, é utilizado o cross_validate, que tem como principal objetivo evitar problemas de aleatoriedade.</p><p>O cross_validate pega os dados, separa em porções de treino e teste, embaralha os dados e divide em k números de dobras (grupos), para assim termos conjuntos diferentes de dados para treino e teste. O resultado do nosso modelo vai ser a média dos valores de cada um desses grupos.</p><p>* A única desvantagem de utilizar o cross_validate é o desempenho, se você tiver uma base de dados muito grande rodar um cross validation vai ser muito custoso computacionalmente.</p><p>Utilizei a função abaixo para calcular a Validação Cruzada.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/987/1*YCP3qMYUCViij_NY-Jb9Rg.png" /></figure><p>Aplicando a função no modelo…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/876/1*AxzIaiqVBjl81Wh9nei5lg.png" /></figure><p>O resultado obtido foi um AUC de 0.7955–1.0, mostrando um desempenho melhor comparado aos outros modelos.</p><h3>Conclusões</h3><p>Considerando a situação emergencial do COVID-19 no Brasil, a necessidade de uma solução rápida, todo esse processo de criação de um modelo deve ser tratado da forma mais séria possível. Trabalhar com dados reais pode ser algo muito complexo nesse caso.</p><p>Este projeto está finalizado no momento, no entanto, ao longo dos próximos meses será aperfeiçoado, conforme a nova remessa de dados e meus novos aprendizados sobre Machine Learning.</p><p>Para conferir mais sobre meu projeto, só acessar o link do meu repositório no Github: <a href="https://github.com/letpires/ICU_prediction_sirio_libanes">https://github.com/letpires/ICU_prediction_sirio_libanes</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/414/1*bvuHDj-X42eTy6IZmvm6Fw.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=811c88062f15" width="1" height="1" alt=""><hr><p><a href="https://medium.com/leti-pires/predi%C3%A7%C3%A3o-da-necessidade-de-leitos-de-uti-no-hospital-s%C3%ADrio-liban%C3%AAs-811c88062f15">Predição da necessidade de leitos de UTI no Hospital Sírio Libanês</a> was originally published in <a href="https://medium.com/leti-pires">Letis Pires</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Me conheça]]></title>
            <link>https://medium.com/leti-pires/me-conhe%C3%A7a-1637bb3925ad?source=rss-51224278bc56------2</link>
            <guid isPermaLink="false">https://medium.com/p/1637bb3925ad</guid>
            <dc:creator><![CDATA[Letis Pires]]></dc:creator>
            <pubDate>Mon, 22 Mar 2021 19:47:56 GMT</pubDate>
            <atom:updated>2022-01-10T10:35:54.044Z</atom:updated>
            <content:encoded><![CDATA[<h4>minha história com dados</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*80rLRS0cmEEpRmi-GEtszA.png" /></figure><p>Minha história sai um pouco da curva eu diria. Tudo começou em 2015, quando eu disse que gostaria de fazer engenharia e que “a única coisa de faculdade que eu não faria seria algo que envolvesse programação e códigos” (mal sabia ela kkk).</p><p>Mas antes de eu chegar na conclusão de que queria engenharia, eu fiz engenharia de pesca na UDESC por 1 ano 😱. Tudo isso com o intuito de ir pra arquitetura (que era no mesmo campus). Só que me apaixonei por engenharia e exatas (já fui chamada de louca por isso haha😛).</p><p>Então, em 2015 me mudei pra Blumenau e comecei Engenharia Civil. Próximo de me formar eu tive algumas frustrações na área já, e comecei a olhar pra outros campos que me chamavam mais atenção. Como eu falei, sempre fui apaixonada por exatas, mas também por inovação e tecnologia. Durante a faculdade mesmo eu participei de um projeto de inovação junto com meus amigos, a Padiolax, e por um bom tempo fiquei envolvida com isso.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/382/1*0_zaDgCJmCruQab5VyrThQ.png" /></figure><p>Ali no último semestre do curso, eu comecei a pesquisar mais sobre a área de tecnologia e descobri a Ciência de Dados. E “fuçando” nos meus arquivos, encontrei um cronograma de estudos que fiz na época, de setembro de 2019 (eu particularmente, não lembrava que já tinha feito isso em 2019 hehehe):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*wxwsulkIo1YnajyeoZWTxQ.png" /><figcaption>Cronograma com base nos cursos da Alura</figcaption></figure><p>Bom, mas como eu tinha o TCC na época, não levei o assunto muito pra frente. Então, graduei no final de 2019 e comecei a luta por emprego na área de engenharia civil. Só frustração. E daí veio pandemia. Mais frustração.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/334/1*DO5iCHUNUkUdQkmoEW0OPQ.gif" /></figure><p>Esse período me fez cada vez mais repensar sobre o que eu queria de fato pra minha vida. Eu queria mesmo me tornar Engenheira Civil?</p><p>Durante todo esse tempo eu estive rodeada por pessoas da área de tecnologia, e em 2020 eu descobri que queria seguir a carreira na área de dados. E foi aí que minha jornada de transição de carreira de fato começou.</p><p>Eu simplesmente me encantei com a área de Ciência de Dados, por unir tecnologia e exatas ❤. Então eu conheci a plataforma da Alura, que na minha opinião, é a melhor plataforma de cursos pra essa área💙.</p><p>Fiz um tabelão de cursos que eu precisava fazer pra me tornar uma Cientista de Dados (faço tabela pra tudo heheh), e comecei a maratonar os cursos. E em outubro de 2020 a Alura lançou o Bootcamp de Data Science Aplicada, que mudou totalmente minha transição de carreira. Iniciei em novembro e finalizei em abril de 2021. Foi uma experiência incrível! Conheci muitas pessoas, aprendi muito Python, Machine Learning, foi uma imersão completa, que sou extremamente grata por ter feito parte.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8tLq-dOKqGMf9lAvHg0WLA.png" /></figure><p>Coloquei muita dedicação no bootcamp e em especial no projeto final (virei algumas noites pra terminar), detalhei ele, documentei, criei esse blog, postei nas redes sociais… e esse projeto foi a minha porta de entrada no mercado de dados. Dia 12/04/2021 iniciei como Cientista de Dados Jr. na Sauter Digital (empresa que me acolheu tão bem🥰) .</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/618/1*1_gdG9AipyUWLYd-qbWfeg.png" /><figcaption>mimos de recepção</figcaption></figure><p>E desde então, venho enfrentando muitos desafios, aprendendo muitas coisas nessa empresa maravilhosa. E tenho compartilhado todo esse processo lá no meu instagram. Uma das coisas que mais amo é poder compartilhar experiências, aprender com outras pessoas, conhecer pessoas🧡.</p><p>Aaah, e além de toda essa paixão por exatas e tecnologia, também sou a louca da organização (gosto de um post-it, viu?!). Sempre estou buscando formas de melhorar minha produtividade através da organização.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/460/1*uvqFRcxw1AewntwTJsLzOQ.gif" /></figure><p>Link das redes sociais: <a href="https://beacons.page/letipires">https://beacons.page/letipires</a></p><p>Entrevistas que falo um pouco sobre minha transição de carreira:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F_6CzRu81G68%3Flist%3DPLh2Y_pKOa4UekCLUlAmQ89uSMWNlHvhR3&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D_6CzRu81G68&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F_6CzRu81G68%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/cf65faea60546d4f8d76599d4f033fd8/href">https://medium.com/media/cf65faea60546d4f8d76599d4f033fd8/href</a></iframe><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fopen.spotify.com%2Fembed-podcast%2Fepisode%2F1iZvAb22JK6ySeMndiFhHX&amp;display_name=Spotify&amp;url=https%3A%2F%2Fopen.spotify.com%2Fepisode%2F1iZvAb22JK6ySeMndiFhHX&amp;image=https%3A%2F%2Fi.scdn.co%2Fimage%2Fefbf7b346a86ecf137abce77159578a2e9c5d734&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=spotify" width="600" height="232" frameborder="0" scrolling="no"><a href="https://medium.com/media/1d719204e871cc7ec8c0bf812a84ba83/href">https://medium.com/media/1d719204e871cc7ec8c0bf812a84ba83/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1637bb3925ad" width="1" height="1" alt=""><hr><p><a href="https://medium.com/leti-pires/me-conhe%C3%A7a-1637bb3925ad">Me conheça</a> was originally published in <a href="https://medium.com/leti-pires">Letis Pires</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>