ফিউচার ওয়ার্নিং: মৌলিক দিকের তুলনা ব্যর্থ হয়েছে; স্কেলার ফিরতে, তবে ভবিষ্যতে উপাদানটির সাথে তুলনা সম্পাদন করবে


99

আমি 0.19.1পাইথন 3 এ পান্ডাস ব্যবহার করছি I কোডের এই লাইনে আমি একটি সতর্কতা পাচ্ছি। আমি একটি তালিকা পাওয়ার চেষ্টা করছি যেখানে Peterকলামে স্ট্রিং উপস্থিত রয়েছে এমন সমস্ত সারি সংখ্যা রয়েছে Unnamed: 5

df = pd.read_excel(xls_path)
myRows = df[df['Unnamed: 5'] == 'Peter'].index.tolist()

এটি একটি সতর্কতা উত্পাদন করে:

"\Python36\lib\site-packages\pandas\core\ops.py:792: FutureWarning: elementwise 
comparison failed; returning scalar, but in the future will perform 
elementwise comparison 
result = getattr(x, name)(y)"

এই ফিউচার ওয়ার্নিংটি কী এবং যেহেতু এটি কাজ করে বলে মনে হচ্ছে তা এড়িয়ে যাওয়া উচিত।

উত্তর:


158

এই ফিউচারওয়্যারিংটি পান্ডাস থেকে নয়, এটি অদ্ভুত থেকে এবং বাগটি ম্যাটপ্ল্লোলিব এবং অন্যদেরকেও প্রভাবিত করে, সমস্যার উত্সটিতে আরও সতর্কবার্তাটি আরও কীভাবে প্রজনন করা যায় তা এখানে:

import numpy as np
print(np.__version__)   # Numpy version '1.12.0'
'x' in np.arange(5)       #Future warning thrown here

FutureWarning: elementwise comparison failed; returning scalar instead, but in the 
future will perform elementwise comparison
False

দ্বিগুণ সমতুল্য অপারেটরটি ব্যবহার করে এই বাগটি পুনরুত্পাদন করার আরেকটি উপায়:

import numpy as np
np.arange(5) == np.arange(5).astype(str)    #FutureWarning thrown here

তাদের চিকিত্সার প্লট বাস্তবায়নের অধীনে এই ফিউচার ওয়ার্নিং দ্বারা প্রভাবিত ম্যাটপ্লটলিবের একটি উদাহরণ: https://matplotlib.org/example/pylab_exferences/quiver_demo.html

এখানে কি হচ্ছে?

নম্পির সংখ্যাসূচক ধরণের সাথে আপনি যখন একটি স্ট্রিং তুলনা করেন তখন কী হবে সে সম্পর্কে নম্পি এবং নেটিভ পাইথনের মধ্যে মতবিরোধ রয়েছে। লক্ষ করুন যে বাম অপরেন্দ্রটি পাইথনের টার্ফ, একটি আদিম স্ট্রিং এবং মাঝের অপারেশনটি অজগরটির টার্ফ, তবে ডান অপরেন্ডটি অদৃশ্য টার্ফ। আপনি কি পাইথন শৈলীর স্কেলার বা বুলিয়ান একটি নম্পি স্টাইলের নাদার্রে ফিরিয়ে দেবেন? নম্পি বলের ন্যাডেরে বলে, পাইথোনিক বিকাশকারীরা একমত নন। ক্লাসিক স্ট্যান্ড অফ।

অ্যারেতে আইটেমটি উপস্থিত থাকলে এটি উপাদান হিসাবে তুলনা বা স্কেলার হওয়া উচিত?

যদি আপনার কোড বা লাইব্রেরিটি ব্যবহার করছে inবা== অজগর স্ট্রিংটিকে ন্যুপি নাদারের সাথে তুলনা করতে অপারেটরগুলি তবে সেগুলি সামঞ্জস্যপূর্ণ নয়, তাই যখন আপনি এটি চেষ্টা করেন, এটি একটি স্কেলার ফিরিয়ে দেয় তবে কেবল এখনই। সতর্কতা ইঙ্গিত দেয় যে ভবিষ্যতে এই আচরণটি পরিবর্তিত হতে পারে তাই অজগর / নম্পি নম্পি স্টাইলটি গ্রহণ করার সিদ্ধান্ত নিলে আপনার কোডটি পুরো কার্পেটের উপরে উঠবে।

