<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های زینب عبدی</title><link>https://virgool.ir/feed/@abdi.zbn</link><description>برنامه نویس</description><language>fa</language><pubDate>2026-11-10 21:54:20</pubDate><image><url>https://files.virgool.ir/upload/users/87228/avatar/avatar.png</url><title>زینب عبدی</title><link>https://virgool.ir/@abdi.zbn</link></image><item><title>پایتون 3.10 منتشر شد!</title><link>https://virgool.ir/@abdi.zbn/پایتون-310-منتشر-شد-z4wgrlhkppv5</link><description>ماه اکتبر رسید و همانطور که طبق استاندارد PEP 602 انتظار میرفت نسخه‌ major جدید پایتون یعنی 3.10 منتشر شد. انتشار نسخه های جدید بصورت سالیانه و در ابتدای ماه اکتبر خواهد بود. این نسخه شامل یکسری فیچر جدید و بهینه سازی هاست که مهم ترین اونها رو با هم در ادامه بررسی می‌کنیم.1. استاندارد PEP 634: ساختار تطبیق الگو با match caseساختار تطبیق الگو تقریبا در اکثر زبان‌ها وجود داره و بالاخره در این نسخه اضافه شد. این ساختار به شما اجازه میده متغیرها رو در برابر مجموعه‌ای از مقادیر ممکن مختلف تطبیق بدید. با استفاده از عملگر | می‌تونید چندین مقدار رو در یک الگو استفاده کنید.match subject:&#xA;    case &lt;pattern_1&gt;:&#xA;         &lt;action_1&gt;&#xA;    case &lt;pattern_2&gt;:&#xA;        &lt;action_2&gt;&#xA;    case &lt;pattern_3&gt;:&#xA;        &lt;action_3&gt;&#xA;    case _:&#xA;         &lt;action_wildcard&gt;2. استاندارد PEP 604: یونیون تایپ با عملگر |برای تعریف متغیر در محدوده‌ی چند تایپ دیگر نیازی به استفاده از typing.union نیست و عملگر | برای اینکار تعریف شده. همچنین می‌تونید این عملگر جدید رو در توابع isinstance و  issubclass استفاده کنید.list[str | int]&#xA;isinstance(&#34;&#34;, int | str)3. بهبود خطاهاعموما متن خطاهای پایتون گمراه کننده هستند. در این نسخه متن خطا و هم اشاره به محل خطا در خیلی موارد دقیق‌تر شده. این بهبودها مخصوصا برای برنامه نویسانی که تازه پایتون رو شروع کردن خیلی کمک‌کننده ست. گوگل کردن متن خطا زین پس کمتر اتفاق خواهد افتاد.4. استاندارد PEP 617: مدیریت کانتکست های پرانتزگذاری شده در ادامه‌ی تغییراتی که در نسخه‌ی 3.9 شاهد بودیم( پارسر مبتنی بر PEG بجای پارسر مبتنی بر CPython). بهبودهایی روی پارسر پایتون صورت خواهد گرفت که به سینتکس بهتری منجر بشه و محدودیت‌های قبلی LL1 رو نداشته باشه.یکی از این محدودیت‌ها نوشتن کانتکست در یک خط بود. در صورتیکه کانتکست طولانی میشد این محدودیت را با کاراکتر \ به چند خط می‌تونستیم تقسیم کنیم. حالا استفاده از پرانتزهای محصور شده برای ادامه کانتکست در چندین خط پشتیبانی میشه. البته این تغییر در پایتون 3.9 هم امکان پذیر بود ولی در این نسخه به طور کامل و رسمی پشتیبانی میشه.with (&#xA;    open(&#34;a_really_long_foo&#34;) as foo,&#xA;    open(&#34;a_really_long_baz&#34;) as baz,&#xA;    open(&#34;a_really_long_bar&#34;) as bar&#xA;):&#xA;&#x9;pass5. استاندارد PEP 626: شماره خطوط دقیق برای دیباگ کردنگاهی اوقات در حین دیباگ کرن کد پایتون شماره خط رو دقیق نشان نمیداد و قابل اطمینان نبود. در این نسخه وقتی تریسینگ رو فعال می‌کنید با ویژگی co_lines بجای f_lineno می‌تونید محل دقیق‌تری از خط اجرای کد رو بدست بیارید.از موارد مهمی که در این نسخه منسوخ یا حذف شده می‌تونم به موارد زیر اشاره کنم:استاندارد PEP 644: نیاز به OpenSSL نسخه‌ی 1.1.1 یا بالاتراستاندارد PEP 632: منسوخ شدن ماژول distutilsاستاندراد PEP 623: منسوخ شدن wstr در PyUnicodeObject که در نسخه‌ی بعدی شاهد حذف اون خواهیم بود.استاندارد PEP 624: حذف شدن api های رمزگذاری Py_UNICODEاستاندارد PEP 597: افزودن EncodingWarning بصورت اختیاریامیدوارم این مطلب برای شما مفید بوده باشه.</description><category>زینب عبدی</category><author>زینب عبدی</author><pubDate>Tue, 05 Oct 2021 11:58:07 +0330</pubDate></item><item><title>محاسبه ریترن کاربران با استفاده از کوهورت در postgreSql</title><link>https://virgool.ir/basalam-product/محاسبه-ی-ریترن-کاربران-در-کوهورت-با-postgresql-npyqnv2rfpxa</link><description>اگر در فضای استارت آپی قرار گرفته باشید می‌دانید که تحلیل داده‌ها اهمیت زیادی برای استارت آپ‌ها و بخصوص سرمایه‌گذارها دارد، به طور مثال داده‌هایی از قبیل اینکه کاربران چه میزان هستند چطور از محصول ما استفاده می کنند، آیا محصول ما برایشان جذاب بوده که دوباره برگردند و …محاسبه ی داده ها روی نمودار کوهورت مزیت های زیادی دارد از جمله اینکه میتوان رفتار کاربران را گروه بندی  و با یکدیگر مقایسه کرد.در این نوشته می‌خواهم برای شما توضیح دهم که چطور کوهورت را برای داده هایتان بدست آورید. ابتدا با مفهوم ریترن و کوهورت آشنا شویم سپس سراغ محاسبه ی آن میرویم.ریترنیکی از داده‌های مهم که در پیش‌بینی مالی یک محصول و میزان پایداری آن بهتر است بدانیم، میزان ریترن و چرن کاربران آن محصول است. این داده‌ها میزان رشد یک استارت آپ را مشخص می‌کنند.ریترن در واقع نرخ بازگشت و چرن نرخ ریزش کاربران جذب شده می‌باشد. جذب در صورتی موفق است که کاربران دوباره برگردند وگرنه ناگزیریم هزینه‌ی زیادی را در بخش مارکتینگ خرج کنیم و همچنین یک زنگ خطر برای محصول ماست.نگهداری کاربر جذب شده راحت‌تر و کم هزینه‌تر از گرفتن کاربر جدید است. احتمال اینکه کاربر جذب شده هزینه‌ی مالی/زمانی بیشتری روی محصول ما انجام دهد بیشتر از کاربر جدید است. البته این را در نظر داشته باشید که همواره درصدی از مشتریان از دست خواهند رفت و تلاش بر کم کردن این عدد می‌باشد.نمودار نرخ بازگشت یا ریترن ریتبطور مثال محصول ما یک نوع مارکت پلیس است. در ماه ژانویه 150 نفر خرید انجام داده‌اند. در ماه فوریه تعداد 260 کاربر خرید میکند و ازین میان 45 نفر از کاربرانِ ژانویه حضور دارند. دراین حالت 45 نفر از کاربران ژانویه ریترن و 105 نفرشان چرن شده‌اند.نرخ ریترن برای ماه ژانویه برابر است با: تعداد کاربران ریترن شده در ماه بعد به تعداد کل کاربران در ماه ژانویه.که در این حالت 30 درصد است.کوهورتدر کوهورت کاربران را به گروه‌های مرتبط زمانی که ویژگی‌ها یا تجربه های مشترکی دارند تقسیم بندی می‌کنیم. بر اساس نوع کوهورت ریترن یا چرن را محاسبه میکنیم. تحلیل داده های کاربران روی کوهورت این مزیت را دارد که کاربران هم گروه را بطور مستقل و هم با گروه های دیگر مقایسه شوند.نمودار کوهورتمثلا روی نمودار بالا که کوهورت ریترن خرید کاربران بصورت ماهانه میباشد، مشخص است که کوهورت ماه may نرخ ریترن بهتری داشتند. مقطع‌هایی که ریزش کاربر داشتیم مشخص است و میتوان تصمیم گرفت در چه بازه هایی باید برنامه‌هایی برای بازگشت کاربران به محصول در نظر گرفت.کاربران فعالیت‌های مختلفی از قبیل بازدید از سایت، فعالیت در اپ، خرید و… روی محصول می‌توانند انجام دهند. برای هر کدام میتوان کوهورت بدست آورد.ابزارهای آماده محاسبه کوهورتگوگل آنالیتیکس و فایربیس از جمله ابزارهای آماده‌ای هستند که می‌توان با استفاده از آنها کوهورت بدست آورد.گوگل آنالیتیکس ابزار بسیار مفیدی در حوزه‌ی سئو و مارکتینگ است. و امکانات بسیار جالبی در اختیار ما قرار می‌دهد. یکی از ابزارهای مفید آن آنالیز کوهورت است.گوگل آنالیتیکسهرچند ابزارهای آماده‌ای در این زمینه وجود دارد ولی گاهی ما نیاز به داده‌هایی پیدا می‌کنیم که با این ابزارها قابل دستیابی نیستند. گاه داده‌های مورد نیاز ما در پایگاه داده وجود دارند یا فیلترهای آماده‌ی آنها در مساله ما قابل استفاده نیستند. در این زمان ما ناگزیریم خودمان دست بکار شویم و برای حل مسأله‌مان کوهورت را محاسبه کنیم.محاسبه ی کوهورت در postgreSqlاکنون که با مفهوم و کاربرد کوهورت آشنا شدید به نحوه‌ی محاسبه آن در زبان postgreSql می‌پردازیم.فرض کنیم ما یک سایت خرید و فروش داریم و مسأله‌ی ‌‌‌‌ ما این هست:مقایسه‌ی ریترن خرید کاربران در نیمه‌ی اول سال 2018 بصورت ماهیانهبرای حل این مساله ابتدا موارد زیر را مشخص کنیم:نوع، سایز، محدوده ی زمانی و معیارنوع: خریدسایز: ماهیانهمحدوده ی زمانی: نیمه اول سال 2018معیار: اولین خریدچون معیار ما اولین خرید کاربر و نوع هم روی خرید کاربر پس ما نیاز به جدول خرید با حداقل فیلدهای زیر داریم:--payments table&#xA;user_id&#xA;paid_atفایل زیر حاوی دیتای نمونه این جدول می‌باشد. https://github.com/abdiz/return_cohort/blob/master/cohort_data_source.sql حالا یک دستور ساده‌ Select از جدول payment را اجرا می‌کنیم.SELECT *&#xA;FROM paymentsخروجی:paymentsقدم اول : لیست کاربران به همراه اولین خریدشانبه دستور بالا تابع min روی فیلد paid_at را اضافه می‌کنیم تا زمان اولین خرید کاربر را بدست آوریم. چون اولین خرید را به ازای هر کاربر نیاز داریم، پس روی فیلد user_id گروه‌بندی(Group By) می‌کنیم.باید کاربرانی را مورد مطالعه قرار دهیم که اولین خریدشان نیمه‌ی اول سال 2018 هستند پس به دستور، شرطی را با استفاده از Having اعمال می‌کنیم که تنها کاربران در محدوده‌ی زمانی مسأله‌ی ‌‌‌‌‌‌‌‌‌‌خواسته شده را در خروجی بیاورد.دقت داشته باشید که این شرط نباید با Where اعمال شود زیرا تابع min در Where در دسترس نیست.-- users_with_first_payments&#xA;SELECT user_id,&#xA;                min(paid_at) as first_paid&#xA;FROM payments&#xA;GROUP BY user_id&#xA;HAVING min(paid_at) &gt;= &#39;2019-01-01 00:00:00&#39;&#xA;                and min(paid_at) &lt;&#39;2019-07-01 00:00:00&#39;خروجی:users_with_first_paymentsقدم دوم: دسته‌بندی کاربران از روی اولین خریدشانبر اساس سایزی که در مساله تعریف شده(ماه) کاربرانی که ماه اولین خریدشان مشترک است را در یک گروه قرار می‌دهیم. ولی فیلد تاریخ خرید ما از نوع timestamp هست که حاوی روز و ساعت و … هست. پس از تابع date_trunc در postgres برای کوتاه کردن زمان به ماه کمک می‌گیریم.-- users_cohort_group&#xA;SELECT users_with_first_payments.user_id,&#xA;                date_trunc(&#39;month&#39;, first_paid) as cohort_group&#xA;FROM users_with_first_paymentsخروجی:users_cohort_groupقدم سوم: لیست کاربران به همراه سایر خریدهایشانحال باید ماه‌هایی که کاربر در آن فعالیت خرید داشته را از روی جداول users_cohort_group و users_with_payments و Join بین آنها بدست آوریم.تابع extract بخشی از تاریخ را جدا می‌کند و برمی‌گرداند. چون به این تابع ورودی month داده‌ایم عدد ماه را از مقدار زمانی که گرفته است برمی‌گرداند.-- user_activity&#xA;SELECT users_cohort_group.user_id,&#xA;                EXTRACT(MONTH FROM payments.paid_at) as month&#xA;FROM users_cohort_group&#xA;INNER JOIN payments ON users_cohort_group.user_id = payments.user_idخروجی:user_activityقدم چهارم: میزان بازگشت کاربران در ماه های بعد از خرید اول به صورت دسته‌بندی شدهدرنهایت می‌توانیم بر اساس کوهورت کاربران میزان خریدشان را در ماه‌های بعد بدست آوریم.SELECT users_cohort_group.cohort_group as &#34;Cohort Group&#34;,&#xA;        count(distinct user_activity.user_id) as &#34;Size&#34;,&#xA;        count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 1) as &#34;Mounth 01&#34;,&#xA;        count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 2) as &#34;Mounth 02&#34;,&#xA;        count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 3) as &#34;Mounth 03&#34;,&#xA;        count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 4) as &#34;Mounth 04&#34;,&#xA;        count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 5) as &#34;Mounth 05&#34;,&#xA;        count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 6) as &#34;Mounth 06&#34;&#xA;FROM user_activity&#xA;INNER JOIN users_cohort_group ON user_activity.user_id = users_cohort_group.user_id&#xA;GROUP BY users_cohort_group.cohort_group;خروجی:cohortقدم نهایی: محاسبه‌ی درصد بازگشت کاربرانبرای محاسبه‌ی درصد از فرمول زیر به ازای هر ماه استفاده می‌کنیم.(count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 1) * 100) / count(distinct user_activity.user_id)در نهایت کوئری ما به این شکل در می آید:WITH users_with_first_payments as (&#xA;    SELECT user_id,&#xA;                    min(paid_at) as first_paid&#xA;    FROM payments&#xA;    GROUP BY user_id&#xA;    HAVING min(paid_at) &gt;= &#39;2019-01-01 00:00:00&#39; and min(paid_at) &lt;&#39;2019-07-01 00:00:00&#39;&#xA;),&#xA;users_cohort_group as (&#xA;    SELECT users_with_first_payments.user_id,&#xA;                    date_trunc(&#39;month&#39;, first_paid) as cohort_group&#xA;    FROM users_with_first_payments&#xA;),&#xA;user_activity as (&#xA;    SELECT users_cohort_group.user_id,&#xA;                    EXTRACT(MONTH FROM payments.paid_at) as month&#xA;    FROM users_cohort_group&#xA;    INNER JOIN payments ON users_cohort_group.user_id = payments.user_id&#xA;)&#xA;SELECT users_cohort_group.cohort_group as &#34;Cohort Group&#34;,&#xA;    count(distinct user_activity.user_id) as &#34;Size&#34;,&#xA;    (count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 1) * 100) / count(distinct user_activity.user_id) as &#34;Mounth 01&#34;,&#xA;    (count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 2) * 100) / count(distinct user_activity.user_id) as &#34;Mounth 02&#34;,&#xA;    (count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 3) * 100) / count(distinct user_activity.user_id) as &#34;Mounth 03&#34;,&#xA;    (count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 4) * 100) / count(distinct user_activity.user_id) as &#34;Mounth 04&#34;,&#xA;    (count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 5) * 100) / count(distinct user_activity.user_id) as &#34;Mounth 05&#34;,&#xA;    (count(distinct user_activity.user_id) FILTER ( WHERE user_activity.month = 6) * 100) / count(distinct user_activity.user_id) as &#34;Mounth 06&#34;&#xA;FROM user_activity&#xA;INNER JOIN users_cohort_group ON user_activity.user_id = users_cohort_group.user_id&#xA;GROUP BY users_cohort_group.cohort_group;این هم از کوهورت ماcohortامیدوارم مطلب برای شما مفید بوده باشد.</description><category>زینب عبدی</category><author>زینب عبدی</author><pubDate>Mon, 02 Dec 2019 19:31:49 +0330</pubDate></item></channel></rss>