<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: median calculation tool in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596557#M46688</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;There was a median calculation tool posted here somewhere by Caleb Mackey.&lt;/P&gt;&lt;P&gt;But no joy with search. So here it is again.&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;'''
Written By Caleb Mackey
4/17/2013
Calculates Median Statistics
'''
import arcpy, os, sys, traceback
# env settings
arcpy.env.overwriteOutput = True
arcpy.env.qualifiedFieldNames = False
def GetMedian(in_list):
&amp;nbsp;&amp;nbsp;&amp;nbsp; sorted_list = sorted(in_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp; median = int(round(len(sorted_list) / 2))
&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(sorted_list)%2==0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; med_val = float(sorted_list[median-1]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + sorted_list[median]) / 2
&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; med_val = sorted_list[median]
&amp;nbsp;&amp;nbsp;&amp;nbsp; return med_val
def GetMedianValues(source_fc, new_table, case_field, value_field):
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' Generates a table with Median Values, summarized by case_field. If the
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goal is to get the median for the entire table, use a case field that has
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the same value for all records.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; source_fc - input feature class to compute median statistics for
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new_table - output table
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case_field - similar to dissolve field, computes stats based on unique values in this field
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value_field - field that contains the actual values for statistics; must be numeric
&amp;nbsp;&amp;nbsp;&amp;nbsp; '''
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Get unique value list for query
&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'starting cursor'
&amp;nbsp;&amp;nbsp;&amp;nbsp; with arcpy.da.SearchCursor(source_fc, [case_field]) as rows:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; un_vals = list(set(r[0] for r in rows))
&amp;nbsp;&amp;nbsp;&amp;nbsp; lyr = arcpy.MakeFeatureLayer_management(source_fc,'source_layer')
&amp;nbsp;&amp;nbsp;&amp;nbsp; values = {}
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Get Median UseValue for each station name
&amp;nbsp;&amp;nbsp;&amp;nbsp; for st in un_vals:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query = '"{0}" = \'{1}\''.format(case_field, st)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.SelectLayerByAttribute_management(lyr, 'NEW_SELECTION', query)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use_vals = []
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; with arcpy.da.SearchCursor(lyr, [value_field]) as rows:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for row in rows:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if row[0] != None:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use_vals.append(row[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(use_vals) &amp;gt; 0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; median = GetMedian(use_vals)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; values[st] = [median, len(use_vals)]
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Create new Summary Statistics table with median
&amp;nbsp;&amp;nbsp;&amp;nbsp; #
&amp;nbsp;&amp;nbsp;&amp;nbsp; if arcpy.Exists(new_table):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.Delete_management(new_table)
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.CreateTable_management(os.path.split(new_table)[0],os.path.basename(new_table))
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Get field names and types
&amp;nbsp;&amp;nbsp;&amp;nbsp; for field in arcpy.ListFields(source_fc):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if field.name in [case_field, value_field]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ftype = field.type
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = field.name
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; length = field.length
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pres = field.precision
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; scale = field.scale
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if name == value_field:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if new_table.endswith('.dbf'):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = 'MED_' + value_field[:6]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = 'MED_' + value_field
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value_field2 = name
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.AddField_management(new_table,name,ftype,pres,scale,length)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Add frequency field
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.AddField_management(new_table,'FREQUENCY','LONG')
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Insert rows
&amp;nbsp;&amp;nbsp;&amp;nbsp; with arcpy.da.InsertCursor(new_table, [case_field, value_field2, 'FREQUENCY']) as rows:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for k,v in sorted(values.iteritems()):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rows.insertRow((k, v[0], v[1]))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; # report results
&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Created %s' %os.path.basename(new_table)
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.AddMessage('Created %s' %os.path.basename(new_table))
&amp;nbsp;&amp;nbsp;&amp;nbsp; # .dbf's are automatically given a 'Field1' field...Clean this up
&amp;nbsp;&amp;nbsp;&amp;nbsp; try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if new_table.endswith('.dbf'):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.DeleteField_management(new_table, 'Field1')
&amp;nbsp;&amp;nbsp;&amp;nbsp; except:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pass
&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Done'
if __name__ == '__main__':
##&amp;nbsp;&amp;nbsp;&amp;nbsp; # testing
##&amp;nbsp;&amp;nbsp;&amp;nbsp; source_fc = r'C:\Testing\Test.gdb\CSR_by_TWP'
####&amp;nbsp;&amp;nbsp;&amp;nbsp; new_table = r'C:\Testing\Test.gdb\Median_CSR' #gdb test
##&amp;nbsp;&amp;nbsp;&amp;nbsp; new_table = r'C:\Testing\Median_CSR.dbf'&amp;nbsp; #dbf test
##&amp;nbsp;&amp;nbsp;&amp;nbsp; case_field = 'NAME'
##&amp;nbsp;&amp;nbsp;&amp;nbsp; value_field = 'AVE_CSR'
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Script tool params
&amp;nbsp;&amp;nbsp;&amp;nbsp; source_fc = arcpy.GetParameterAsText(0)
&amp;nbsp;&amp;nbsp;&amp;nbsp; new_table = arcpy.GetParameterAsText(1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; case_field = arcpy.GetParameterAsText(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp; value_field = arcpy.GetParameterAsText(3)
&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMedianValues(source_fc, new_table, case_field, value_field)
&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sun, 12 Dec 2021 01:36:40 GMT</pubDate>
    <dc:creator>NeilAyres</dc:creator>
    <dc:date>2021-12-12T01:36:40Z</dc:date>
    <item>
      <title>median calculation tool</title>
      <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596552#M46683</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Currently working on a Median calculation tool. This tool is similar to the one I posted on a previous post involving selecting a city and zooming into it. In this case, we have to type in a country name, where the tool will then select all the cities in that country, sort the POP_RANK of the cities in that country, and calculate the median POP_RANK for that country. I was able to complete the select and zoom aspect but I am not entirely sure how to create a list/search cursor which will allow us to input a calculation. Is there a specific way I should approach this?&amp;nbsp; Any and all help is appreciated!! Thank you&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;import arcpy&lt;/P&gt;&lt;P&gt;from arcpy import mapping&lt;/P&gt;&lt;P&gt;#sets the workspace&lt;/P&gt;&lt;P&gt;mxd = arcpy.mapping.MapDocument("CURRENT")&lt;/P&gt;&lt;P&gt;df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;fc = ("N:/data2016/Lab13/cities.shp")&lt;/P&gt;&lt;P&gt;cities = arcpy.mapping.ListLayers(mxd, "Cities")[0]&lt;/P&gt;&lt;P&gt;cities.showLabels = True&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;def countryList():&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; country = arcpy.GetParameterAsText(0)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; country_Layer = arcpy.MakeFeatureLayer_management(fc, "country_lyr")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.SelectLayerByAttribute_management(cities, "NEW_SELECTION", "CNTRY_NAME = '{}' ".format(country))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.mapping.ListDataFrames(mxd)[0].zoomToSelectedFeatures()&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.RefreshActiveView()&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.Delete_management("country_lyr")&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 03 May 2016 18:02:40 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596552#M46683</guid>
      <dc:creator>GarrettPullis</dc:creator>
      <dc:date>2016-05-03T18:02:40Z</dc:date>
    </item>
    <item>
      <title>Re: median calculation tool</title>
      <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596553#M46684</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;A href="http://desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-data-access/searchcursor-class.htm" title="http://desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-data-access/searchcursor-class.htm"&gt;SearchCursor—Help | ArcGIS for Desktop&lt;/A&gt; example 2 shows how to ge the unique values.. if you leave out the set(...) bit, you have all the values, which then you can then use a python sort, get the len(gth) and if len is divisible by 2 (mod), just take the average of the middle 2 (from len/2 and len/2 +1) otherwise if len is odd, just take the middle one.&lt;/P&gt;&lt;P&gt;alternately that field can be read and converted to a numpy array for which there are median methods for data with and without nodata values.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 03 May 2016 19:38:30 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596553#M46684</guid>
      <dc:creator>DanPatterson_Retired</dc:creator>
      <dc:date>2016-05-03T19:38:30Z</dc:date>
    </item>
    <item>
      <title>Re: median calculation tool</title>
      <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596554#M46685</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;forgot the code link &lt;A href="http://www.arcgis.com/home/item.html?id=6c384f06c9f14d09920f4ff14460f4e2" title="http://www.arcgis.com/home/item.html?id=6c384f06c9f14d09920f4ff14460f4e2"&gt;http://www.arcgis.com/home/item.html?id=6c384f06c9f14d09920f4ff14460f4e2&lt;/A&gt;&lt;/P&gt;&lt;P&gt;and your chance to join a cause to free statistical tools &lt;A href="https://community.esri.com/migration-blogpost/55577"&gt;Free Frequency ... join the cause  &lt;/A&gt; &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 03 May 2016 20:59:55 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596554#M46685</guid>
      <dc:creator>DanPatterson_Retired</dc:creator>
      <dc:date>2016-05-03T20:59:55Z</dc:date>
    </item>
    <item>
      <title>Re: median calculation tool</title>
      <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596555#M46686</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;If you install ArcGIS Pro, you will be using python 3.4 which comes with the Statistics module, which has 4 variants of the median which covers most useable situations &lt;A href="https://docs.python.org/3.4/library/statistics.html#module-statistics" title="https://docs.python.org/3.4/library/statistics.html#module-statistics"&gt;9.7. statistics — Mathematical statistics functions — Python 3.4.4 documentation&lt;/A&gt; &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 10 May 2016 00:14:21 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596555#M46686</guid>
      <dc:creator>DanPatterson_Retired</dc:creator>
      <dc:date>2016-05-10T00:14:21Z</dc:date>
    </item>
    <item>
      <title>Re: median calculation tool</title>
      <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596556#M46687</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Does anyone in the 'global reach' section have any further ideas? or should I mark this 'assumed answered'&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 12 May 2016 00:18:31 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596556#M46687</guid>
      <dc:creator>DanPatterson_Retired</dc:creator>
      <dc:date>2016-05-12T00:18:31Z</dc:date>
    </item>
    <item>
      <title>Re: median calculation tool</title>
      <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596557#M46688</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;There was a median calculation tool posted here somewhere by Caleb Mackey.&lt;/P&gt;&lt;P&gt;But no joy with search. So here it is again.&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;'''
Written By Caleb Mackey
4/17/2013
Calculates Median Statistics
'''
import arcpy, os, sys, traceback
# env settings
arcpy.env.overwriteOutput = True
arcpy.env.qualifiedFieldNames = False
def GetMedian(in_list):
&amp;nbsp;&amp;nbsp;&amp;nbsp; sorted_list = sorted(in_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp; median = int(round(len(sorted_list) / 2))
&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(sorted_list)%2==0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; med_val = float(sorted_list[median-1]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + sorted_list[median]) / 2
&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; med_val = sorted_list[median]
&amp;nbsp;&amp;nbsp;&amp;nbsp; return med_val
def GetMedianValues(source_fc, new_table, case_field, value_field):
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' Generates a table with Median Values, summarized by case_field. If the
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goal is to get the median for the entire table, use a case field that has
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the same value for all records.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; source_fc - input feature class to compute median statistics for
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new_table - output table
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case_field - similar to dissolve field, computes stats based on unique values in this field
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value_field - field that contains the actual values for statistics; must be numeric
&amp;nbsp;&amp;nbsp;&amp;nbsp; '''
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Get unique value list for query
&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'starting cursor'
&amp;nbsp;&amp;nbsp;&amp;nbsp; with arcpy.da.SearchCursor(source_fc, [case_field]) as rows:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; un_vals = list(set(r[0] for r in rows))
&amp;nbsp;&amp;nbsp;&amp;nbsp; lyr = arcpy.MakeFeatureLayer_management(source_fc,'source_layer')
&amp;nbsp;&amp;nbsp;&amp;nbsp; values = {}
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Get Median UseValue for each station name
&amp;nbsp;&amp;nbsp;&amp;nbsp; for st in un_vals:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query = '"{0}" = \'{1}\''.format(case_field, st)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.SelectLayerByAttribute_management(lyr, 'NEW_SELECTION', query)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use_vals = []
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; with arcpy.da.SearchCursor(lyr, [value_field]) as rows:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for row in rows:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if row[0] != None:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use_vals.append(row[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(use_vals) &amp;gt; 0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; median = GetMedian(use_vals)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; values[st] = [median, len(use_vals)]
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Create new Summary Statistics table with median
&amp;nbsp;&amp;nbsp;&amp;nbsp; #
&amp;nbsp;&amp;nbsp;&amp;nbsp; if arcpy.Exists(new_table):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.Delete_management(new_table)
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.CreateTable_management(os.path.split(new_table)[0],os.path.basename(new_table))
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Get field names and types
&amp;nbsp;&amp;nbsp;&amp;nbsp; for field in arcpy.ListFields(source_fc):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if field.name in [case_field, value_field]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ftype = field.type
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = field.name
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; length = field.length
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pres = field.precision
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; scale = field.scale
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if name == value_field:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if new_table.endswith('.dbf'):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = 'MED_' + value_field[:6]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = 'MED_' + value_field
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value_field2 = name
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.AddField_management(new_table,name,ftype,pres,scale,length)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Add frequency field
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.AddField_management(new_table,'FREQUENCY','LONG')
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Insert rows
&amp;nbsp;&amp;nbsp;&amp;nbsp; with arcpy.da.InsertCursor(new_table, [case_field, value_field2, 'FREQUENCY']) as rows:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for k,v in sorted(values.iteritems()):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rows.insertRow((k, v[0], v[1]))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; # report results
&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Created %s' %os.path.basename(new_table)
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.AddMessage('Created %s' %os.path.basename(new_table))
&amp;nbsp;&amp;nbsp;&amp;nbsp; # .dbf's are automatically given a 'Field1' field...Clean this up
&amp;nbsp;&amp;nbsp;&amp;nbsp; try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if new_table.endswith('.dbf'):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.DeleteField_management(new_table, 'Field1')
&amp;nbsp;&amp;nbsp;&amp;nbsp; except:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pass
&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Done'
if __name__ == '__main__':
##&amp;nbsp;&amp;nbsp;&amp;nbsp; # testing
##&amp;nbsp;&amp;nbsp;&amp;nbsp; source_fc = r'C:\Testing\Test.gdb\CSR_by_TWP'
####&amp;nbsp;&amp;nbsp;&amp;nbsp; new_table = r'C:\Testing\Test.gdb\Median_CSR' #gdb test
##&amp;nbsp;&amp;nbsp;&amp;nbsp; new_table = r'C:\Testing\Median_CSR.dbf'&amp;nbsp; #dbf test
##&amp;nbsp;&amp;nbsp;&amp;nbsp; case_field = 'NAME'
##&amp;nbsp;&amp;nbsp;&amp;nbsp; value_field = 'AVE_CSR'
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Script tool params
&amp;nbsp;&amp;nbsp;&amp;nbsp; source_fc = arcpy.GetParameterAsText(0)
&amp;nbsp;&amp;nbsp;&amp;nbsp; new_table = arcpy.GetParameterAsText(1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; case_field = arcpy.GetParameterAsText(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp; value_field = arcpy.GetParameterAsText(3)
&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMedianValues(source_fc, new_table, case_field, value_field)
&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 12 Dec 2021 01:36:40 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596557#M46688</guid>
      <dc:creator>NeilAyres</dc:creator>
      <dc:date>2021-12-12T01:36:40Z</dc:date>
    </item>
    <item>
      <title>Re: median calculation tool</title>
      <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596558#M46689</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;so if using recent versions of python, it would still be easier to use the builtins&lt;/P&gt;&lt;P&gt;&amp;gt;&amp;gt;&amp;gt; import statistics&lt;/P&gt;&lt;P&gt;&amp;gt;&amp;gt;&amp;gt; a = [1,2,3]&lt;/P&gt;&lt;P&gt;&amp;gt;&amp;gt;&amp;gt; statistics.median(a)&lt;/P&gt;&lt;P&gt;2&lt;/P&gt;&lt;P&gt;&amp;gt;&amp;gt;&amp;gt; b = [1,2,3,4]&lt;/P&gt;&lt;P&gt;&amp;gt;&amp;gt;&amp;gt; statistics.median(b)&lt;/P&gt;&lt;P&gt;2.5&lt;/P&gt;&lt;P&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/P&gt;&lt;P&gt;&amp;gt;&amp;gt;&amp;gt; dir(statistics)&lt;/P&gt;&lt;P&gt;['Decimal', 'Fraction', 'StatisticsError', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_check_type', '_counts', '_decimal_to_ratio', '_exact_ratio', '_ss', '_sum', 'collections', 'math', 'mean', 'median', 'median_grouped', 'median_high', 'median_low', 'mode', 'pstdev', 'pvariance', 'stdev', 'variance']&lt;/P&gt;&lt;P&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 12 May 2016 09:27:11 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596558#M46689</guid>
      <dc:creator>DanPatterson_Retired</dc:creator>
      <dc:date>2016-05-12T09:27:11Z</dc:date>
    </item>
    <item>
      <title>Re: median calculation tool</title>
      <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596559#M46690</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Of course Dan,&lt;/P&gt;&lt;P&gt;But I am running 10.3.1 (soon moving to 10.4).&lt;/P&gt;&lt;P&gt;Haven't got anywhere near Pro yet. Need to buy a deep blue before I do.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 12 May 2016 11:18:48 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596559#M46690</guid>
      <dc:creator>NeilAyres</dc:creator>
      <dc:date>2016-05-12T11:18:48Z</dc:date>
    </item>
    <item>
      <title>Re: median calculation tool</title>
      <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596560#M46691</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I have been using python 3.4 since arcmap 10.2... it is a matter of setup&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 12 May 2016 14:17:06 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596560#M46691</guid>
      <dc:creator>DanPatterson_Retired</dc:creator>
      <dc:date>2016-05-12T14:17:06Z</dc:date>
    </item>
    <item>
      <title>Re: median calculation tool</title>
      <link>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596561#M46692</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I think we have it wrapped up with this one, in case it is a network question&lt;/P&gt;&lt;P&gt;&lt;IMG alt="image.gif" class="j-img-floatstart image-1 jive-image" src="https://community.esri.com/legacyfs/online/199990_image.gif" style="height: 150px; float: left;" /&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 12 May 2016 21:25:54 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/median-calculation-tool/m-p/596561#M46692</guid>
      <dc:creator>DanPatterson_Retired</dc:creator>
      <dc:date>2016-05-12T21:25:54Z</dc:date>
    </item>
  </channel>
</rss>