জমা দেওয়া বাগ রিপোর্ট:

নম্পি এবং পাইথন স্থবির হয়ে পড়েছে, আপাতত অপারেশনটি একটি স্কেলার ফিরিয়ে দেয় তবে ভবিষ্যতে এটি পরিবর্তন হতে পারে।

https://github.com/numpy/numpy/issues/6784

https://github.com/pandas-dev/pandas/issues/7830

দুটি কার্যক্ষম সমাধান:

উভয় ক্ষেত্রেই পাইথন এবং numpy সংস্করণটি লকডাউন, সতর্কবার্তা উপেক্ষা করা এবং পরিবর্তনের আচরণ আশা, বা উভয় বাম এবং ডান operands রূপান্তর ==এবং inএকটি numpy টাইপ বা আদিম পাইথন সাংখ্যিক ধরণ থেকে যাবে।

বিশ্বব্যাপী সতর্কতা দমন করুন:

import warnings
import numpy as np
warnings.simplefilter(action='ignore', category=FutureWarning)
print('x' in np.arange(5))   #returns False, without Warning

লাইন ভিত্তিতে একটি লাইনে সতর্কতা দমন করুন।

import warnings
import numpy as np

with warnings.catch_warnings():
    warnings.simplefilter(action='ignore', category=FutureWarning)
    print('x' in np.arange(2))   #returns False, warning is suppressed

print('x' in np.arange(10))   #returns False, Throws FutureWarning

কেবল নামের দ্বারা সতর্কবার্তাটি দমন করুন, তারপরে অজগর এবং নম্পতির বর্তমান সংস্করণ উল্লেখ করে এর পাশে একটি জোরে মন্তব্য করুন, এই কোডটি ভঙ্গুর এবং এই সংস্করণগুলির প্রয়োজন এবং এখানে একটি লিঙ্ক দিন। রাস্তায় ক্যান কিক।

টিএলডিআর: pandas জেডি; numpyঝুপড়ি; এবং pythonগ্যালাকটিক সাম্রাজ্য হয়। https://youtu.be/OZczsiCfQQk?t=3


4
উঃ সুতরাং যদি আমার কিছু পরিমাণ থাকে thing(যা একটি নাম্বার ধরণের হতে পারে বা নাও হতে পারে; আমি জানি না) এবং আমি দেখতে চাই thing == 'some string'এবং একটি সাধারণ boolফলাফল পেতে চাই তবে আমার কী করা উচিত? np.atleast_1d(thing)[0] == 'some string'? তবে কিছু জোকারের পক্ষে 'some string'এটি অ্যারের প্রথম উপাদানটি শক্তিশালী নয় । আমি অনুমান করি যে আমাকে thingপ্রথমে প্রকারটি পরীক্ষা করতে হবে এবং তারপরে কেবল এটি ==পরীক্ষা করা উচিত যদি এটি স্ট্রিং (বা কোনও নম্পি অবজেক্ট নয়)।
EL_DON

4
প্রকৃতপক্ষে, যখনই আপনি একটি খালি তালিকার সাথে একটি নম্পি.অ্যান্ডারাকে তুলনা করার চেষ্টা করবেন তখন ভবিষ্যতের এই সতর্কতাটিও উত্থাপিত হয়। উদাহরণস্বরূপ, কার্যকর করা সতর্কতাও np.array([1, 2]) == []বাড়িয়ে তুলবে।
1313e

4
এটি করার উদাহরণটি দেখতে আমি সহায়ক মনে করব:or babysit your left and right operands to be from a common turf
এএইচপসন্তরন

10
এটি এই বিষয়ে মানের তথ্যের আশ্চর্যজনক স্তর।
স্টিফেনবশ

সুতরাং আমি এই কোডটিতে সতর্কতা থেকে মুক্তি পাব: df.loc [df.cName == '', 'cName'] = '10004'। অন্য কথায়, পাইথন এর '' (খালি স্ট্রিং) এর পান্ডাস / numpy সমতুল্য কি
Garet Jax

12

আমি যখন index_colকোনও ফাইলকে একটি Pandaডেটা ফ্রেমে সেট করে রাখার চেষ্টা করি তখন আমি একই ত্রুটি পেয়েছি :

df = pd.read_csv('my_file.tsv', sep='\t', header=0, index_col=['0'])  ## or same with the following
df = pd.read_csv('my_file.tsv', sep='\t', header=0, index_col=[0])

এর আগে আমি এর আগে কখনও ত্রুটির মুখোমুখি হইনি। আমি এখনও এর পিছনের কারণটি সনাক্ত করার চেষ্টা করছি (@ এরিক লেসচিনস্কির ব্যাখ্যা এবং অন্যান্য ব্যবহার করে)।

যাইহোক, নীচের পদ্ধতিটি আপাতত সমস্যাটি সমাধান করে যতক্ষণ না আমি কারণটি বের করি:

df = pd.read_csv('my_file.tsv', sep='\t', header=0)  ## not setting the index_col
df.set_index(['0'], inplace=True)

আমি এই জাতীয় আচরণের কারণ সনাক্ত করার সাথে সাথে এটি আপডেট করব।


আমারও একই সমস্যা আছে read_csv()। আমার কাছে এমন কিছুর মতো লাগে যা pandasঠিক করা দরকার।
কনস্ট্যান্টিন

4
ধন্যবাদ! আমার অনেক কাজ বাঁচিয়েছে - আমার ধারণা। pd__version__: 0.22.0; np.__version__: 1.15.4
মার্কাস ডুশচে

4
এখানে একই সমস্যা, প্যারামিটার read_csvব্যবহার করার সময় কিছুটা স্পষ্টভাবে কল কল index_col। আমি বিভিন্ন ফলাফলের সাথে দুটি সেটআপ পরীক্ষা করেছি: ১. নমুনা সংস্করণ ১.১৯.২, পান্ডস সংস্করণ ১.১.২: ফিউচার ওয়ার্নিং: মৌলিক দিকের তুলনা ব্যর্থ হয়েছে ... ২.সুগল সংস্করণ ১.১৯.২, পান্ডাস সংস্করণ ১.১.৩: টাইপ-এরর: ufunc ' ইসনান 'সমর্থিত নয় ...
কার্লোস

9

একই সতর্কতা বার্তায় আমার অভিজ্ঞতা টাইপ ইরারের কারণে হয়েছিল।

প্রকারের ত্রুটি: অবৈধ প্রকারের তুলনা

সুতরাং, আপনি এর ডাটা টাইপ পরীক্ষা করতে চাইতে পারেন Unnamed: 5

for x in df['Unnamed: 5']:
  print(type(x))  # are they 'str' ?

আমি এখানে কীভাবে সতর্কতা বার্তাটি প্রতিলিপি করতে পারি:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 2), columns=['num1', 'num2'])
df['num3'] = 3
df.loc[df['num3'] == '3', 'num3'] = 4  # TypeError and the Warning
df.loc[df['num3'] == 3, 'num3'] = 4  # No Error

আশা করি এটা সাহায্য করবে.


4
সতর্কতাটি বর্ণনা করার জন্য আপনার কোডটিতে প্রচুর অপ্রয়োজনীয় চলন্ত অংশ রয়েছে। পান্ডারা আপনাকে সেই অতিরিক্ত টাইপয়েরর দিয়ে গ্রেস করে তবে এটি পান্ডাদের ক্ষতি নিয়ন্ত্রণ, উত্স সতর্কতা নম্পি এবং পাইথনের মধ্যে দ্বিমত এবং এটি মূল্যায়নে ঘটে df['num3'] == '3'
এরিক লেসচিনস্কি

4
df.loc[df['num3'] == 3, 'num3'] = 4 # No Errorএই অংশটি আমাকে সাহায্য করে। ধন্যবাদ
জামেলেম

5

এরিক লেসচিনস্কির দুর্দান্ত উত্তরটি পরাজিত করতে পারে না, তবে মূল প্রশ্নটি সম্পর্কে যা আমি এখনও মনে করি না তা সম্পর্কে একটি দ্রুত আলোচনা করা যায় - একটি তালিকায় স্ট্রিংটি রাখুন এবং তার .isinপরিবর্তে ব্যবহার করুন==

উদাহরণ স্বরূপ:

import pandas as pd
import numpy as np

df = pd.DataFrame({"Name": ["Peter", "Joe"], "Number": [1, 2]})

# Raises warning using == to compare different types:
df.loc[df["Number"] == "2", "Number"]

# No warning using .isin:
df.loc[df["Number"].isin(["2"]), "Number"]

আমি ভাবছি যদি আমি এই সিনট্যাক্সটি দিয়েও একই কাজ করতে পারি -> "-" যদি ডিএফএন ['ড্রেট'] তে। অনন্য ()
lone_coder

3

এই জন্য একটি দ্রুত workaround ব্যবহার করা হয় numpy.core.defchararray। আমি একই সতর্কতা বার্তার মুখোমুখি হয়েছি এবং উপরের মডিউলটি ব্যবহার করে এটি সমাধান করতে সক্ষম হয়েছি।

import numpy.core.defchararray as npd
resultdataset = npd.equal(dataset1, dataset2)

2

এরিকের উত্তর সহায়কভাবে ব্যাখ্যা করেছে যে সমস্যাটি একটি পাইন্ডন স্ট্রিংয়ের সাথে পান্ডাস সিরিজ (একটি নুমপি অ্যারেযুক্ত) তুলনা করে আসে। দুর্ভাগ্যক্রমে, তার দু'টি কাজের উভয়ই কেবল সতর্কতা দমন করে।

কোডটি লিখতে যাতে প্রথমে সতর্কতার কারণ হয় না, স্পষ্টভাবে আপনার স্ট্রিংটিকে সিরিজের প্রতিটি উপাদানটির সাথে তুলনা করুন এবং প্রত্যেকটির জন্য পৃথক বুল পান। উদাহরণস্বরূপ, আপনি mapএবং একটি বেনামী ফাংশন ব্যবহার করতে পারেন ।

myRows = df[df['Unnamed: 5'].map( lambda x: x == 'Peter' )].index.tolist()

1

যদি আপনার অ্যারেগুলি খুব বড় না হয় বা আপনার খুব বেশি না থাকে তবে আপনি বাম হাতের অংশটি ==স্ট্রিং হতে বাধ্য করে পালিয়ে যেতে সক্ষম হতে পারেন :

myRows = df[str(df['Unnamed: 5']) == 'Peter'].index.tolist()

তবে এটি যদি df['Unnamed: 5']স্ট্রিং হয় তবে 1.5 df['Unnamed: 5']ডলার গতি কম, 25-30 বার আস্তে যদি ছোট ছোট আপাটি অ্যারে (দৈর্ঘ্য = 10) হয় এবং 150-160 গুণ বেশি ধীর হয় তবে এটি দৈর্ঘ্য 100 এর সাথে একটি নির্লিপ্ত অ্যারে (500 বারেরও বেশি বার গড়) ।

a = linspace(0, 5, 10)
b = linspace(0, 50, 100)
n = 500
string1 = 'Peter'
string2 = 'blargh'
times_a = zeros(n)
times_str_a = zeros(n)
times_s = zeros(n)
times_str_s = zeros(n)
times_b = zeros(n)
times_str_b = zeros(n)
for i in range(n):
    t0 = time.time()
    tmp1 = a == string1
    t1 = time.time()
    tmp2 = str(a) == string1
    t2 = time.time()
    tmp3 = string2 == string1
    t3 = time.time()
    tmp4 = str(string2) == string1
    t4 = time.time()
    tmp5 = b == string1
    t5 = time.time()
    tmp6 = str(b) == string1
    t6 = time.time()
    times_a[i] = t1 - t0
    times_str_a[i] = t2 - t1
    times_s[i] = t3 - t2
    times_str_s[i] = t4 - t3
    times_b[i] = t5 - t4
    times_str_b[i] = t6 - t5
print('Small array:')
print('Time to compare without str conversion: {} s. With str conversion: {} s'.format(mean(times_a), mean(times_str_a)))
print('Ratio of time with/without string conversion: {}'.format(mean(times_str_a)/mean(times_a)))

print('\nBig array')
print('Time to compare without str conversion: {} s. With str conversion: {} s'.format(mean(times_b), mean(times_str_b)))
print(mean(times_str_b)/mean(times_b))

print('\nString')
print('Time to compare without str conversion: {} s. With str conversion: {} s'.format(mean(times_s), mean(times_str_s)))
print('Ratio of time with/without string conversion: {}'.format(mean(times_str_s)/mean(times_s)))

ফলাফল:

Small array:
Time to compare without str conversion: 6.58464431763e-06 s. With str conversion: 0.000173756599426 s
Ratio of time with/without string conversion: 26.3881526541

Big array
Time to compare without str conversion: 5.44309616089e-06 s. With str conversion: 0.000870866775513 s
159.99474375821288

String
Time to compare without str conversion: 5.89370727539e-07 s. With str conversion: 8.30173492432e-07 s
Ratio of time with/without string conversion: 1.40857605178

4
এর বাম উপসর্গটি ==স্থাপন strকরা আমার পক্ষে একটি ভাল সমাধান ছিল যা 1.5 মিলিয়ন সারিগুলিতে সবেমাত্র আঘাতের পারফরম্যান্সকে আঘাত করেছিল যা ভবিষ্যতে এর চেয়ে বড় হবে না।
ডেভিড এরিকসন

0

আমি এই সতর্কতাটি পেয়েছি কারণ আমি ভেবেছিলাম আমার কলামে নাল স্ট্রিং রয়েছে, তবে চেক করার সময় এটিতে এনপি.নান রয়েছে!

if df['column'] == '':

আমার কলামটি খালি স্ট্রিংয়ে পরিবর্তন করা সাহায্য করেছে :)


0

আমি এটি করার জন্য কয়েকটি সম্ভব পদ্ধতির তুলনা করেছি, যার মধ্যে পান্ডাস, বেশ কয়েকটি ন্যাক্পি পদ্ধতি এবং একটি তালিকা বোঝার পদ্ধতি রয়েছে।

প্রথমে একটি বেসলাইন দিয়ে শুরু করা যাক:

>>> import numpy as np
>>> import operator
>>> import pandas as pd

>>> x = [1, 2, 1, 2]
>>> %time count = np.sum(np.equal(1, x))
>>> print("Count {} using numpy equal with ints".format(count))
CPU times: user 52 µs, sys: 0 ns, total: 52 µs
Wall time: 56 µs
Count 2 using numpy equal with ints

সুতরাং, আমাদের বেসলাইনটি হ'ল গণনাটি সঠিক 2হওয়া উচিত এবং আমাদের উচিত 50 us

এখন, আমরা নিষ্পাপ পদ্ধতিটি চেষ্টা করি:

>>> x = ['s', 'b', 's', 'b']
>>> %time count = np.sum(np.equal('s', x))
>>> print("Count {} using numpy equal".format(count))
CPU times: user 145 µs, sys: 24 µs, total: 169 µs
Wall time: 158 µs
Count NotImplemented using numpy equal
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/ipykernel_launcher.py:1: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  """Entry point for launching an IPython kernel.

এবং এখানে, আমরা ভুল উত্তর পেয়েছি ( NotImplemented != 2), এটি আমাদের অনেক সময় নেয় এবং এটি সতর্কতা ছুড়ে দেয়।

সুতরাং আমরা অন্য একটি নিষ্পাপ পদ্ধতি চেষ্টা করব:

>>> %time count = np.sum(x == 's')
>>> print("Count {} using ==".format(count))
CPU times: user 46 µs, sys: 1 µs, total: 47 µs
Wall time: 50.1 µs
Count 0 using ==

আবার, ভুল উত্তর ( 0 != 2)। এটি আরও বেশি কুখ্যাত কারণ কারণ পরবর্তী কোনও সতর্কতা নেই ( 0ঠিক এর মতো করে দেওয়া যেতে পারে 2)।

এখন, আসুন একটি তালিকা বোঝার চেষ্টা করুন:

>>> %time count = np.sum([operator.eq(_x, 's') for _x in x])
>>> print("Count {} using list comprehension".format(count))
CPU times: user 55 µs, sys: 1 µs, total: 56 µs
Wall time: 60.3 µs
Count 2 using list comprehension

আমরা এখানে সঠিক উত্তর পেয়েছি এবং এটি বেশ দ্রুত!

আরেকটি সম্ভাবনা pandas:

>>> y = pd.Series(x)
>>> %time count = np.sum(y == 's')
>>> print("Count {} using pandas ==".format(count))
CPU times: user 453 µs, sys: 31 µs, total: 484 µs
Wall time: 463 µs
Count 2 using pandas ==

ধীর, তবে সঠিক!

এবং অবশেষে, বিকল্পটি আমি ব্যবহার করতে যাচ্ছি: numpyঅ্যারেটিকে objectটাইপ করুন:

>>> x = np.array(['s', 'b', 's', 'b']).astype(object)
>>> %time count = np.sum(np.equal('s', x))
>>> print("Count {} using numpy equal".format(count))
CPU times: user 50 µs, sys: 1 µs, total: 51 µs
Wall time: 55.1 µs
Count 2 using numpy equal

দ্রুত এবং সঠিক!


সুতরাং IIUC, ঠিক করার জন্য 'x' in np.arange(5), আপনি কেবল 'x' in np.arange(5).astype(object)(বা একইভাবে 'x' == np.arange(5).astype(object):) করার পরামর্শ দিচ্ছেন। ঠিক? আইএমএইচও, এটি এখানে দেখানো সর্বাধিক মার্জিত কাজ, তাই উর্ধ্বতনগুলির অভাব নিয়ে আমি বিভ্রান্ত হয়ে পড়েছি। নীচের লাইনের সাথে শুরু করতে আপনার উত্তরটি সম্পাদনা করুন, এবং তারপরে সুন্দর পারফরম্যান্স বিশ্লেষণে চলে যেতে পারেন?
ওরেণ মিলম্যান

ধন্যবাদ ওরে, আমি এটি চেষ্টা করে দেখব যে এটি আমাকে কোথায় পেয়েছে।
আহাগেন

0

আমার এই কোডটি ছিল যা ত্রুটি ঘটাচ্ছে:

for t in dfObj['time']:
  if type(t) == str:
    the_date = dateutil.parser.parse(t)
    loc_dt_int = int(the_date.timestamp())
    dfObj.loc[t == dfObj.time, 'time'] = loc_dt_int

আমি এটিকে এটিতে পরিবর্তন করেছি:

for t in dfObj['time']:
  try:
    the_date = dateutil.parser.parse(t)
    loc_dt_int = int(the_date.timestamp())
    dfObj.loc[t == dfObj.time, 'time'] = loc_dt_int
  except Exception as e:
    print(e)
    continue

তুলনা এড়াতে, যা সতর্কতা নিক্ষেপ করছে - উপরে বর্ণিত হিসাবে। dfObj.locলুপের জন্য আমাকে কেবল ব্যতিক্রম এড়াতে হয়েছিল , সম্ভবত ইতিমধ্যে পরিবর্তিত সারিগুলি পরীক্ষা না করার জন্য এটি বলার উপায় রয়েছে।


0

আমার ক্ষেত্রে, সতর্কতাটি কেবল নিয়মিত ধরণের বুলিয়ান ইনডেক্সিংয়ের কারণে ঘটেছিল - কারণ এই সিরিজে কেবল এনপি.নান ছিল। বিক্ষোভ (প্যান্ডাস 1.0.3):

>>> import pandas as pd
>>> import numpy as np
>>> pd.Series([np.nan, 'Hi']) == 'Hi'
0    False
1     True
>>> pd.Series([np.nan, np.nan]) == 'Hi'
~/anaconda3/envs/ms3/lib/python3.7/site-packages/pandas/core/ops/array_ops.py:255: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  res_values = method(rvalues)
0    False
1    False

আমার মনে হয় পান্ডাস 1.0 এর সাথে তারা সত্যিই আপনি নতুন 'string'ডেটাটাইপটি ব্যবহার করতে চান যা pd.NAমানগুলির জন্য অনুমতি দেয় :

>>> pd.Series([pd.NA, pd.NA]) == 'Hi'
0    False
1    False
>>> pd.Series([np.nan, np.nan], dtype='string') == 'Hi'
0    <NA>
1    <NA>
>>> (pd.Series([np.nan, np.nan], dtype='string') == 'Hi').fillna(False)
0    False
1    False

কোন দিন তারা বুলিয়ান ইনডেক্সিংয়ের মতো প্রতিদিনের কার্যকারিতার সাথে সাদৃশ্যপূর্ণ তা পছন্দ করবেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.